2013-02-22 130 views
4

我是新来的语法和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' | '_')+ 
    ; 
+0

我正在使用antlrworks-1.4.3.jar。 – 2013-02-22 08:18:45

+0

对于v4,错误保持不变: – 2013-02-22 09:01:15

+0

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

回答

2

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') + 
    ;