我有一个Lua grammar,(对C#进行输出的小修改,只是命名空间指令和几个选项更改),当我在一些示例输入上运行它时,它给了我一棵树根“nil”节点和子节点看起来是输入代码的标记化版本。看起来ANTLR的树语法在分层树上运行而不是“平”树,所以我认为我不能按原样使用输出。
是否有一个简单的语法修复方法,还是需要从头开始重写?
答案 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。
祝你好运!