diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/lexer.c | 41 | ||||
-rw-r--r-- | src/lexer.h | 6 | ||||
-rw-r--r-- | src/parser.c | 18 |
3 files changed, 44 insertions, 21 deletions
diff --git a/src/lexer.c b/src/lexer.c index bbf29fc..e5f232b 100644 --- a/src/lexer.c +++ b/src/lexer.c @@ -151,9 +151,32 @@ lexer_next_token(lexer_t *lexer, token_t *token) return; } - if (lexer_current_char(lexer) == '+' || lexer_current_char(lexer) == '-' || lexer_current_char(lexer) == '*' || - lexer_current_char(lexer) == '/' || lexer_current_char(lexer) == '=') { - lexer_define_literal_token_props(lexer, token, TOKEN_OP); + if (lexer_current_char(lexer) == '+') { + lexer_define_literal_token_props(lexer, token, TOKEN_PLUS); + lexer_drop_char(lexer); + return; + } + + if (lexer_current_char(lexer) == '-') { + lexer_define_literal_token_props(lexer, token, TOKEN_MINUS); + lexer_drop_char(lexer); + return; + } + + if (lexer_current_char(lexer) == '*') { + lexer_define_literal_token_props(lexer, token, TOKEN_STAR); + lexer_drop_char(lexer); + return; + } + + if (lexer_current_char(lexer) == '/') { + lexer_define_literal_token_props(lexer, token, TOKEN_SLASH); + lexer_drop_char(lexer); + return; + } + + if (lexer_current_char(lexer) == '=') { + lexer_define_literal_token_props(lexer, token, TOKEN_EQUAL); lexer_drop_char(lexer); return; } @@ -248,8 +271,16 @@ token_kind_to_str(token_kind_t kind) return "}"; case TOKEN_NUMBER: return "TOKEN_NUMBER"; - case TOKEN_OP: - return "TOKEN_OP"; + case TOKEN_PLUS: + return "+"; + case TOKEN_MINUS: + return "-"; + case TOKEN_STAR: + return "*"; + case TOKEN_SLASH: + return "/"; + case TOKEN_EQUAL: + return "="; case TOKEN_EOF: return "TOKEN_EOF"; case TOKEN_UNKNOWN: diff --git a/src/lexer.h b/src/lexer.h index 8c84745..d4e84e1 100644 --- a/src/lexer.h +++ b/src/lexer.h @@ -32,7 +32,11 @@ typedef enum TOKEN_OCURLY, TOKEN_CCURLY, TOKEN_NUMBER, - TOKEN_OP, + TOKEN_PLUS, + TOKEN_MINUS, + TOKEN_STAR, + TOKEN_SLASH, + TOKEN_EQUAL, TOKEN_EOF, TOKEN_UNKNOWN } token_kind_t; diff --git a/src/parser.c b/src/parser.c index f3c6328..fd836af 100644 --- a/src/parser.c +++ b/src/parser.c @@ -138,8 +138,7 @@ parser_parse_term(parser_t *parser, ast_node_t *node) token_t token; lexer_next_token(parser->lexer, &token); - while (token.kind == TOKEN_OP && (string_view_eq(token.value, string_view_from_str("*")) || - string_view_eq(token.value, string_view_from_str("/")))) { + while (token.kind == TOKEN_STAR || token.kind == TOKEN_SLASH) { ast_node_t *left = ast_node_new(); *left = *node; @@ -173,8 +172,7 @@ parser_parse_expression(parser_t *parser, ast_node_t *node) token_t token; lexer_next_token(parser->lexer, &token); - while (token.kind == TOKEN_OP && (string_view_eq(token.value, string_view_from_str("+")) || - string_view_eq(token.value, string_view_from_str("-")))) { + while (token.kind == TOKEN_PLUS || token.kind == TOKEN_MINUS) { ast_node_t *left = ast_node_new(); *left = *node; @@ -220,19 +218,9 @@ parser_parse_variable_definition(parser_t *parser, string_view_t variable_name, token_t equal_token; - if (!expected_token(&equal_token, parser, TOKEN_OP)) + if (!expected_token(&equal_token, parser, TOKEN_EQUAL)) return false; - if (!string_view_eq(equal_token.value, string_view_from_str("="))) { - parser_error_t error; - error.token = equal_token; - - sprintf(error.message, "expected '=' but got " SVFMT, SVARG(&equal_token.value)); - - parser->errors[parser->errors_len++] = error; - return false; - } - ast_node_t *expression = ast_node_new(); if (!parser_parse_expression(parser, expression) || !drop_expected_token(parser, TOKEN_SEMICOLON)) { |