parsec:有一种简单的方法可以在语法中的任何地方允许注释/空白吗?

时间:2015-07-29 13:58:41

标签: haskell parsec

你如何处理空白和评论?在句法分析阶段通常会删除的片段?我想在我正在解析的文档中的任何地方启用注释。是在我定义唯一选项的每个基本解析器中添加这些吗?

2 个答案:

答案 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中使用派生的解析器,例如identifierinteger等。您可以从lexeme获取TokenParser函数,将您可能拥有的任何解析器转换为吞噬所有尾随空格的解析器。

有关详细信息,请参阅makeTokenParser

我写的一个例子是this code。这是真实世界的代码,所以也许不像一个好的教程那样教育,但你可以看到我如何定义lang = makeTokenParser...,然后在下面的解析器中使用像whiteSpace langparens lang这样的解析器。 parseTime是我在“普通”解析器周围使用lexeme的示例。