From 108018e3e7326dabbbef568ab08bc5cebf5d427b Mon Sep 17 00:00:00 2001 From: dec05eba Date: Mon, 20 Jan 2020 23:00:39 +0100 Subject: Add arithmetic, implement hash map --- src/parser.c | 41 ++++++++++++++++++++++++++++++++++++----- 1 file changed, 36 insertions(+), 5 deletions(-) (limited to 'src/parser.c') diff --git a/src/parser.c b/src/parser.c index 176be63..45b4412 100644 --- a/src/parser.c +++ b/src/parser.c @@ -150,7 +150,7 @@ static int tsl_parser_parse_func_call(TslParser *self) { for(;;) { TslToken token = tsl_tokenizer_peek(&self->tokenizer); if(token == TSL_TOKEN_RPAREN) { - tsl_tokenizer_next(&self->tokenizer); /* consume previous TSL_TOKEN_RPAREN */ + tsl_tokenizer_consume_peek(&self->tokenizer); /* consume previous TSL_TOKEN_RPAREN */ return 0; } else { if(tsl_parser_parse_rhs(self) != 0) @@ -189,7 +189,7 @@ static int tsl_parser_parse_command(TslParser *self) { } } -/* RHS_SUB = VAR_INDEX|FUNC_CALL RHS_SUB? */ +/* RHS_SUB = (VAR_INDEX|FUNC_CALL RHS_SUB?)|(TOKEN_ARITHMETIC RHS) */ static int tsl_parser_parse_rhs_sub(TslParser *self) { TslToken token = tsl_tokenizer_peek(&self->tokenizer); if(token == TSL_TOKEN_LBRACKET) { @@ -200,6 +200,27 @@ static int tsl_parser_parse_rhs_sub(TslParser *self) { if(tsl_parser_parse_func_call(self) != 0) return -1; return tsl_parser_parse_rhs_sub(self); + } else if(token == TSL_TOKEN_ARITHMETIC) { + 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); + } + /* + No sub expression found, possibly a new expression after this (a new expression on a new line), let that + part of the code handle error if there is any instead. + */ + return 0; +} + +/* RHS_SUB_ARITHMETIC = TOKEN_ARITHMETIC RHS */ +static int tsl_parser_parse_rhs_sub_arithmetic(TslParser *self) { + TslToken token = tsl_tokenizer_peek(&self->tokenizer); + if(token == TSL_TOKEN_ARITHMETIC) { + 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); } /* No sub expression found, possibly a new expression after this (a new expression on a new line), let that @@ -213,10 +234,20 @@ int tsl_parser_parse_rhs(TslParser *self) { TslToken token = tsl_tokenizer_next(&self->tokenizer); if(token == TSL_TOKEN_IDENTIFIER) { TslStringView var_name = self->tokenizer.identifier; - printf("var: %.*s\n", (int)var_name.size, var_name.data); + 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) { - printf("rhs num: %ld\n", self->tokenizer.number_value); + TslRegister dst_reg = tsl_bytecode_writer_get_unique_register(&self->bytecode_writer); + if(dst_reg == -1) { + fprintf(stderr, "Error: Too many registers used\n"); + return -1; + } + + if(!tsl_bytecode_writer_load_number(&self->bytecode_writer, dst_reg, self->tokenizer.number_value)) + return -1; + + printf("rhs num: %f\n", self->tokenizer.number_value); + return tsl_parser_parse_rhs_sub_arithmetic(self); } else if(token == TSL_TOKEN_BOOL) { printf("rhs bool: %s\n", self->tokenizer.bool_value ? "true" : "false"); } else if(token == TSL_TOKEN_NULL) { @@ -249,7 +280,7 @@ int tsl_parser_parse_expressions(TslParser *self, TslToken end_token) { TslStringView identifier = self->tokenizer.identifier; printf("identifier: %.*s\n", identifier.size, identifier.data); if(tsl_tokenizer_peek(&self->tokenizer) == TSL_TOKEN_EQUAL) { - tsl_tokenizer_next(&self->tokenizer); /* consume previous TSL_TOKEN_EQUAL */ + tsl_tokenizer_consume_peek(&self->tokenizer); /* consume previous TSL_TOKEN_EQUAL */ if(tsl_parser_parse_rhs(self) != 0) return -1; } else { -- cgit v1.2.3