summaryrefslogtreecommitdiffstats
path: root/src/generator.cpp
diff options
context:
space:
mode:
authorMatthias Schiffer <mschiffer@universe-factory.net>2015-03-31 20:46:33 +0200
committerMatthias Schiffer <mschiffer@universe-factory.net>2015-03-31 20:46:33 +0200
commit342f927aace815c2b6e7903def14d4aca9bc2233 (patch)
treed000c11855d00dd9c9d11ab2a609aeefbb2b0004 /src/generator.cpp
parent03b5a87eeb87fb059c9d51696912bfa9c39c5929 (diff)
downloadsolar-342f927aace815c2b6e7903def14d4aca9bc2233.tar
solar-342f927aace815c2b6e7903def14d4aca9bc2233.zip
generator: generate transitions
Diffstat (limited to 'src/generator.cpp')
-rw-r--r--src/generator.cpp44
1 files changed, 29 insertions, 15 deletions
diff --git a/src/generator.cpp b/src/generator.cpp
index 7f5f5e9..e8fd07b 100644
--- a/src/generator.cpp
+++ b/src/generator.cpp
@@ -63,23 +63,22 @@ void generator_t::close_set(std::set<item_t> *set) {
}
void generator_t::generate_itemsets() {
- std::queue<std::set<item_t>> queue;
+ std::queue<std::pair<std::set<item_t>, unsigned>> queue;
{
std::set<item_t> set0 = get_set("");
close_set(&set0);
- add_set(set0);
- queue.push(set0);
+ queue.push(*add_set(set0).first);
}
for (; !queue.empty(); queue.pop()) {
- const std::set<item_t> &cur = queue.front();
+ const auto &cur = queue.front();
const std::set<item_t> empty_set;
std::map<symbol_t, std::set<item_t>> new_sets;
- for (const item_t &item : cur) {
+ for (const item_t &item : cur.first) {
if (!item.has_next())
continue;
@@ -95,12 +94,26 @@ void generator_t::generate_itemsets() {
for (auto &entry : new_sets) {
close_set(&entry.second);
- if (add_set(entry.second).first)
- queue.push(entry.second);
+ auto added = add_set(entry.second);
+ transitions.emplace(std::make_pair(cur.second, entry.first), added.first->second);
+
+ if (added.second)
+ queue.push(*added.first);
}
}
}
+void generator_t::print_symbol(const symbol_t &sym) {
+ switch (sym.get_type()) {
+ case SYMBOL_TYPE_CHAR:
+ printf("'%c'", sym.get_value()[0]);
+ break;
+
+ default:
+ printf("%s", sym.get_value().c_str());
+ }
+}
+
void generator_t::print_item(const item_t &item) {
printf("%s |=", item.get_lhs().c_str());
@@ -111,14 +124,8 @@ void generator_t::print_item(const item_t &item) {
if (i == item.get_rhs().size())
break;
- switch (item.get_rhs()[i].get_type()) {
- case SYMBOL_TYPE_CHAR:
- printf(" '%c'", item.get_rhs()[i].get_value()[0]);
- break;
-
- default:
- printf(" %s", item.get_rhs()[i].get_value().c_str());
- }
+ printf(" ");
+ print_symbol(item.get_rhs()[i]);
}
printf("\n");
@@ -150,6 +157,13 @@ generator_t::generator_t(const std::set<item_t> &rules0) {
print_set(*setlist[i]);
printf("\n");
}
+
+ printf("Transitions:\n");
+ for (const auto &t : transitions) {
+ printf("%u ", t.first.first);
+ print_symbol(t.first.second);
+ printf(" -> %u\n", t.second);
+ }
}
}