diff options
author | kdx <kikoodx@paranoici.org> | 2023-06-10 14:57:49 +0200 |
---|---|---|
committer | kdx <kikoodx@paranoici.org> | 2023-06-10 14:57:49 +0200 |
commit | 11a2e237efbadd3877f94e4352bc894ef9e77a2b (patch) | |
tree | 11475fc97046e8c92308b9b8a4d5a692513af82c | |
parent | a3df7db9414d675a49ad58da116a76f95bc8a5dc (diff) | |
download | golem-11a2e237efbadd3877f94e4352bc894ef9e77a2b.tar.gz |
and/or/xor
-rw-r--r-- | src/main.c | 78 |
1 files changed, 49 insertions, 29 deletions
@@ -155,6 +155,9 @@ typedef enum { NOD_NEQ, // != NOD_LT, // < NOD_LE, // <= + NOD_AND, // & + NOD_OR, // | + NOD_XOR, // ^ NOD_NUM, // integer NOD_BLOCK_STMT, NOD_EXPR_STMT, @@ -278,6 +281,7 @@ static Node *wrt_stmt(Token **rest, Token *tok); static Node *assign_stmt(Token **rest, Token *tok); static Node *ifelse_stmt(Token **rest, Token *tok); static Node *loop_stmt(Token **rest, Token *tok); +static Node *logical(Token **rest, Token *tok); static Node *equality(Token **rest, Token *tok); static Node *relational(Token **rest, Token *tok); static Node *add(Token **rest, Token *tok); @@ -342,15 +346,42 @@ local(Token **rest, Token *tok) static Node * expr(Token **rest, Token *tok) { - return equality(rest, tok); + return logical(rest, tok); } static Node +*logical(Token **rest, Token *tok) +{ + Node *node = equality(&tok, tok); + + for (;;) { + if (equal(tok, "&")) { + node = new_binary(NOD_AND, node, equality(&tok, tok->next)); + continue; + } + + if (equal(tok, "^")) { + node = new_binary(NOD_XOR, node, equality(&tok, tok->next)); + continue; + } + + if (equal(tok, "|")) { + node = new_binary(NOD_OR, node, equality(&tok, tok->next)); + continue; + } + + *rest = tok; + return node; + } +} + + +static Node *equality(Token **rest, Token *tok) { Node *node = relational(&tok, tok); -for (;;) { + for (;;) { if (equal(tok, "==")) { node = new_binary(NOD_EQU, node, relational(&tok, tok->next)); continue; @@ -631,36 +662,25 @@ gen_expr(Node *node) gen_expr(node->rhs); depth -= 1; + const char *op = NULL; switch (node->type) { - case NOD_ADD: - printf("\tADD\n"); - return; - case NOD_SUB: - printf("\tSUB\n"); - return; - case NOD_MUL: - printf("\tMUL\n"); - return; - case NOD_DIV: - printf("\tDIV\n"); - return; - case NOD_EQU: - printf("\tEQU\n"); - return; - case NOD_NEQ: - printf("\tNEQ\n"); - return; - case NOD_LT: - printf("\tLTH\n"); - return; - case NOD_LE: - printf("\tGTH NOT\n"); - return; - default: - break; + case NOD_ADD: op = "ADD"; break; + case NOD_SUB: op = "SUB"; break; + case NOD_MUL: op = "MUL"; break; + case NOD_DIV: op = "DIV"; break; + case NOD_EQU: op = "EQU"; break; + case NOD_NEQ: op = "NEQ"; break; + case NOD_LT: op = "LTH"; break; + case NOD_LE: op = "GTH NOT"; break; + case NOD_AND: op = "AND"; break; + case NOD_OR: op = "OR"; break; + case NOD_XOR: op = "XOR"; break; + default: break; } - error("invalid expression %d", node->type); + if (op == NULL) + error("invalid expression %d", node->type); + printf("\t%s\n", op); } static void |