From c4cd57533139e92485e9f97a439d9630a4153953 Mon Sep 17 00:00:00 2001 From: Kugel Fuhr <98353208+kugelfuhr@users.noreply.github.com> Date: Tue, 18 Nov 2025 14:35:29 +0100 Subject: [PATCH] Fix parsing boolean not (.not/!). --- src/ca65/expr.c | 57 +++++++++++++------------------------------------ 1 file changed, 15 insertions(+), 42 deletions(-) diff --git a/src/ca65/expr.c b/src/ca65/expr.c index 1391eddbd..cb77d0e1d 100644 --- a/src/ca65/expr.c +++ b/src/ca65/expr.c @@ -146,7 +146,7 @@ static void FreeExprNode (ExprNode* E) -static ExprNode* Expr0 (void); +static ExprNode* Expr1 (void); @@ -1106,6 +1106,18 @@ static ExprNode* Factor (void) NextTok (); break; + case TOK_BOOLNOT: + NextTok (); + L = Expr1 (); + if (IsEasyConst (L, &Val)) { + FreeExpr (L); + N = GenLiteralExpr (!Val); + } else { + N = NewExprNode (EXPR_BOOLNOT); + N->Left = L; + } + break; + case TOK_PLUS: NextTok (); N = Factor (); @@ -1159,7 +1171,7 @@ static ExprNode* Factor (void) case TOK_LPAREN: NextTok (); - N = Expr0 (); + N = Expr1 (); ConsumeRParen (); break; @@ -1652,51 +1664,12 @@ static ExprNode* Expr1 (void) -static ExprNode* Expr0 (void) -/* Boolean operators: NOT */ -{ - ExprNode* Root; - - /* Handle booleans */ - if (CurTok.Tok == TOK_BOOLNOT) { - - long Val; - ExprNode* Left; - - /* Skip the operator token */ - NextTok (); - - /* Read the argument */ - Left = Expr0 (); - - /* If the argument is const, evaluate it directly */ - if (IsEasyConst (Left, &Val)) { - FreeExpr (Left); - Root = GenLiteralExpr (!Val); - } else { - Root = NewExprNode (EXPR_BOOLNOT); - Root->Left = Left; - } - - } else { - - /* Read left hand side */ - Root = Expr1 (); - - } - - /* Return the expression tree we've created */ - return Root; -} - - - ExprNode* Expression (void) /* Evaluate an expression, build the expression tree on the heap and return ** a pointer to the root of the tree. */ { - return Expr0 (); + return Expr1 (); }