你如何处理空白和评论?在句法分析阶段通常会删除的片段?我想在我正在解析的文档中的任何地方启用注释。是在我定义唯一选项的每个基本解析器中添加这些吗?
答案 0 :(得分:8)
在Text.Parsec.Token
中完成的方法是让每个令牌都消耗它后面的空格和注释。
这是通过lexeme
组合器的帮助完成的:
lexeme p = do { x <- p; whitespace; return x }
运行解析器p
,使用后面的空格并返回返回的p
。
当您查看makeTokenParser
(link)的来源时,您会看到许多令牌解析器使用lexeme
组合器进行包装,例如:
symbol name
= lexeme (string name)
使用这种方法,lexeme
(link)的注释指出,解析器唯一需要明确消耗空格的时间是输入的开头,以便在第一个空格之前跳过任何空白区域令牌。
答案 1 :(得分:7)
您应该使用parsec的能力来定义“令牌解析器”。我们的想法是,您可以在LanguageDef
中定义语言的特征,然后在生成的TokenParser
中使用派生的解析器,例如identifier
,integer
等。您可以从lexeme
获取TokenParser
函数,将您可能拥有的任何解析器转换为吞噬所有尾随空格的解析器。
有关详细信息,请参阅makeTokenParser。
我写的一个例子是this code。这是真实世界的代码,所以也许不像一个好的教程那样教育,但你可以看到我如何定义lang = makeTokenParser...
,然后在下面的解析器中使用像whiteSpace lang
,parens lang
这样的解析器。 parseTime
是我在“普通”解析器周围使用lexeme
的示例。