diff options
| author | 2023-05-27 14:36:23 +0200 | |
|---|---|---|
| committer | 2023-05-27 14:36:23 +0200 | |
| commit | 0f53520c5ee5f07ec2ba0361172fd72bd1456ad4 (patch) | |
| tree | 6ba8c3bb92dbe451ac7b36fabfa27021c79e1a45 /lex.c | |
| parent | 640a3dac2b18d037169af15dfd5502c386c7e828 (diff) | |
recursive descent -> precedence climbing parser
Diffstat (limited to 'lex.c')
| -rw-r--r-- | lex.c | 10 |
1 files changed, 5 insertions, 5 deletions
@@ -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; |