使用Haskell Parsec自定义whiteSpace

时间:2010-04-14 23:25:00

标签: parsing haskell whitespace parsec

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

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

查看makeTokenParser的代码我想我明白为什么它会这样运作。我想知道是否有任何变通办法可以避免完全重复makeTokenParser的代码?

1 个答案:

答案 0 :(得分:7)

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

代码是嘲弄的,因为它使用与makeTokenParser中的本地函数相同的名称以及TokenParser构造函数的记录成员。它们实际上是完全不同的实体。