2013-05-09 51 views
2

我正在寫一個antlr語法,我希望能夠嵌套表達式,它可以是「簡單」表達式或布爾表達式(帶有可選的圓括號)。一個簡單的表達僅僅是一個與LHS和RHS,如a = 5antlr用於嵌套布爾表達式的左遞歸

我希望能夠支持這些類型的表達式:

a = 5 
a = 5 OR b = 10 
a = 5 OR (b = 10 AND c = 12) 
(a = 5 AND b = 10) OR (c = 12 AND D = 13) 

我的語法是這樣的:

STRING: CHAR+; 
fragment CHAR: ('a'..'z' | 'A'..'Z' | '0'..'9'); 

booleanOp: 'AND' | 'OR'; 
simpleExpr: STRING '=' STRING; 
expr: simpleExpr | parenExpr | booleanExpr; 
parenExpr: '(' expr ')'; 
booleanExpr: expr (booleanOp expr)+; 

我得到一個錯誤,exprbooleanExpr是相互左遞歸。我明白爲什麼這是發生的,但我真的不知道如何解決這個問題,如果我想能夠嵌套布爾表達式在彼此。

回答

2

論www.antlr.org你可以看到這個樣本語法主頁:

grammar Expr; 
    prog: (expr NEWLINE)* ; 
    expr: expr ('*'|'/') expr 
    | expr ('+'|'-') expr 
    | INT 
    | '(' expr ')' ; 

稍加修改,這將是你所需要的。這是ANTLR 4.你使用的是哪個版本?我確信ANTLR的每個版本都有一個表達語法樣本。

+0

我使用antlr3,但讓我試試4 ...它似乎更接受 – 2013-05-09 19:23:32

+1

是的,antlr4使它更容易,謝謝。 – 2013-05-09 19:45:16

+0

我想知道爲什麼expr規則沒有給出「左遞歸」錯誤。 – 2018-02-14 19:40:25