#include "item_set_transitions.h" #include "item_set_closure.h" #include "rule_transitions.h" using std::dynamic_pointer_cast; using std::make_shared; namespace tree_sitter { namespace build_tables { transition_map item_transitions(const Item &item) { return rule_transitions(item.rule).map([&](rules::rule_ptr to_rule) { return make_shared(item.rule_name, to_rule, item.next_sym_count()); }); }; template transition_map transitions(const ItemSet &item_set, const Grammar &grammar) { transition_map result; for (Item item : item_set) { for (auto transition : item_transitions(item)) { auto rule = dynamic_pointer_cast(transition.first); auto new_item_set = make_shared(item_set_closure(ItemSet({ *transition.second }), grammar)); if (rule.get()) result.add(rule, new_item_set); } } return result; } transition_map char_transitions(const ItemSet &item_set, const Grammar &grammar) { return transitions(item_set, grammar); } transition_map sym_transitions(const ItemSet &item_set, const Grammar &grammar) { return transitions(item_set, grammar); } } }