2014-01-12 09:13:53 -08:00
|
|
|
#include "item_set_closure.h"
|
2014-01-19 01:49:56 -08:00
|
|
|
#include "./follow_sets.h"
|
2014-01-11 16:48:40 -08:00
|
|
|
#include "grammar.h"
|
|
|
|
|
#include "item.h"
|
|
|
|
|
|
|
|
|
|
namespace tree_sitter {
|
|
|
|
|
namespace build_tables {
|
2014-01-18 09:47:26 -08:00
|
|
|
static bool contains(ParseItemSet items, ParseItem item) {
|
2014-01-11 16:48:40 -08:00
|
|
|
return (std::find(items.begin(), items.end(), item) != items.end());
|
|
|
|
|
}
|
|
|
|
|
|
2014-01-18 09:47:26 -08:00
|
|
|
static void add_item(ParseItemSet &item_set, const ParseItem &item, const Grammar &grammar) {
|
2014-01-13 18:47:57 -08:00
|
|
|
if (!contains(item_set, item)) {
|
|
|
|
|
item_set.insert(item);
|
2014-01-19 01:49:56 -08:00
|
|
|
for (auto pair : follow_sets(item, grammar)) {
|
|
|
|
|
auto non_terminal = pair.first;
|
|
|
|
|
auto terminals = pair.second;
|
|
|
|
|
for (rules::Symbol terminal : terminals) {
|
2014-01-28 22:09:37 -08:00
|
|
|
auto next_item = ParseItem(non_terminal, grammar.rule(non_terminal), {}, terminal);
|
2014-01-19 01:49:56 -08:00
|
|
|
add_item(item_set, next_item, grammar);
|
|
|
|
|
}
|
2014-01-11 16:48:40 -08:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
2014-01-18 09:47:26 -08:00
|
|
|
|
|
|
|
|
const ParseItemSet item_set_closure(const ParseItemSet &item_set, const Grammar &grammar) {
|
|
|
|
|
ParseItemSet result;
|
|
|
|
|
for (ParseItem item : item_set)
|
2014-01-13 18:47:57 -08:00
|
|
|
add_item(result, item, grammar);
|
|
|
|
|
return result;
|
2014-01-11 16:48:40 -08:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|