ANTLR4 - 相互左递归语法

时间:2015-06-19 15:55:48

标签: antlr antlr4

我收到错误:The following sets of rules are mutually left-recursive [symbolExpression]。在我的语法中,symbolExpression是直接左递归的,所以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;

1 个答案:

答案 0 :(得分:0)

规则'symbolExpression'中的元素'symbolExpression'和'operation'是相互依赖的递归。

在不了解语言规范的情况下,无法说出语言本身是否具有不可挽回的模糊性。

尽管如此,尝试的一种途径是重构语法以移动重复的句子,例如

( operation | value )

(operation | values | value | symbolExpression)

以他们自己的规则为目标,将“操作”和“symbolExpression”(以及可能的“bracketedSymbolExpression”)规则统一到一个规则中 - 一个至多是自我左递归的规则。像

这样的东西
a : value
  | LPAREN a* RPAREN
  | LBRACK a* LBRACK
  | a SYMBOL a
  | a ( COMMA a )+
  ;