summaryrefslogtreecommitdiff
path: root/src/parser.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/parser.c')
-rw-r--r--src/parser.c21
1 files changed, 19 insertions, 2 deletions
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);
}