From 0f53520c5ee5f07ec2ba0361172fd72bd1456ad4 Mon Sep 17 00:00:00 2001 From: lemon Date: Sat, 27 May 2023 14:36:23 +0200 Subject: recursive descent -> precedence climbing parser --- lex.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) (limited to 'lex.c') diff --git a/lex.c b/lex.c index 5cf12eb..bad05c8 100644 --- a/lex.c +++ b/lex.c @@ -368,7 +368,7 @@ Begin: } RET(c); case '%': - if (match(pr, '=')) RET(TKSETMOD); + if (match(pr, '=')) RET(TKSETREM); RET(c); case '^': if (match(pr, '=')) RET(TKSETXOR); @@ -687,7 +687,7 @@ Unary: while (nunop > 0) switch (unops[--nunop]) { - case '-': x = -x; break; + case '-': x = -(uvlong)x; break; case '~': x = ~x; break; case '!': x = !x; break; default: assert(0); @@ -700,9 +700,9 @@ Unary: y = expr(pr, &yu, opprec + 1); u = xu | yu; switch ((int) tk.t) { - case '+': x += y; break; - case '-': x -= y; break; - case '*': x *= y; break; + case '+': x += (uvlong) y; break; + case '-': x -= (uvlong) y; break; + case '*': x = u ? (uvlong) x * y : x * y; break; case '&': x &= y; break; case '^': x ^= y; break; case '|': x |= y; break; -- cgit v1.2.3