2011-03-27 51 views
1

树表示,如果声明,正确地分析我有以下几点:如果语句在ANTLR

ifStatement 
    : 'IF' expression 'THEN' statementBlock 
     (options {greedy=true;} 
      : 'ELSE' statementBlock)? 

    ; 

现在,我想它解析为一个AST这一点。这是我做的:

ifStatement 
    : 'IF'^ expression 'THEN'! statementBlock 
     (options {greedy=true;} 
      : 'ELSE'! statementBlock)? 

    ; 

新增!^,为->建造指令似乎没有工作。

我的结果是有3个孩子的AST:1是条件式,2和3是语句块。 else部分是可选的:如果没有其他部分,则节点3丢失。

问题是语句块总是空的。如何解决这个问题?

+0

对不起,这个问题到底是什么?你想要什么结果,你得到了什么不同的结果?你希望我们能为你做什么? – 2011-03-27 22:48:46

+0

抱歉不清楚,但是,我的代码不会返回包含3个节点的父节点。如果我还没有一个else语句,然后2. 通常,我的父节点需要有1个孩子,表达式,第二个孩子的第一个语句,第三个else语句 – pantelis 2011-03-27 23:38:40

+0

所以你*要*得到一个AST与三个孩子先行的,后续的,替代的),但实际上,根据输入中是否存在“ELSE”条款,您实际上会获得(先行的,随后的,替代的)或(先行的,后续的),并且您正在寻找使AST得到建立,使它具有相同的结构吗? – 2011-03-28 00:38:34

回答

0

以下是我如何实现它。请注意,“IF”,“THEN”和“ELSE”是在“令牌”部分

ifStatement 
: IF expression THEN ifStat=statementBlock 
    ( ELSE elseStat=statementBlock -> ^(IF expression $ifStat $elseStat) 
    |         -> ^(IF expression $ifStat) 
    ) 
; 

[编辑]声明或者你可以更明确这也应该工作

ifStatement 
: IF expression THEN ifStat=statementBlock ELSE elseStat=statementBlock -> ^(IF expression $ifStat $elseStat) 
| IF expression THEN ifStat=statementBlock        -> ^(IF expression $ifStat) 
; 
+0

是的,但其他需要是可选的。 – pantelis 2011-03-28 07:51:03

+0

好吧,它似乎工作,但我得到一个警告 “决定可以匹配输入,如”'ELSE'“使用多个备选方案:1 因此,替代(2)被禁用该输入” – pantelis 2011-03-28 08:15:06

+0

在这规则,ELSE是可选的。你会注意到一个子规则,即括号内的部分。只有以ELSE开头时,子规则的第一部分才会匹配。否则,它匹配其他中频产品。您可能有其他一些规则与导致错误的“ELSE”匹配。我没有你的整个语法,所以我不知道。 – 2011-03-28 20:19:30