如何让ANTLR输出分层AST?

时间:2009-12-23 08:11:59

标签: parsing lua antlr abstract-syntax-tree

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

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

1 个答案:

答案 0 :(得分:6)

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

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

!     excludes the node (token) from the (sub)tree;
^     makes a node the root of a (sub)tree.

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

一个例子:

grammar Exp;

options {output=AST;}

// ... some rules ...

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

Integer
  :  '0'
  |  '1'..'9' '0'..'9'*
  ;

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

   +
  / \
 /   \
6     9

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

有关详细说明,请参阅The Definitive ANTLR Reference中的第7章“树构造”。我强烈建议您保留一份副本。

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

祝你好运!