summaryrefslogtreecommitdiff
path: root/src/core/interpret.c
diff options
context:
space:
mode:
authorPaul Buetow <paul@buetow.org>2008-09-16 17:05:51 +0000
committerPaul Buetow <paul@buetow.org>2008-09-16 17:05:51 +0000
commit71185ab0ab0b08b4d5bb2e750ff85e11f105a453 (patch)
treea6ad933176f92b60d2f1560d2f1bac46ec6b9566 /src/core/interpret.c
parent8b31b18a43dea55489e70d5b2ea6fc183cc67533 (diff)
array progress
Diffstat (limited to 'src/core/interpret.c')
-rw-r--r--src/core/interpret.c65
1 files changed, 48 insertions, 17 deletions
diff --git a/src/core/interpret.c b/src/core/interpret.c
index 5aa07ef..c3f781c 100644
--- a/src/core/interpret.c
+++ b/src/core/interpret.c
@@ -54,15 +54,16 @@
#define _NEXT_TT _next_tt(p_interpret)
#define _SKIP _next(p_interpret);
-void _print_lookahead(Interpret *p_interpret);
+int __expression_get(Interpret *p_interpret, List *p_list_block);
+int __array_get(Interpret *p_interpret, Token *p_token_arr);
+void __print_lookahead(Interpret *p_interpret);
int _next(Interpret *p_interpret);
int _program(Interpret *p_interpret);
int _var_decl(Interpret *p_interpret);
int _var_assign(Interpret *p_interpret);
int _var_list(Interpret *p_interpret);
-int _expression_get(Interpret *p_interpret, List *p_list_block);
int _block_get(Interpret *p_interpret, List *p_list_block);
-int _block_skip(Interpret *p_interpret);
+int __block_skip(Interpret *p_interpret);
int _proc_decl(Interpret *p_interpret);
int _func_decl(Interpret *p_interpret);
int _statement(Interpret *p_interpret);
@@ -114,7 +115,7 @@ interpret_delete(Interpret *p_interpret) {
}
void
-_print_lookahead(Interpret *p_interpret) {
+__print_lookahead(Interpret *p_interpret) {
ListIterator *p_iter = p_interpret->p_iter;
ListIteratorState *p_state = listiterator_get_state(p_iter);
@@ -175,7 +176,6 @@ _var_decl(Interpret *p_interpret) {
_CHECK TRACK
switch (p_interpret->tt) {
- //case TT_ARR: //TODO cleanup TT_ARR
case TT_MY:
{
if (_NEXT_TT != TT_IDENT)
@@ -200,7 +200,7 @@ _var_decl(Interpret *p_interpret) {
}
}
default:
- break;
+ break;
}
return (0);
@@ -226,8 +226,8 @@ _var_assign(Interpret *p_interpret) {
p_interpret->p_stack = stack_new();
if (_expression_(p_interpret)) {
- function_process_buildin(p_interpret, p_token,
- p_interpret->p_stack);
+ function_process_buildin(p_interpret, p_token,
+ p_interpret->p_stack);
stack_merge(p_stack, p_interpret->p_stack);
stack_delete(p_interpret->p_stack);
@@ -236,7 +236,6 @@ _var_assign(Interpret *p_interpret) {
p_token = stack_top(p_interpret->p_stack);
Symbol *p_symbol = symbol_new(SYM_VARIABLE, p_token);
scope_newset(p_interpret->p_scope, c_name, p_symbol);
-
} else {
return (0);
}
@@ -298,11 +297,10 @@ _block_get(Interpret *p_interpret, List *p_list_block) {
}
int
-_expression_get(Interpret *p_interpret, List *p_list_expression) {
+__expression_get(Interpret *p_interpret, List *p_list_expression) {
for (;;) {
- if (p_interpret->tt == TT_PARANT_CL) {
+ if (p_interpret->tt == TT_PARANT_CL)
break; /* for */
- }
list_add_back(p_list_expression, p_interpret->p_token);
@@ -319,7 +317,36 @@ _expression_get(Interpret *p_interpret, List *p_list_expression) {
}
int
-_block_skip(Interpret *p_interpret) {
+__array_get(Interpret *p_interpret, Token *p_token_arr) {
+#ifdef DEBUG_ARRAY_GET
+ printf("====> ARRAY\n");
+#endif /* DEBUG_ARRAY_GET */
+ Array *p_array = p_token_arr->p_array;
+
+ do {
+ Token *p_token = p_interpret->p_token;
+
+#ifdef DEBUG_ARRAY_GET
+ printf("Insert: ");
+ token_print_ln(p_token);
+#endif /* DEBUG_ARRAY_GET */
+
+ array_unshift(p_array, p_token);
+ token_ref_up(p_token);
+ _NEXT
+ } while (p_interpret->tt != TT_PARANT_AR);
+
+#ifdef DEBUG_ARRAY_GET
+ printf("<==== ARRAY\n");
+#endif /* DEBUG_ARRAY_GET */
+ /* Ignore TT_PARANT_AR */
+ _NEXT
+
+ return (0);
+}
+
+int
+__block_skip(Interpret *p_interpret) {
if (p_interpret->tt != TT_PARANT_CL)
_INTERPRET_ERROR("Expected '{'", p_interpret->p_token);
_NEXT
@@ -523,7 +550,7 @@ _control(Interpret *p_interpret) {
_NEXT
- _expression_get(p_interpret, p_list_expr);
+ __expression_get(p_interpret, p_list_expr);
_block_get(p_interpret, p_list_block);
Token *p_token_backup = p_interpret->p_token;
@@ -541,7 +568,6 @@ _control(Interpret *p_interpret) {
Token *p_token_top = stack_pop(p_interpret->p_stack);
if (p_token_top == NULL) {
- printf("FOO\n");
exit(0);
}
if (tt == TT_WHILE) {
@@ -786,6 +812,7 @@ _term(Interpret *p_interpret) {
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);
@@ -917,9 +944,13 @@ _term(Interpret *p_interpret) {
Token *p_token = p_interpret->p_token;
_NEXT
- Token *p_token_arr = token_new_array(ARRAY_SIZE);
+ Token *p_token_arr = token_new_array(ARRAY_SIZE);
stack_push(p_interpret->p_stack, p_token_arr);
- _INTERPRET_ERROR("arrays not yet fully implemented", p_token_arr);
+
+ if (__array_get(p_interpret, p_token_arr) != 0)
+ _INTERPRET_ERROR("Array syntax error", p_token);
+
+ return (1);
}
break;