2015-11-26 33 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)*;