Antlr4 生成的代码是否包含类似 unparser 的东西,可以使用语法和解析器树来重建原始源代码?如果它存在,我将如何调用它?我问是因为它可能在某些应用程序和调试中有用。
问问题
536 次
2 回答
0
这真的取决于你想要实现什么。请记住,放置在 HIDDEN 通道上的 Lexer 标记(如评论和哪些空格)并且根本不被解析。我使用的方法是
- 在词法分析器令牌类中使用其他用户特定信息
- 解析源代码并获取 AST
- 倒回词法分析器(令牌源)并遍历所有 Lexem-es,包括隐藏的
- 对于每个隐藏的 Lexeme,将引用附加到相应的 AST 叶
- 所以每个 AST 叶子都“知道”哪些空白词素正在跟随它
- 递归遍历 AST 并打印所有 Lexemes
于 2013-11-04T12:52:59.077 回答
0
是的!ANTLR 的基础设施(通常)使原始源数据可用。
在默认情况下,您将使用 CommonTokenStream。这继承自BufferedTokenStream,它提供了一整套获取东西的方法。
方法 getHiddenTokensOnLeft (和 ...Right)将为您提供未出现在 DEFAULT 流中的令牌列表。这些标记将使用 getText() 显示它们的源文本。
我发现更方便的是 BufferedTokenStream.getText(interval),它将为您提供 Interval 上的文本(包括隐藏的),您可以从树元素 (RuleContext) 中获取这些文本。
要使用您的 CommonTokenStream 及其方法,您只需将它从创建它的位置传递并将您的解析器设置到正在检查解析树的任何类,例如您的 XXXBaseListener - 我只是给了我的 Listener 一个存储CommonTokenStream 作为实例字段。
所以当我想要一个规则 ctx 的完整文本时,我使用这个小方法:
String originalString(ParserRuleContext ctx) {
return this.tokenStream.getText(ctx.getSourceInterval());
}
或者,标记还包含行号和偏移量,如果你想摆弄这些。
于 2015-04-19T21:02:03.900 回答