aboutsummaryrefslogtreecommitdiff
path: root/src/parser.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/parser.c')
-rw-r--r--src/parser.c41
1 files changed, 36 insertions, 5 deletions
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 {