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

Joh*_*ler 10 parsing haskell

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

原来我有:

data Token = TAtom | TString String | TInt Integer | TFloat [...]
Run Code Online (Sandbox Code Playgroud)

看起来我可以Position为每个Token构造函数添加一个元素,也可以创建一个新类型data TokenWithPosition = T Token Position.

我已经开始了后一条路径,但现在我有一个问题,就是TokenWithPosition当我想在Parsec中描述一个令牌时必须创建一个假位置,或者我TokenWithPosition每次想要进行比较时都需要打开它.简而言之,我的漂亮干净语法正在被忽略位置信息所需的代码溢出.

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

Rom*_*aka 3

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

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