2013-07-10 127 views
3

我不明白ANTLR4如何能夠使用直接let-recursion實際上幫助我們。好吧,你可以寫一個能識別語言的語法,沒關係。但你很少停留在這裏。通常你想用分析樹做一些事情。爲了得到一個直接的左遞歸而必須摺疊一些規則在這裏沒有幫助。ANTLR4中的相互左遞歸規則

一個例子。假設我想定義+和 - 運算符並希望它們具有相同的優先級。黃金我會寫這樣的事:

expression 
    : binaryExpression 
    | unaryExpression 
    ; 

binaryExpression 
    : plusExpression 
    | minusExpression 
    ; 

plusExpression 
    : expression '+' unaryExpression 

minusExpression 
    : expression '-' unaryExpression 

當然在ANTLR4我可以做

expression 
    : expression '+' unaryExpression 
    | expression '-' unaryExpression 
    | unaryExpression 
    ; 

但當生成的訪問者,我將只對expressionunaryExpression方法。當我訪問ExpressionContext時,我該怎麼知道該怎麼辦?它是一個附加或子系統嗎?

回答

2

我找到了答案here

一個能「標籤」的替代品是這樣的:

expression 
    : expression '+' unaryExpression # plusExpr 
    | expression '-' unaryExpression # minusExpr 
    | unaryExpression    # unaryExpr 
    ; 

這樣做之後,你會發現相應的基礎訪問者生成的方法。