如何使用Antlr作为Unparser

时间:2013-10-31 21:34:56

标签: antlr

Antlr4生成的代码是否包含可以使用语法和解析器树重构原始源的unarser之类的东西?如果它存在,我将如何调用它?我问,因为它可能在某些应用程序和调试中很有用。

2 个答案:

答案 0 :(得分:0)

这取决于你想要实现的目标。请记住,将Lexer令牌放入HIDDEN通道(如注释和哪些空格)并且根本不进行解析。 我使用的方法是

  • 在词法分析器类
  • 中使用其他特定于用户的信息
  • 解析源并获得AST
  • 回放词法分析器(令牌源)并循环遍历所有Lexem-es,包括隐藏的词汇
  • 对于每个隐藏的Lexeme,将引用附加到相应的AST叶
  • 所以每个AST叶子都“知道”哪个空格Lexemes跟着它
  • 递归遍历AST并打印所有Lexemes

答案 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());
}

或者,令牌也包含行号和偏移,如果你想摆弄那些。