2011-03-27 25 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