diff options
author | Matthias Schiffer <mschiffer@universe-factory.net> | 2015-04-06 18:50:03 +0200 |
---|---|---|
committer | Matthias Schiffer <mschiffer@universe-factory.net> | 2015-04-06 18:50:03 +0200 |
commit | d6deff997e4f882d9fa46b109fd32e713f054a6d (patch) | |
tree | d0d5f6faf532234f239310c7376b737e1c284ea9 /src/parser_state.cpp | |
parent | 6fb60a72012f97f846477eb370d1a0706b1b4bc2 (diff) | |
download | solar-d6deff997e4f882d9fa46b109fd32e713f054a6d.tar solar-d6deff997e4f882d9fa46b109fd32e713f054a6d.zip |
Implement a lot of symbol value support
Diffstat (limited to 'src/parser_state.cpp')
-rw-r--r-- | src/parser_state.cpp | 33 |
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)); } } |