使用Haskell Parsec自定义whiteSpace

fry*_*bob 6 whitespace parsing haskell parsec

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

...
lexer :: P.TokenParser ()
lexer      = l { P.whiteSpace = myWhiteSpace }
   where l = P.makeTokenParser myLanguageDef
...
Run Code Online (Sandbox Code Playgroud)

查看代码,makeTokenParser我想我明白为什么它以这种方式工作.我想知道是否有任何变通方法可以避免完全复制代码makeTokenParser

Mtn*_*ark 7

可悲的是,我认为没有办法.在使用局部定义makeTokenParser递归是指自己,那么,你已经注意到,lexeme使用whiteSpace如其中,而不是whiteSpace记录部件您在更换lexer对象.

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

  • 现在,如果只有`TokenParser`是用类型类写的,我们就可以了. (2认同)