我有一个Lua 语法,(为了将其输出到 C# 进行了细微的修改,只是命名空间指令和几个选项更改),当我在一些示例输入上运行它时,它给了我一个带有根“nil”节点的树并且作为孩子,看起来是输入代码的标记化版本。看起来ANTLR的树语法在分层树而不是“平面”树上运行,所以我认为我不能按原样使用输出。
语法是否有一个简单的修复方法,还是需要从头开始重写?
假设您的树只是节点的一维列表,以下是创建父/兄弟层次结构的方法:
在 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。
祝你好运!