void process_directive(std::string expression) { expression = trim_whitespace(expression); if ('$' != expression[0]) return; else if ("$enable_cache" == expression) persist_symbol_table() = true; else if ("$disable_cache" == expression) persist_symbol_table() = false; else if ("$enable_symbol_dump" == expression) symbol_dump() = true; else if ("$disable_symbol_dump" == expression) symbol_dump() = false; else if ("$enable_assignment_dump" == expression) assignment_dump() = true; else if ("$disable_assignment_dump" == expression) assignment_dump() = false; else if ("$enable_timer" == expression) display_total_time() = true; else if ("$enable_compile_timer" == expression) display_total_compile_time() = true; else if ("$disable_timer" == expression) display_total_time() = false; else if ("$disable_compile_timer" == expression) display_total_compile_time() = false; else if ("$enable_usr" == expression) enable_usr() = true; else if ("$disable_usr" == expression) enable_usr() = false; else if ("$enable_local_vardef" == expression) disable_local_vardef() = false; else if ("$disable_local_vardef" == expression) disable_local_vardef() = true; else if ("$list_vars" == expression) list_symbols(); else if ("$clear_functions" == expression) clear_functions(); else if ((0 == expression.find("$load ")) && (expression.size() > 7)) process_from_file(expression.substr(6,expression.size() - 6)); else if ((0 == expression.find("$disable arithmetic ")) && (expression.size() >= 21)) process_disable_arithmetic(expression.substr(20,expression.size() - 20)); else if ((0 == expression.find("$disable assignment ")) && (expression.size() >= 21)) process_disable_assignment(expression.substr(20,expression.size() - 20)); else if ((0 == expression.find("$disable inequality ")) && (expression.size() >= 21)) process_disable_inequality(expression.substr(20,expression.size() - 20)); else if ((0 == expression.find("$enable arithmetic ")) && (expression.size() >= 20)) process_enable_arithmetic(expression.substr(19,expression.size() - 19)); else if ((0 == expression.find("$enable assignment ")) && (expression.size() >= 20)) process_enable_assignment(expression.substr(19,expression.size() - 19)); else if ((0 == expression.find("$enable inequality ")) && (expression.size() >= 20)) process_enable_inequality(expression.substr(19,expression.size() - 19)); else if ("$begin" == expression) process_multiline(); else if (0 == expression.find("$function")) process_function_definition(expression); else printf("\nERROR - Invalid directive: %s\n",expression.c_str()); }
// Insert a sym + name into a symbol table bool sym_insertion (symbol_table *table, symbol *sym, string *name) { if (table == NULL || sym == NULL || name == NULL) return false; if (table->find(name) != table->end()) return false; table->insert(make_pair(name, sym)); symbol_dump(sym, name); return true; }
void symbol_table_dump(int indent, struct symbol_table *stab) { struct symbol *sym; for (sym = stab->head; sym != NULL; sym = sym->next) symbol_dump(indent, sym); }
// Table for newly found function void new_fn_table (astree *fn_node) { if (fn_node == NULL || fn_node->children.empty()) return; astree *type_node = fn_node->children[0]; if (type_node == NULL || type_node->children.empty()) return; astree *name_node = type_node->children[0]; if (name_node == NULL) return; astree *params_node = fn_node->children[1]; if (params_node == NULL) return; astree *fnblock_node = fn_node->children[2]; if (fnblock_node == NULL) return; symbol *fn_symbol = new_symbol(fn_node); if (fn_symbol == NULL) return; fn_symbol->attributes.set(ATTR_function); fn_symbol->parameters = new vector<symbol*>(); symbol_dump(fn_symbol, (string *)name_node->clexinfo); // new block symbol_table *fn_table = enter_block(); idents.push_back(fn_table); fprintf(oil_file, "%s __%s (\n", type_node->clexinfo->c_str(), name_node->clexinfo->c_str()); // parameters for (auto ¶m_type : params_node->children) { new_fn_parameter(param_type, fn_table, fn_symbol); if (param_type == params_node->children.back()) { fprintf(oil_file, ")\n"); } else { fprintf(oil_file, ",\n"); } } fprintf(oil_file, "{\n"); // block new_block_table(fnblock_node); exit_block(); sym_insertion(idents[blockstack.back()], fn_symbol, (string*)name_node->clexinfo); fn_node->checked = true; fprintf(oil_file, "{\n"); }
void ast_dump(struct ast *a, int indent) { #ifdef DEBUG int i; if (a == NULL) { return; } for (i = 0; i < indent; i++) printf(" "); if (a->label != NULL) { /* XXX printf("@#%d -> ", a->label - (vm_label_t)program); */ printf("@#%08lx -> ", (unsigned long)a->label); } printf(ast_name(a)); printf("="); type_print(stdout, a->datatype); switch (a->type) { case AST_LOCAL: printf("(%d,%d)=", a->u.local.index, a->u.local.upcount); if (a->u.local.sym != NULL) symbol_dump(a->u.local.sym, 0); printf("\n"); break; case AST_VALUE: printf("("); value_print(a->u.value.value); printf(")\n"); break; case AST_BUILTIN: printf("`"); fputsu8(stdout, a->u.builtin.bi->name); printf("`{\n"); ast_dump(a->u.builtin.right, indent + 1); for (i = 0; i < indent; i++) printf(" "); printf("}\n"); break; case AST_APPLY: printf("{\n"); ast_dump(a->u.apply.left, indent + 1); ast_dump(a->u.apply.right, indent + 1); for (i = 0; i < indent; i++) printf(" "); printf("}\n"); break; case AST_ARG: printf("{\n"); ast_dump(a->u.arg.left, indent + 1); ast_dump(a->u.arg.right, indent + 1); for (i = 0; i < indent; i++) printf(" "); printf("}\n"); break; case AST_ROUTINE: printf("{\n"); ast_dump(a->u.routine.body, indent + 1); for (i = 0; i < indent; i++) printf(" "); printf("}\n"); break; case AST_STATEMENT: printf("{\n"); ast_dump(a->u.statement.left, indent + 1); ast_dump(a->u.statement.right, indent + 1); for (i = 0; i < indent; i++) printf(" "); printf("}\n"); break; case AST_ASSIGNMENT: printf("(%s){\n", a->u.assignment.defining ? "definition" : "application"); ast_dump(a->u.assignment.left, indent + 1); ast_dump(a->u.assignment.right, indent + 1); for (i = 0; i < indent; i++) printf(" "); printf("}\n"); break; case AST_CONDITIONAL: printf("{\n"); ast_dump(a->u.conditional.test, indent + 1); ast_dump(a->u.conditional.yes, indent + 1); if (a->u.conditional.no != NULL) ast_dump(a->u.conditional.no, indent + 1); for (i = 0; i < indent; i++) printf(" "); printf("}\n"); break; case AST_WHILE_LOOP: printf("{\n"); ast_dump(a->u.while_loop.test, indent + 1); ast_dump(a->u.while_loop.body, indent + 1); for (i = 0; i < indent; i++) printf(" "); printf("}\n"); break; case AST_RETR: printf("{\n"); ast_dump(a->u.retr.body, indent + 1); for (i = 0; i < indent; i++) printf(" "); printf("}\n"); break; } #endif }