Package TParser :: execute(int & pos) { deque<TScanner :: TToken> & lst(*generated_tokens); switch (lst[pos].token_name) { case TScanner :: assign : if (lst[pos] == token_round_bracket_l || lst[pos] == token_rect_bracket_l || lst[pos] == token_italian_bracket_l) { auto tmp = execute(++pos); if (tmp.code_seg == NULL || tmp.code_seg -> title == "") Error.message("Invalid expression occured."); string title = tmp.code_seg -> title; auto target = keyword_vtable.find(title); if (target != keyword_vtable.end()) { TProcessor * op = target -> second; auto t = op -> proc(pos, lst); return t; } else { TSeq_arg in_pending; Package next; while (true) { next = execute(pos); if (next.empty()) break; // std :: cerr << next << ' '; in_pending.push_back(next); } //std :: cerr << "for function #" << title << "#" << std :: endl; arg_stack.push_back(in_pending); int p; Package ret_p; bool is_static; bool is_renewable = true; long long x; long long y; if (tmp.code_seg -> l == 0 && tmp.code_seg -> r == 0) { auto tg = symbol_table.find(title); if (tg == symbol_table.end()) Error.message("Invalid operator #" + title + "# found."); auto static_flag = static_def_list.find(title); is_static = (static_flag != static_def_list.end()); x = (in_pending.size() > 0 && in_pending[0].int_val != NULL) ? (*in_pending[0].int_val) : 0; y = (in_pending.size() > 1 && in_pending[1].int_val != NULL) ? (*in_pending[1].int_val) : 0; if (is_static) { if (in_pending[0].int_val != NULL) { auto saved_valuex = static_flag -> second.find(*in_pending[0].int_val); if (saved_valuex != static_flag -> second.end()) { auto saved_value = saved_valuex -> second.find(y); if (saved_value != saved_valuex -> second.end()) { is_renewable = false; ret_p = saved_value -> second; } } } else { Error.message("Fatal : A non-staticizeable function is under such a attempt."); } } p = tg -> second.l; } else { p = tmp.code_seg -> l; } if (ret_p.empty()) ret_p = execute(p); if (is_static && is_renewable) { static_def_list[title][x][y] = ret_p; } arg_stack.pop_back(); return ret_p; } } else { pos++; return Package(); } break; case TScanner :: id : ++pos; if (arg_symbol_stack.empty() || arg_symbol_stack[arg_symbol_stack.size() - 1].find(Scanner.seq_identifier[lst[pos - 1].attribute_value]) == arg_symbol_stack[arg_symbol_stack.size() - 1].end()) return Package(Scanner.seq_identifier[lst[pos - 1].attribute_value], 0, 0); else return get_arg(arg_symbol_stack[arg_symbol_stack.size() - 1][Scanner.seq_identifier[lst[pos - 1].attribute_value]]); break; case TScanner :: immediate_int : return Package(Scanner.seq_imm_int[lst[pos++].attribute_value]); break; case TScanner :: immediate_str : return Package(Scanner.seq_imm_str[lst[pos++].attribute_value]); break; } return Package(); }