diff options
author | Charlie Brej <cbrej@cs.man.ac.uk> | 2009-10-04 17:46:59 +0100 |
---|---|---|
committer | root <cbrej@cs.man.ac.uk> | 2009-10-04 17:46:59 +0100 |
commit | dcd543c17d440bb70c35781bdd05f3396e7597b5 (patch) | |
tree | 2446950872d8efc551ca84bcf22fabdefafe73fa | |
parent | 9ca46671bbb21ed3cd56becf555229d553bc6a56 (diff) |
[script] Allow inline array definitions
This can be used to initialise an array:
arr = [12, 43]; // arr[0] = 12; arr[1] = 43;
Or create an empty object:
obj = [];
-rw-r--r-- | src/plugins/splash/script/script-execute.c | 28 | ||||
-rw-r--r-- | src/plugins/splash/script/script-parse.c | 49 | ||||
-rw-r--r-- | src/plugins/splash/script/script.h | 2 |
3 files changed, 78 insertions, 1 deletions
diff --git a/src/plugins/splash/script/script-execute.c b/src/plugins/splash/script/script-execute.c index 161186f1..7f16dd4e 100644 --- a/src/plugins/splash/script/script-execute.c +++ b/src/plugins/splash/script/script-execute.c @@ -125,6 +125,29 @@ static script_obj_t *script_evaluate_var (script_state_t *state, return obj; } +static script_obj_t *script_evaluate_set (script_state_t *state, + script_exp_t *exp) +{ + + ply_list_t *parameter_data = exp->data.parameters; + ply_list_node_t *node_data = ply_list_get_first_node (parameter_data); + int index = 0; + script_obj_t *obj = script_obj_new_hash (); + while (node_data) + { + script_exp_t *data_exp = ply_list_node_get_data (node_data); + script_obj_t *data_obj = script_evaluate (state, data_exp); + char *name; + asprintf (&name, "%d", index); + index++; + script_obj_hash_add_element (obj, data_obj, name); + free(name); + + node_data = ply_list_get_next_node (parameter_data, node_data); + } + return obj; +} + static script_obj_t *script_evaluate_assign (script_state_t *state, script_exp_t *exp) { @@ -444,6 +467,11 @@ static script_obj_t *script_evaluate (script_state_t *state, return state->this; } + case SCRIPT_EXP_TYPE_TERM_SET: + { + return script_evaluate_set (state, exp); + } + case SCRIPT_EXP_TYPE_TERM_VAR: { return script_evaluate_var (state, exp); diff --git a/src/plugins/splash/script/script-parse.c b/src/plugins/splash/script/script-parse.c index 1e02ac5d..bddba474 100644 --- a/src/plugins/splash/script/script-parse.c +++ b/src/plugins/splash/script/script-parse.c @@ -122,6 +122,14 @@ static script_exp_t *script_parse_new_exp_function_def (script_function_t return exp; } +static script_exp_t *script_parse_new_exp_set (ply_list_t *parameters, + script_debug_location_t *location) +{ + script_exp_t *exp = script_parse_new_exp(SCRIPT_EXP_TYPE_TERM_SET, location); + exp->data.parameters = parameters; + return exp; +} + static script_op_t *script_parse_new_op (script_op_type_t type, script_debug_location_t *location) { @@ -301,6 +309,33 @@ static script_exp_t *script_parse_exp_tm (script_scan_t *scan) script_scan_get_next_token (scan); return exp; } + + if (script_scan_token_is_symbol_of_value (curtoken, '[')) + { + ply_list_t *parameters = ply_list_new (); + script_debug_location_t location = curtoken->location; + script_scan_get_next_token (scan); + while (true) + { + if (script_scan_token_is_symbol_of_value (curtoken, ']')) break; + script_exp_t *parameter = script_parse_exp (scan); + + ply_list_append_data (parameters, parameter); + + curtoken = script_scan_get_current_token (scan); + if (script_scan_token_is_symbol_of_value (curtoken, ']')) break; + if (!script_scan_token_is_symbol_of_value (curtoken, ',')) + { + script_parse_error (&curtoken->location, + "Set parameters should be separated with a ',' and terminated with a ']'"); + return NULL; + } + curtoken = script_scan_get_next_token (scan); + } + script_scan_get_next_token (scan); + exp = script_parse_new_exp_set (parameters, &location); + return exp; + } if (script_scan_token_is_symbol_of_value (curtoken, '(')) { script_scan_get_next_token (scan); @@ -877,7 +912,19 @@ static void script_parse_exp_free (script_exp_t *exp) case SCRIPT_EXP_TYPE_TERM_GLOBAL: case SCRIPT_EXP_TYPE_TERM_THIS: break; - + case SCRIPT_EXP_TYPE_TERM_SET: + { + ply_list_node_t *node; + for (node = ply_list_get_first_node (exp->data.parameters); + node; + node = ply_list_get_next_node (exp->data.parameters, node)) + { + script_exp_t *sub = ply_list_node_get_data (node); + script_parse_exp_free (sub); + } + ply_list_free (exp->data.parameters); + break; + } case SCRIPT_EXP_TYPE_FUNCTION_EXE: { ply_list_node_t *node; diff --git a/src/plugins/splash/script/script.h b/src/plugins/splash/script/script.h index e4f6958b..391deca1 100644 --- a/src/plugins/splash/script/script.h +++ b/src/plugins/splash/script/script.h @@ -130,6 +130,7 @@ typedef enum SCRIPT_EXP_TYPE_TERM_LOCAL, SCRIPT_EXP_TYPE_TERM_GLOBAL, SCRIPT_EXP_TYPE_TERM_THIS, + SCRIPT_EXP_TYPE_TERM_SET, SCRIPT_EXP_TYPE_PLUS, SCRIPT_EXP_TYPE_MINUS, SCRIPT_EXP_TYPE_MUL, @@ -181,6 +182,7 @@ typedef struct script_exp_t struct script_exp_t *name; ply_list_t *parameters; } function_exe; + ply_list_t *parameters; script_function_t *function_def; } data; } script_exp_t; |