os

An operating system
git clone https://erai.gay/code/os/
Log | Files | Refs | README | LICENSE

commit 62727304ba2258d24d069146c6f1859ca8eebdfc
parent 4a9c4747cbd5f9c50e0ef8641f48607ab12914c8
Author: erai <erai@omiltem.net>
Date:   Sat, 16 Mar 2024 11:39:45 -0400

left assoc arithmetic

Diffstat:
Mcc0.c | 166+++++++++++++++++++++++++++++++++++++++++++++----------------------------------
Mcc1.c | 168+++++++++++++++++++++++++++++++++++++++++++++----------------------------------
Mcc2 | 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.