如何以非递归的方式编写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
规则)将保持递归状态。签出此文档: