int check_func(ast::Func* func) { assert(func != nullptr); for (auto it = func->arguments.begin(); it != func->arguments.end(); ++it) { declare_variable(*it); } // Allocate memory on stack for local variables for (auto it = func->local_variables.begin(); it != func->local_variables.end(); ++it) { declare_variable(*it); } this->current_function = func; check_body(func->body); // TODO: check for return value? auto return_ = std::make_shared<ast::Return>(); return_->value = std::make_shared<ast::Constant>(default_value_for(func->return_value)); func->body.push_back(return_); this->current_function = nullptr; variables.clear(); return EXIT_SUCCESS; }
int main(int argc, char **argv) { if (argc < 2) { error_message(); exit(0); } char *inputName; char *destName; char *titleString; char *destTitleString; declare_variable(&inputName, &destName, &titleString, &destTitleString, argv[1]); data_relocate(inputName, destName, titleString, destTitleString); print_data(destName, destTitleString); return 0; }
static plc_t declare_names(int operand, const variable_t var, plc_t plc){ char * name = var->name; if(name){ unsigned char index = var->index; char * byte = get_param_val("BYTE", var->params); if(byte){ int idx = atoi(byte) * BYTESIZE; char * bit = get_param_val("BIT", var->params); if(bit){ idx += atoi(bit); } if(idx>=0 && idx < 256){ index = (unsigned char)idx; } } return declare_variable(plc, operand, index, name); } else return plc; }
int FIAL_interpret (struct FIAL_exec_env *env) { block *b = NULL; node *stmt = NULL; if(!env || !env->block_stack) return -1; if(!env->block_stack->stmt) return 1; for(;;) { b = env->block_stack; stmt = b->stmt->left; assert(stmt); switch(stmt->type) { case AST_VAR_DECL: ER(declare_variable(stmt, env)); break; case AST_ASSIGN: ER(assign_variable(stmt, env)); break; case AST_IF: ER(execute_if(stmt, env)); break; case AST_BLOCK: ER(push_block(env, stmt)); env->skip_advance = 1; break; case AST_CALL_A: ER(execute_call_A(stmt, env)); break; case AST_CALL_B: ER(execute_call_B(stmt, env)); break; case AST_BREAK: ER(execute_break(stmt, env)); break; case AST_CONTINUE: ER(execute_continue(stmt, env)); break; default: assert(0); /*is this an error? I could just skip unknown * statements...*/ break; } if(!env->block_stack) break; if(env->skip_advance) env->skip_advance = 0; else env->block_stack->stmt = env->block_stack->stmt->right; while(!env->block_stack->stmt) { pop_block(env); if(!env->block_stack) { return 0; } assert(env->block_stack->stmt); env->block_stack->stmt = env->block_stack->stmt->right; } } return 0; }
void dynamic_context::add_variable(ulong varid, store::Item_t& value) { declare_variable(varid, false); set_variable(varid, NULL, QueryLoc::null, value); }