diff --git a/krakenGrammer.kgm b/krakenGrammer.kgm index 6ea9388..900db2f 100644 --- a/krakenGrammer.kgm +++ b/krakenGrammer.kgm @@ -144,8 +144,8 @@ alpha_alphanumeric = "(a|b|c|d|e|f|g|h|i|j|k|l|m|n|o|p|q|r|s|t|u|v|w|x|y|z|A|B|C augmented_alpha_alphanumeric = alpha_alphanumeric augmented_alpha_alphanumeric | keywords_also_identifiers augmented_alpha_alphanumeric | alpha_alphanumeric | keywords_also_identifiers ; numeric = "(0|1|2|3|4|5|6|7|8|9)+" ; -# note the hacks around \things -string = triple_quoted_string | "\"(`|1|2|3|4|5|6|7|8|9|0|-|=| |q|w|e|r|t|y|u|i|o|p|[|]|(\\\\)|(\\n)|(\\t)|(\\0)|a|s|d|f|g|h|j|k|l|;|'| +# note the hacks around \things. Hmm, I feel like it actually shouldn't be like this. Added \\\* because I want to come back later +string = triple_quoted_string | "\"(`|1|2|3|4|5|6|7|8|9|0|-|=| |q|w|e|r|t|y|u|i|o|p|[|]|(\\\\)|(\\n)|(\\t)|(\\\*)|(\\0)|a|s|d|f|g|h|j|k|l|;|'| |z|x|c|v|b|n|m|,|.|/|~|!|@|#|$|%|^|&|\*|\(|\)|_|\+|Q|W|E|R|T|Y|U|I|O|P|{|}|\||A|S|D|F|G|H|J|K|L|:|Z|X|C|V|B|N|M|<|>|\?| |(\\\"))*\"" ; comment = cpp_comment | c_comment ; cpp_comment = "//(`|1|2|3|4|5|6|7|8|9|0|-|=| |q|w|e|r|t|y|u|i|o|p|[|]|\\|a|s|d|f|g|h|j|k|l|;|'|z|x|c|v|b|n|m|,|.|/|~|!|@|#|$|%|^|&|\*|\(|\)|_|\+|Q|W|E|R|T|Y|U|I|O|P|{|}|\||A|S|D|F|G|H|J|K|L|:|\"|Z|X|C|V|B|N|M|<|>|\?| )* diff --git a/stdlib/ast_transformation.krak b/stdlib/ast_transformation.krak index 60217ba..125984e 100644 --- a/stdlib/ast_transformation.krak +++ b/stdlib/ast_transformation.krak @@ -309,7 +309,10 @@ fun transform_value(node: *tree, scope: *ast_node): *ast_node { } } if (contains_dot) - value_type = type_ptr(base_type::double_precision()) //value_type = type_ptr(base_type::floating()) + if (value_str[value_str.length()-1] == 'f') + value_type = type_ptr(base_type::floating()) //value_type = type_ptr(base_type::floating()) + else + value_type = type_ptr(base_type::double_precision()) //value_type = type_ptr(base_type::floating()) else value_type = type_ptr(base_type::integer()) } @@ -418,7 +421,10 @@ fun transform_for_loop(node: *tree, scope: *ast_node, template_replaceme return for_loop } fun transform_return_statement(node: *tree, scope: *ast_node, template_replacements: map): *ast_node { - return ast_return_statement_ptr(transform(node->children[0], scope, template_replacements)) + var return_value = get_node("boolean_expression", node) + if (return_value) + return ast_return_statement_ptr(transform(return_value, scope, template_replacements)) + return ast_return_statement_ptr(null()) } fun transform_branching_statement(node: *tree, scope: *ast_node): *ast_node { if (node->data.name == "break_statement") @@ -485,11 +491,13 @@ fun transform_expression(node: *tree, scope: *ast_node, searching_for: s return ast_function_call_ptr(get_builtin_function(func_name, parameter_types), parameters) } fun get_builtin_function(name: string, param_types: vector<*type>): *ast_node { - if (name == "." || name == "->") + if (name == "==" || name == "!=" || name == ">" || name == "<" || name == "<=" || name == ">" || name == ">=" || name == "&&" || name == "||" || name == "!") + return ast_function_ptr(name, type_ptr(param_types, type_ptr(base_type::boolean())), vector<*ast_node>()) + if (name == "." || name == "->" || name == "[") return ast_function_ptr(name, type_ptr(param_types, param_types[1]), vector<*ast_node>()) if (name == "&") return ast_function_ptr(name, type_ptr(param_types, param_types[0]->clone_with_increased_indirection()), vector<*ast_node>()) - if (name == "\\*") + if (name == "\*") return ast_function_ptr(name, type_ptr(param_types, param_types[0]->clone_with_decreased_indirection()), vector<*ast_node>()) if (param_types.size > 1 && param_types[1]->rank() > param_types[0]->rank()) return ast_function_ptr(name, type_ptr(param_types, param_types[1]), vector<*ast_node>()) diff --git a/stdlib/c_generator.krak b/stdlib/c_generator.krak index 09fa2cf..fce1590 100644 --- a/stdlib/c_generator.krak +++ b/stdlib/c_generator.krak @@ -88,7 +88,7 @@ obj c_generator (Object) { } fun destruct() { } - fun get_id(): string return to_string(id_counter++); + fun get_id(): string return to_string(id_counter++); fun generate_c(name_ast_map: map,*ast_node>>): pair { var linker_string:string = "" var prequal: string = "#include \n#include \n#include \n" @@ -164,6 +164,11 @@ obj c_generator (Object) { } ast_node::type_def(backing) { type_poset.add_vertex(child) + backing.variables.for_each(fun(i: *ast_node) { + var var_type = get_ast_type(i->declaration_statement.identifier) + if (!var_type->indirection && var_type->type_def) + type_poset.add_relationship(child, var_type->type_def) + }) } } }) @@ -244,6 +249,8 @@ obj c_generator (Object) { } fun generate_return_statement(node: *ast_node, enclosing_object: *ast_node, defer_stack: *stack>>): code_triple { var return_value = node->return_statement.return_value + if (!return_value) + return code_triple("return") var return_value_type = get_ast_type(return_value) var to_ret = code_triple() // if we're returning an object, copy_construct a new one to return @@ -333,12 +340,14 @@ obj c_generator (Object) { var parameters = node->function_call.parameters if ( parameters.size == 2 && (func_name == "+" || func_name == "-" || func_name == "*" || func_name == "/" || func_name == "||" || func_name == "&&" || func_name == "<" || func_name == ">" || func_name == "<=" || func_name == ">=" - || func_name == "==" || func_name == "%" + || func_name == "==" || func_name == "!=" || func_name == "%" )) return code_triple("(") + generate(parameters[0], enclosing_object, null>>>()) + func_name + generate(parameters[1], enclosing_object, null>>>()) + string(")") // don't propegate enclosing function down right of access if (func_name == "." || func_name == "->") return code_triple("(") + generate(parameters[0], enclosing_object, null>>>()) + func_name + generate(parameters[1], null(), null>>>()) + string(")") + if (func_name == "[") + return code_triple("(") + generate(parameters[0], enclosing_object, null>>>()) + "[" + generate(parameters[1], null(), null>>>()) + string("])") // the post ones need to be post-ed specifically, and take the p off if (func_name == "++p" || func_name == "--p") return code_triple("(") + generate(parameters[0], enclosing_object, null>>>()) + ")" + func_name.slice(0,-2) @@ -368,7 +377,7 @@ obj c_generator (Object) { } }) if (func_return_type->is_object() && func_return_type->indirection == 0 && has_method(func_return_type->type_def, "destruct", vector<*type>())) { - // kind of ugly combo here of + // kind of ugly combo here of var temp_ident = ast_identifier_ptr(string("temporary_return")+get_id(), func_return_type) var declaration = ast_declaration_statement_ptr(temp_ident, null()) // have to pass false to the declaration generator, so can't do it through generate_statement diff --git a/stdlib/importer.krak b/stdlib/importer.krak index 651b44d..8aee79b 100644 --- a/stdlib/importer.krak +++ b/stdlib/importer.krak @@ -50,10 +50,12 @@ obj importer (Object) { println("**Fourth Pass**") name_ast_map.for_each(fun(name: string, tree_pair: pair<*tree, *ast_node>) ast_pass.fourth_pass(tree_pair.first, tree_pair.second);) + /* name_ast_map.for_each(fun(name: string, tree_pair: pair<*tree, *ast_node>) { print("writing ast for: "); println(name) write_file(name + ".ast.dot", ast_to_dot(tree_pair.second)) }) + */ return to_ret } @@ -74,11 +76,11 @@ obj importer (Object) { }) var parse_tree = parse.parse_input(file, file_name) print("post-parse: "); println(file_name) - write_file(file_name + ".parse.dot", syntax_tree_to_dot(parse_tree)) + /*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)) + /*write_file(file_name + ".trimmed_parse.dot", syntax_tree_to_dot(parse_tree))*/ print("pre-first-ast: "); println(file_name) var ast = ast_pass.first_pass(file_name, parse_tree, this) print("post-first-ast: "); println(file_name) diff --git a/tests/simple_print.krak b/tests/simple_print.krak index 25158f2..85530c9 100644 --- a/tests/simple_print.krak +++ b/tests/simple_print.krak @@ -22,6 +22,10 @@ fun println(to_print: double) { print(to_print) print("\n") } +fun println(to_print: bool) { + print(to_print) + print("\n") +} fun print(to_print: *char) { __if_comp__ __C__ simple_passthrough(to_print::) """ printf("%s", to_print); @@ -48,4 +52,8 @@ fun print(to_print: double) { printf("%f", to_print); """ } +fun print(to_print: bool) { + if (to_print) print("true") + else print("false") +} diff --git a/tests/test_RecursiveTest.krak b/tests/test_RecursiveTest.krak index 04fbe40..7850faa 100644 --- a/tests/test_RecursiveTest.krak +++ b/tests/test_RecursiveTest.krak @@ -1,4 +1,4 @@ -import io:*; +import simple_print:*; fun fibanacci(num: int): int { if (num < 2) diff --git a/tests/test_auto_void.krak b/tests/test_auto_void.krak index 2114782..b7878f5 100644 --- a/tests/test_auto_void.krak +++ b/tests/test_auto_void.krak @@ -1,4 +1,4 @@ -import io:* +import simple_print:* fun retVoid() { println("Woooo") diff --git a/tests/test_badMath.expected_results b/tests/test_badMath.expected_results index 6bf29f7..ec9ee53 100644 --- a/tests/test_badMath.expected_results +++ b/tests/test_badMath.expected_results @@ -5,5 +5,4 @@ Spam We'll find out. 34 woo not -true false diff --git a/tests/test_badMath.krak b/tests/test_badMath.krak index d5dda59..6df9422 100644 --- a/tests/test_badMath.krak +++ b/tests/test_badMath.krak @@ -1,8 +1,7 @@ -import io:* -import string:* +import simple_print:* fun main(): int { - io::println("Spam"); + simple_print::println("Spam"); var x: int = 4; x += 3; x++; @@ -11,15 +10,14 @@ fun main(): int { var q :int = z+z; var q2:int = z*3; var q3:int = y + y; - io::println(q3); - io::println(z); - io::println(q); + simple_print::println(q3); + simple_print::println(z); + simple_print::println(q); for (var i:int = 0; i < 20; i++;) z++; - if (z > 20) io::println("We'll find out."); - io::println(z); + if (z > 20) simple_print::println("We'll find out."); + simple_print::println(z); var boolean = false if ( z > 20 && !boolean) - io::println("woo not") - io::println(string("ab")[0] == 'a') - io::println('b' == 'a') + simple_print::println("woo not") + simple_print::println('b' == 'a') } diff --git a/tests/test_bracket_assign.krak b/tests/test_bracket_assign.krak index 0ca2820..0fc34e2 100644 --- a/tests/test_bracket_assign.krak +++ b/tests/test_bracket_assign.krak @@ -1,4 +1,4 @@ -import io:* +import simple_print:* obj BracketAssign { fun operator[]=(index:int, rhs:int) { diff --git a/tests/test_break_continue_defer.krak b/tests/test_break_continue_defer.krak index c143c8a..e4b934b 100644 --- a/tests/test_break_continue_defer.krak +++ b/tests/test_break_continue_defer.krak @@ -1,4 +1,4 @@ -import io:* +import simple_print:* fun main():int { for (var i = 1; i < 10; i++;) { diff --git a/tests/test_c_comments.krak b/tests/test_c_comments.krak index 7537f65..6399ebd 100644 --- a/tests/test_c_comments.krak +++ b/tests/test_c_comments.krak @@ -1,5 +1,5 @@ /*here*/ -/*here*/import /*here*/io/*here*/:/*here*/*/*here*/ +/*here*/import /*here*/simple_print/*here*/:/*here*/*/*here*/ /*here*/ /*here*/fun/*here*/ main/*here*/(/*here*/)/*here*/:/*here*/ int/*here*/ {/*here*/ /*here*/ println/*here*/( /*here*/1 /*here*/ )/*here*/ diff --git a/tests/test_cgen_bug.krak b/tests/test_cgen_bug.krak index e8ad0d2..05038f2 100644 --- a/tests/test_cgen_bug.krak +++ b/tests/test_cgen_bug.krak @@ -1,4 +1,4 @@ -import io:* +import simple_print:* import vector:* fun onlyMatch(vec: vector, matchWith: int): vector { diff --git a/tests/test_chainedIndirectTemplates.krak b/tests/test_chainedIndirectTemplates.krak index ebe5e57..29d2166 100644 --- a/tests/test_chainedIndirectTemplates.krak +++ b/tests/test_chainedIndirectTemplates.krak @@ -1,5 +1,5 @@ import vector:*; -import io:*; +import simple_print:*; fun test(a: vector): T { return a.at(0); diff --git a/tests/test_commentFirstTest.krak b/tests/test_commentFirstTest.krak index bbe6b4c..bb653b0 100644 --- a/tests/test_commentFirstTest.krak +++ b/tests/test_commentFirstTest.krak @@ -1,5 +1,5 @@ /* Comment first! */ -import io:*; +import simple_print:*; fun main(): int { println(1337) /*how bout now*/ diff --git a/tests/test_destructor_copy_constructor.krak b/tests/test_destructor_copy_constructor.krak index 052469c..4bd0ac8 100644 --- a/tests/test_destructor_copy_constructor.krak +++ b/tests/test_destructor_copy_constructor.krak @@ -1,4 +1,4 @@ -import io:* +import simple_print:* obj wDestructor { var data: *char diff --git a/tests/test_else.krak b/tests/test_else.krak index e150e06..7549ad5 100644 --- a/tests/test_else.krak +++ b/tests/test_else.krak @@ -1,4 +1,4 @@ -import io:*; +import simple_print:*; fun main(): int { diff --git a/tests/test_functionOrderingTest.krak b/tests/test_functionOrderingTest.krak index 8ac6732..aa79e36 100644 --- a/tests/test_functionOrderingTest.krak +++ b/tests/test_functionOrderingTest.krak @@ -1,4 +1,4 @@ -import io:*; +import simple_print:*; fun ret1(): int { return ret2() / 2; diff --git a/tests/test_functionTemplateInference.krak b/tests/test_functionTemplateInference.krak index 951af63..ed18d1c 100644 --- a/tests/test_functionTemplateInference.krak +++ b/tests/test_functionTemplateInference.krak @@ -1,4 +1,4 @@ -import io:* +import simple_print:* obj Traited(Traits) {} diff --git a/tests/test_literal.krak b/tests/test_literal.krak index 47b9bdb..79042be 100644 --- a/tests/test_literal.krak +++ b/tests/test_literal.krak @@ -1,4 +1,4 @@ -import io:* +import simple_print:* fun do_num(it: int) { print("int: ") diff --git a/tests/test_moreComplexObjectTest.krak b/tests/test_moreComplexObjectTest.krak index 1e3333d..038c0ac 100644 --- a/tests/test_moreComplexObjectTest.krak +++ b/tests/test_moreComplexObjectTest.krak @@ -1,4 +1,4 @@ -import io:*; +import simple_print:*; obj firstObject { var objectNum: int; diff --git a/tests/test_multiline_strings.krak b/tests/test_multiline_strings.krak index a109687..c81a5d0 100644 --- a/tests/test_multiline_strings.krak +++ b/tests/test_multiline_strings.krak @@ -1,4 +1,4 @@ -import io:* +import simple_print:* fun main():int { println("multi diff --git a/tests/test_nequals.krak b/tests/test_nequals.krak index 9a5b103..d552f76 100644 --- a/tests/test_nequals.krak +++ b/tests/test_nequals.krak @@ -1,4 +1,4 @@ -import io:*; +import simple_print:*; fun main(): int { diff --git a/tests/test_newScoping.krak b/tests/test_newScoping.krak index de563eb..e424999 100644 --- a/tests/test_newScoping.krak +++ b/tests/test_newScoping.krak @@ -1,32 +1,32 @@ -import io; +import simple_print; import scopeQualified; import scopeUnqualified : * ; fun main(): int { - io::println("Qualified io!"); + simple_print::println("Qualified simple_print!"); // Defined in scopeQualified - io::println(scopeQualified::qualified_variable); - io::println(scopeQualified::qualified_func()); + simple_print::println(scopeQualified::qualified_variable); + simple_print::println(scopeQualified::qualified_func()); var qClass.construct(11): scopeQualified::qualified_class; - io::println(qClass.get()); + simple_print::println(qClass.get()); var sayQualified.construct("Qualified Container!"): scopeQualified::qualified_container<*char>; - io::println(sayQualified.get()); - io::println(scopeQualified::qualified_id<*char>("Even template functions qualified!")); + simple_print::println(sayQualified.get()); + simple_print::println(scopeQualified::qualified_id<*char>("Even template functsimple_printns qualified!")); - io::println(); + simple_print::println(); - io::println("Unqualified io!"); + simple_print::println("Unqualified simple_print!"); // Defined in scopeUnqualified - io::println(unqualifed_variable); - io::println(unqualified_func()); + simple_print::println(unqualifed_variable); + simple_print::println(unqualified_func()); var uqClass.construct(12): unqualified_class; - io::println(uqClass.get()); + simple_print::println(uqClass.get()); var sayUnqualified.construct("Unqualified Container!"): unqualified_container<*char>; - io::println(sayUnqualified.get()); - io::println(unqualified_id<*char>("Even template functions unqualified!")); + simple_print::println(sayUnqualified.get()); + simple_print::println(unqualified_id<*char>("Even template functsimple_printns unqualified!")); return 0; } diff --git a/tests/test_nosemicolon.krak b/tests/test_nosemicolon.krak index 7953bf9..178c0a9 100644 --- a/tests/test_nosemicolon.krak +++ b/tests/test_nosemicolon.krak @@ -1,4 +1,4 @@ -import io:* +import simple_print:* fun main(): int { println("no semicolons!") diff --git a/tests/test_objectOrderingTest.krak b/tests/test_objectOrderingTest.krak index 80f66ba..4adf25a 100644 --- a/tests/test_objectOrderingTest.krak +++ b/tests/test_objectOrderingTest.krak @@ -1,4 +1,4 @@ -import io:*; +import simple_print:*; obj objectA { var a: int; diff --git a/tests/test_oneStatementFunction.krak b/tests/test_oneStatementFunction.krak index d04eb6d..5350b9a 100644 --- a/tests/test_oneStatementFunction.krak +++ b/tests/test_oneStatementFunction.krak @@ -1,4 +1,4 @@ -import io:* +import simple_print:* fun oneLine1():void println(7) fun oneLine2():int return 8 diff --git a/tests/test_references.krak b/tests/test_references.krak index 9628d96..f783b42 100644 --- a/tests/test_references.krak +++ b/tests/test_references.krak @@ -1,4 +1,4 @@ -import io:* +import simple_print:* obj test_cons(Object) { fun construct(): *test_cons { diff --git a/tests/test_sameName.krak b/tests/test_sameName.krak index c79bbe0..08ab0b6 100644 --- a/tests/test_sameName.krak +++ b/tests/test_sameName.krak @@ -1,4 +1,4 @@ -import io:* +import simple_print:* import sameNameOne import sameNameTwo diff --git a/tests/test_short_circuit.krak b/tests/test_short_circuit.krak index 4d67e92..01e9e2e 100644 --- a/tests/test_short_circuit.krak +++ b/tests/test_short_circuit.krak @@ -1,4 +1,4 @@ -import io:* +import simple_print:* fun is_true():bool { return true diff --git a/tests/test_simpleObjectMultipleTemplateTest.krak b/tests/test_simpleObjectMultipleTemplateTest.krak index 0e78d21..e9d9cbd 100644 --- a/tests/test_simpleObjectMultipleTemplateTest.krak +++ b/tests/test_simpleObjectMultipleTemplateTest.krak @@ -1,4 +1,4 @@ -import io; +import simple_print; obj TemplateTest { diff --git a/tests/test_simpleObjectTest.krak b/tests/test_simpleObjectTest.krak index 385618b..2003a53 100644 --- a/tests/test_simpleObjectTest.krak +++ b/tests/test_simpleObjectTest.krak @@ -1,10 +1,10 @@ -import io; +import simple_print; obj FirstObject { var objectNum: int; fun PrintSelf(a: int): void { - io::print(objectNum); - io::print(a); + simple_print::print(objectNum); + simple_print::print(a); } }; @@ -12,6 +12,6 @@ fun main(): int { var wooObject: FirstObject; wooObject.objectNum = 5; wooObject.PrintSelf(7); - io::print("\n"); + simple_print::print("\n"); return 0; } diff --git a/tests/test_templateMemberFunction.krak b/tests/test_templateMemberFunction.krak index c15737b..0e68668 100644 --- a/tests/test_templateMemberFunction.krak +++ b/tests/test_templateMemberFunction.krak @@ -1,4 +1,4 @@ -import io:* +import simple_print:* obj templd { var data: T diff --git a/tests/test_templateTest.krak b/tests/test_templateTest.krak index e4b201d..3059333 100644 --- a/tests/test_templateTest.krak +++ b/tests/test_templateTest.krak @@ -1,4 +1,4 @@ -import io:*; +import simple_print:*; import trivial_container:*; obj TemplateTest { diff --git a/tests/test_testArrayNotation.krak b/tests/test_testArrayNotation.krak index 097312d..c9db3a4 100644 --- a/tests/test_testArrayNotation.krak +++ b/tests/test_testArrayNotation.krak @@ -1,5 +1,4 @@ -import io:*; -import mem:*; +import simple_print:*; fun main(): int { var b: int; diff --git a/tests/test_topLevelVarInit.krak b/tests/test_topLevelVarInit.krak index 1390dcd..9f12a79 100644 --- a/tests/test_topLevelVarInit.krak +++ b/tests/test_topLevelVarInit.krak @@ -1,10 +1,10 @@ -import io; +import simple_print; var a: int = 42; var b = "hi"; fun main(): int { - io::println(a); - io::println(b); + simple_print::println(a); + simple_print::println(b); return 0; } diff --git a/tests/test_trigTest.krak b/tests/test_trigTest.krak index b66fbdc..0e49771 100644 --- a/tests/test_trigTest.krak +++ b/tests/test_trigTest.krak @@ -1,4 +1,4 @@ -import io:*; +import simple_print:*; import math:*; fun main(): int diff --git a/tests/test_typeExpr.krak b/tests/test_typeExpr.krak index 45ad805..184ff11 100644 --- a/tests/test_typeExpr.krak +++ b/tests/test_typeExpr.krak @@ -1,4 +1,4 @@ -import io; +import simple_print; obj ClassWithConstructor { var data: int; @@ -7,7 +7,7 @@ obj ClassWithConstructor { return this; } fun printData(): void { - io::println(data); + simple_print::println(data); } }; @@ -15,6 +15,6 @@ fun main(): int { var object.construct(4): ClassWithConstructor; object.printData(); var a :int = 8; - io::println(a); + simple_print::println(a); return 0; } diff --git a/tests/test_util.krak b/tests/test_util.krak index 054bd57..122cbf9 100644 --- a/tests/test_util.krak +++ b/tests/test_util.krak @@ -1,5 +1,5 @@ import util:* -import io:* +import simple_print:* obj test(Object) { var counter:int