tree-sitter/src/compiler/build_tables/item_set_closure.cpp

32 lines
1 KiB
C++
Raw Normal View History

#include "item_set_closure.h"
#include "./next_symbols.h"
#include "grammar.h"
#include "item.h"
#include <vector>
using std::vector;
namespace tree_sitter {
namespace build_tables {
2014-01-13 18:47:57 -08:00
static bool contains(ItemSet items, Item item) {
return (std::find(items.begin(), items.end(), item) != items.end());
}
2014-01-13 18:47:57 -08:00
static void add_item(ItemSet &item_set, const Item &item, const Grammar &grammar) {
if (!contains(item_set, item)) {
item_set.insert(item);
for (rules::Symbol rule : next_non_terminals(item, grammar)) {
Item next_item = Item::at_beginning_of_rule(rule.name, grammar);
2014-01-13 18:47:57 -08:00
add_item(item_set, next_item, grammar);
}
}
}
2014-01-13 18:47:57 -08:00
const ItemSet item_set_closure(const ItemSet &item_set, const Grammar &grammar) {
ItemSet result;
for (Item item : item_set)
2014-01-13 18:47:57 -08:00
add_item(result, item, grammar);
return result;
}
}
}