【问题标题】:ANTLR4 - Mutually left-recursive grammarANTLR4 - 相互左递归语法
【发布时间】:2015-06-19 15:55:48
【问题描述】:

我收到错误消息: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;

【问题讨论】:

    标签: antlr antlr4


    【解决方案1】:

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

    如果不了解语言规范,就无法说语言本身是否具有不可恢复的歧义。

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

    ( operation | value )
    

    (operation | values | value | symbolExpression)
    

    他们自己的规则,目的是将“操作”和“符号表达式”(也许还有“括号内的符号表达式”)规则统一为一个规则——一个最多是自左递归的规则。类似的东西

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

    【讨论】:

    • 为什么symbolExpressionoperation 相互依赖地左递归? SymbolExpression 扩展为operation,但operation 的规则以OPERATOR( 开头。
    • 相互左递归是 Antlr 定义的,它包括依赖于operationsymbolExpression 和依赖于symbolExpressionoperation 的间接递归。 IIRC,文档指出左递归规则不能引用另一个引用左递归规则的规则(尽管我目前找不到它)。另请参阅answer
    • 是的,我相信 ANTLR 可以处理自左递归,但不能处理相互左递归。但是,我认为这根本不是相互左递归的情况,因为operation 没有扩展到其左侧的symbolExpression。在最左边,它扩展为(OPERATOR,它们都是终端。
    • 您将“相互左递归”定义为需要涉及两个左递归规则。根据我之前的评论,Antlr 显然对它的定义不同。另请注意,Antlr 错误消息仅将一条规则 symbolExpression 标识为相互左递归。您可以在 Github 存储库中就错误消息的清晰度提出问题。
    • 您能否提供一个链接来支持 ANTLR 使用不同的相互左递归定义?我找不到任何关于它的信息,而且情况似乎很奇怪。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多