我正在尝试制作一个将重写为嵌套树的规则(类似于二叉树)。
例如:
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) ) )
答案 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;"
:
答案 1 :(得分:0)
你试过吗
rule: ID '+' rule | ID;