Pass LexTableBuilder to ParseTableBuilder
This commit is contained in:
parent
fc4c6723b8
commit
573b5f3671
7 changed files with 73 additions and 58 deletions
|
|
@ -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',
|
||||
|
|
|
|||
|
|
@ -1,22 +0,0 @@
|
|||
#ifndef COMPILER_BUILD_TABLES_BUILD_PARSE_TABLE_H_
|
||||
#define COMPILER_BUILD_TABLES_BUILD_PARSE_TABLE_H_
|
||||
|
||||
#include <utility>
|
||||
#include <vector>
|
||||
#include "compiler/parse_table.h"
|
||||
#include "compiler/compile_error.h"
|
||||
|
||||
namespace tree_sitter {
|
||||
|
||||
struct SyntaxGrammar;
|
||||
struct LexicalGrammar;
|
||||
|
||||
namespace build_tables {
|
||||
|
||||
std::pair<ParseTable, CompileError> build_parse_table(const SyntaxGrammar &,
|
||||
const LexicalGrammar &);
|
||||
|
||||
} // namespace build_tables
|
||||
} // namespace tree_sitter
|
||||
|
||||
#endif // COMPILER_BUILD_TABLES_BUILD_PARSE_TABLE_H_
|
||||
|
|
@ -1,7 +1,7 @@
|
|||
#include "compiler/build_tables/build_tables.h"
|
||||
#include <tuple>
|
||||
#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<ParseTable, LexTable, CompileError> 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);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1,9 +1,7 @@
|
|||
#ifndef COMPILER_BUILD_TABLES_BUILD_TABLES_H_
|
||||
#define COMPILER_BUILD_TABLES_BUILD_TABLES_H_
|
||||
|
||||
#include <string>
|
||||
#include <tuple>
|
||||
#include <vector>
|
||||
#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<ParseTable, LexTable, CompileError> build_tables(
|
||||
const SyntaxGrammar &, const LexicalGrammar &);
|
||||
const SyntaxGrammar &,
|
||||
const LexicalGrammar &
|
||||
);
|
||||
|
||||
} // namespace build_tables
|
||||
} // namespace tree_sitter
|
||||
|
|
|
|||
|
|
@ -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_
|
||||
|
|
@ -1,4 +1,4 @@
|
|||
#include "compiler/build_tables/build_parse_table.h"
|
||||
#include "compiler/build_tables/parse_table_builder.h"
|
||||
#include <algorithm>
|
||||
#include <map>
|
||||
#include <set>
|
||||
|
|
@ -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<Symbol, ParseItemSet> recovery_item_sets_by_lookahead;
|
||||
|
|
@ -48,16 +49,21 @@ class ParseTableBuilder {
|
|||
deque<ParseStateQueueEntry> parse_state_queue;
|
||||
ParseTable parse_table;
|
||||
ParseItemSetBuilder item_set_builder;
|
||||
LexTableBuilder *lex_table_builder;
|
||||
set<ParseAction> fragile_reductions;
|
||||
vector<set<Symbol>> incompatible_tokens_by_token_index;
|
||||
vector<set<Symbol::Index>> 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<ParseTable, CompileError> build_parse_table(
|
||||
const SyntaxGrammar &grammar, const LexicalGrammar &lex_grammar) {
|
||||
return ParseTableBuilder(grammar, lex_grammar).build();
|
||||
unique_ptr<ParseTableBuilder> ParseTableBuilder::create(
|
||||
const SyntaxGrammar &syntax_grammar,
|
||||
const LexicalGrammar &lexical_grammar,
|
||||
LexTableBuilder *lex_table_builder
|
||||
) {
|
||||
return unique_ptr<ParseTableBuilder>(
|
||||
new ParseTableBuilderImpl(syntax_grammar, lexical_grammar, lex_table_builder)
|
||||
);
|
||||
}
|
||||
|
||||
pair<ParseTable, CompileError> ParseTableBuilder::build() {
|
||||
return static_cast<ParseTableBuilderImpl *>(this)->build();
|
||||
}
|
||||
|
||||
} // namespace build_tables
|
||||
33
src/compiler/build_tables/parse_table_builder.h
Normal file
33
src/compiler/build_tables/parse_table_builder.h
Normal file
|
|
@ -0,0 +1,33 @@
|
|||
#ifndef COMPILER_BUILD_TABLES_PARSE_TABLE_BUILDER_H_
|
||||
#define COMPILER_BUILD_TABLES_PARSE_TABLE_BUILDER_H_
|
||||
|
||||
#include <memory>
|
||||
#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<ParseTableBuilder> create(
|
||||
const SyntaxGrammar &,
|
||||
const LexicalGrammar &,
|
||||
LexTableBuilder *
|
||||
);
|
||||
std::pair<ParseTable, CompileError> build();
|
||||
protected:
|
||||
ParseTableBuilder() = default;
|
||||
};
|
||||
|
||||
} // namespace build_tables
|
||||
} // namespace tree_sitter
|
||||
|
||||
#endif // COMPILER_BUILD_TABLES_PARSE_TABLE_BUILDER_H_
|
||||
Loading…
Add table
Add a link
Reference in a new issue