2012-06-26 96 views
3

我试图制定一个规则,将重写成嵌套树(类似于二叉树)。ANTLR规则重写为嵌套树

例如:

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

你必须使用嵌套表达式,因为ANTLR是LL(*)。见[这个问题](http://stackoverflow.com/questions/1452729/antlr-grammar-for-expressions?rq=1)。或者你可以在树解析器中做到这一点,这可能会更容易/更快取决于你的语法。 – 2012-06-26 21:59:47

+0

如果'a + b'都是子节点,那么根是什么?你为什么不想以root身份运营? –

+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

+0

这是完美的,谢谢巴特。 –

+0

不客气@NicWolfe。 –

0

你尝试

rule: ID '+' rule | ID; 

+0

是的,这给了我一棵倒退到我想要的树: '(a +(b +(c + d)))' –