Antlr4生成的代码是否包含可以使用语法和解析器树重构原始源的unarser之类的东西?如果它存在,我将如何调用它?我问,因为它可能在某些应用程序和调试中很有用。
答案 0 :(得分:0)
这取决于你想要实现的目标。请记住,将Lexer令牌放入HIDDEN通道(如注释和哪些空格)并且根本不进行解析。 我使用的方法是
答案 1 :(得分:0)
是的! ANTLR的基础设施(通常)使原始源数据可用。
在默认情况下,您将使用CommonTokenStream。这继承自BufferedTokenStream,它提供了大量的方法来获取内容。
方法getHiddenTokensOnLeft(和......右)将获取未出现在DEFAULT流中的标记列表。这些令牌将使用getText()显示其源文本。
我发现更方便的是BufferedTokenStream.getText(interval),它将为您提供Interval上的文本(包括隐藏),您可以从树元素(RuleContext)获取。
要使用您的CommonTokenStream及其方法,您只需要从创建它的位置传递它,并将解析器设置为检查解析树的任何类,例如您的XXXBaseListener - 我只是给了我的Listener一个构造函数将CommonTokenStream存储为实例字段。
所以,当我想要一个规则ctx的完整文本时,我使用这个小方法:
String originalString(ParserRuleContext ctx) {
return this.tokenStream.getText(ctx.getSourceInterval());
}
或者,令牌也包含行号和偏移,如果你想摆弄那些。