ANTLR4-互左递归语法

ANTLR4-互左递归语法,antlr,antlr4,Antlr,Antlr4,我得到一个错误:以下规则集是相互左递归的[symbolExpression]。在我的语法中,symbolExpression是直接左递归的,所以ANTLR4不应该处理这个问题吗 以下是我的解析器的相关部分: operation: OPERATOR '(' (operation | values | value | symbolExpression) ')' #OperatorExpression | bracketedSymb

我得到一个错误:
以下规则集是相互左递归的[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;

规则“symbolExpression”中的元素“symbolExpression”和“operation”是相互依赖的左递归元素

如果不知道语言规范,就不可能说语言本身是否具有不可恢复的歧义

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

( operation | value )

将“操作”和“符号表达式”(可能还有“括号内的符号表达式”)规则统一为一个规则,这是一个最多自左递归的规则。差不多

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

规则“symbolExpression”中的元素“symbolExpression”和“operation”是相互依赖的左递归元素

如果不知道语言规范,就不可能说语言本身是否具有不可恢复的歧义

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

( operation | value )

将“操作”和“符号表达式”(可能还有“括号内的符号表达式”)规则统一为一个规则,这是一个最多自左递归的规则。差不多

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

为什么
symbolExpression
operation
相互依赖地左递归<代码>符号表达式扩展为
操作
,但
操作
的规则以
运算符
开头(
。交互左递归如Antlr所定义,包括
symbolExpression
的间接递归(取决于
operation
)和
operation
的间接递归(取决于
symbolExpression
)乐(虽然我现在找不到)是的,我相信ANTLR可以处理自左递归,但不能处理相互左递归。然而,我认为这根本不是相互左递归的情况,因为
操作
不会在其左侧扩展为
符号表达式
。在其最左侧,它扩展为
运算符
,两者都是终端。您将“相互左递归”定义为需要涉及两个左递归规则。根据我之前的评论,Antlr显然对其进行了不同的定义。另外请注意,Antlr错误消息仅将一个规则
符号表达式
标识为相互左递归。您可能会在Github repo上就错误消息的清晰度提出问题。您是否可以提供一个链接来支持ANTLR使用不同的相互左递归定义?我找不到任何关于它的信息,这种情况似乎很奇怪。为什么
symbolExpression
operation
相互依赖左递归?
SymbolExpression
扩展为
操作
,但
操作
的规则以
运算符或
开始(
。交互左递归如Antlr所定义,包括
symbolExpression
的间接递归(取决于
operation
)和
operation
的间接递归(取决于
symbolExpression
)乐(虽然我现在找不到)是的,我相信ANTLR可以处理自左递归,但不能处理相互左递归。然而,我认为这根本不是相互左递归的情况,因为
操作
不会在其左侧扩展为
符号表达式
。在其最左侧,它扩展为
运算符
,两者都是终端。您将“相互左递归”定义为需要涉及两个左递归规则。根据我之前的评论,Antlr显然对其进行了不同的定义。另外请注意,Antlr错误消息仅将一个规则
符号表达式
标识为相互左递归。您可能会在Github repo上就错误消息的清晰度提出问题。您是否可以提供一个链接来支持ANTLR使用不同的相互左递归定义?我找不到任何关于它的信息,这种情况似乎很奇怪。为什么
symbolExpression
operation
相互依赖左递归?
SymbolExpression
扩展为
操作
,但
操作
的规则以
运算符或
开始(
。交互左递归如Antlr所定义,包括
symbolExpression
的间接递归(取决于
operation
)和
operation
的间接递归(取决于
symbolExpression
)乐(虽然我现在找不到)是的,我相信ANTLR可以处理自左递归,但不能处理相互左递归。然而,我认为这根本不是相互左递归的情况,因为
操作
不会在其左侧扩展为
符号表达式
。在其最左侧,它扩展为
运算符
,两者都是终端。您将“相互左递归”定义为需要涉及两个左递归规则。根据我之前的评论,Antlr显然对其进行了不同的定义。另外请注意,Antlr错误消息仅将一个规则
符号表达式
标识为相互左递归。您可能会在Github回购协议中就错误的明确性提出问题