tree-sitter/spec/compiler/build_tables/item_set_closure_spec.cc
Max Brunsfeld 48baf056b4 Store grammars' rules in vectors, not maps
This way, we can keep of the order in which the rules
were given, for resolving reduce/reduce conflicts.
2014-03-24 13:17:38 -07:00

52 lines
No EOL
1.9 KiB
C++

#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")), {}, Symbol("__END__"))
}), grammar);
AssertThat(item_set, Equals(ParseItemSet({
ParseItem(Symbol("F"), grammar.rule(Symbol("F")), {}, Symbol("__END__")),
ParseItem(Symbol("F"), grammar.rule(Symbol("F")), {}, Symbol("+")),
ParseItem(Symbol("F"), grammar.rule(Symbol("F")), {}, Symbol("*")),
ParseItem(Symbol("T"), grammar.rule(Symbol("T")), {}, Symbol("__END__")),
ParseItem(Symbol("T"), grammar.rule(Symbol("T")), {}, Symbol("+")),
ParseItem(Symbol("E"), grammar.rule(Symbol("E")), {}, Symbol("__END__")),
})));
ParseItemSet next_item_set = sym_transitions(item_set, grammar)[Symbol("v")];
AssertThat(next_item_set, Equals(ParseItemSet({
ParseItem(Symbol("F"), rules::blank(), { false }, Symbol("__END__")),
ParseItem(Symbol("F"), rules::blank(), { false }, Symbol("*")),
ParseItem(Symbol("F"), rules::blank(), { false }, Symbol("+")),
})));
});
});
END_TEST