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

Lam*_*eek 4 parsing haskell comments parsec code-translation

我正在使用parsec编写源到源的转换,所以我有一个LanguageDeffor my language,我TokenParser使用它构建一个for Text.Parsec.Token.makeTokenParser:

myLanguage = LanguageDef { ...
  commentStart = "/*"
  , commentEnd = "*/"
  ...
}

-- defines 'stringLiteral', 'identifier', etc...
TokenParser {..} = makeTokenParser myLanguage
Run Code Online (Sandbox Code Playgroud)

不幸的是,因为我定义了,commentStart并且commentEnd,每个解析器组合器TokenParser都是一个以词语形式实现的词法解析器whiteSpace,并且whiteSpace吃空格和注释.

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

我能想到的方法:

  1. 不要定义commentStartcommentEnd.将每个lexeme解析器包装在另一个组合器中,该组合器在解析每个标记之前抓取注释.
  2. 实现我自己的版本makeTokenParser(或者使用一些概括的库Text.Parsec.Token;如果是,哪个库?)

在这种情况下做了什么?

And*_*ewC 5

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

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

data Statement = Comment String | Return Expression | ......
Run Code Online (Sandbox Code Playgroud)

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


这种方法的主要问题是:它不能很好地适应makeTokenParser,并且更适合从头开始实现源语言的解析器.

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