Parsing 如何让ANTLR输出分层AST?

Parsing 如何让ANTLR输出分层AST?,parsing,lua,antlr,abstract-syntax-tree,Parsing,Lua,Antlr,Abstract Syntax Tree,我有一个(为了让它输出C#,做了一些小的修改,只是名称空间指令和一些选项更改),当我在一些示例输入上运行它时,它会返回一个带有根“nil”节点的树,作为孩子,它看起来是输入代码的标记化版本。看起来的树语法是在层次树上运行的,而不是在“平面”树上运行的,所以我认为不能按原样使用输出 语法是否有一个简单的修复方法,还是需要从头重写?假设树只是一个一维的节点列表,下面是创建父/同级层次结构的方法: 在ANTLR中,有两个用于创建AST的运算符: ! excludes the node (tok

我有一个(为了让它输出C#,做了一些小的修改,只是名称空间指令和一些选项更改),当我在一些示例输入上运行它时,它会返回一个带有根“nil”节点的树,作为孩子,它看起来是输入代码的标记化版本。看起来的树语法是在层次树上运行的,而不是在“平面”树上运行的,所以我认为不能按原样使用输出


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

假设树只是一个一维的节点列表,下面是创建父/同级层次结构的方法:

在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,但它的格式似乎也完全不适合应用树语法。对不起,我没有在我的问题中说这个!好吧,听起来不像我害怕的那么糟糕。谢谢你的帮助!