如何以非递归的方式编写Antlr规则?

如何以非递归的方式编写Antlr规则?,antlr,antlr4,Antlr,Antlr4,我需要解析以下表达式 and(true, false) or(true, false, true) not(or(true, false, true)) and(and(true, false), false) or(or(true, false, true), true) 到目前为止,我有以下语法 expr : orExpr ; orExpr : OR '(' andExpr (',' andExpr)+ ')' | andExpr ; andEx

我需要解析以下表达式

and(true, false)
or(true, false, true)
not(or(true, false, true))
and(and(true, false), false)
or(or(true, false, true), true)
到目前为止,我有以下语法

expr
    : orExpr
    ;

orExpr
    : OR '(' andExpr (',' andExpr)+ ')'
    | andExpr
    ;

andExpr
    : AND '(' equalityExpr (',' equalityExpr)+ ')'
    | equalityExpr
    ;

equalityExpr
    : comparison ((EQUALS | NOT_EQUALS) comparison)*
    ;

comparison
    : notExpr ((GREATER_THAN_EQUALS | LESS_THAN_EQUALS | GREATER_THAN | LESS_THAN ) notExpr)?
    ;

notExpr
    : NOT '(' expr ')'
    | primary
    ;

primary
    : '(' expr ')'
    | true
    | false
    ;
