aboutsummaryrefslogtreecommitdiff
path: root/src/parser.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/parser.c')
-rw-r--r--src/parser.c22
1 files changed, 16 insertions, 6 deletions
diff --git a/src/parser.c b/src/parser.c
index e7fa99c..0c46f42 100644
--- a/src/parser.c
+++ b/src/parser.c
@@ -83,7 +83,17 @@ static TslParseResult tsl_parser_parse_map(TslParser *self, int *num_items) {
*num_items = 0;
for(;;) {
TslToken token = tsl_tokenizer_next(&self->tokenizer);
- if(token == TSL_TOKEN_NUM) {
+ if(token == TSL_TOKEN_STRING) {
+ ++*num_items;
+ return_if_error(tsl_bytecode_add_ins4(get_function_bytecode(self), TSL_OPCODE_LOADS, &self->tokenizer.string));
+ parse_map_element_separator
+ } else if(token == TSL_TOKEN_IDENTIFIER) {
+ /* Use the identifier as a key for the map. This is not a variable, but a key (string) without spaces */
+ /* This allows syntax like: variable = { key: "value" } */
+ ++*num_items;
+ return_if_error(tsl_bytecode_add_ins4(get_function_bytecode(self), TSL_OPCODE_LOADS, &self->tokenizer.identifier));
+ parse_map_element_separator
+ } else if(token == TSL_TOKEN_NUM) {
++*num_items;
return_if_error(tsl_bytecode_add_ins2(get_function_bytecode(self), TSL_OPCODE_LOADN, self->tokenizer.number_value));
parse_map_element_separator
@@ -95,10 +105,6 @@ static TslParseResult tsl_parser_parse_map(TslParser *self, int *num_items) {
++*num_items;
return_if_error(tsl_bytecode_add_ins5(get_function_bytecode(self), TSL_OPCODE_LOADNULL));
parse_map_element_separator
- } else if(token == TSL_TOKEN_STRING) {
- ++*num_items;
- return_if_error(tsl_bytecode_add_ins4(get_function_bytecode(self), TSL_OPCODE_LOADS, &self->tokenizer.string));
- parse_map_element_separator
} else if(token == TSL_TOKEN_RBRACE) {
/* '}' after trailing ',' or an empty map */
return TSL_PARSE_RESULT_OK;
@@ -125,7 +131,11 @@ static TslParseResult tsl_parser_parse_list(TslParser *self, int *num_items) {
for(;;) {
/* TODO: Use tsl_parser_parse_rhs instead */
TslToken token = tsl_tokenizer_next(&self->tokenizer);
- if(token == TSL_TOKEN_NUM) {
+ if(token == TSL_TOKEN_IDENTIFIER) {
+ ++*num_items;
+ return_if_error(tsl_bytecode_add_ins4(get_function_bytecode(self), TSL_OPCODE_LOADV, &self->tokenizer.identifier));
+ parse_list_element_separator
+ } else if(token == TSL_TOKEN_NUM) {
++*num_items;
return_if_error(tsl_bytecode_add_ins2(get_function_bytecode(self), TSL_OPCODE_LOADN, self->tokenizer.number_value));
parse_list_element_separator