ANTLR 在 lambda 主体上匹配加法

ANTLR matches addition over lambda body

我有一个带有算术、布尔和 lambda 表达式的简单 ANTLR 语法。它错误地将 fun x -> x + 1 解析为 (fun x -> x) + 1 而不是 fun x -> (x +1),即使 lambda 规则位于加法规则之上。

expression
    : number                                                              # NumberExpr
    | bool                                                                # BooleanExpr
    | 'fun' args=ID+ '->' body=expression                                 # LambdaExpr
    | callee=expression args=expression+                                  # CallExpr
    | 'let' name=ID '=' value=expression 'in' body=expression             # LetExpr
    | name=ID                                                             # VarExpr
    | 'if' test=expression 'then' then=expression 'else' else_=expression # IfThenElseExpr
    | '(' inner=expression ')'                                            # ParensExpr
    | left=expression operator=MUL right=expression                       # MultiplicationExpr
    | left=expression operator=DIV right=expression                       # DivisionExpr
    | left=expression operator=ADD right=expression                       # AdditionExpr
    | left=expression operator=SUB right=expression                       # SubtractionExpr
    | left=expression operator=AND right=expression                       # AndExpr
    | left=expression operator=OR  right=expression                       # OrExpr
    | left=expression operator=EQ right=expression                        # EqExpr

不是虽然,但是因为

表达式a * b + c被解析为(a * b) + c,表达式a + b * c被解析为a + (b * c),因为乘法具有更高的优先级。

在您的情况下,lambda 优先于加法,因此 fun x -> x + 1 被解析为 (fun x -> x) + 1 并没有错,因为必须先执行高优先级操作,然后再执行低优先级操作。

只需将lambda规则移到加法规则下即可修复。