我不能用上述语法解析
和(和(真,假,假)
?我哪里做错了

请假定
之间有优先权,而不是
(尽管我知道这看起来可能没有必要)

但是现在,我需要能够解析
true=and(5=5,4=4,3>2)
,反之亦然
和(5=5,4=4,3>2)=true

在这种情况下,绝对没有必要把事情复杂化。你所要做的就是:

grammar Test;

parse
 : expr EOF
 ;

expr
 : '(' expr ')'
 | OR '(' expr (',' expr)+ ')'
 | AND '(' expr (',' expr)+ ')'
 | NOT '(' expr ')'
 | expr (LT | LTE | GT | GTE) expr
 | expr (EQ | NEQ) expr
 | TRUE
 | FALSE
 | INT
 ;

LT    : '<';
LTE   : '<=';
GT    : '>';
GTE   : '>=';
NEQ   : '!=';
EQ    : '=';
NOT   : 'not';
TRUE  : 'true';
FALSE : 'false';
AND   : 'and';
OR    : 'or';

INT
 : [0-9]+
 ;

SPACES
 : [ \t\r\n] -> skip
 ;
语法测试;
作语法分析
:expr EOF
;
expr
:“('expr')”
|或“('expr(','expr)+')”
|和“('expr(','expr)+')”
|不是“(“expr”)”
|expr(LT | LTE | GT | GTE)expr
|expr(EQ | NEQ)expr
|真的
|假的
|INT
;
LT:'=';
NEQ:“!=”;
等式:'=';
不是‘不是’;
真:‘真’;
假:‘假’;
和:'和';
或:‘或’;
国际的
: [0-9]+
;
空间
:[\t\r\n]->跳过
;
但是现在,我需要能够解析
true=and(5=5,4=4,3>2)
,反之亦然
和(5=5,4=4,3>2)=true

在这种情况下,绝对没有必要把事情复杂化。你所要做的就是:

grammar Test;

parse
 : expr EOF
 ;

expr
 : '(' expr ')'
 | OR '(' expr (',' expr)+ ')'
 | AND '(' expr (',' expr)+ ')'
 | NOT '(' expr ')'
 | expr (LT | LTE | GT | GTE) expr
 | expr (EQ | NEQ) expr
 | TRUE
 | FALSE
 | INT
 ;

LT    : '<';
LTE   : '<=';
GT    : '>';
GTE   : '>=';
NEQ   : '!=';
EQ    : '=';
NOT   : 'not';
TRUE  : 'true';
FALSE : 'false';
AND   : 'and';
OR    : 'or';

INT
 : [0-9]+
 ;

SPACES
 : [ \t\r\n] -> skip
 ;
语法测试;
作语法分析
:expr EOF
;
expr
:“('expr')”
|或“('expr(','expr)+')”
|和“('expr(','expr)+')”
|不是“(“expr”)”
|expr(LT | LTE | GT | GTE)expr
|expr(EQ | NEQ)expr
|真的
|假的
|INT
;
LT:'=';
NEQ:“!=”;
等式:'=';
不是‘不是’;
真:‘真’;
假:‘假’;
和:'和';
或:‘或’;
国际的
: [0-9]+
;
空间
:[\t\r\n]->跳过
;


看起来这仍然是您试图解析的实际语言的一小部分。您能否编辑您的问题,使其包含一个包含所有可能运算符的完整表达式?您现在的问题可以通过更改为
或“('expr(','expr)+'”
和“('expr(','expr)+')”
来回答,但我怀疑这将解决您的所有问题。你的电话,发誓!这解决了大部分问题。当然也添加了比较规则。我只是想简化范围!现在我无法解析
true=and(5=5,4=4,3>2)
,反之亦然
and(5=5,4=4,3>2)=true
我理解,我只是试图简化范围,但这样做,你(很可能)遗漏了其他人需要给你一个好答案的信息。比较规则是我得到的最后一条规则。如果我在将来添加更多,如果我无法解决它,我将不得不发布另一个问题。但是现在,我需要能够解析true=和(5=5,4=4,3>2),或者反之亦然,和(5=5,4=4,3>2)=true?看起来这仍然是您试图解析的实际语言的一小部分。您能否编辑您的问题,使其包含一个包含所有可能运算符的完整表达式?您现在的问题可以通过更改为
或“('expr(','expr)+'”
和“('expr(','expr)+')”
来回答,但我怀疑这将解决您的所有问题。你的电话,发誓!这解决了大部分问题。当然也添加了比较规则。我只是想简化范围!现在我无法解析
true=and(5=5,4=4,3>2)
,反之亦然
and(5=5,4=4,3>2)=true
我理解,我只是试图简化范围,但这样做,你(很可能)遗漏了其他人需要给你一个好答案的信息。比较规则是我得到的最后一条规则。如果我在将来添加更多,如果我无法解决它,我将不得不发布另一个问题。但是现在,我需要能够解析true=and(5=5,4=4,3>2),或者反之亦然,以及(5=5,4=4,3>2)=true?这是有意义的。你能告诉我什么时候人们会尝试用非递归的方式做事吗?我认为递归是很糟糕的!不,不全是坏事。请注意,您这样做的方式已经是递归的了。你的意思可能是直接左递归。这也不错,但大多数解析器生成器不支持这一点(这在ANTLR4中是新的)。所以,既然它在ANTLR4中得到了支持,你也可以使用它,因为它大大简化了你的语法。我甚至不知道它是否有可能以非递归的方式实现?事实上,这是我的问题之一。如果你不想在表达式中任意嵌套,它肯定使用递归。不是直接的左递归规则,但它使用递归:
primary
规则中有一个
expr
规则。如果它立即匹配一个
expr
,而没有
,则它(主
规则)将是左递归的(“
在它前面。签出这个文档:这很有意义。你能告诉我什么时候人们会尝试以非递归的方式做事情吗?我认为递归都不好!不,也不都不好。请注意,你做这件事的方式已经是递归的。你可能指的是直接左递归。这也不坏,但大多数解析器都是这样做的发电机不支持这一点(这在ANTLR4中是新的).所以,既然它在ANTLR4中得到了支持,您也可以使用它,因为它大大简化了您的语法。我甚至不知道是否可以用非递归的方式进行操作?事实上,这是我的问题之一。如果您不想在表达式中任意嵌套,它当然使用递归。不是直接的左递归规则,而是使用recursion:
primary
规则中有一个
expr
规则。如果它立即匹配一个
expr
,而前面没有
('
),则它(
primary
规则)将保持递归状态。签出此文档: