generator: remove printing, add some getters
This commit is contained in:
parent
531a4de1fc
commit
ab2d315aa2
2 changed files with 11 additions and 79 deletions
|
@ -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));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Reference in a new issue