2013-04-29 46 views
1

我正在使用antlr生成生成抽象語法樹的解析器。我遇到了關於左聯合操作符的一些問題。我的語法是這樣的:如何處理ANTLR中的左聯想語法

add_expr returns [ASTNode value] 
    :a=mul_expr {$value = a;} 
    (
     o = ('+' | '-') b = add_expr 
     { 
     $value = new AddNode(a, b, $o.text); 
     } 
    )? 
    ; 
mul_expr returns [ASTNode value] 
    :a=term {$value = a;} 
    (
     o = ('*' | '/') b = mul_expr 
     { 
     $value = new MultiplyNode(a, b, $o.text); 
     } 
    )? 
    ; 

ADDNODE和MultiplyNode的構造是這樣的:

AddNote(ASTNode left, ASTNode right, String operatorr) 

問題是,輸入ABC,它被解析成類似A-(BC)而不是(ab)-c。 Antlr不接受左遞歸語法。如何修改語法以使左關聯語法在表達式中工作,如a-b-c?

回答

1

解析a-b-c不是作爲a-(b-c)而不是作爲(a-b)-c而是作爲a (-b) (-c),即,

additiveExpression 
: multiplicativeExpression 
    ( 
     ( '+' 
     | '-' 
     ) 
     multiplicativeExpression 
    )* 
; 

上述規則從Java grammar服用。保存文本並用編輯器讀取,因爲瀏覽器可能會忽略其中的行結束。