From 6ff9c804aac5e85a638ce3997584d383b2260074 Mon Sep 17 00:00:00 2001 From: Hydrostic Date: Fri, 12 Jun 2026 11:42:34 +0800 Subject: [PATCH] fix(ast): Equality prior than rational --- src/ast/parser/expr.rs | 28 ++++++++++++++++++++++++---- 1 file changed, 24 insertions(+), 4 deletions(-) diff --git a/src/ast/parser/expr.rs b/src/ast/parser/expr.rs index f7e1c2f..d64e1a6 100644 --- a/src/ast/parser/expr.rs +++ b/src/ast/parser/expr.rs @@ -262,8 +262,6 @@ impl Parser { TokenValue::Greater => BinaryOp::Greater, TokenValue::LessEqual => BinaryOp::LessEqual, TokenValue::GreaterEqual => BinaryOp::GreaterEqual, - TokenValue::DoubleEqual => BinaryOp::Equal, - TokenValue::NotEqual => BinaryOp::NotEqual, _ => break, }; self.advance(1); @@ -280,15 +278,37 @@ impl Parser { } Ok(left) } - fn parse_logical_and(&mut self) -> Result { + fn parse_equality(&mut self) -> Result { let mut left = self.parse_relational()?; + loop { + let op = match self.peek().value { + TokenValue::DoubleEqual => BinaryOp::Equal, + TokenValue::NotEqual => BinaryOp::NotEqual, + _ => break, + }; + self.advance(1); + let right = self.parse_relational()?; + let span = Span::from_two(left.span, right.span); + left = Expr { + value: ExprValue::BinaryOp { + lhs: Box::new(left), + op, + rhs: Box::new(right), + }, + span, + }; + } + Ok(left) + } + fn parse_logical_and(&mut self) -> Result { + let mut left = self.parse_equality()?; loop { let op = match self.peek().value { TokenValue::And => BinaryOp::And, _ => break, }; self.advance(1); - let right = self.parse_relational()?; + let right = self.parse_equality()?; let span = Span::from_two(left.span, right.span); left = Expr { value: ExprValue::BinaryOp {