diff options
Diffstat (limited to 'src/parser.c')
-rw-r--r-- | src/parser.c | 40 |
1 files changed, 11 insertions, 29 deletions
diff --git a/src/parser.c b/src/parser.c index bad630e..39fff0c 100644 --- a/src/parser.c +++ b/src/parser.c @@ -16,7 +16,7 @@ typedef struct { TslHashMap variables; } TslParser; -static TslParseResult tsl_parser_parse_rhs(TslParser *self, TslRegister *reg_result); +static TslParseResult tsl_parser_parse_rhs(TslParser *self); static TslParseResult tsl_parser_parse_expressions(TslParser *self, TslToken end_token); static void tsl_parser_init(TslParser *self, const char *code, size_t code_size) { @@ -44,10 +44,9 @@ static uint64_t hash_string_view(const void *data, size_t size) { #endif static TslParseResult tsl_parser_parse_map(TslParser *self) { - TslRegister src_reg; #define parse_map_element_separator \ return_if_error(tsl_tokenizer_accept(&self->tokenizer, TSL_TOKEN_COLON)); \ - return_if_error(tsl_parser_parse_rhs(self, &src_reg)); \ + return_if_error(tsl_parser_parse_rhs(self)); \ token = tsl_tokenizer_next(&self->tokenizer); \ if(token == TSL_TOKEN_COMMA) { \ continue; \ @@ -155,9 +154,8 @@ static TslParseResult tsl_parser_parse_fn(TslParser *self) { /* VAR_INDEX = '[' RHS ']' */ static TslParseResult tsl_parser_parse_var_indexing(TslParser *self) { - TslRegister src_reg; return_if_error(tsl_tokenizer_accept(&self->tokenizer, TSL_TOKEN_LBRACKET)); - return_if_error(tsl_parser_parse_rhs(self, &src_reg)); + return_if_error(tsl_parser_parse_rhs(self)); return tsl_tokenizer_accept(&self->tokenizer, TSL_TOKEN_RBRACKET); } @@ -170,8 +168,7 @@ static TslParseResult tsl_parser_parse_func_call(TslParser *self) { tsl_tokenizer_consume_peek(&self->tokenizer); /* consume previous TSL_TOKEN_RPAREN */ return TSL_PARSE_RESULT_OK; } else { - TslRegister src_reg; - return_if_error(tsl_parser_parse_rhs(self, &src_reg)); + return_if_error(tsl_parser_parse_rhs(self)); token = tsl_tokenizer_next(&self->tokenizer); if(token == TSL_TOKEN_COMMA) { continue; @@ -214,11 +211,10 @@ static TslParseResult tsl_parser_parse_rhs_sub(TslParser *self) { return_if_error(tsl_parser_parse_func_call(self)); return tsl_parser_parse_rhs_sub(self); } else if(token == TSL_TOKEN_ARITHMETIC) { - TslRegister src_reg; tsl_tokenizer_consume_peek(&self->tokenizer); /* consume previous TSL_TOKEN_ARITHMETIC */ printf("rhs sub arithmetic symbol: %c\n", self->tokenizer.arithmetic_symbol); /* TODO: Handle arithmetic expression precedence */ - return tsl_parser_parse_rhs(self, &src_reg); + return tsl_parser_parse_rhs(self); } /* No sub expression found, possibly a new expression after this (a new expression on a new line), let that @@ -231,11 +227,10 @@ static TslParseResult tsl_parser_parse_rhs_sub(TslParser *self) { static TslParseResult tsl_parser_parse_rhs_sub_arithmetic(TslParser *self) { TslToken token = tsl_tokenizer_peek(&self->tokenizer); if(token == TSL_TOKEN_ARITHMETIC) { - TslRegister src_reg; tsl_tokenizer_consume_peek(&self->tokenizer); /* consume previous TSL_TOKEN_ARITHMETIC */ printf("rhs sub arithmetic symbol: %c\n", self->tokenizer.arithmetic_symbol); /* TODO: Handle arithmetic expression precedence */ - return tsl_parser_parse_rhs(self, &src_reg); + return tsl_parser_parse_rhs(self); } /* No sub expression found, possibly a new expression after this (a new expression on a new line), let that @@ -245,7 +240,7 @@ static TslParseResult tsl_parser_parse_rhs_sub_arithmetic(TslParser *self) { } /* RHS = (IDENTIFIER|NUM|BOOL|NULL|STRING|MAP|LIST|('fn' FN)|('$' COMMAND)) RHS_SUB? */ -TslParseResult tsl_parser_parse_rhs(TslParser *self, TslRegister *reg_result) { +TslParseResult tsl_parser_parse_rhs(TslParser *self) { TslToken token = tsl_tokenizer_next(&self->tokenizer); if(token == TSL_TOKEN_IDENTIFIER) { TslStringView var_name = self->tokenizer.identifier; @@ -253,18 +248,12 @@ TslParseResult tsl_parser_parse_rhs(TslParser *self, TslRegister *reg_result) { printf("rhs var: %.*s\n", (int)var_name.size, var_name.data); return tsl_parser_parse_rhs_sub(self); } else if(token == TSL_TOKEN_NUM) { - *reg_result = tsl_bytecode_writer_get_unique_register(&self->bytecode_writer); - if(*reg_result == -1) { - fprintf(stderr, "Error: Too many registers used\n"); - return TSL_PARSE_RESULT_ERR; - } - - return_if_error(tsl_bytecode_writer_load_number(&self->bytecode_writer, *reg_result, self->tokenizer.number_value)); + return_if_error(tsl_bytecode_writer_loadn(&self->bytecode_writer, self->tokenizer.number_value)); printf("rhs num: %f\n", self->tokenizer.number_value); return tsl_parser_parse_rhs_sub_arithmetic(self); } else if(token == TSL_TOKEN_BOOL) { - assert(0 && "TODO: Implement"); printf("rhs bool: %s\n", self->tokenizer.bool_value ? "true" : "false"); + return tsl_bytecode_writer_loadb(&self->bytecode_writer, self->tokenizer.bool_value); } else if(token == TSL_TOKEN_NULL) { assert(0 && "TODO: Implement"); printf("rhs null\n"); @@ -301,16 +290,9 @@ TslParseResult tsl_parser_parse_expressions(TslParser *self, TslToken end_token) TslStringView identifier = self->tokenizer.identifier; printf("identifier: %.*s\n", (int)identifier.size, identifier.data); if(tsl_tokenizer_peek(&self->tokenizer) == TSL_TOKEN_EQUAL) { - TslRegister dst_reg; - TslRegister src_reg; - tsl_tokenizer_consume_peek(&self->tokenizer); /* consume previous TSL_TOKEN_EQUAL */ - return_if_error(tsl_parser_parse_rhs(self, &src_reg)); - - dst_reg = tsl_bytecode_writer_get_unique_register(&self->bytecode_writer); - if(dst_reg < 0) - return TSL_PARSE_RESULT_ERR; - return_if_error(tsl_bytecode_writer_mov_reg(&self->bytecode_writer, dst_reg, src_reg)); + return_if_error(tsl_parser_parse_rhs(self)); + return_if_error(tsl_bytecode_writer_setv(&self->bytecode_writer, &identifier)); } else { return_if_error(tsl_parser_parse_rhs_sub(self)); } |