我正在编写一个两遍解析器,我首先将文本扫描到标记中(使用Alex
),然后解析这些标记(使用Parsec
)。在我尝试将位置信息添加到令牌之前,一切都很好,这样我就可以写出一个好的错误消息。
最初我有:
data Token = TAtom | TString String | TInt Integer | TFloat [...]
似乎我可以Position
向每个构造函数添加一个元素,也可以Token
创建一个新类型,例如data TokenWithPosition = T Token Position
.
我已经开始走后一条道路,但现在我遇到了一个问题,即TokenWithPosition
当我想在 Parsec 中描述一个标记时必须创建一个带有假位置的,或者我TokenWithPosition
每次想要进行比较时都必须打开它。简而言之,我的干净语法被忽略位置信息所需的代码所淹没。
所以我的问题是:有没有一种干净的方法来跟踪位置信息,而不会使第二遍中的解析器复杂化?这似乎有一个标准的解决方案。