我正在使用parsec编写源到源转换,所以我的语言有LanguageDef
,我使用{{1}为它构建TokenParser
}}:
Text.Parsec.Token.makeTokenParser
不幸的是,由于我定义了myLanguage = LanguageDef { ...
commentStart = "/*"
, commentEnd = "*/"
...
}
-- defines 'stringLiteral', 'identifier', etc...
TokenParser {..} = makeTokenParser myLanguage
和commentStart
,commentEnd
中的每个解析器组合器都是以{{1}为单位实现的 lexeme 解析器},TokenParser
吃空格和评论。
在这种情况下保留评论的正确方法是什么?
我能想到的方法:
whiteSpace
和whiteSpace
。将每个词法解析器包装在另一个组合器中,该组合器在解析每个标记之前抓取注释。commentStart
版本(或者使用一些概括commentEnd
的库;若然,哪个库?)在这种情况下做了什么?
答案 0 :(得分:5)
原则上,定义commentStart和commentEnd不适合保留注释,因为您需要将注释视为源语言和目标语言的有效部分,包括语法和AST / ADT中的注释。
通过这种方式,您可以将注释文本保留为Comment构造函数的有效负载数据,并以目标语言输出,如
data Statement = Comment String | Return Expression | ......
源语言和目标语言都没有将评论文本视为相关,这与您的翻译代码无关。
这种方法存在的主要问题:它与makeTokenParser
不太匹配,更适合从头开始实现源语言解析器。
我想我正在编辑makeTokenParser
,只是让评论解析器返回String
而不是()
。