From 73d8cb372282908e9ed4d46096b95d52fc3afc21 Mon Sep 17 00:00:00 2001 From: Max Brunsfeld Date: Wed, 18 Dec 2013 08:25:50 -0800 Subject: [PATCH] Refactor parse table builder --- src/compiler/lr/parse_table_builder.cpp | 40 +++++++++++++++---------- src/compiler/lr/parse_table_builder.h | 4 ++- 2 files changed, 27 insertions(+), 17 deletions(-) diff --git a/src/compiler/lr/parse_table_builder.cpp b/src/compiler/lr/parse_table_builder.cpp index c7734276..6c5fe815 100644 --- a/src/compiler/lr/parse_table_builder.cpp +++ b/src/compiler/lr/parse_table_builder.cpp @@ -17,7 +17,8 @@ namespace tree_sitter { ParseTableBuilder::ParseTableBuilder(const Grammar &grammar) : grammar(grammar), table(ParseTable(grammar.rule_names())), - state_indices(unordered_map()) {}; + state_indices(unordered_map()) + {}; void ParseTableBuilder::build() { auto item = Item(ParseTable::START, rules::sym(grammar.start_rule_name), 0); @@ -31,24 +32,31 @@ namespace tree_sitter { state_index = table.add_state(); state_indices[item_set] = state_index; - for (auto transition : item_set.sym_transitions(grammar)) { - rules::sym_ptr symbol = static_pointer_cast(transition.first); - size_t new_state_index = add_item_set(*transition.second); - table.add_action(state_index, symbol->name, ParseAction::Shift(new_state_index)); - } - - for (Item item : item_set) { - if (item.is_done()) { - if (item.rule_name == ParseTable::START) { - table.add_action(state_index, ParseTable::END_OF_INPUT, ParseAction::Accept()); - } else { - for (string rule_name : table.symbol_names) - table.add_action(state_index, rule_name, ParseAction::Reduce(item.rule_name, item.consumed_sym_count)); - } + add_shift_actions(item_set, state_index); + add_reduce_actions(item_set, state_index); + } + return state_index; + } + + void ParseTableBuilder::add_shift_actions(const ItemSet &item_set, size_t state_index) { + for (auto transition : item_set.sym_transitions(grammar)) { + rules::sym_ptr symbol = static_pointer_cast(transition.first); + size_t new_state_index = add_item_set(*transition.second); + table.add_action(state_index, symbol->name, ParseAction::Shift(new_state_index)); + } + } + + void ParseTableBuilder::add_reduce_actions(const ItemSet &item_set, size_t state_index) { + for (Item item : item_set) { + if (item.is_done()) { + if (item.rule_name == ParseTable::START) { + table.add_action(state_index, ParseTable::END_OF_INPUT, ParseAction::Accept()); + } else { + for (string rule_name : table.symbol_names) + table.add_action(state_index, rule_name, ParseAction::Reduce(item.rule_name, item.consumed_sym_count)); } } } - return state_index; } long ParseTableBuilder::state_index_for_item_set(const ItemSet &item_set) const { diff --git a/src/compiler/lr/parse_table_builder.h b/src/compiler/lr/parse_table_builder.h index 88bca265..9a58752d 100644 --- a/src/compiler/lr/parse_table_builder.h +++ b/src/compiler/lr/parse_table_builder.h @@ -13,8 +13,10 @@ namespace tree_sitter { ParseTable table; std::unordered_map state_indices; - size_t add_item_set(const ItemSet &item_set); long state_index_for_item_set(const ItemSet &item_set) const; + void add_shift_actions(const ItemSet &item_set, size_t state_index); + void add_reduce_actions(const ItemSet &item_set, size_t state_index); + size_t add_item_set(const ItemSet &item_set); public: ParseTableBuilder(const Grammar &grammar); static ParseTable build_table(const Grammar &grammar);