10

我正在编写一个两遍解析器,我首先将文本扫描到标记中(使用Alex),然后解析这些标记(使用Parsec)。在我尝试将位置信息添加到令牌之前,一切都很好,这样我就可以写出一个好的错误消息。

最初我有:

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

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

我已经开始走后一条道路,但现在我遇到了一个问题,即TokenWithPosition当我想在 Parsec 中描述一个标记时必须创建一个带有假位置的,或者我TokenWithPosition每次想要进行比较时都必须打开它。简而言之,我的干净语法被忽略位置信息所需的代码所淹没。

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

4

1 回答 1

3

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

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

于 2013-04-19T07:46:06.977 回答