Don't create items with point at end
This commit is contained in:
parent
8de90acc67
commit
63640911b9
3 changed files with 3 additions and 14 deletions
|
@ -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();
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -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();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
Reference in a new issue