generator: remove printing, add some getters

This commit is contained in:
Matthias Schiffer 2015-04-02 01:43:43 +02:00
parent 531a4de1fc
commit ab2d315aa2
2 changed files with 11 additions and 79 deletions

View file

@ -119,39 +119,6 @@ void generator_t::generate_itemsets() {
} }
} }
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, bool point) {
printf("%s |=", item.get_lhs().c_str());
for (size_t i = 0; i <= item.get_rhs().size(); i++) {
if (i == item.get_point() && point)
printf(" .");
if (i == item.get_rhs().size())
break;
printf(" ");
print_symbol(item.get_rhs()[i]);
}
printf("\n");
}
void generator_t::print_set(const std::set<item_t> &set) {
for (const item_t &item : set)
print_item(item, true);
}
generator_t::generator_t(const std::vector<item_t> &rules0) : rules(rules0) { generator_t::generator_t(const std::vector<item_t> &rules0) : rules(rules0) {
for (size_t i = 0; i < rules.size(); i++) { for (size_t i = 0; i < rules.size(); i++) {
item_t rule = rules[i]; item_t rule = rules[i];
@ -172,45 +139,6 @@ generator_t::generator_t(const std::vector<item_t> &rules0) : rules(rules0) {
} }
generate_itemsets(); generate_itemsets();
printf("Rules:\n");
for (size_t i = 0; i < rules.size(); i++) {
printf("(%u) ", unsigned(i));
print_item(rules[i], false);
}
printf("\n");
const std::set<item_t> *setlist[itemsets.size()];
for (const auto &entry : itemsets)
setlist[entry.second] = &entry.first;
for (size_t i = 0; i < itemsets.size(); i++) {
printf("Item %u:\n", unsigned(i));
print_set(*setlist[i]);
printf("\n");
}
printf("Actions:\n");
for (const auto &a : shifts) {
printf("%u ", unsigned(a.first.first));
if (!a.first.second.get_value().empty()) {
print_symbol(a.first.second);
printf(" -> s%u\n", unsigned(a.second));
}
else {
printf("$ -> acc\n");
}
}
for (const auto &a : reductions)
printf("%u -> r%u\n", unsigned(a.first), unsigned(a.second));
printf("\n");
printf("Gotos:\n");
for (const auto &g : gotos)
printf("%u %s -> %u\n", unsigned(g.first.first), g.first.second.get_value().c_str(), unsigned(g.second));
} }
} }

View file

@ -45,9 +45,9 @@ private:
std::multimap<symbol_t, item_t> items; std::multimap<symbol_t, item_t> items;
std::map<std::set<item_t>, size_t> itemsets; std::map<std::set<item_t>, size_t> itemsets;
std::map<std::pair<unsigned, symbol_t>, unsigned> shifts; std::map<std::pair<size_t, symbol_t>, size_t> shifts;
std::map<unsigned, unsigned> reductions; std::map<size_t, size_t> reductions;
std::map<std::pair<unsigned, symbol_t>, unsigned> gotos; std::map<std::pair<size_t, symbol_t>, size_t> gotos;
void close_set(std::set<item_t> *set); void close_set(std::set<item_t> *set);
std::set<item_t> get_set(const std::string &nonterm); std::set<item_t> get_set(const std::string &nonterm);
@ -58,11 +58,15 @@ private:
void generate_itemsets(); void generate_itemsets();
static void print_symbol(const symbol_t &sym);
static void print_item(const item_t &item, bool point);
static void print_set(const std::set<item_t> &set);
public: public:
const std::set<symbol_t> & get_terminals() const {
return terminals;
}
size_t get_state_count() const {
return itemsets.size();
}
generator_t(const std::vector<item_t> &rules0); generator_t(const std::vector<item_t> &rules0);
}; };