#include "compiler_spec_helper.h" #include "compiler/prepared_grammar.h" #include "compiler/build_tables/item_set_closure.h" #include "compiler/build_tables/item_set_transitions.h" using namespace build_tables; using namespace rules; START_TEST describe("computing closures of item sets", []() { PreparedGrammar grammar({ { "E", choice({ seq({ sym("T"), sym("+"), sym("T") }), sym("T") }) }, { "T", choice({ seq({ sym("F"), sym("*"), sym("F") }), sym("F") }) }, { "F", choice({ sym("v"), sym("n") }) } }, {}); it("computes the item set closure", [&]() { ParseItemSet item_set = item_set_closure(ParseItemSet({ ParseItem(Symbol("E"), grammar.rule(Symbol("E")), 0, Symbol("__END__")) }), grammar); AssertThat(item_set, Equals(ParseItemSet({ ParseItem(Symbol("F"), grammar.rule(Symbol("F")), 0, Symbol("__END__")), ParseItem(Symbol("F"), grammar.rule(Symbol("F")), 0, Symbol("+")), ParseItem(Symbol("F"), grammar.rule(Symbol("F")), 0, Symbol("*")), ParseItem(Symbol("T"), grammar.rule(Symbol("T")), 0, Symbol("__END__")), ParseItem(Symbol("T"), grammar.rule(Symbol("T")), 0, Symbol("+")), ParseItem(Symbol("E"), grammar.rule(Symbol("E")), 0, Symbol("__END__")), }))); ParseItemSet next_item_set = sym_transitions(item_set, grammar)[Symbol("v")]; AssertThat(next_item_set, Equals(ParseItemSet({ ParseItem(Symbol("F"), rules::blank(), 1, Symbol("__END__")), ParseItem(Symbol("F"), rules::blank(), 1, Symbol("*")), ParseItem(Symbol("F"), rules::blank(), 1, Symbol("+")), }))); }); }); END_TEST