summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/ast.c4
-rw-r--r--src/ast.h13
-rw-r--r--src/gas_assembly_generator.c11
-rw-r--r--src/parser.c21
4 files changed, 36 insertions, 13 deletions
diff --git a/src/ast.c b/src/ast.c
index 10bb79d..d8f406e 100644
--- a/src/ast.c
+++ b/src/ast.c
@@ -130,11 +130,11 @@ ast_literal_integer_create(ast_node_t *node, uint32_t number)
}
void
-ast_node_init_binary_operation(ast_node_t *node, string_view_t op, ast_node_t *left, ast_node_t *right)
+ast_node_init_binary_operation(ast_node_t *node, ast_binary_operation_kind_t kind, ast_node_t *left, ast_node_t *right)
{
node->accept_visitor = &ast_node_binary_operation_visitor;
node->kind = AST_BINARY_OPERATION;
- node->data = (ast_node_data_t){ .binary_operation = { .op = op, .left = left, .right = right } };
+ node->data = (ast_node_data_t){ .binary_operation = { .kind = kind, .left = left, .right = right } };
}
void
diff --git a/src/ast.h b/src/ast.h
index 0907635..267e8ba 100644
--- a/src/ast.h
+++ b/src/ast.h
@@ -42,10 +42,17 @@ typedef struct ast_function_declaration_t
vector_t *body;
} ast_function_declaration_t;
+typedef enum ast_binary_operation_kind_t
+{
+ AST_BINOP_ADITION,
+ AST_BINOP_SUBTRACTION,
+ AST_BINOP_MULTIPLICATION,
+ AST_BINOP_DIVISION
+} ast_binary_operation_kind_t;
+
typedef struct ast_binary_operation_t
{
- // FIXME: We want to use enum to distinguish operators
- string_view_t op;
+ ast_binary_operation_kind_t kind;
ast_node_t *left;
ast_node_t *right;
} ast_binary_operation_t;
@@ -123,7 +130,7 @@ void
ast_node_destroy(ast_node_t *node);
void
-ast_node_init_binary_operation(ast_node_t *node, string_view_t op, ast_node_t *left, ast_node_t *right);
+ast_node_init_binary_operation(ast_node_t *node, ast_binary_operation_kind_t kind, ast_node_t *left, ast_node_t *right);
void
ast_node_init_function_declaration(ast_node_t *node, string_view_t name, type_t return_type, vector_t *body);
void
diff --git a/src/gas_assembly_generator.c b/src/gas_assembly_generator.c
index 00897fd..bf98255 100644
--- a/src/gas_assembly_generator.c
+++ b/src/gas_assembly_generator.c
@@ -100,27 +100,26 @@ gas_assembly_generator_binary_operation(ast_visitor_t *visitor, ast_binary_opera
fprintf(gen->out, " pop %%rcx\n");
- if (string_view_eq(binary_operation->op, string_view_from_str("+"))) {
+ if (binary_operation->kind == AST_BINOP_ADITION) {
fprintf(gen->out, " add %%rcx, %%rax\n");
return;
}
- if (string_view_eq(binary_operation->op, string_view_from_str("-"))) {
+ if (binary_operation->kind == AST_BINOP_SUBTRACTION) {
fprintf(gen->out, " sub %%rcx, %%rax\n");
return;
}
- if (string_view_eq(binary_operation->op, string_view_from_str("*"))) {
+ if (binary_operation->kind == AST_BINOP_MULTIPLICATION) {
fprintf(gen->out, " mul %%rcx\n");
return;
}
- if (string_view_eq(binary_operation->op, string_view_from_str("/"))) {
+ if (binary_operation->kind == AST_BINOP_DIVISION) {
fprintf(gen->out, " xor %%rdx, %%rdx\n");
fprintf(gen->out, " div %%rcx\n");
return;
}
- fprintf(stderr, "no strategy defined for: " SVFMT "\n", SVARG(&binary_operation->op));
- assert(false);
+ assert(false && "No strategy defined for binary operation");
}
diff --git a/src/parser.c b/src/parser.c
index fd836af..e02d1fe 100644
--- a/src/parser.c
+++ b/src/parser.c
@@ -101,6 +101,23 @@ parser_literal_integer_node(ast_node_t *node, token_t *token)
return true;
}
+static ast_binary_operation_kind_t
+token_to_binary_operation_kind(token_t *token)
+{
+ switch (token->kind) {
+ case TOKEN_PLUS:
+ return AST_BINOP_ADITION;
+ case TOKEN_MINUS:
+ return AST_BINOP_SUBTRACTION;
+ case TOKEN_STAR:
+ return AST_BINOP_MULTIPLICATION;
+ case TOKEN_SLASH:
+ return AST_BINOP_DIVISION;
+ default:
+ assert(false && "token mapping not found.");
+ }
+}
+
bool
parser_parse_factor(parser_t *parser, ast_node_t *node)
{
@@ -146,7 +163,7 @@ parser_parse_term(parser_t *parser, ast_node_t *node)
if (!parser_parse_factor(parser, right))
return false;
- ast_node_init_binary_operation(node, token.value, left, right);
+ ast_node_init_binary_operation(node, token_to_binary_operation_kind(&token), left, right);
lexer_next_token(parser->lexer, &token);
}
@@ -180,7 +197,7 @@ parser_parse_expression(parser_t *parser, ast_node_t *node)
if (!parser_parse_term(parser, right))
return false;
- ast_node_init_binary_operation(node, token.value, left, right);
+ ast_node_init_binary_operation(node, token_to_binary_operation_kind(&token), left, right);
lexer_next_token(parser->lexer, &token);
}