summaryrefslogtreecommitdiffstats
path: root/src/generator.hpp
diff options
context:
space:
mode:
authorMatthias Schiffer <mschiffer@universe-factory.net>2015-03-31 20:25:04 +0200
committerMatthias Schiffer <mschiffer@universe-factory.net>2015-03-31 20:25:04 +0200
commit03b5a87eeb87fb059c9d51696912bfa9c39c5929 (patch)
tree6ff1e85d67afc4b105a02230611da854695c9477 /src/generator.hpp
parent129b81e09375dbee4a12c468ef75f18243e8a0a4 (diff)
downloadsolar-03b5a87eeb87fb059c9d51696912bfa9c39c5929.tar
solar-03b5a87eeb87fb059c9d51696912bfa9c39c5929.zip
generator: generate item sets recursively
Diffstat (limited to 'src/generator.hpp')
-rw-r--r--src/generator.hpp12
1 files changed, 10 insertions, 2 deletions
diff --git a/src/generator.hpp b/src/generator.hpp
index d9bcaf6..880323b 100644
--- a/src/generator.hpp
+++ b/src/generator.hpp
@@ -38,12 +38,20 @@ class generator_t {
private:
std::multimap<std::string, item_t> rules;
std::multimap<symbol_t, item_t> items;
+ std::map<std::set<item_t>, unsigned> itemsets;
void close_set(std::set<item_t> *set);
std::set<item_t> get_set(const std::string &nonterm);
- void print_item(const item_t &item);
- void print_set(const std::set<item_t> &set);
+ std::pair<bool, unsigned> add_set(const std::set<item_t> &set) {
+ auto ret = itemsets.emplace(set, itemsets.size());
+ return std::make_pair(ret.second, ret.first->second);
+ }
+
+ void generate_itemsets();
+
+ static void print_item(const item_t &item);
+ static void print_set(const std::set<item_t> &set);
public:
generator_t(const std::set<item_t> &rules0);