Refactor item set transition functions

This commit is contained in:
Max Brunsfeld 2014-06-16 13:37:34 -07:00
parent e953dbaa17
commit 1daaf4485f
5 changed files with 13 additions and 33 deletions

View file

@ -40,8 +40,6 @@ describe("syntactic item set transitions", [&]() {
{ ParseItem(Symbol(0), seq({ i_token(22), i_sym(1) }), 3), { Symbol(23, SymbolOptionToken) } },
});
SymTransitions sym_transitions;
AssertThat(sym_transitions(set1, grammar), Equals(map<Symbol, ParseItemSet>({
{ Symbol(22, SymbolOptionToken), ParseItemSet({
{ ParseItem(Symbol(0), i_sym(1), 4), { Symbol(23, SymbolOptionToken) } },

View file

@ -5,7 +5,7 @@ int main(int argc, char *argv[]) {
"",
"--no-color",
"--only="
""
"compiles the javascript"
};
return bandit::run(4, const_cast<char **>(args));
}

View file

@ -26,7 +26,6 @@ namespace tree_sitter {
const PreparedGrammar grammar;
ParseConflictManager conflict_manager;
unordered_map<const ParseItemSet, ParseStateId> parse_state_ids;
SymTransitions sym_transitions;
ParseTable parse_table;
ParseStateId add_parse_state(const ParseItemSet &item_set) {

View file

@ -13,28 +13,20 @@ namespace tree_sitter {
namespace build_tables {
map<Symbol, ParseItemSet>
SymTransitions::operator()(const ParseItemSet &item_set, const PreparedGrammar &grammar) {
sym_transitions(const ParseItemSet &item_set, const PreparedGrammar &grammar) {
map<Symbol, ParseItemSet> result;
for (const auto &pair : item_set) {
const ParseItem &item = pair.first;
const set<Symbol> &lookahead_symbols = pair.second;
map<Symbol, ParseItemSet> result_for_item;
for (auto &transition : sym_transitions(item.rule)) {
ParseItem new_item(item.lhs, transition.second, item.consumed_symbol_count + 1);
result_for_item.insert({
transition.first,
item_set_closure(new_item, lookahead_symbols, grammar)
});
merge_sym_transitions<ParseItemSet>(&result, {{ transition.first, item_set_closure(new_item, lookahead_symbols, grammar) }},
[](ParseItemSet *left, const ParseItemSet *right) {
for (auto &pair : *right)
left->operator[](pair.first).insert(pair.second.begin(), pair.second.end());
});
}
merge_sym_transitions<ParseItemSet>(&result, result_for_item,
[](ParseItemSet *left, const ParseItemSet *right) {
for (auto &pair : *right)
left->operator[](pair.first).insert(pair.second.begin(), pair.second.end());
});
}
return result;
}
@ -42,18 +34,13 @@ namespace tree_sitter {
char_transitions(const LexItemSet &item_set, const PreparedGrammar &grammar) {
map<CharacterSet, LexItemSet> result;
for (const LexItem &item : item_set) {
map<CharacterSet, LexItemSet> item_transitions;
for (auto &transition : char_transitions(item.rule)) {
LexItem next_item(item.lhs, transition.second);
item_transitions.insert({
transition.first,
LexItemSet({ next_item })
});
merge_char_transitions<LexItemSet>(&result, {{ transition.first, LexItemSet({ next_item }) }},
[](LexItemSet *left, const LexItemSet *right) {
left->insert(right->begin(), right->end());
});
}
merge_char_transitions<LexItemSet>(&result, item_transitions,
[](LexItemSet *left, const LexItemSet *right) {
left->insert(right->begin(), right->end());
});
}
return result;
}

View file

@ -13,12 +13,8 @@ namespace tree_sitter {
}
namespace build_tables {
class SymTransitions {
public:
std::map<rules::Symbol, ParseItemSet>
operator()(const ParseItemSet &item_set, const PreparedGrammar &grammar);
std::map<rules::rule_ptr, std::map<rules::Symbol, ParseItemSet>> transitions_cache;
};
std::map<rules::Symbol, ParseItemSet>
sym_transitions(const ParseItemSet &item_set, const PreparedGrammar &grammar);
std::map<rules::CharacterSet, LexItemSet>
char_transitions(const LexItemSet &item_set, const PreparedGrammar &grammar);