保留`Text.Parsec.Token`标记生成器中的注释

时间:2014-06-26 13:49:20

标签: parsing haskell comments parsec code-translation

我正在使用parsec编写源到源转换,所以我的语言有LanguageDef,我使用{{1}为它构建TokenParser }}:

Text.Parsec.Token.makeTokenParser

不幸的是,由于我定义了myLanguage = LanguageDef { ... commentStart = "/*" , commentEnd = "*/" ... } -- defines 'stringLiteral', 'identifier', etc... TokenParser {..} = makeTokenParser myLanguage commentStartcommentEnd中的每个解析器组合器都是以{{1}为单位实现的 lexeme 解析器},TokenParser吃空格和评论。

在这种情况下保留评论的正确方法是什么?

我能想到的方法:

  1. 不要定义whiteSpacewhiteSpace。将每个词法解析器包装在另一个组合器中,该组合器在解析每个标记之前抓取注释。
  2. 实现我自己的commentStart版本(或者使用一些概括commentEnd的库;若然,哪个库?)
  3. 在这种情况下做了什么?

1 个答案:

答案 0 :(得分:5)

原则上,定义commentStart和commentEnd不适合保留注释,因为您需要将注释视为源语言和目标语言的有效部分,包括语法和AST / ADT中的注释。

通过这种方式,您可以将注释文本保留为Comment构造函数的有效负载数据,并以目标语言输出,如

data Statement = Comment String | Return Expression | ......

源语言和目标语言都没有将评论文本视为相关,这与您的翻译代码无关。


这种方法存在的主要问题:它与makeTokenParser不太匹配,更适合从头开始实现源语言解析器。

我想我正在编辑makeTokenParser,只是让评论解析器返回String而不是()