Don't create items with point at end

This commit is contained in:
Matthias Schiffer 2015-03-31 00:01:18 +02:00
parent 8de90acc67
commit 63640911b9
3 changed files with 3 additions and 14 deletions

View file

@ -61,7 +61,7 @@ struct item_t : public std::tuple<std::string, std::vector<symbol_t>, unsigned>
return std::get<2>(*this);
}
bool can_shift() const {
bool has_next() const {
return get_point() < get_rhs().size();
}
@ -70,10 +70,7 @@ struct item_t : public std::tuple<std::string, std::vector<symbol_t>, unsigned>
}
symbol_t get_next_symbol() const {
if (can_shift())
return get_rhs()[get_point()];
else
return symbol_t::make_end();
}
};

View file

@ -55,11 +55,8 @@ void state_t::add_rule_terminal(unsigned char term) {
void state_t::add_rule() {
rules.emplace(current.get_lhs(), current);
while (true) {
while (current.has_next()) {
items.emplace(current.get_next_symbol(), current);
if (!current.can_shift())
break;
current.shift();
}
}

View file

@ -33,7 +33,6 @@
namespace solar {
enum symbol_type_t {
SYMBOL_TYPE_END,
SYMBOL_TYPE_NONTERM,
SYMBOL_TYPE_TERM,
SYMBOL_TYPE_CHAR,
@ -50,10 +49,6 @@ struct symbol_t : public std::tuple<symbol_type_t, std::string> {
return std::get<1>(*this);
}
static symbol_t make_end() {
return symbol_t(SYMBOL_TYPE_END, "");
}
static symbol_t make_nonterm(const char *value) {
return symbol_t(SYMBOL_TYPE_NONTERM, value);
}