左递归ANTLR语法
问题描述:
我是新来的语法和antlr。我写了一个语法,但得到一个左递归错误。谁能帮我这个 ?左递归ANTLR语法
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,表达] [12:41:35]因为下面的规则是相互左递归的而中止: [[Lang.primary_expression,index = 2,line = 19],[Lang.logical_and_expression,index = 5,line = 36],[Lang .logical_or_expression,index = 4,line = 31],[Lang.expression,index = 3,line = 24]]
更正语法:
grammar Lang;
options
{
// Note that in the C implementation, all implementations of trees and
// adaptors pass around pANTLR3_BASE_TREE, which contains a super pointer
// to your own implementation of a tree node and tree and so on. Hence
// the node type is ALWAYS pANTLR3_BASE_TREE and there is no need to define
// the type (the definition is silently ignored if you leave it there)
//
//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
: STRING
| STRING '&' logical_and_expression
;
/* We're going to ignore all white space characters */
WS
: (' ' | '\t' | '\r'| '\n') {$channel=HIDDEN;}
;
STRING
: ('a'..'z' | 'A'..'Z' | '0'..'9' | '_')+
;
答
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。 – 2013-02-22 08:18:45
对于v4,错误保持不变: – 2013-02-22 09:01:15
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] – 2013-02-22 09:01:33