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