diff --git a/stdlib/importer.krak b/stdlib/importer.krak index 320e577..be60eb0 100644 --- a/stdlib/importer.krak +++ b/stdlib/importer.krak @@ -1,6 +1,7 @@ import symbol:* import tree:* import vector:* +import queue:* import map:* import util:* import string:* @@ -36,12 +37,56 @@ obj importer (Object) { var parse_tree = parse.parse_input(read_file(file_name), file_name) print("post-parse: "); println(file_name) write_file(file_name + ".parse.dot", syntax_tree_to_dot(parse_tree)) + print("pre-trim: "); println(file_name) + trim(parse_tree) + print("post-trim: "); println(file_name) + write_file(file_name + ".trimmed_parse.dot", syntax_tree_to_dot(parse_tree)) print("pre-ast: "); println(file_name) var ast = ast_pass.first_pass(file_name, parse_tree, this) print("post-ast: "); println(file_name) write_file(file_name + ".ast.dot", ast_to_dot(ast)) } + fun trim(parse_tree: *tree) { + remove_node(symbol("$NULL$", false), parse_tree) + remove_node(symbol("WS", false), parse_tree) + remove_node(symbol("\\(", true), parse_tree) + remove_node(symbol("\\)", true), parse_tree) + remove_node(symbol("var", true), parse_tree) + remove_node(symbol("fun", true), parse_tree) + remove_node(symbol(";", true), parse_tree) + remove_node(symbol("line_end", false), parse_tree) + remove_node(symbol("{", true), parse_tree) + remove_node(symbol("}", true), parse_tree) + remove_node(symbol("(", true), parse_tree) + remove_node(symbol(")", true), parse_tree) + remove_node(symbol("if", true), parse_tree) + remove_node(symbol("while", true), parse_tree) + remove_node(symbol("__if_comp__", true), parse_tree) + remove_node(symbol("comp_simple_passthrough", true), parse_tree) + remove_node(symbol("def_nonterm", false), parse_tree) + remove_node(symbol("obj_nonterm", false), parse_tree) + remove_node(symbol("adt_nonterm", false), parse_tree) + remove_node(symbol("template", true), parse_tree) + remove_node(symbol("\\|", true), parse_tree) + } + + fun remove_node(remove: symbol, parse_tree: *tree) { + var to_process = queue<*tree>() + to_process.push(parse_tree) + while(!to_process.empty()) { + var node = to_process.pop() + for (var i = 0; i < node->children.size; i++;) { + if (node->children[i]->data.equal_wo_data(remove)) { + node->children.remove(i) + i--; + } else { + to_process.push(node->children[i]) + } + } + } + } + fun register(file_name: string, parse_tree: *tree, translation_unit: *ast_node) { print("Registered parse_tree+translation_unit for ") println(file_name) diff --git a/stdlib/symbol.krak b/stdlib/symbol.krak index 9dd5cd6..ae24020 100644 --- a/stdlib/symbol.krak +++ b/stdlib/symbol.krak @@ -77,6 +77,9 @@ obj symbol (Object, Serializable) { util::unpack(terminal, pos) = serialize::unserialize(it, pos) return pos } + fun equal_wo_data(other: ref symbol): bool { + return name == other.name && terminal == other.terminal; + } fun operator==(other: ref symbol): bool { return data == other.data && name == other.name && terminal == other.terminal; }