summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorkdx <kikoodx@paranoici.org>2023-06-10 14:57:49 +0200
committerkdx <kikoodx@paranoici.org>2023-06-10 14:57:49 +0200
commit11a2e237efbadd3877f94e4352bc894ef9e77a2b (patch)
tree11475fc97046e8c92308b9b8a4d5a692513af82c /src
parenta3df7db9414d675a49ad58da116a76f95bc8a5dc (diff)
downloadgolem-11a2e237efbadd3877f94e4352bc894ef9e77a2b.tar.gz
and/or/xor
Diffstat (limited to 'src')
-rw-r--r--src/main.c78
1 files changed, 49 insertions, 29 deletions
diff --git a/src/main.c b/src/main.c
index 966b004..a67f00c 100644
--- a/src/main.c
+++ b/src/main.c
@@ -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