Tree 用ANTLR构造树

Tree 用ANTLR构造树,tree,antlr,compiler-theory,Tree,Antlr,Compiler Theory,如中所述,我可以删除左递归 E -> E + T|T T -> T * F|F F -> INT | ( E ) E->E+T | T T->T*F | F F->INT |(E) 在左递归移除之后,我得到了下面的一个 E -> TE' E' -> null | + TE' T -> FT' T' -> null | * FT' E->TE' E'->null |+TE' T->FT' T'->null |*FT' 那么,如何用修改后的语法进行树的构造呢? 对于输入1+2,我希望有一个树^('+

如中所述,我可以删除左递归

E -> E + T|T T -> T * F|F F -> INT | ( E ) E->E+T | T T->T*F | F F->INT |(E) 在左递归移除之后,我得到了下面的一个

E -> TE' E' -> null | + TE' T -> FT' T' -> null | * FT' E->TE' E'->null |+TE' T->FT' T'->null |*FT' 那么,如何用修改后的语法进行树的构造呢? 对于输入1+2,我希望有一个树^('+'^(int1)^(int2))。或类似的

^('+' ^(INT 1) ^(INT 2)) grammar T; options { output=AST; language=Python; ASTLabelType=CommonTree; } start : e -> e ; e : t ep -> ??? ; ep : | '+' t ep -> ??? ; t : f tp -> ??? ; tp : | '*' f tp -> ??? ; f : INT | '(' e ')' -> e ; INT : '0'..'9'+ ; WS: (' '|'\n'|'\r')+ {$channel=HIDDEN;} ; 语法T; 选择权{ 输出=AST; 语言=Python; ASTLabelType=CommonTree; } 开始:e->e ; e:TEP->??? ; ep: |“+”t ep->??? ; t:f tp->??? ; tp: |“*”f tp->??? ; f:INT |“(“e”)”->e ; INT:'0'..'9'+; WS:(“”|’\n’|’\r')+{$channel=HIDDEN;};
一点看法:尽管有时可以像你所做的那样从LR语法转换为LL语法,但结果并不像习惯用语那样,对于熟悉LL语法的人来说,这似乎是一种奇怪的语法定义方式

例如,考虑下面的摘录:

tp : 
  | '*' f tp -> ???
上面接受一个
*
后跟一个
f
,其第一组将包含
INT
,它本身的开头是正确的递归。因此,您永远看不到要在
*
上扎根的表达式的开头,这将使构建所需的树变得更加困难

为了便于在ANTLR中创建AST,您需要同时具有操作数和运算符

add:
   INT '+'^ INT;
插入符号
^
使
+
成为树的根,两个
INT
成为其子级


Bart K的例子是一个很好的例子,说明了我希望如何使用LL语法完成它……它可以扩展以支持不同优先级的运算符。

我在这里发布了一个使用AST重写规则的例子:。这有帮助吗?