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回购协议中就错误的明确性提出问题