diff --git a/stdlib/parser.krak b/stdlib/parser.krak index 0f817bb..2219f4c 100644 --- a/stdlib/parser.krak +++ b/stdlib/parser.krak @@ -287,15 +287,32 @@ obj parser (Object) { } else { if (!are_packed(parent->children)) { // ambiguity inner + var sub_parent = new>()->construct(symbol("AmbiguityInner", true)) + set_packed(sub_parent, true) + sub_parent->children.add_all(parent->children) + parent->children.clear() + parent->children.add(sub_parent) } // ambiguity outer + var next_sub_parent = new>()->construct(symbol("AmbiguityOuter", true)) + set_packed(next_sub_parent, true) + parent->children.add(next_sub_parent) + next_sub_parent->children.add_all(children) } } fun belongs_to_family(node: *tree, nodes: vector<*tree>): bool { - return false + var family_count = 0 + node->children.for_each(fun(child: *tree) { + if (nodes.contains(child)) + family_count++ + }) + return family_count == nodes.size } fun are_packed(nodes: vector<*tree>): bool { - return true + return nodes.any_true(fun(it: *tree):bool { return packed_map.contains_key(it) && packed_map[it]; }) + } + fun set_packed(node: *tree, packed: bool) { + packed_map.set(node, packed) } fun fully_reduces_to_null(r: ref rule): bool { return r.position == 0 && gram.first_vector(r.rhs).contains(null_symbol()) diff --git a/tests/test_grammer.krak b/tests/test_grammer.krak index 36eabbd..d531d94 100644 --- a/tests/test_grammer.krak +++ b/tests/test_grammer.krak @@ -52,7 +52,8 @@ fun main():int { println(a.to_string()) a.calculate_state_automaton() var parse.construct(a): parser - var result = parse.parse_input(string("fun main():int { return 0; }"), string("fun name")) + var result = parse.parse_input(string("inport a;"), string("fun name")) + /*var result = parse.parse_input(string("fun main():int { return 0; }"), string("fun name"))*/ /*var result = parse.parse_input(string("ad"), string("fun name"))*/ /*var result = parse.parse_input(string("hibyed"), string("fun name"))*/ /*var result = parse.parse_input(string("hmmhmm"), string("fun name"))*/