如何让ANTLR输出分层的抽象语法树(AST)?

我有一个 Lua 语法,(做了一些小修改,使其输出 C#,仅用于命名空间指令和一些选项更改),当我在一些示例输入上运行它时,它会返回一个以“nil”节点为根的树,并显示输入代码分词后的版本。看起来 ANTLR 的树形语法是基于分层树而不是“扁平”树操作的,因此我不认为我可以直接使用输出。

这个语法是否有简单的修复方式,还是必须从头开始重写?

原文链接 https://stackoverflow.com/questions/1951339

点赞
stackoverflow用户50476
stackoverflow用户50476

假设你的树只是一个一维的节点列表,下面是如何创建父/兄弟层次结构的方式:

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

!     将节点(标记)从(子)树中排除;
^     将节点设置为(子)树的根。

当未提供运算符时,节点/标记将作为当前根的子节点添加。这可能是你的情况:你只看到一个一维节点/标记列表。

以一个例子为例:

grammar Exp;

options {output=AST;}

// ... 一些规则 ...

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

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

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

   +
  / \
 /   \
6     9

如你所见:+是根节点(它之后有^),数字是标记(它们没有运算符),分号是被排除的(它之后有一个!)。

有关详细说明,请参阅《The Definitive ANTLR Reference》的第7章“Tree Construction”。我强烈建议你获取一份副本。

你决定是否要从头开始。我只是从一个空的语法文件开始,逐渐添加规则,并经常检查是否所有都能正常工作。简单地在现有语法中添加一些树运算符可能非常难以调试,特别是如果你对 ANTLR 不太熟悉的话。

祝你好运!

2009-12-23 19:04:41