2015-11-26 42 views
0

我在ANTLR中有這種語法的代碼。用ANTLR編碼語法(相互左向遞歸)

grammar Booleanos; 

    //lexico 

    AND  : 'AND' || 'and' ; 
    OR   : 'OR' || 'or' ; 
    NOT  : 'NOT' || 'not'; 
    TRUE  : 'TRUE' || 'true' ; 
    FALSE  : 'FALSE' || 'false' ; 
    LPAREN  : '(' ; 
    RPAREN  : ')' ; 

    //sintactico 

    start : bexpr; 
    bexpr : bexpr OR bterm | bterm; 
    bterm : bterm AND bfactor | bfactor; 
    bfactor : NOT bfactor | LPAREN bexpr RPAREN | TRUE | FALSE; 

但我在bexpr:和bterm:上存在相互左遞歸問題。我如何刪除此警告?我無法編譯。謝謝你的幫助。

回答

0

ANTLR3不能隱式處理這種情況,因此你會得到錯誤。使用ANTLR4直接左遞歸(那些不在多個規則中傳播的)會自動處理。所以如果你可以升級,考慮一下。

但是,解決左遞歸併不困難。最簡單的方法可能是使用ANTLRWorks 1.5,它有一個菜單項來開始解決左遞歸。

0

你可以嘗試重寫你的bexpr和BTERM的規則是這樣的:

bexpr : bterm (OR bterm)*; 
bterm : bfactor (AND bfactor)*;