Parsing 如何让ANTLR输出分层AST?
我有一个(为了让它输出C#,做了一些小的修改,只是名称空间指令和一些选项更改),当我在一些示例输入上运行它时,它会返回一个带有根“nil”节点的树,作为孩子,它看起来是输入代码的标记化版本。看起来的树语法是在层次树上运行的,而不是在“平面”树上运行的,所以我认为不能按原样使用输出Parsing 如何让ANTLR输出分层AST?,parsing,lua,antlr,abstract-syntax-tree,Parsing,Lua,Antlr,Abstract Syntax Tree,我有一个(为了让它输出C#,做了一些小的修改,只是名称空间指令和一些选项更改),当我在一些示例输入上运行它时,它会返回一个带有根“nil”节点的树,作为孩子,它看起来是输入代码的标记化版本。看起来的树语法是在层次树上运行的,而不是在“平面”树上运行的,所以我认为不能按原样使用输出 语法是否有一个简单的修复方法,还是需要从头重写?假设树只是一个一维的节点列表,下面是创建父/同级层次结构的方法: 在ANTLR中,有两个用于创建AST的运算符: ! excludes the node (tok
语法是否有一个简单的修复方法,还是需要从头重写?假设树只是一个一维的节点列表,下面是创建父/同级层次结构的方法: 在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
如您所见:+
是根(后面有^
),数字是记号(它们没有运算符),分号被排除(后面有一个!
)
有关详细说明,请参见第7章,树构造,摘自。我强烈建议你拿一份
你是否应该从头开始的问题由你自己决定。我只是从一个空的语法文件开始,然后逐渐向其中添加规则,并经常检查是否所有操作都有效。简单地在现有语法中添加一些树运算符可能很难调试:特别是如果您对ANTLR不太熟悉的话
祝你好运 呃,我猜你的意思是你真的想要得到一个抽象语法树,对吧?啊,是的,标题上是这么说的,但你的实际问题让人觉得你已经得到了AST…我确实得到了AST,但它的格式似乎也完全不适合应用树语法。对不起,我没有在我的问题中说这个!好吧,听起来不像我害怕的那么糟糕。谢谢你的帮助!