generator_slr: fix follow set generation
Looks like my source of information was incomplete...
This commit is contained in:
parent
aeaeba2d73
commit
4976085b72
1 changed files with 19 additions and 19 deletions
|
@ -92,31 +92,31 @@ void generator_slr_t::generate_follow_sets() {
|
||||||
const std::set<symbol_t> &lhs = follow_sets[item.get_lhs()];
|
const std::set<symbol_t> &lhs = follow_sets[item.get_lhs()];
|
||||||
std::set<symbol_t> &rhs = follow_sets[sym.get_value()];
|
std::set<symbol_t> &rhs = follow_sets[sym.get_value()];
|
||||||
|
|
||||||
|
bool has_empty = true;
|
||||||
item_t next = item;
|
item_t next = item;
|
||||||
next.shift();
|
|
||||||
|
|
||||||
bool next_empty = false;
|
while (has_empty) {
|
||||||
|
has_empty = false;
|
||||||
|
next.shift();
|
||||||
|
|
||||||
if (next.has_next()) {
|
if (next.has_next()) {
|
||||||
const symbol_t &next_sym = next.get_next_symbol();
|
const symbol_t &next_sym = next.get_next_symbol();
|
||||||
|
|
||||||
if (next_sym.get_type() == SYMBOL_TYPE_NONTERM) {
|
if (next_sym.get_type() == SYMBOL_TYPE_NONTERM) {
|
||||||
for (const symbol_t &sym2 : first_sets[next_sym.get_value()]) {
|
for (const symbol_t &sym2 : first_sets[next_sym.get_value()]) {
|
||||||
if (sym2 == symbol_t::empty())
|
if (sym2 == symbol_t::empty())
|
||||||
next_empty = true;
|
has_empty = true;
|
||||||
else
|
else
|
||||||
changed = changed || rhs.insert(sym2).second;
|
changed = changed || rhs.insert(sym2).second;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
changed = changed || rhs.insert(next_sym).second;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
else {
|
|
||||||
changed = changed || rhs.insert(next_sym).second;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
next_empty = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (next_empty) {
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
for (const symbol_t &sym2 : lhs)
|
for (const symbol_t &sym2 : lhs)
|
||||||
changed = changed || rhs.insert(sym2).second;
|
changed = changed || rhs.insert(sym2).second;
|
||||||
}
|
}
|
||||||
|
|
Reference in a new issue