左递归ANTLR语法
我写了一个语法,但是得到了一个左递归错误左递归ANTLR语法,antlr,antlr3,antlrworks,left-recursion,Antlr,Antlr3,Antlrworks,Left Recursion,我写了一个语法,但是得到了一个左递归错误 grammar Lang; options { output = AST; language = C; ASTLabelType= pANTLR3_BASE_TREE; backtrack = true; } start : primary_expression+ ; primary_expression : '{' expression '}'
grammar Lang;
options
{
output = AST;
language = C;
ASTLabelType= pANTLR3_BASE_TREE;
backtrack = true;
}
start : primary_expression+
;
primary_expression
: '{' expression '}'
| expression ',' expression
;
expression
: logical_or_expression
| logical_or_expression '?' expression ':' expression
| logical_or_expression '?' ':' expression
| logical_or_expression '?' expression
;
logical_or_expression
: logical_and_expression
| logical_and_expression '|' logical_or_expression
;
logical_and_expression
: primary_expression
| primary_expression '&' logical_and_expression
;
我得到以下错误:
[12:41:35]错误(210):以下规则集是相互左递归的[primary_expression,logical_and_expression,logical_or_expression,expression][12:41:35]正在中止,因为以下规则是相互保留的递归规则: [[Lang.primary_表达式,索引=2,行=19],[Lang.logical_和_表达式,索引=5,行=36],[Lang.logical_或_表达式,索引=4,行=31],[Lang.expression,索引=3,行=24]]
修正语法
Antlr 4可以处理直接左递归,但不能处理间接左递归。在第一种情况下,“primary_expression”和“logical_and_expression:primary_expression…”形成了间接左递归。但现在antlr4无法生成“c”代码
grammar test3;
options
{
language = Java;
}
start :
expression+
;
expression :
primary_expression
| expression '&' expression
| expression '|' expression
| expression '?' expression ':' expression
| expression '?' expression
| expression '?' ':' expression
| expression ',' expression
| '{' expression '}'
;
primary_expression : // variable or constant definition, such as
VARIABLE
| NUMBER
;
VARIABLE :
('A'..'Z')+
;
NUMBER :
('0'..'9') +
;
我使用的是antlrworks-1.4.3.jar.v4,错误仍然是一样的:C:\Users\agupta\Desktop>java-cp antlr-4.0-complete.jar org.antlr.v4.Tool Lang4.g错误(119):Lang4.g:::以下规则集是相互左递归的[primary_expression,logical_and_expression,expression,logical_or_expression],正如我所说的,我是语法新手,所以这一定是个错误。你能建议我如何纠正这个问题吗。我只需要一个语法来处理以下=>,“{”}?”:“|”和“谢谢你的提示:)。我已经通过添加终端和生成代码来更正语法。
grammar test3;
options
{
language = Java;
}
start :
expression+
;
expression :
primary_expression
| expression '&' expression
| expression '|' expression
| expression '?' expression ':' expression
| expression '?' expression
| expression '?' ':' expression
| expression ',' expression
| '{' expression '}'
;
primary_expression : // variable or constant definition, such as
VARIABLE
| NUMBER
;
VARIABLE :
('A'..'Z')+
;
NUMBER :
('0'..'9') +
;