import symbol:* import tree:* import vector:* import stack:* import map:* import util:* import string:* import mem:* import io:* import importer:* import ast_node:* /*Importer * importer;*/ /*NodeTree* builtin_trans_unit; // the top scope for language level stuff*/ /*std::map*>> languageLevelReservedWords;*/ /*std::map*>> languageLevelOperators;*/ /*std::map*, NodeTree*> this_map; // used to map implicit "this" variables to their type*/ /*NodeTree* topScope; //maintained for templates that need to add themselves to the top scope no matter where they are instantiated*/ /*int lambdaID = 0;*/ obj ast_transformation (Object) { fun construct(): *ast_transformation { return this } fun copy_construct(old: *ast_transformation) { } fun operator=(old: ref ast_transformation) { destruct() copy_construct(&old) } fun destruct() { } // first pass defines all type_defs (objects and aliases), ADTs, and top-level if/passthroughs fun first_pass(file_name: string, parse_tree: *tree, importer: *importer): *ast_node { var translation_unit = ast_translation_unit_ptr() importer->register(file_name, parse_tree, translation_unit) parse_tree->children.for_each(fun(child: *tree) { if (child->data.name == "type_def") { var name = concat_symbol_tree(get_node("identifier", child)) var type_def_node = ast_type_def_ptr() translation_unit->translation_unit.children.add(type_def_node) } }) return translation_unit } } fun concat_symbol_tree(node: *tree): string { var str.construct(): string if (node->data.data != "no_value") str += node->data.data node->children.for_each(fun(child: *tree) str += concat_symbol_tree(child);) return str } fun get_node(lookup: *char, parent: *tree): *tree { return get_node(string(lookup), parent) } fun get_node(lookup: string, parent: *tree): *tree { var results = get_nodes(lookup, parent) if (results.size > 1) println("too many results!") if (results.size) return results[0] return null>() } fun get_nodes(lookup: string, parent: *tree): vector<*tree> { return parent->children.filter(fun(node: *tree):bool return node->data.name == lookup;) }