3

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

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

4

1 回答 1

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

如您所见:the+是根(它^后面有),数字是标记(它们没有运算符),分号被排除在外(它!后面有一个)。

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

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

祝你好运!

于 2009-12-23T19:04:41.880 回答