summaryrefslogtreecommitdiffstats
path: root/src/parser_state.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/parser_state.cpp')
-rw-r--r--src/parser_state.cpp33
1 files changed, 30 insertions, 3 deletions
diff --git a/src/parser_state.cpp b/src/parser_state.cpp
index 92584a6..dfbe8a5 100644
--- a/src/parser_state.cpp
+++ b/src/parser_state.cpp
@@ -32,28 +32,55 @@ namespace solar {
void parser_state_t::new_rule(const char *nonterm) {
if (rules.empty()) {
// start rule
- current.get_rhs().emplace_back(symbol_t::make_nonterm(nonterm));
+ add_rule_nonterminal(nonterm);
add_rule();
}
current = item_t(nonterm);
-
+ current_vars = std::vector<std::string>();
}
void parser_state_t::add_rule_nonterminal(const char *nonterm) {
current.get_rhs().emplace_back(symbol_t::make_nonterm(nonterm));
+ current_vars.emplace_back();
}
void parser_state_t::add_rule_terminal(const char *term) {
current.get_rhs().emplace_back(symbol_t::make_term(term));
+ current_vars.emplace_back();
}
void parser_state_t::add_rule_terminal(unsigned char term) {
current.get_rhs().emplace_back(symbol_t::make_char(term));
+ current_vars.emplace_back();
}
void parser_state_t::add_rule(const std::string &action) {
- rules.emplace_back(current, action);
+ rules.emplace_back(std::move(current), std::move(current_vars), action);
+}
+
+void parser_state_t::add_rule_var(const char *var) {
+ current_vars.back() = var;
+}
+
+void parser_state_t::add_type_nonterminal(const char *nonterm) {
+ current_var = nonterm;
+}
+
+void parser_state_t::add_type_terminal(const char *term) {
+ current_var = term;
+}
+
+void parser_state_t::set_type_nonterminal(const char *type) {
+ nonterm_types.emplace(current_var, type);
+}
+
+void parser_state_t::set_type_terminal(const char *type) {
+ current_type = type;
+}
+
+void parser_state_t::set_type_terminal_name(const char *name) {
+ term_types.emplace(symbol_t::make_term(current_var.c_str()), std::make_pair(current_type, name));
}
}