删除间接左递归(我不明白正式符号)

时间:2018-06-17 18:44:23

标签: antlr4 context-free-grammar left-recursion

我已经尝试寻找我的解决方案的答案,但我似乎无法围绕广义的解决方案。我无法弄清楚哪些元素映射为大写字母,哪些元素应该用小写字母表示,这无济于事。

这是我在Antlr语法中的一部分:

expression
    : literal
    | unaryExpression
    | binaryExpression
    | priorityExpression
    | invocation
    ;

binaryExpression: expression binaryOperator expression;

binaryOperator
    : ADD
    | SUBTRACT
    | DIVIDE
    | CONCAT
    | EQUALS
    | NOT_EQUALS
    | LESS_THAN
    | GREATER_THAN
    | MULTIPLY
    ;

我如何去除binaryExpression中的递归?

1 个答案:

答案 0 :(得分:1)

只需在binaryExpression中直接删除expression binaryOperator expression并使用expression

expression
    : literal
    | unaryExpression
    | expression binaryOperator expression
    | priorityExpression
    | invocation
    ;

binaryOperator
    : ADD
    | SUBTRACT
    | DIVIDE
    | CONCAT
    | EQUALS
    | NOT_EQUALS
    | LESS_THAN
    | GREATER_THAN
    | MULTIPLY
    ;

修改

  

但现在我丢失了AST中的二进制表达式节点,我必须稍后在代码中检测它

然后使用labels

expression
    : literal                              #literalExpr
    | unaryExpression                      #unaryExpr
    | expression binaryOperator expression #binaryExpr
    | priorityExpression                   #priorityExpr
    | invocation                           #invocationExpr
    ;

binaryOperator
    : ADD
    | SUBTRACT
    | DIVIDE
    | CONCAT
    | EQUALS
    | NOT_EQUALS
    | LESS_THAN
    | GREATER_THAN
    | MULTIPLY
    ;
  

此外,我希望更好地了解如何删除此递归而不是将其卸载到Antlr

你不能。 ANTLR根本不允许这种间接的左递归规则。只是直接左递归。