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规则移到加法规则下即可修复。
我有一个带有算术、布尔和 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规则移到加法规则下即可修复。