From 573b5f3671efa4495cf04ea4872ea02a2c2a3566 Mon Sep 17 00:00:00 2001 From: Max Brunsfeld Date: Fri, 25 Aug 2017 15:57:50 -0700 Subject: [PATCH] Pass LexTableBuilder to ParseTableBuilder --- project.gyp | 2 +- src/compiler/build_tables/build_parse_table.h | 22 ------------ src/compiler/build_tables/build_tables.cc | 18 ++++++---- src/compiler/build_tables/build_tables.h | 6 ++-- src/compiler/build_tables/conflict_type.h | 16 --------- ..._parse_table.cc => parse_table_builder.cc} | 34 +++++++++++++------ .../build_tables/parse_table_builder.h | 33 ++++++++++++++++++ 7 files changed, 73 insertions(+), 58 deletions(-) delete mode 100644 src/compiler/build_tables/build_parse_table.h delete mode 100644 src/compiler/build_tables/conflict_type.h rename src/compiler/build_tables/{build_parse_table.cc => parse_table_builder.cc} (96%) create mode 100644 src/compiler/build_tables/parse_table_builder.h diff --git a/project.gyp b/project.gyp index 153e6f19..bbb88438 100644 --- a/project.gyp +++ b/project.gyp @@ -11,7 +11,6 @@ 'externals/json-parser', ], 'sources': [ - 'src/compiler/build_tables/build_parse_table.cc', 'src/compiler/build_tables/build_tables.cc', 'src/compiler/build_tables/lex_item.cc', 'src/compiler/build_tables/lex_item_transitions.cc', @@ -20,6 +19,7 @@ 'src/compiler/build_tables/lookahead_set.cc', 'src/compiler/build_tables/parse_item.cc', 'src/compiler/build_tables/parse_item_set_builder.cc', + 'src/compiler/build_tables/parse_table_builder.cc', 'src/compiler/build_tables/rule_can_be_blank.cc', 'src/compiler/compile.cc', 'src/compiler/generate_code/c_code.cc', diff --git a/src/compiler/build_tables/build_parse_table.h b/src/compiler/build_tables/build_parse_table.h deleted file mode 100644 index e0dc52f4..00000000 --- a/src/compiler/build_tables/build_parse_table.h +++ /dev/null @@ -1,22 +0,0 @@ -#ifndef COMPILER_BUILD_TABLES_BUILD_PARSE_TABLE_H_ -#define COMPILER_BUILD_TABLES_BUILD_PARSE_TABLE_H_ - -#include -#include -#include "compiler/parse_table.h" -#include "compiler/compile_error.h" - -namespace tree_sitter { - -struct SyntaxGrammar; -struct LexicalGrammar; - -namespace build_tables { - -std::pair build_parse_table(const SyntaxGrammar &, - const LexicalGrammar &); - -} // namespace build_tables -} // namespace tree_sitter - -#endif // COMPILER_BUILD_TABLES_BUILD_PARSE_TABLE_H_ diff --git a/src/compiler/build_tables/build_tables.cc b/src/compiler/build_tables/build_tables.cc index de9fa466..a15aede3 100644 --- a/src/compiler/build_tables/build_tables.cc +++ b/src/compiler/build_tables/build_tables.cc @@ -1,7 +1,7 @@ #include "compiler/build_tables/build_tables.h" #include #include "compiler/build_tables/lex_table_builder.h" -#include "compiler/build_tables/build_parse_table.h" +#include "compiler/build_tables/parse_table_builder.h" #include "compiler/syntax_grammar.h" #include "compiler/lexical_grammar.h" #include "compiler/compile_error.h" @@ -9,19 +9,25 @@ namespace tree_sitter { namespace build_tables { -using std::string; using std::tuple; -using std::vector; using std::make_tuple; tuple build_tables( - const SyntaxGrammar &grammar, + const SyntaxGrammar &syntax_grammar, const LexicalGrammar &lexical_grammar ) { - auto parse_table_result = build_parse_table(grammar, lexical_grammar); + auto lex_table_builder = LexTableBuilder::create(lexical_grammar); + auto parse_table_builder = ParseTableBuilder::create( + syntax_grammar, + lexical_grammar, + lex_table_builder.get() + ); + + auto parse_table_result = parse_table_builder->build(); ParseTable parse_table = parse_table_result.first; const CompileError error = parse_table_result.second; - LexTable lex_table = LexTableBuilder::create(lexical_grammar)->build(&parse_table); + + LexTable lex_table = lex_table_builder->build(&parse_table); return make_tuple(parse_table, lex_table, error); } diff --git a/src/compiler/build_tables/build_tables.h b/src/compiler/build_tables/build_tables.h index 32982b88..ed1f4770 100644 --- a/src/compiler/build_tables/build_tables.h +++ b/src/compiler/build_tables/build_tables.h @@ -1,9 +1,7 @@ #ifndef COMPILER_BUILD_TABLES_BUILD_TABLES_H_ #define COMPILER_BUILD_TABLES_BUILD_TABLES_H_ -#include #include -#include #include "compiler/parse_table.h" #include "compiler/lex_table.h" #include "compiler/compile_error.h" @@ -16,7 +14,9 @@ struct LexicalGrammar; namespace build_tables { std::tuple build_tables( - const SyntaxGrammar &, const LexicalGrammar &); + const SyntaxGrammar &, + const LexicalGrammar & +); } // namespace build_tables } // namespace tree_sitter diff --git a/src/compiler/build_tables/conflict_type.h b/src/compiler/build_tables/conflict_type.h deleted file mode 100644 index c6bf938b..00000000 --- a/src/compiler/build_tables/conflict_type.h +++ /dev/null @@ -1,16 +0,0 @@ -#ifndef COMPILER_BUILD_TABLES_CONFLICT_TYPE_H_ -#define COMPILER_BUILD_TABLES_CONFLICT_TYPE_H_ - -namespace tree_sitter { -namespace build_tables { - -enum ConflictType { - ConflictTypeNone, - ConflictTypeResolved, - ConflictTypeUnresolved -}; - -} // namespace build_tables -} // namespace tree_sitter - -#endif // COMPILER_BUILD_TABLES_CONFLICT_TYPE_H_ diff --git a/src/compiler/build_tables/build_parse_table.cc b/src/compiler/build_tables/parse_table_builder.cc similarity index 96% rename from src/compiler/build_tables/build_parse_table.cc rename to src/compiler/build_tables/parse_table_builder.cc index af29a942..7e67b650 100644 --- a/src/compiler/build_tables/build_parse_table.cc +++ b/src/compiler/build_tables/parse_table_builder.cc @@ -1,4 +1,4 @@ -#include "compiler/build_tables/build_parse_table.h" +#include "compiler/build_tables/parse_table_builder.h" #include #include #include @@ -26,6 +26,7 @@ using std::map; using std::move; using std::string; using std::to_string; +using std::unique_ptr; using std::unordered_map; using rules::Associativity; using rules::Symbol; @@ -39,7 +40,7 @@ struct ParseStateQueueEntry { ParseStateId state_id; }; -class ParseTableBuilder { +class ParseTableBuilderImpl : public ParseTableBuilder { const SyntaxGrammar grammar; const LexicalGrammar lexical_grammar; unordered_map recovery_item_sets_by_lookahead; @@ -48,16 +49,21 @@ class ParseTableBuilder { deque parse_state_queue; ParseTable parse_table; ParseItemSetBuilder item_set_builder; + LexTableBuilder *lex_table_builder; set fragile_reductions; vector> incompatible_tokens_by_token_index; vector> following_tokens_by_token_index; bool processing_recovery_states; public: - ParseTableBuilder(const SyntaxGrammar &grammar, const LexicalGrammar &lex_grammar) - : grammar(grammar), - lexical_grammar(lex_grammar), - item_set_builder(grammar, lex_grammar), + ParseTableBuilderImpl( + const SyntaxGrammar &syntax_grammar, + const LexicalGrammar &lexical_grammar, + LexTableBuilder *lex_table_builder + ) : grammar(syntax_grammar), + lexical_grammar(lexical_grammar), + item_set_builder(syntax_grammar, lexical_grammar), + lex_table_builder(lex_table_builder), incompatible_tokens_by_token_index(lexical_grammar.variables.size()), following_tokens_by_token_index(lexical_grammar.variables.size()), processing_recovery_states(false) {} @@ -350,7 +356,6 @@ class ParseTableBuilder { } void compute_unmergable_token_pairs() { - auto lex_table_builder = LexTableBuilder::create(lexical_grammar); for (unsigned i = 0, n = lexical_grammar.variables.size(); i < n; i++) { Symbol token = Symbol::terminal(i); auto &incompatible_indices = incompatible_tokens_by_token_index[i]; @@ -798,9 +803,18 @@ class ParseTableBuilder { } }; -pair build_parse_table( - const SyntaxGrammar &grammar, const LexicalGrammar &lex_grammar) { - return ParseTableBuilder(grammar, lex_grammar).build(); +unique_ptr ParseTableBuilder::create( + const SyntaxGrammar &syntax_grammar, + const LexicalGrammar &lexical_grammar, + LexTableBuilder *lex_table_builder +) { + return unique_ptr( + new ParseTableBuilderImpl(syntax_grammar, lexical_grammar, lex_table_builder) + ); +} + +pair ParseTableBuilder::build() { + return static_cast(this)->build(); } } // namespace build_tables diff --git a/src/compiler/build_tables/parse_table_builder.h b/src/compiler/build_tables/parse_table_builder.h new file mode 100644 index 00000000..bab96243 --- /dev/null +++ b/src/compiler/build_tables/parse_table_builder.h @@ -0,0 +1,33 @@ +#ifndef COMPILER_BUILD_TABLES_PARSE_TABLE_BUILDER_H_ +#define COMPILER_BUILD_TABLES_PARSE_TABLE_BUILDER_H_ + +#include +#include "compiler/parse_table.h" +#include "compiler/compile_error.h" + +namespace tree_sitter { + +struct ParseTable; +struct SyntaxGrammar; +struct LexicalGrammar; + +namespace build_tables { + +class LexTableBuilder; + +class ParseTableBuilder { + public: + static std::unique_ptr create( + const SyntaxGrammar &, + const LexicalGrammar &, + LexTableBuilder * + ); + std::pair build(); + protected: + ParseTableBuilder() = default; +}; + +} // namespace build_tables +} // namespace tree_sitter + +#endif // COMPILER_BUILD_TABLES_PARSE_TABLE_BUILDER_H_