我想使用秒差距makeTokenParser
构建我的解析器,但我想使用我自己的定义whiteSpace
。执行以下替换whiteSpace
按照我的定义,但所有lexeme
解析器仍然使用旧的定义(例如P.identifier lexer
将使用旧的空白)。
...
lexer :: P.TokenParser ()
lexer = l { P.whiteSpace = myWhiteSpace }
where l = P.makeTokenParser myLanguageDef
...
查看代码makeTokenParser http://hackage.haskell.org/packages/archive/parsec/3.0.0/doc/html/src/Text-Parsec-Token.html#makeTokenParser我想我明白为什么会这样。我想知道是否有任何解决方法可以避免完全重复代码makeTokenParser
?
可悲的是,我认为没有办法。中使用的本地定义makeTokenParser
递归地引用自己,因此,正如您所指出的,lexeme
uses whiteSpace
那里定义的,而不是whiteSpace
记录您替换的成员lexer
object.
该代码是嘲讽的,因为它使用与两个本地函数相同的名称makeTokenParser
并作为记录成员TokenParser
构造函数。它们实际上是完全不同的实体。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)