ANTLR规则重写为嵌套树

时间:2012-06-26 21:53:14

标签: parsing rewrite antlr grammar abstract-syntax-tree

我正在尝试制作一个将重写为嵌套树的规则(类似于二叉树)。

例如:

a + b + c + d;

将解析为( ( (a + b) + c) + d)之类的树。基本上每个根节点都有三个子节点(LHS'+'RHS),其中LHS可以是更多嵌套节点。

我尝试了一些事情:

rule: lhs '+' ID;
lhs: ID | rule;

rule
    : rule '+' ID
    | ID '+' ID;

(有一些树重写)但他们都给了我一个关于它是左递归的错误。如果没有某种类型的递归,我不确定如何解决这个问题。

编辑:我最近的尝试是在右侧进行的,这与我想要的相反:

rule:
ID (op='+' rule)?
-> {op == null}? ID
-> ^(BinaryExpression<node=MyBinaryExpression> ID $op rule)

提供(a + (b + (c + d) ) )

2 个答案:

答案 0 :(得分:2)

以下语法:

grammar T;

options {
  output=AST;
}

tokens {
  BinaryExpression;
}

parse
 : expr ';' EOF -> expr
 ;

expr
 : (atom -> atom) (ADD a=atom -> ^(BinaryExpression $expr ADD $a))*
 ;

atom
 : ID
 | NUM
 | '(' expr ')'
 ;

ADD   : '+';
NUM   : '0'..'9'+;
ID    : 'a'..'z'+;
SPACE : (' ' | '\t' | '\r' | '\n')+ {skip();};

按如下方式解析您的输入"a + b + c + d;"

enter image description here

答案 1 :(得分:0)

你试过吗

rule: ID '+' rule | ID;