diff --git a/src/ASTTransformation.cpp b/src/ASTTransformation.cpp index a5d2a5f..0b9a6b9 100644 --- a/src/ASTTransformation.cpp +++ b/src/ASTTransformation.cpp @@ -709,7 +709,8 @@ NodeTree* ASTTransformation::transform(NodeTree* from, NodeTree // for type inferencing if (!identifierType) { if (toAssign) { - identifierType = toAssign->getDataRef()->valueType; + // no reference variables + identifierType = toAssign->getDataRef()->valueType->withoutReference(); newIdentifier->getDataRef()->valueType = identifierType; } else throw "have to inference but no expression"; diff --git a/src/CGenerator.cpp b/src/CGenerator.cpp index d1f2a23..d513f23 100644 --- a/src/CGenerator.cpp +++ b/src/CGenerator.cpp @@ -568,7 +568,7 @@ CCodeTriple CGenerator::generate(NodeTree* from, NodeTree* enc output.value += ValueTypeToCType(children[0]->getData().valueType, assignedTo) + ";\n"; // we put the thing about to be copy constructed in a variable so we can for sure take its address std::string toAssignTemp = "copy_construct_param" + getID(); - output.value += ValueTypeToCType(children[1]->getData().valueType, toAssignTemp) + " = " + toAssign.value + ";\n"; + output.value += ValueTypeToCType(children[1]->getData().valueType->withoutReference(), toAssignTemp) + " = " + toAssign.value + ";\n"; output.value += generateMethodIfExists(children[0]->getDataRef()->valueType, "copy_construct", "&" + assignedTo + ", &" + toAssignTemp, std::vector{children[1]->getDataRef()->valueType->withIncreasedIndirection()}) + ";\n" + output.postValue; output.value += toAssign.postValue; diff --git a/stdlib/grammer.krak b/stdlib/grammer.krak index 6584e65..1182aad 100644 --- a/stdlib/grammer.krak +++ b/stdlib/grammer.krak @@ -139,42 +139,53 @@ obj grammer (Object) { ) var first_helper = fun(rhs: vector::vector): set::set { var toRet = set::set() - rhs.for_each(fun(sym: symbol::symbol) { - toRet.add(first_set_map[sym]) - }) + if (rhs.size) { + for (var i = 0; i < rhs.size; i++;) { + var lookahead = first_set_map[rhs[i]] + if (lookahead.contains(symbol::null_symbol())) { + lookahead.remove(symbol::null_symbol()) + toRet.add(lookahead) + } else { + toRet.add(lookahead) + break + } + } + } else { + toRet.add(symbol::null_symbol()) + } return toRet } var changed = true while (changed) { - io::println("//////////current state of map/////////////") + /*io::println("//////////current state of map/////////////")*/ first_set_map.keys.for_each(fun(sym: symbol::symbol) { - io::print("for ") - io::println(sym.to_string()) - io::println("map is:") - first_set_map[sym].for_each(fun(look: symbol::symbol) { - io::print("lookahead: "); io::println(look.to_string()) - }) + /*io::print("for ")*/ + /*io::println(sym.to_string())*/ + /*io::println("map is:")*/ + /*first_set_map[sym].for_each(fun(look: symbol::symbol) {*/ + /*io::print("lookahead: "); io::println(look.to_string())*/ + /*})*/ }) changed = false rules.for_each( fun(r: rule) { var rule_lookahead = first_helper(r.rhs) if (!changed) { - io::println(r.to_string()) + /*io::println(r.to_string())*/ changed = !first_set_map[r.lhs].contains(rule_lookahead) - io::print("changed: "); io::println(changed) - io::print("\tcurrent lookahead is sized:") - io::println(first_set_map[r.lhs].size()) - io::println("\tcurrent lookahead is:") - first_set_map[r.lhs].for_each(fun(look: symbol::symbol) { - io::print("\t\tlookahead: "); io::println(look.to_string()) - }) - io::println() - io::print("\rule lookahead is sized:") - io::println(rule_lookahead.size()) - io::println("\trule lookahead is:") - rule_lookahead.for_each(fun(look: symbol::symbol) { - io::print("\t\tlookahead: "); io::println(look.to_string()) - }) + /*io::print("changed: "); io::println(changed)*/ + /*io::print("\tcurrent lookahead is sized:")*/ + /*io::println(first_set_map[r.lhs].size())*/ + /*io::println("\tcurrent lookahead is:")*/ + /*first_set_map[r.lhs].for_each(fun(look: symbol::symbol) {*/ + /*io::print("\t\tlookahead: "); io::println(look.to_string())*/ + /*})*/ + /*io::println()*/ + /*io::print("\rule lookahead is sized:")*/ + /*io::println(rule_lookahead.size())*/ + /*io::println("\trule lookahead is:")*/ + /*rule_lookahead.for_each(fun(look: symbol::symbol) {*/ + /*io::print("\t\tlookahead: "); io::println(look.to_string())*/ + /*})*/ } first_set_map[r.lhs].add(rule_lookahead) }) diff --git a/stdlib/symbol.krak b/stdlib/symbol.krak index f322dc0..61a3cd6 100644 --- a/stdlib/symbol.krak +++ b/stdlib/symbol.krak @@ -1,5 +1,10 @@ import string +fun null_symbol(): symbol { + var toRet.construct(string::string("$NULL"), false, string::string("$NULL$")): symbol + return toRet +} + fun symbol(nameIn: *char, terminalIn: bool): symbol { var toRet.construct(string::string(nameIn), terminalIn, string::string("no_value")): symbol return toRet diff --git a/tests/grammer2.kgm b/tests/grammer2.kgm new file mode 100644 index 0000000..2b50832 --- /dev/null +++ b/tests/grammer2.kgm @@ -0,0 +1,10 @@ +# comment +a = b ; +b = "c":named_c ; +b = c "d":dname ; +c = "a" | d ; +d = e post_null post_non_null ; +e = f | ; +f = ; +post_null = "hi" +post_non_null = "bye" diff --git a/tests/test_grammer.krak b/tests/test_grammer.krak index 099cb3b..a535897 100644 --- a/tests/test_grammer.krak +++ b/tests/test_grammer.krak @@ -8,7 +8,8 @@ import symbol:* fun main():int { /*var a = load_grammer(read_file(string("../krakenGrammer.kgm")))*/ - var a = load_grammer(read_file(string("grammer.kgm"))) + /*var a = load_grammer(read_file(string("grammer.kgm")))*/ + var a = load_grammer(read_file(string("grammer2.kgm"))) println(a.to_string()) var doFirstSet = fun() { a.calculate_first_set() @@ -39,8 +40,9 @@ fun main():int { var lex = lexer(a.terminals) /*lex.set_input(read_file(string("test_grammer.krak")))*/ - lex.set_input(string("ccdahas spacedhas -returndaaaaaaaaaaaaaa")) + /*lex.set_input(string("ccdahas spacedhas*/ +/*returndaaaaaaaaaaaaaa"))*/ + lex.set_input(string("hibyed")) println("woo lexing:") range(8).for_each(fun(i: int) { println(lex.next().to_string()); } ) /*range(80).for_each(fun(i: int) { println(lex.next().to_string()); } )*/ diff --git a/tests/test_references.expected_results b/tests/test_references.expected_results index af7ccef..585cf3c 100644 --- a/tests/test_references.expected_results +++ b/tests/test_references.expected_results @@ -5,4 +5,7 @@ construct do do +copy_construct +do +destruct destruct diff --git a/tests/test_references.krak b/tests/test_references.krak index fb6f1ce..9628d96 100644 --- a/tests/test_references.krak +++ b/tests/test_references.krak @@ -59,6 +59,9 @@ fun main():int { var t.construct() : test_cons call(t) id(t).do() + + var do_copy = id(t) + do_copy.do() return 0 }