6

我想使用 ParsecmakeTokenParser来构建我的解析器,但我想使用我自己的whiteSpace. 执行以下操作将替换whiteSpace为我的定义,但所有lexeme解析器仍使用旧定义(例如P.identifier lexer,将使用旧空白)。

...
lexer :: P.TokenParser ()
lexer      = l { P.whiteSpace = myWhiteSpace }
   where l = P.makeTokenParser myLanguageDef
...

查看代码,makeTokenParser我想我明白它为什么会这样工作。我想知道是否有任何解决方法可以避免完全复制代码makeTokenParser

4

1 回答 1

7

可悲的是,我认为没有办法。中使用的本地定义makeTokenParser递归地引用它们自己,因此,正如您所指出的,lexeme使用whiteSpace在那里定义的,而不是whiteSpace您在lexer对象中替换的记录成员。

这段代码很讽刺,因为它使用了与构造函数中的本地函数makeTokenParser和记录成员相同的名称TokenParser。它们实际上是完全不同的实体。

于 2010-04-15T00:33:39.913 回答