2015-06-19 120 views
1

我收到错误:The following sets of rules are mutually left-recursive [symbolExpression]。在我的语法中,symbolExpression是直接左递归的,所以ANTLR4不应该处理这个问题吗?ANTLR4 - 相互左递归语法

这里是我的解析器的相关部分:

operation: 
     OPERATOR '(' (operation | values | value | symbolExpression) ')'      #OperatorExpression 
    | bracketedSymbolExpression                #BracketedOperatorExpression 
    ; 

symbolExpression: 
    (operation | values | value | symbolExpression) SYMBOL (operation | values | value | symbolExpression); 

bracketedSymbolExpression: 
    '(' (operation | values | value | symbolExpression) SYMBOL (operation | values | value | symbolExpression) ')'; 

list: '[' (operation | value) (',' (operation | value))* ']'; 

values: (operation | value) (',' (operation | value))+; 

value: 
    NUMBER 
    | IDENTIFIER 
    | list 
    | object; 

回答

0

“的元素symbolExpression”和规则“symbolExpression”操作'的相互依赖左递归。

不知道语言规范,不可能说语言本身是不可避免的含糊不清。

尽管如此,一个途径是尝试重构语法移动反复条款,如

(operation | value) 

(operation | values | value | symbolExpression) 

自己的规则,统一的“操作”的目标, 'symbolExpression'(也可能是'bracketedSymbolExpression')规则到一条规则 - 一个至多是自我左递归的规则。类似于

a : value 
    | LPAREN a* RPAREN 
    | LBRACK a* LBRACK 
    | a SYMBOL a 
    | a (COMMA a)+ 
    ; 
+0

为什么'''symbolExpression'''和''''''''''相互依赖地左递归? ''''SymbolExpression'''扩展到''''''',但''''''''操作规则从'''OPERATOR'''或''''开始('''。 –

+0

相左递归是Antlr定义的,它包括'symbolExpression'的间接递归,取决于'operation'和'operation',这取决于'symbolExpression'。IIRC,文档指出左递归规则不能引用另一个引用左递归的规则规则(尽管目前我无法找到它)。另请参见此[答案](http://stackoverflow.com/questions/20791690/how-to-avoid-mutual-left-recursion-in-antlr-4)。 – GRosenberg

+0

是的,我相信ANTLR可以处理自我左递归而不是相互左递归,但是我并不认为这是一个相互左递归的情况,因为“操作”没有扩展到''''symbolExpression'''在它的左边,在它的最左边,它扩展到''''('''''''OPERATOR'''都是终端。 –