diff --git a/stdlib/ast_nodes.krak b/stdlib/ast_nodes.krak index 2a09ca5..ceb949a 100644 --- a/stdlib/ast_nodes.krak +++ b/stdlib/ast_nodes.krak @@ -11,11 +11,6 @@ import mem:* import io:* import type:* - - - - - adt ast_node { translation_unit: translation_unit, import: import, @@ -1097,7 +1092,7 @@ fun get_ast_children(node: *ast_node): vector<*ast_node> { ast_node::if_comp(backing) return vector<*ast_node>(backing.statement) ast_node::simple_passthrough(backing) return vector<*ast_node>() ast_node::function_call(backing) return vector(backing.func) + backing.parameters - ast_node::compiler_intrinsic(backing) return vector<*ast_node>() + ast_node::compiler_intrinsic(backing) return backing.parameters ast_node::cast(backing) return vector<*ast_node>(backing.value) ast_node::value(backing) return vector<*ast_node>() } diff --git a/stdlib/c_generator.krak b/stdlib/c_generator.krak index 37d4f0a..3f55afd 100644 --- a/stdlib/c_generator.krak +++ b/stdlib/c_generator.krak @@ -14,27 +14,22 @@ import poset:* obj c_generator (Object) { var id_counter: int - var ast_to_syntax: map<*ast_node, *tree> var ast_name_map: hash_map<*ast_node, string> var used_names: hash_set var function_type_map: map - var function_typedef_string: string - var closure_struct_definitions: string - var c_keyword_avoid: set var replacement_map: map var longest_replacement: int + var function_typedef_string: string var linker_string: string fun construct(): *c_generator { id_counter = 0 - ast_to_syntax.construct() ast_name_map.construct() used_names.construct() + // to avoid using c keywords + used_names.add(string("extern")) function_type_map.construct() function_typedef_string.construct() - closure_struct_definitions.construct() linker_string.construct() - c_keyword_avoid.construct() - c_keyword_avoid.add(string("extern")) replacement_map.construct() replacement_map[string("+")] = string("plus") @@ -89,13 +84,10 @@ obj c_generator (Object) { } fun copy_construct(old: *c_generator) { id_counter = old->id_counter - ast_to_syntax.copy_construct(&old->ast_to_syntax) ast_name_map.copy_construct(&old->ast_name_map) used_names.copy_construct(&old->used_names) function_type_map.copy_construct(&old->function_type_map) function_typedef_string.copy_construct(&old->function_typedef_string) - closure_struct_definitions.copy_construct(&old->closure_struct_definitions) - c_keyword_avoid.copy_construct(&old->c_keyword_avoid) replacement_map.copy_construct(&old->replacement_map) longest_replacement = old->longest_replacement linker_string.copy_construct(&old->linker_string) @@ -105,13 +97,10 @@ obj c_generator (Object) { copy_construct(&other) } fun destruct() { - ast_to_syntax.destruct() ast_name_map.destruct() used_names.destruct() function_type_map.destruct() function_typedef_string.destruct() - closure_struct_definitions.destruct() - c_keyword_avoid.destruct() replacement_map.destruct() linker_string.destruct() } @@ -140,14 +129,12 @@ obj c_generator (Object) { type_to_c(backing.type->return_type) + " " + decorated_name + "(" + parameters + ")") } fun generate_c(name_ast_map: map,*ast_node>>, ast_to_syntax_in: map<*ast_node, *tree> ): pair { - ast_to_syntax = ast_to_syntax_in var prequal: string = "#include \n" var plain_typedefs: string = "\n/**Plain Typedefs**/\n" var top_level_c_passthrough: string = "" var variable_extern_declarations: string = "" var structs: string = "\n/**Type Structs**/\n" function_typedef_string = "\n/**Typedefs**/\n" - closure_struct_definitions = "\n/**Closure Struct Definitions**/\n" var function_prototypes: string = "\n/**Function Prototypes**/\n" var function_definitions: string = "\n/**Function Definitions**/\n" var variable_declarations: string = "\n/**Variable Declarations**/\n" @@ -234,7 +221,7 @@ obj c_generator (Object) { structs += "};\n" }) - return make_pair(prequal+plain_typedefs+function_typedef_string+top_level_c_passthrough+variable_extern_declarations+structs+closure_struct_definitions+function_prototypes+variable_declarations+function_definitions + "\n", linker_string) + return make_pair(prequal+plain_typedefs+function_typedef_string+top_level_c_passthrough+variable_extern_declarations+structs+function_prototypes+variable_declarations+function_definitions + "\n", linker_string) } fun generate_declaration_statement(node: *ast_node): string { var identifier = node->declaration_statement.identifier @@ -495,8 +482,7 @@ obj c_generator (Object) { } if (result == "impossible name") error("HUGE PROBLEMS") - // TODO keyword avoid seems not to work - if (make_unique && (used_names.contains(result) || c_keyword_avoid.contains(result))) + if (make_unique && used_names.contains(result)) result += get_id() ast_name_map.set(node, result) used_names.add(result) diff --git a/stdlib/pass_common.krak b/stdlib/pass_common.krak index 964a45f..1e198c0 100644 --- a/stdlib/pass_common.krak +++ b/stdlib/pass_common.krak @@ -462,6 +462,7 @@ fun run_on_tree_helper(func_before: fun(*ast_node,*stack<*ast_node>,*hash_set<*a ast_node::assignment_statement(backing) get_ast_children(node).for_each(fun(n: *ast_node) run_on_tree_helper(func_before, func_after, n, parent_chain, visited);) ast_node::declaration_statement(backing) get_ast_children(node).for_each(fun(n: *ast_node) run_on_tree_helper(func_before, func_after, n, parent_chain, visited);) ast_node::if_comp(backing) get_ast_children(node).for_each(fun(n: *ast_node) run_on_tree_helper(func_before, func_after, n, parent_chain, visited);) + ast_node::compiler_intrinsic(backing) get_ast_children(node).for_each(fun(n: *ast_node) run_on_tree_helper(func_before, func_after, n, parent_chain, visited);) ast_node::function_call(backing) { run_on_tree_helper(func_before, func_after, backing.func, parent_chain, visited) node->function_call.parameters.for_each(fun(n: *ast_node) run_on_tree_helper(func_before, func_after, n, parent_chain, visited);)