From 3e3564ea5431028c883eb1bfc059a535b128edc2 Mon Sep 17 00:00:00 2001 From: Nathan Braswell Date: Tue, 18 Sep 2018 09:04:05 -0400 Subject: [PATCH] Add basic if statement --- k.krak | 26 +++++++++++++++++++++++--- 1 file changed, 23 insertions(+), 3 deletions(-) diff --git a/k.krak b/k.krak index cd3d51a..78428c3 100644 --- a/k.krak +++ b/k.krak @@ -103,6 +103,8 @@ fun main(argc: int, argv: **char): int { var parse_tree = parse.parse_input(read_file(file_path), file_path) trim(parse_tree) name_ast_map[file_path] = syntax_to_ast(file_path, parse_tree, import_paths) + printlnerr("syntax_to_ast " + file_path + ":") + print_tree(name_ast_map[file_path], 1) } set_binding(b.first, name_ast_map[file_path]) } @@ -290,7 +292,18 @@ fun main(argc: int, argv: **char): int { }) C_str += idt + "}" } - ast::_if() { error("if gen unimplemented"); } + ast::_if() { + C_str += idt + "if (" + emit_C(t->children[0], 0) + C_str += ") {\n" + emit_C(t->children[1], level + 1) + C_str += ";\n" + idt + "}" + if t->children.size > 2 { + C_str += " else {\n" + emit_C(t->children[2], level + 1) + C_str += ";\n" + idt + "}" + } + } ast::_match() { error("no match should remain at C emit"); } ast::_case() { error("no case should remain at C emit"); } ast::_while() { error("while gen unimplemented"); } @@ -352,7 +365,7 @@ fun main(argc: int, argv: **char): int { printlnerr("doing pass new style " + file_pass.second + " on " + to_string(file_pass.first->data)) passes[file_pass.second](file_pass.first) }) - C_str = C_declaration_str + "\n" + C_str + C_str = "#include \n" + C_declaration_str + "\n" + C_str println() println() @@ -497,6 +510,8 @@ fun syntax_to_ast(file_name: str, syntax: *tree, import_paths: ref vecchildren[0]) else if (syntax->data.name == "code_block") return _block(syntax->children.map(syntax_to_ast_helper)) + else if (syntax->data.name == "if_statement") + return _if(syntax->children.map(syntax_to_ast_helper)) else if (syntax->data.name == "return_statement") return _return(syntax->children.map(syntax_to_ast_helper)) else if (syntax->data.name == "defer_statement") @@ -556,10 +571,14 @@ fun syntax_to_ast(file_name: str, syntax: *tree, import_paths: ref vecdata.name == "number") return _value(concat(syntax), type(base_type::_int(), 0, false)) + else if (syntax->data.name == "bool") + return _value(concat(syntax), type(base_type::_bool(), 0, false)) else if (syntax->data.name == "scoped_identifier" || syntax->data.name == "identifier") return make_binding(concat(syntax)) - else + else { + error(syntax, "Cannot transform") return null>() + } } var result = _translation_unit(file_name, syntax->children.map(syntax_to_ast_helper)) return result @@ -628,6 +647,7 @@ fun trim(parse_tree: *tree) { remove_node(symbol("\"(\"", true), parse_tree) remove_node(symbol("\")\"", true), parse_tree) remove_node(symbol("\"if\"", true), parse_tree) + remove_node(symbol("\"else\"", 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)