2013-05-09 56 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