Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Parsing 扫描令牌时跟踪位置会使解析器复杂化_Parsing_Haskell - Fatal编程技术网

Parsing 扫描令牌时跟踪位置会使解析器复杂化

Parsing 扫描令牌时跟踪位置会使解析器复杂化,parsing,haskell,Parsing,Haskell,我正在编写一个双过程解析器,首先将文本扫描到令牌(使用Alex),然后解析这些令牌(使用Parsec)。这一切都很好,直到我尝试将位置信息添加到令牌中,以便编写一条好的错误消息 最初我有: data Token = TAtom | TString String | TInt Integer | TFloat [...] 似乎我可以向每个令牌构造函数添加Position元素,或者创建一个新类型,如data-TokenWithPosition=T-Token-Position 我已经开始使用后一种

我正在编写一个双过程解析器,首先将文本扫描到令牌(使用
Alex
),然后解析这些令牌(使用
Parsec
)。这一切都很好,直到我尝试将位置信息添加到令牌中,以便编写一条好的错误消息

最初我有:

data Token = TAtom | TString String | TInt Integer | TFloat [...]
似乎我可以向每个
令牌
构造函数添加
Position
元素,或者创建一个新类型,如
data-TokenWithPosition=T-Token-Position

我已经开始使用后一种方法,但是现在我遇到了一个问题,当我想在Parsec中描述一个标记时,我必须用一个假位置创建一个
TokenWithPosition
,或者每次我想进行比较时,我必须打开
TokenWithPosition
。简言之,我的整洁语法中充斥着忽略位置信息所需的代码


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

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

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