代码之家  ›  专栏  ›  技术社区  ›  Zev Spitz

互左递归规则

  •  0
  • Zev Spitz  · 技术社区  · 6 年前

    我有以下语法规则:

    CCExpression
        : LiteralExpression
        | CCParenthesizedExpression
        | CCSimpleNameExpression
        | CCCastExpression
        | CCOperatorExpression
        | CCConditionalExpression
        ;
    
    CCOperatorExpression
        : CCUnaryOperator CCExpression
        | CCExpression CCBinaryOperator CCExpression
        ;
    

    我得到以下错误:

    以下规则集是相互左递归的[cExpression,cOperatorExpression]


    我试着折叠 CCOperatorExpression 将规则放入 CCExpression 规则:

    CCExpression
        : CCExpression CCBinaryOperator CCExpression
        | CCUnaryOperator CCExpression
        | '(' CCExpression ')'
        | LiteralExpression
        | CCSimpleNameExpression
        | CCCastExpression
        | CCConditionalExpression
        ;
    

    但这似乎没有帮助。我仍然得到:

    以下规则集是相互左递归的[cExpression]

    我怎样才能解决这个问题?

    1 回复  |  直到 6 年前
        1
  •  0
  •   Bart Kiers    6 年前

    这是因为lexer规则不能保持递归,只有解析器规则可以。

    请参见: Practical difference between parser rules and lexer rules in ANTLR?