void exec_dowhile(env_t* env, ast_t* ast) { /* same as exec_while() but with a call of exec_statements() before. */ exec_statements(env, ast->data.while_statement.statements); ast_t* cond = eval_expression(env, ast->data.while_statement.condition); if(cond->type != at_bool) { error_expected(NULL,get_ast_type_name(at_bool),get_ast_type_name(cond->type)); } else { while(cond->data.b) { exec_statements(env, ast->data.while_statement.statements); dec_ref(cond); cond = eval_expression(env, ast->data.while_statement.condition); } dec_ref(cond); } }
void vm_exec(env_t* env, ast_t* ast) { if(ast->type == at_statements) { exec_statements(env,ast); } else { // TODO : ----- } }
void exec_while(env_t* env, ast_t* ast) { ast_t* cond = eval_expression(env, ast->data.while_statement.condition); if(cond->type != at_bool) { error_expected(NULL,get_ast_type_name(at_bool),get_ast_type_name(cond->type)); } else { while(cond->data.b) { exec_statements(env, ast->data.while_statement.statements); dec_ref(cond); cond = eval_expression(env, ast->data.while_statement.condition); } dec_ref(cond); } }
int main(int argc, char* argv[]) { struct t_exec exec; struct item *item; struct t_var *var; if (argc > 1) { debug_level = atoi(argv[1]); } else { debug_level = 1; } printf("debug_level: %d\n", debug_level); do { if (exec_init(&exec, stdin) < 0) { fprintf(stderr, "Failed to exec\n"); break; } core_apply(&exec); exec.parser.max_output = 100; exec_addfunc2(&exec, "funcA", &myfunc); if (exec_statements(&exec) < 0) { fprintf(stderr, "exec_statements() failed\n"); break; } /* * Print all the vars */ item = exec.vars.first; if (item) { printf("Vars:\n"); while (item) { var = (struct t_var *) item->value; printf(" %s=%s\n", var->name, value_to_s(var->value)); item = item->next; } } } while (0); exec_close(&exec); printf("Done.\n"); return 0; }
int exec_if(env_t* env, ast_t* ast) { int result = 0; /* not null when condition was true, null when condition was false */ ast_t* cond = eval_expression(env, ast->data.if_statement.condition); if(cond->type != at_bool) { error_expected(NULL,get_ast_type_name(at_bool),get_ast_type_name(cond->type)); } else { if(cond->data.b) { exec_statements(env, ast->data.if_statement.statements); result = 1; } dec_ref(cond); } return result; }
void exec_conditional(env_t* env, ast_t* ast) { /* if */ if(exec_if(env, ast->data.conditional.if_statement)) { return; } else { if(ast->data.conditional.elif_statements != NULL) { size_t i; /* elif */ for(i = 0; i < ast->data.conditional.elif_statements->data.elif_statements.count; i++) { if(exec_if(env, ast->data.conditional.elif_statements->data.elif_statements.elif_statements[i])) { return; } } } if(ast->data.conditional.else_statement != NULL) { /* else */ exec_statements(env, ast->data.conditional.else_statement); } } }
int main(int argc, char* argv[]) { struct t_exec exec; do { if (exec_init(&exec, stdin) < 0) { fprintf(stderr, "Failed to exec\n"); break; } core_apply(&exec); exec.parser.max_output = 100; if (exec_statements(&exec) < 0) { break; } } while (0); exec_close(&exec); return 0; }
ast_t* eval_call(env_t* env, ast_t* ast) { ast_t* func = NULL; ast_t* result = NULL; char* fn = NULL; /* function name */ switch(ast->data.call.call_type) { case ct_anonymous: fn = "<anonymous>"; func = ast->data.call.function.function; break; case ct_named: fn = ast->data.call.function.id; func = get_ast_by_id(env, fn); if(func == NULL) { error_id(NULL, fn); }; break; } switch(func->type) { case at_function:{ size_t i; if(ast->data.call.callargs->data.callargs.count != func->data.function.params->data.params.count) { error_paramcount(NULL, fn, func->data.function.params->data.params.count, ast->data.call.callargs->data.callargs.count); } env_t* inner = create_env(); inner->parent = env; for(i = 0; i < func->data.function.params->data.params.count; i++) { set_ast_to_id( inner, func->data.function.params->data.params.params[i], eval_expression(env,ast->data.call.callargs->data.callargs.callargs[i]) ); } /* execute the function */ exec_statements(inner, func->data.function.statements); /* get the result */ inner->parent = NULL; /* must be NULL, get_ast_by_id() also searches the parent environment */ result = get_ast_by_id(inner, "@"); free_env(inner); break; } case at_builtin: if(ast->data.call.callargs->data.callargs.count != func->data.builtin.paramcount) { error_paramcount(NULL, fn, func->data.function.params->data.params.count, ast->data.call.callargs->data.callargs.count); } switch(func->data.builtin.paramcount) { case 0: result = func->data.builtin.function.builtin_0(); break; case 1: { ast_t* p = eval_expression(env,ast->data.call.callargs->data.callargs.callargs[0]); result = func->data.builtin.function.builtin_1(p); dec_ref(p); break; } case 2: { ast_t* p1 = eval_expression(env,ast->data.call.callargs->data.callargs.callargs[0]); ast_t* p2 = eval_expression(env,ast->data.call.callargs->data.callargs.callargs[1]); result = func->data.builtin.function.builtin_2(p1,p2); dec_ref(p1); dec_ref(p2); break; } case 3: { ast_t* p1 = eval_expression(env, ast->data.call.callargs->data.callargs.callargs[0]); ast_t* p2 = eval_expression(env, ast->data.call.callargs->data.callargs.callargs[1]); ast_t* p3 = eval_expression(env, ast->data.call.callargs->data.callargs.callargs[2]); result = func->data.builtin.function.builtin_3(p1,p2,p3); dec_ref(p1); dec_ref(p2); dec_ref(p3); break; } default: printf("\n\n*** HINT TO DEVELOPER ***\nimplement builtincall in vm.c\n\n"); exit(1); /* if you create a builtin function with more parameters then you have to add a case here */ break; } break; default: error_expected(NULL, get_ast_type_name(at_function), get_ast_type_name(func->type)); break; } return result; }