Пример #1
0
   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;
}
Пример #3
0
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 &param_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");
}
Пример #5
0
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
}