commit 62727304ba2258d24d069146c6f1859ca8eebdfc
parent 4a9c4747cbd5f9c50e0ef8641f48607ab12914c8
Author: erai <erai@omiltem.net>
Date: Sat, 16 Mar 2024 11:39:45 -0400
left assoc arithmetic
Diffstat:
M | cc0.c | | | 166 | +++++++++++++++++++++++++++++++++++++++++++++---------------------------------- |
M | cc1.c | | | 168 | +++++++++++++++++++++++++++++++++++++++++++++---------------------------------- |
M | cc2 | | | 0 | |
3 files changed, 189 insertions(+), 145 deletions(-)
diff --git a/cc0.c b/cc0.c
@@ -992,8 +992,8 @@ unary_expr(void)
// shift_expr := unary_expr
-// | unary_expr '<<' shift_expr
-// | unary_expr '>>' shift_expr
+// | shift_expr '<<' unary_expr
+// | shift_expr '>>' unary_expr
struct node *
shift_expr(void)
{
@@ -1005,30 +1005,36 @@ shift_expr(void)
return 0;
}
- if (tt == T_LSH) {
- feed();
-
- b = shift_expr();
+ while (1) {
+ if (tt == T_LSH) {
+ feed();
- return mknode(N_LSH, a, b);
- }
+ b = unary_expr();
+ if (!b) {
+ die("expected unary_expr");
+ }
- if (tt == T_RSH) {
- feed();
+ a = mknode(N_LSH, a, b);
+ } else if (tt == T_RSH) {
+ feed();
- b = shift_expr();
+ b = unary_expr();
+ if (!b) {
+ die("expected unary_expr");
+ }
- return mknode(N_RSH, a, b);
+ a = mknode(N_RSH, a, b);
+ } else {
+ return a;
+ }
}
-
- return a;
}
// mul_expr := shift_expr
-// | shift_expr '*' mul_expr
-// | shift_expr '/' mul_expr
-// | shift_expr '%' mul_expr
-// | shift_expr '&' mul_expr
+// | mul_expr '*' shift_expr
+// | mul_expr '/' shift_expr
+// | mul_expr '%' shift_expr
+// | mul_expr '&' shift_expr
struct node *
mul_expr(void)
{
@@ -1040,46 +1046,54 @@ mul_expr(void)
return 0;
}
- if (tt == T_STAR) {
- feed();
-
- b = mul_expr();
-
- return mknode(N_MUL, a, b);
- }
-
- if (tt == T_DIV) {
- feed();
+ while (1) {
+ if (tt == T_STAR) {
+ feed();
- b = mul_expr();
+ b = shift_expr();
+ if (!b) {
+ die("expected shift_expr");
+ }
- return mknode(N_DIV, a, b);
- }
+ a = mknode(N_MUL, a, b);
+ } else if (tt == T_DIV) {
+ feed();
- if (tt == T_MOD) {
- feed();
+ b = shift_expr();
+ if (!b) {
+ die("expected shift_expr");
+ }
- b = mul_expr();
+ a = mknode(N_DIV, a, b);
+ } else if (tt == T_MOD) {
+ feed();
- return mknode(N_MOD, a, b);
- }
+ b = shift_expr();
+ if (!b) {
+ die("expected shift_expr");
+ }
- if (tt == T_AMP) {
- feed();
+ a = mknode(N_MOD, a, b);
+ } else if (tt == T_AMP) {
+ feed();
- b = mul_expr();
+ b = shift_expr();
+ if (!b) {
+ die("expected shift_expr");
+ }
- return mknode(N_AND, a, b);
+ a = mknode(N_AND, a, b);
+ } else {
+ return a;
+ }
}
-
- return a;
}
// add_expr := mul_expr
-// | mul_expr '+' add_expr
-// | mul_expr '-' add_expr
-// | mul_expr '|' add_expr
-// | mul_expr '^' add_expr
+// | add_expr '+' mul_expr
+// | add_expr '-' mul_expr
+// | add_expr '|' mul_expr
+// | add_expr '^' mul_expr
struct node *
add_expr(void)
{
@@ -1091,39 +1105,47 @@ add_expr(void)
return 0;
}
- if (tt == T_ADD) {
- feed();
-
- b = add_expr();
-
- return mknode(N_ADD, a, b);
- }
-
- if (tt == T_SUB) {
- feed();
+ while (1) {
+ if (tt == T_ADD) {
+ feed();
- b = add_expr();
+ b = mul_expr();
+ if (!b) {
+ die("expected mul_expr");
+ }
- return mknode(N_SUB, a, b);
- }
+ a = mknode(N_ADD, a, b);
+ } else if (tt == T_SUB) {
+ feed();
- if (tt == T_OR) {
- feed();
+ b = mul_expr();
+ if (!b) {
+ die("expected mul_expr");
+ }
- b = add_expr();
+ a = mknode(N_SUB, a, b);
+ } else if (tt == T_OR) {
+ feed();
- return mknode(N_OR, a, b);
- }
+ b = mul_expr();
+ if (!b) {
+ die("expected mul_expr");
+ }
- if (tt == T_XOR) {
- feed();
+ a = mknode(N_OR, a, b);
+ } else if (tt == T_XOR) {
+ feed();
- b = add_expr();
+ b = mul_expr();
+ if (!b) {
+ die("expected mul_expr");
+ }
- return mknode(N_XOR, a, b);
+ a = mknode(N_XOR, a, b);
+ } else {
+ return a;
+ }
}
-
- return a;
}
// comp_expr := add_expr
@@ -1214,8 +1236,8 @@ comp_expr(void)
}
// bool_expr := bool_expr
-// | add_expr '&&' bool_expr
-// | add_expr '||' bool_expr
+// | comp_expr '&&' bool_expr
+// | comp_expr '||' bool_expr
struct node *
bool_expr(void)
{
diff --git a/cc1.c b/cc1.c
@@ -1188,8 +1188,8 @@ parse_unary_expr(c: *compiler): *node {
// shift_expr := unary_expr
-// | unary_expr '<<' shift_expr
-// | unary_expr '>>' shift_expr
+// | shift_expr '<<' unary_expr
+// | shift_expr '>>' unary_expr
parse_shift_expr(c: *compiler): *node {
var a: *node;
var b: *node;
@@ -1199,30 +1199,36 @@ parse_shift_expr(c: *compiler): *node {
return 0:*node;
}
- if (c.tt == T_LSH) {
- feed(c);
-
- b = parse_shift_expr(c);
+ loop {
+ if (c.tt == T_LSH) {
+ feed(c);
- return mknode(c, N_LSH, a, b);
- }
+ b = parse_unary_expr(c);
+ if (!b) {
+ die(c, "expected unary_expr");
+ }
- if (c.tt == T_RSH) {
- feed(c);
+ a = mknode(c, N_LSH, a, b);
+ } else if (c.tt == T_RSH) {
+ feed(c);
- b = parse_shift_expr(c);
+ b = parse_unary_expr(c);
+ if (!b) {
+ die(c, "expected unary_expr");
+ }
- return mknode(c, N_RSH, a, b);
+ a = mknode(c, N_RSH, a, b);
+ } else {
+ return a;
+ }
}
-
- return a;
}
// mul_expr := shift_expr
-// | shift_expr '*' mul_expr
-// | shift_expr '/' mul_expr
-// | shift_expr '%' mul_expr
-// | shift_expr '&' mul_expr
+// | mul_expr '*' shift_expr
+// | mul_expr '/' shift_expr
+// | mul_expr '%' shift_expr
+// | mul_expr '&' shift_expr
parse_mul_expr(c: *compiler): *node {
var a: *node;
var b: *node;
@@ -1232,46 +1238,54 @@ parse_mul_expr(c: *compiler): *node {
return 0:*node;
}
- if (c.tt == T_STAR) {
- feed(c);
-
- b = parse_mul_expr(c);
-
- return mknode(c, N_MUL, a, b);
- }
-
- if (c.tt == T_DIV) {
- feed(c);
+ loop {
+ if (c.tt == T_STAR) {
+ feed(c);
- b = parse_mul_expr(c);
+ b = parse_shift_expr(c);
+ if (!b) {
+ die(c, "expected shift_expr");
+ }
- return mknode(c, N_DIV, a, b);
- }
+ a = mknode(c, N_MUL, a, b);
+ } else if (c.tt == T_DIV) {
+ feed(c);
- if (c.tt == T_MOD) {
- feed(c);
+ b = parse_shift_expr(c);
+ if (!b) {
+ die(c, "expected shift_expr");
+ }
- b = parse_mul_expr(c);
+ a = mknode(c, N_DIV, a, b);
+ } else if (c.tt == T_MOD) {
+ feed(c);
- return mknode(c, N_MOD, a, b);
- }
+ b = parse_shift_expr(c);
+ if (!b) {
+ die(c, "expected shift_expr");
+ }
- if (c.tt == T_AMP) {
- feed(c);
+ a = mknode(c, N_MOD, a, b);
+ } else if (c.tt == T_AMP) {
+ feed(c);
- b = parse_mul_expr(c);
+ b = parse_shift_expr(c);
+ if (!b) {
+ die(c, "expected shift_expr");
+ }
- return mknode(c, N_AND, a, b);
+ a = mknode(c, N_AND, a, b);
+ } else {
+ return a;
+ }
}
-
- return a;
}
// add_expr := mul_expr
-// | mul_expr '+' add_expr
-// | mul_expr '-' add_expr
-// | mul_expr '|' add_expr
-// | mul_expr '^' add_expr
+// | add_expr '+' mul_expr
+// | add_expr '-' mul_expr
+// | add_expr '|' mul_expr
+// | add_expr '^' mul_expr
parse_add_expr(c: *compiler): *node {
var a: *node;
var b: *node;
@@ -1281,39 +1295,47 @@ parse_add_expr(c: *compiler): *node {
return 0:*node;
}
- if (c.tt == T_ADD) {
- feed(c);
-
- b = parse_add_expr(c);
-
- return mknode(c, N_ADD, a, b);
- }
-
- if (c.tt == T_SUB) {
- feed(c);
+ loop {
+ if (c.tt == T_ADD) {
+ feed(c);
- b = parse_add_expr(c);
+ b = parse_mul_expr(c);
+ if (!b) {
+ die(c, "expected mul_expr");
+ }
- return mknode(c, N_SUB, a, b);
- }
+ a = mknode(c, N_ADD, a, b);
+ } else if (c.tt == T_SUB) {
+ feed(c);
- if (c.tt == T_OR) {
- feed(c);
+ b = parse_mul_expr(c);
+ if (!b) {
+ die(c, "expected mul_expr");
+ }
- b = parse_add_expr(c);
+ a = mknode(c, N_SUB, a, b);
+ } else if (c.tt == T_OR) {
+ feed(c);
- return mknode(c, N_OR, a, b);
- }
+ b = parse_mul_expr(c);
+ if (!b) {
+ die(c, "expected mul_expr");
+ }
- if (c.tt == T_XOR) {
- feed(c);
+ a = mknode(c, N_OR, a, b);
+ } else if (c.tt == T_XOR) {
+ feed(c);
- b = parse_add_expr(c);
+ b = parse_mul_expr(c);
+ if (!b) {
+ die(c, "expected mul_expr");
+ }
- return mknode(c, N_XOR, a, b);
+ a = mknode(c, N_XOR, a, b);
+ } else {
+ return a;
+ }
}
-
- return a;
}
// comp_expr := add_expr
@@ -1402,8 +1424,8 @@ parse_comp_expr(c: *compiler): *node {
}
// bool_expr := bool_expr
-// | add_expr '&&' bool_expr
-// | add_expr '||' bool_expr
+// | bool_expr '&&' comp_expr
+// | bool_expr '||' comp_expr
parse_bool_expr(c: *compiler): *node {
var a: *node;
var b: *node;
@@ -1482,7 +1504,7 @@ parse_if_stmt(c: *compiler): *node {
loop {
a = parse_expr(c);
- if (!a) {
+ if !a {
die(c, "expected expr");
}
diff --git a/cc2 b/cc2
Binary files differ.