Refactor item set transition functions
This commit is contained in:
parent
e953dbaa17
commit
1daaf4485f
5 changed files with 13 additions and 33 deletions
|
|
@ -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) } },
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@ int main(int argc, char *argv[]) {
|
|||
"",
|
||||
"--no-color",
|
||||
"--only="
|
||||
""
|
||||
"compiles the javascript"
|
||||
};
|
||||
return bandit::run(4, const_cast<char **>(args));
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue