如何让ANTLR输出分层AST?

RCI*_*CIX 3 lua parsing antlr abstract-syntax-tree

我有一个Lua语法,(对C#进行输出的小修改,只是命名空间指令和几个选项更改),当我在一些示例输入上运行它时,它给了我一个根"nil"节点的树作为孩子们看起来是输入代码的标记化版本.看起来ANTLR的树语法在分层树上运行而不是"平"树,所以我认为我不能按原样使用输出.

是否有一个简单的语法修复方法,还是需要从头开始重写?

Bar*_*ers 6

假设您的树只是一维节点列表,以下是如何创建父/兄弟层次结构:

在ANTLR中,有两个用于AST创建的运算符:

!     excludes the node (token) from the (sub)tree;
^     makes a node the root of a (sub)tree.
Run Code Online (Sandbox Code Playgroud)

如果未提供运算符,则将节点/标记添加为当前根的子节点.这可能是你发生的事情:你看到的只是节点/令牌的一维列表.

一个例子:

grammar Exp;

options {output=AST;}

// ... some rules ...

addition
  :  Integer '+'^ Integer ';'!
  ;

Integer
  :  '0'
  |  '1'..'9' '0'..'9'*
  ;
Run Code Online (Sandbox Code Playgroud)

addition规则将为表达式创建以下树6+9;:

   +
  / \
 /   \
6     9
Run Code Online (Sandbox Code Playgroud)

正如你所看到的那样:它+是根(它^在它之后),数字是标记(它们没有运算符),排除了半冒号(它!后面有一个).

有关详细说明,请参阅"最终ANTLR参考"中的第7章"树构造".我强烈建议你拿一份副本.

你是否应该从头开始的问题由你来决定.我只是从一个空的语法文件开始,逐渐添加规则,经常检查它是否一切正常.简单地在现有语法中使用一些树操作符可能很难调试:特别是如果你不太熟悉ANTLR.

祝你好运!