我对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 :(得分:0)
ANTLR3无法隐式处理这种情况,因此您会收到错误。使用ANTLR4,可以自动处理直接左递归(未扩散到多个规则的那些)。因此,如果您可以升级,请考虑这一点。
然而,解决左递归问题并不困难。最简单的方法可能是使用ANTLRWorks 1.5,它有一个菜单项来开始解析左递归。
答案 1 :(得分:0)
您可以尝试重写bexpr和bterm规则,如下所示:
bexpr : bterm (OR bterm)*;
bterm : bfactor (AND bfactor)*;