#include "item_set_transitions.h" #include "item_set_closure.h" #include "rule_transitions.h" using std::dynamic_pointer_cast; using std::make_shared; using std::shared_ptr; namespace tree_sitter { namespace build_tables { template static std::set merge_sets(const std::set &left, const std::set &right) { std::set result = left; result.insert(right.begin(), right.end()); return result; } transition_map char_transitions(const LexItemSet &item_set, const Grammar &grammar) { transition_map result; for (LexItem item : item_set) { transition_map item_transitions; for (auto transition : rule_transitions(item.rule)) { auto rule = dynamic_pointer_cast(transition.first); if (rule.get()) { auto new_item = LexItem(item.lhs, transition.second); auto new_item_set = LexItemSet({ new_item }); item_transitions.add(rule, make_shared(new_item_set)); } } result.merge(item_transitions, [](shared_ptr left, shared_ptr right) -> shared_ptr { return make_shared(merge_sets(*left, *right)); }); } return result; } transition_map sym_transitions(const ParseItemSet &item_set, const Grammar &grammar) { transition_map result; for (ParseItem item : item_set) { transition_map item_transitions; for (auto transition : rule_transitions(item.rule)) { auto rule = dynamic_pointer_cast(transition.first); if (rule.get()) { auto consumed_symbols = item.consumed_symbols; consumed_symbols.push_back(*rule); auto new_item = ParseItem(item.lhs, transition.second, consumed_symbols, item.lookahead_sym); auto new_item_set = item_set_closure(ParseItemSet({ new_item }), grammar); item_transitions.add(rule, make_shared(new_item_set)); } } result.merge(item_transitions, [](shared_ptr left, shared_ptr right) -> shared_ptr { return make_shared(merge_sets(*left, *right)); }); } return result; } } }