Parsing 使用Haskell Parsec自定义空白

Parsing 使用Haskell Parsec自定义空白,parsing,haskell,whitespace,parsec,Parsing,Haskell,Whitespace,Parsec,我想使用Parsec的makeTokenParser来构建我的解析器,但我想使用我自己对空白的定义。执行以下操作将使用我的定义替换空白,但所有词素解析器仍使用旧的定义(例如P.identifier lexer将使用旧的空白) 查看的代码,我想我理解为什么它是这样工作的。我想知道是否有任何变通方法可以避免完全重复makeTokenParser?的代码。遗憾的是,我认为没有办法。makeTokenParser中使用的本地定义递归地引用它们自己,因此正如您所注意到的,lexeme使用那里定义的whit

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


查看的代码,我想我理解为什么它是这样工作的。我想知道是否有任何变通方法可以避免完全重复
makeTokenParser

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


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

现在,如果
TokenParser
是用类型类编写的,我们就可以。。。如果它可以制作一元解析器(在Parsec 3中),而不是硬连接到
标识
。相关:
...
lexer :: P.TokenParser ()
lexer      = l { P.whiteSpace = myWhiteSpace }
   where l = P.makeTokenParser myLanguageDef
...