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