2012-11-27 10 views
2

我幾乎已經完成了我與ANTLR的第一次冒險,而且這已經是一次旅行了。不幸的是,永遠只能算馬蹄鐵,手榴彈和核武器,對嗎?錯誤分離ANTLR中的多條規則

不管怎麼說,我試圖解析看起來像這樣輸入:

; IF AGE IS LESS THAN 21, STILL RETURN TRUE FOR OVERSEAS LOCATION \r\n 
SHOW "AGE REQUIREMENTS FAILED" FOR \r\n 
IF AGE < 21 THEN \r\n 
LOCATION = "OVERSEAS" \r\n 
ENDIF \r\n 
\r\n 
; NEED SOMEONE WHO HAS WORKED FOR US FOR > 1 YEAR EXCEPT FOR CEO \r\n 
SHOW "MINIMUM TIME REQUIREMENT NOT MET" FOR \r\n 
IF STARTDATE > TODAY - 1 YEAR THEN \r\n 
EMPLID=001 \r\n 
ENDIF \r\n 

一般情況下,如果測試失敗,則顯示的消息。

無論如何,一套可以包含1個或更多的SHOW規則。處理單個SHOW規則有效,但當輸入流包含> 1個SHOW規則時它不會「分裂」。

這裏是從語法的相關規則:

showGroup returns [List<PolicyEvaluation> value] 
    @init {List<PolicyEvaluation> peList = new ArrayList<PolicyEvaluation>();} 
    : (expr1=show)* {peList.add($expr1.value);} 
    { 
    System.out.println("Entered policyGroup rule"); 
    $value = peList; 
    } 
    ; 

// evaluate a single SHOW statement 
show returns [PolicyEvaluation value] 
    : ('SHOW' expr1=STRING 'FOR')? expr2=ifStatement EOL* 
    { 
    System.out.println("Entered show rule"); 
    Boolean expr2Value = (Boolean) $expr2.value; 
    PolicyEvaluation pe = new PolicyEvaluation(); 
    if (expr1 == null) { 
     pe.setValue(expr2Value); 
     pe.setMessage(null); 
    } else { 
     if (expr2Value == false) { 
      pe.setValue(false); 
      pe.setMessage(expr1.getText()); 
     } else { 
      pe.setValue(true); 
      pe.setMessage(null); 
     } 
    } 
    $value = pe; 
    } 
    ; 
// rules leading up to the show rule 
// domain-specific grammar rules 
STRING: '"' ID (' ' ID)* '"' 
    { 
    System.out.println("Entered STRING lexer rule"); 
    // strip the quotes once we match this token 
    setText(getText().substring(1, getText().length()-1)); 
    } 
    ; 
COMMENT: ';' (ID|' ')* EOL {$channel = HIDDEN;}; 
EOL: ('\r'|'\n'|'\r\n') {$channel = HIDDEN;}; 
SPACE: ' ' {$channel = HIDDEN;}; 

也許這是簡單的東西。任何幫助表示讚賞。

傑森

回答

3

嘗試修改此:(expr1=show)* {peList.add($expr1.value);}

這樣的:(expr1=show {peList.add($expr1.value);})*

,因爲它只會火畢竟show比賽已經完成,留下你的最後一個expr1操作動作。

+0

這樣做。謝謝。 – Jason

+0

來自我的額外感謝。這幫了我很多。 –