diff options
author | Matthias Schiffer <mschiffer@universe-factory.net> | 2015-03-31 20:25:04 +0200 |
---|---|---|
committer | Matthias Schiffer <mschiffer@universe-factory.net> | 2015-03-31 20:25:04 +0200 |
commit | 03b5a87eeb87fb059c9d51696912bfa9c39c5929 (patch) | |
tree | 6ff1e85d67afc4b105a02230611da854695c9477 /src/generator.hpp | |
parent | 129b81e09375dbee4a12c468ef75f18243e8a0a4 (diff) | |
download | solar-03b5a87eeb87fb059c9d51696912bfa9c39c5929.tar solar-03b5a87eeb87fb059c9d51696912bfa9c39c5929.zip |
generator: generate item sets recursively
Diffstat (limited to 'src/generator.hpp')
-rw-r--r-- | src/generator.hpp | 12 |
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); |