我想使用Parsec的makeTokenParser
来构建我的解析器,但我想使用我自己的whiteSpace
定义。执行以下操作会将whiteSpace
替换为我的定义,但所有lexeme
解析器仍使用旧定义(例如P.identifier lexer
将使用旧的whiteSpace。)
...
lexer :: P.TokenParser ()
lexer = l { P.whiteSpace = myWhiteSpace }
where l = P.makeTokenParser myLanguageDef
...
查看makeTokenParser
的代码我想我明白为什么它会这样运作。我想知道是否有任何变通办法可以避免完全重复makeTokenParser
的代码?
答案 0 :(得分:7)
makeTokenParser
中使用的本地定义以递归方式引用自己,因此,正如您所指出的那样,lexeme
使用whiteSpace
定义,而不是whiteSpace
记录成员替换你的lexer
对象。
代码是嘲弄的,因为它使用与makeTokenParser
中的本地函数相同的名称以及TokenParser
构造函数的记录成员。它们实际上是完全不同的实体。