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); return std::get<2>(*this);
} }
bool can_shift() const { bool has_next() const {
return get_point() < get_rhs().size(); 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 { symbol_t get_next_symbol() const {
if (can_shift()) return get_rhs()[get_point()];
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() { void state_t::add_rule() {
rules.emplace(current.get_lhs(), current); rules.emplace(current.get_lhs(), current);
while (true) { while (current.has_next()) {
items.emplace(current.get_next_symbol(), current); items.emplace(current.get_next_symbol(), current);
if (!current.can_shift())
break;
current.shift(); current.shift();
} }
} }

View file

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