使用ANTLR编码语法(相互左递归)

时间:2015-11-26 05:15:00

标签: antlr3

我对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上有一个相互左递归的问题:。我该如何删除此警告?我无法编译。谢谢你的帮助。

2 个答案:

答案 0 :(得分:0)

ANTLR3无法隐式处理这种情况,因此您会收到错误。使用ANTLR4,可以自动处理直接左递归(未扩散到多个规则的那些)。因此,如果您可以升级,请考虑这一点。

然而,解决左递归问题并不困难。最简单的方法可能是使用ANTLRWorks 1.5,它有一个菜单项来开始解析左递归。

答案 1 :(得分:0)

您可以尝试重写bexpr和bterm规则,如下所示:

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