diff options
| author | Paul Buetow <paul@buetow.org> | 2008-11-07 22:11:06 +0000 |
|---|---|---|
| committer | Paul Buetow <paul@buetow.org> | 2008-11-07 22:11:06 +0000 |
| commit | a46655f67043af257e70715903badf9d4321c4de (patch) | |
| tree | 556997ba868ac106c6f92703e6e35875e4872dc2 /src/core | |
| parent | fbff89d91c2a13155423bd83d2bbefd5d6891e23 (diff) | |
one step further for arrays.
Diffstat (limited to 'src/core')
| -rw-r--r-- | src/core/function.c | 46 | ||||
| -rw-r--r-- | src/core/interpret.c | 68 | ||||
| -rw-r--r-- | src/core/token.c | 4 |
3 files changed, 49 insertions, 69 deletions
diff --git a/src/core/function.c b/src/core/function.c index a102d7b..0df0b65 100644 --- a/src/core/function.c +++ b/src/core/function.c @@ -636,12 +636,27 @@ void function_process_buildin(Interpret *p_interpret, Token *p_token_ident, Stack *p_stack_args) { + Token *p_token = stack_top(p_stack_args); + + if (token_get_tt(p_token) == TT_ARRAY) { + ArrayIterator *p_iter = arrayiterator_new(p_token->p_array); + + while (arrayiterator_has_next(p_iter)) { + stack_push(p_stack_args, arrayiterator_next(p_iter)); + function_process_buildin(p_interpret, p_token_ident, + p_stack_args); + stack_pop(p_stack_args); + } + + arrayiterator_delete(p_iter); + + return; + } + if (strcmp("assert", token_get_val(p_token_ident)) == 0) { if (0 == stack_size(p_stack_args)) _FUNCTION_ERROR("No argument given", p_token_ident); - Token *p_token = stack_top(p_stack_args); - switch (token_get_tt(p_token)) { case TT_INTEGER: if (token_get_ival(p_token) == 0) @@ -655,9 +670,6 @@ function_process_buildin(Interpret *p_interpret, Token *p_token_ident, if (atoi(token_get_val(p_token)) == 0) _FUNCTION_ERROR("Assert failed", p_token); break; - case TT_ARRAY: - ERROR("ARRAY bla yet implemented"); - break; NO_DEFAULT; } @@ -665,7 +677,6 @@ function_process_buildin(Interpret *p_interpret, Token *p_token_ident, if (0 == stack_size(p_stack_args)) _FUNCTION_ERROR("No argument given", p_token_ident); - Token *p_token = stack_top(p_stack_args); switch (token_get_tt(p_token)) { case TT_INTEGER: token_set_ival(p_token, token_get_ival(p_token) - 1); @@ -677,9 +688,6 @@ function_process_buildin(Interpret *p_interpret, Token *p_token_ident, convert_to_integer(p_token); token_set_ival(p_token, token_get_ival(p_token) - 1); break; - case TT_ARRAY: - ERROR("ARRAY bla yet implemented"); - break; NO_DEFAULT; } @@ -707,7 +715,6 @@ function_process_buildin(Interpret *p_interpret, Token *p_token_ident, if (0 == stack_size(p_stack_args)) _FUNCTION_ERROR("No argument given", p_token_ident); - Token *p_token = stack_top(p_stack_args); p_token = token_new_copy(p_token); convert_to_integer(p_token); exit(token_get_ival(p_token)); @@ -716,7 +723,6 @@ function_process_buildin(Interpret *p_interpret, Token *p_token_ident, if (0 == stack_size(p_stack_args)) _FUNCTION_ERROR("No argument given", p_token_ident); - Token *p_token = stack_top(p_stack_args); switch (token_get_tt(p_token)) { case TT_INTEGER: token_set_ival(p_token, token_get_ival(p_token) + 1); @@ -728,9 +734,6 @@ function_process_buildin(Interpret *p_interpret, Token *p_token_ident, convert_to_integer(p_token); token_set_ival(p_token, token_get_ival(p_token) + 1); break; - case TT_ARRAY: - ERROR("ARRAY bla yet implemented"); - break; NO_DEFAULT; } @@ -763,9 +766,6 @@ function_process_buildin(Interpret *p_interpret, Token *p_token_ident, token_set_ival(p_token, -atoi(token_get_val(p_token))); token_set_tt(p_token, TT_INTEGER); break; - case TT_ARRAY: - ERROR("ARRAY bla yet implemented"); - break; NO_DEFAULT; } @@ -789,9 +789,6 @@ function_process_buildin(Interpret *p_interpret, Token *p_token_ident, token_set_ival(p_token, !atoi(token_get_val(p_token))); token_set_tt(p_token, TT_INTEGER); break; - case TT_ARRAY: - ERROR("ARRAY bla yet implemented"); - break; NO_DEFAULT; } } @@ -812,9 +809,6 @@ function_process_buildin(Interpret *p_interpret, Token *p_token_ident, case TT_STRING: printf("%s", token_get_val(p_token)); break; - case TT_ARRAY: - ERROR("ARRAY bla yet implemented"); - break; NO_DEFAULT; } } @@ -837,9 +831,6 @@ function_process_buildin(Interpret *p_interpret, Token *p_token_ident, case TT_STRING: printf("%s", token_get_val(p_token)); break; - case TT_ARRAY: - ERROR("ARRAY bla yet implemented"); - break; } } stackiterator_delete(p_iter); @@ -886,9 +877,6 @@ function_process_buildin(Interpret *p_interpret, Token *p_token_ident, token_set_ival(p_token, !atoi(token_get_val(p_token))); token_set_tt(p_token, TT_INTEGER); break; - case TT_ARRAY: - ERROR("ARRAY bla yet implemented"); - break; NO_DEFAULT; } diff --git a/src/core/interpret.c b/src/core/interpret.c index 67ebc22..cc1d87f 100644 --- a/src/core/interpret.c +++ b/src/core/interpret.c @@ -50,6 +50,7 @@ #define _CHECK if (p_interpret->p_token == NULL) return (0); #define _HAS_NEXT listiterator_has_next(p_interpret->p_iter) +#define _NEXT_ORG _next(p_interpret); #define _NEXT if (!_next(p_interpret)) { return (2); } #define _NEXT_TT _next_tt(p_interpret) #define _SKIP _next(p_interpret); @@ -146,6 +147,7 @@ _next(Interpret *p_interpret) { p_interpret->p_token = NULL; p_interpret->tt = TT_NONE; + //printf("==>\n"); return (0); } @@ -465,7 +467,8 @@ _expression(Interpret *p_interpret) { _CHECK TRACK if (_expression_(p_interpret)) { - if (p_interpret->tt == TT_SEMICOLON) { + TokenType tt = p_interpret->tt; + if (tt == TT_SEMICOLON || tt == TT_NONE) { _NEXT } else { @@ -798,13 +801,18 @@ _term(Interpret *p_interpret) { _CHECK TRACK switch (p_interpret->tt) { + case TT_STRING: case TT_INTEGER: case TT_DOUBLE: - case TT_STRING: case TT_ARRAY: stack_push(p_interpret->p_stack, p_interpret->p_token); - _NEXT - return (1); + // Checks if the term is the last element of an array + // say ["element"] # The "element" + // or of a function + // func foo { say 1 } # The 1 + if (_NEXT_TT != TT_PARANT_AR && _NEXT_TT != TT_PARANT_CR) + _NEXT + return (1); case TT_IDENT: { @@ -949,49 +957,29 @@ _term(Interpret *p_interpret) { } break; - /* - // Reference operator - case TT_AAND: + case TT_PARANT_AL: { - _NEXT - if (p_interpret->tt != TT_IDENT) - _INTERPRET_ERROR("Expexted identifier for '&'", - p_interpret->p_token); - - char *c_name = token_get_val(p_interpret->p_token); - Symbol *p_symbol = scope_get(p_interpret->p_scope, c_name); - - _INTERPRET_ERROR("nyi", p_interpret->p_token); - - _NEXT; - return (1); - } - break; + Token *p_token_arr = token_new_array(ARRAY_SIZE); + Array *p_array = p_token_arr->p_array; - // Dereference opeator - case TT_MULT: - { _NEXT - if (p_interpret->tt != TT_IDENT) - _INTERPRET_ERROR("Expexted identifier for '*'", - p_interpret->p_token); + // Get the array elements + while (p_interpret->tt != TT_PARANT_AR) { + TokenType tt = tt = p_interpret->tt; + if (tt != TT_COMMA && tt != TT_SEMICOLON) { + UNLESS (_expression_(p_interpret)) { + Token *p_token = p_interpret->p_token; + _INTERPRET_ERROR("Expected expression", p_token); + } + array_unshift(p_array, stack_pop(p_interpret->p_stack)); + } - _INTERPRET_ERROR("nyi", p_interpret->p_token); - _NEXT; - return (1); - } - break; - */ + _NEXT + } - case TT_PARANT_AL: - { - Token *p_token = p_interpret->p_token; + stack_push(p_interpret->p_stack, p_token_arr); _NEXT - - _INTERPRET_ERROR("arrays not yet fully implemented", p_token); - Token *p_token_arr = token_new_array(ARRAY_SIZE); - //stack_push(p_interpret->p_stack, p_token_arr); } break; diff --git a/src/core/token.c b/src/core/token.c index a60a790..8f8adb0 100644 --- a/src/core/token.c +++ b/src/core/token.c @@ -252,7 +252,10 @@ token_new_string(char *c_val) { Token* token_new_array(int i_size) { Token *p_token = token_new_dummy(); + token_set_tt(p_token, TT_ARRAY); + p_token->p_array = array_new(); + array_resize(p_token->p_array, i_size); return (p_token); @@ -415,3 +418,4 @@ token_print_cb(void *p_void) { token_print(p_token); printf("\n"); } + |
