tree-sitter/src/compiler/lr/item_set.h

65 lines
2.2 KiB
C++

#ifndef __TreeSitter__item_set__
#define __TreeSitter__item_set__
#include "item.h"
#include "grammar.h"
namespace tree_sitter {
namespace lr {
class ItemSet;
typedef std::shared_ptr<const ItemSet> item_set_ptr;
class ItemSet {
const std::vector<Item> contents;
public:
ItemSet(const std::vector<Item> &items);
ItemSet(const std::initializer_list<Item> &items);
ItemSet(const Item &item, const Grammar &grammar);
typedef Item value_type;
typedef std::vector<Item>::const_iterator const_iterator;
const_iterator begin() const;
const_iterator end() const;
size_t size() const;
transition_map<rules::Rule, ItemSet> all_transitions(const Grammar &grammar) const;
template<typename RuleClass>
transition_map<RuleClass, ItemSet> transitions(const Grammar &grammar) const {
transition_map<RuleClass, ItemSet> result;
for (auto transition : all_transitions(grammar)) {
auto rule = std::dynamic_pointer_cast<const RuleClass>(transition.first);
if (rule.get()) result.add(rule, transition.second);
}
return result;
}
template<typename RuleClass>
std::vector<RuleClass> next_inputs(const Grammar &grammar) const {
std::vector<RuleClass> result;
for (auto pair : transitions<RuleClass>(grammar))
result.push_back(*pair.first);
return result;
}
bool operator==(const ItemSet &other) const;
};
typedef std::shared_ptr<const ItemSet> item_set_ptr;
std::ostream& operator<<(std::ostream &stream, const ItemSet &item_set);
}
}
namespace std {
template<>
struct hash<const tree_sitter::lr::ItemSet> {
size_t operator()(const tree_sitter::lr::ItemSet &item_set) const {
size_t result = hash<size_t>()(item_set.size());
for (auto item : item_set)
result ^= hash<tree_sitter::lr::Item>()(item);
return result;
}
};
}
#endif