aboutsummaryrefslogtreecommitdiffhomepage
path: root/lex.c
diff options
context:
space:
mode:
authorlemon <lsof@mailbox.org>2023-05-27 14:36:23 +0200
committerlemon <lsof@mailbox.org>2023-05-27 14:36:23 +0200
commit0f53520c5ee5f07ec2ba0361172fd72bd1456ad4 (patch)
tree6ba8c3bb92dbe451ac7b36fabfa27021c79e1a45 /lex.c
parent640a3dac2b18d037169af15dfd5502c386c7e828 (diff)
recursive descent -> precedence climbing parser
Diffstat (limited to 'lex.c')
-rw-r--r--lex.c10
1 files changed, 5 insertions, 5 deletions
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;