扫描令牌使分析器复杂化时的跟踪位置

时间:2013-04-19 02:05:14

标签: parsing haskell

我正在编写一个两遍解析器,我首先将文本扫描到令牌(使用Alex),然后解析这些令牌(使用Parsec)。一切顺利,直到我尝试将位置信息添加到令牌中,这样我才能写出一个好的错误信息。

原来我有:

data Token = TAtom | TString String | TInt Integer | TFloat [...]

我似乎可以向每个Position构造函数添加Token元素,也可以创建一个类似data TokenWithPosition = T Token Position的新类型。

我已经开始了后一条路径,但是现在我遇到了一个问题,即当我想要在Parsec中描述一个令牌时,必须创建一个带有假位置的TokenWithPosition,或者我必须打开{{ 1}}每次我想做一个比较。简而言之,我的干净语法正在被忽略位置信息所需的代码溢出。

所以我的问题是:有没有一种干净的方法来跟踪位置信息而不会在第二次传递中使解析器复杂化?这似乎是一个标准解决方案。

1 个答案:

答案 0 :(得分:3)

您需要使用Text.Parsec.Prim中的函数(例如,tokenPrim)来实现您自己的“原始解析器”。

这些原始解析器将使用位置信息更新Parsec的内部状态,并返回一个没有位置的纯Token