RCI*_*CIX 3 lua parsing antlr abstract-syntax-tree
我有一个Lua语法,(对C#进行输出的小修改,只是命名空间指令和几个选项更改),当我在一些示例输入上运行它时,它给了我一个根"nil"节点的树作为孩子们看起来是输入代码的标记化版本.看起来ANTLR的树语法在分层树上运行而不是"平"树,所以我认为我不能按原样使用输出.
是否有一个简单的语法修复方法,还是需要从头开始重写?
假设您的树只是一维节点列表,以下是如何创建父/兄弟层次结构:
在ANTLR中,有两个用于AST创建的运算符:
! excludes the node (token) from the (sub)tree;
^ makes a node the root of a (sub)tree.
Run Code Online (Sandbox Code Playgroud)
如果未提供运算符,则将节点/标记添加为当前根的子节点.这可能是你发生的事情:你看到的只是节点/令牌的一维列表.
一个例子:
grammar Exp;
options {output=AST;}
// ... some rules ...
addition
: Integer '+'^ Integer ';'!
;
Integer
: '0'
| '1'..'9' '0'..'9'*
;
Run Code Online (Sandbox Code Playgroud)
该addition规则将为表达式创建以下树6+9;:
+
/ \
/ \
6 9
Run Code Online (Sandbox Code Playgroud)
正如你所看到的那样:它+是根(它^在它之后),数字是标记(它们没有运算符),排除了半冒号(它!后面有一个).
有关详细说明,请参阅"最终ANTLR参考"中的第7章"树构造".我强烈建议你拿一份副本.
你是否应该从头开始的问题由你来决定.我只是从一个空的语法文件开始,逐渐添加规则,经常检查它是否一切正常.简单地在现有语法中使用一些树操作符可能很难调试:特别是如果你不太熟悉ANTLR.
祝你好运!