From 36870bfced9701a36766c697aa0b3e3f066ae1e7 Mon Sep 17 00:00:00 2001 From: Max Brunsfeld Date: Fri, 8 Jan 2016 15:51:30 -0800 Subject: [PATCH] Make Grammar a simple struct --- externals/json-parser | 1 + include/tree_sitter/compiler.h | 23 ++++------ project.gyp | 1 - spec/compiler/compile_spec.cc | 8 ++-- spec/compiler/helpers/stream_methods.cc | 2 +- .../prepare_grammar/intern_symbols_spec.cc | 14 +++--- spec/fixtures/grammars/anonymous_tokens.cc | 6 +-- spec/fixtures/grammars/arithmetic.cc | 6 +-- spec/fixtures/grammars/c.cc | 8 ++-- spec/fixtures/grammars/cpp.cc | 8 ++-- spec/fixtures/grammars/golang.cc | 6 +-- spec/fixtures/grammars/javascript.cc | 8 ++-- spec/fixtures/grammars/json.cc | 6 +-- src/compiler/grammar.cc | 44 ------------------- .../prepare_grammar/intern_symbols.cc | 10 ++--- .../prepare_grammar/prepare_grammar.h | 2 +- 16 files changed, 53 insertions(+), 100 deletions(-) create mode 160000 externals/json-parser delete mode 100644 src/compiler/grammar.cc diff --git a/externals/json-parser b/externals/json-parser new file mode 160000 index 00000000..70533215 --- /dev/null +++ b/externals/json-parser @@ -0,0 +1 @@ +Subproject commit 70533215eea575e40a0b91a34ae01a779641d73a diff --git a/include/tree_sitter/compiler.h b/include/tree_sitter/compiler.h index fbc18010..2c0b6847 100644 --- a/include/tree_sitter/compiler.h +++ b/include/tree_sitter/compiler.h @@ -27,18 +27,10 @@ rule_ptr prec_right(const rule_ptr &); rule_ptr prec_right(int precedence, const rule_ptr &); rule_ptr token(const rule_ptr &rule); -class Grammar { - const std::vector> rules_; - std::vector extra_tokens_; - std::vector> expected_conflicts_; - - public: - explicit Grammar(const std::vector> &); - Grammar &extra_tokens(const std::vector &); - Grammar &expected_conflicts(const std::vector> &); - const std::vector> &rules() const; - const std::vector &extra_tokens() const; - const std::vector> &expected_conflicts() const; +struct Grammar { + std::vector> rules; + std::vector extra_tokens; + std::vector> expected_conflicts; }; enum GrammarErrorType { @@ -51,8 +43,11 @@ enum GrammarErrorType { class GrammarError { public: - GrammarError(GrammarErrorType type, std::string message); - bool operator==(const GrammarError &other) const; + GrammarError(GrammarErrorType type, std::string message) : type(type), message(message) {} + bool operator==(const GrammarError &other) const { + return type == other.type && message == other.message; + } + GrammarErrorType type; std::string message; }; diff --git a/project.gyp b/project.gyp index 16d629a8..9effe59a 100644 --- a/project.gyp +++ b/project.gyp @@ -24,7 +24,6 @@ 'src/compiler/build_tables/rule_can_be_blank.cc', 'src/compiler/compile.cc', 'src/compiler/generate_code/c_code.cc', - 'src/compiler/grammar.cc', 'src/compiler/lex_table.cc', 'src/compiler/parse_table.cc', 'src/compiler/precedence_range.cc', diff --git a/spec/compiler/compile_spec.cc b/spec/compiler/compile_spec.cc index bcff2239..88a749e4 100644 --- a/spec/compiler/compile_spec.cc +++ b/spec/compiler/compile_spec.cc @@ -8,9 +8,9 @@ START_TEST describe("Compile", []() { describe("when the grammar's start symbol is a token", [&]() { it("does not fail", [&]() { - Grammar grammar({ + Grammar grammar{{ { "rule1", str("the-value") } - }); + }, {}, {}}; auto result = compile(grammar, "test_grammar"); const GrammarError *error = result.second; @@ -20,9 +20,9 @@ describe("Compile", []() { describe("when the grammar's start symbol is blank", [&]() { it("does not fail", [&]() { - Grammar grammar({ + Grammar grammar{{ { "rule1", blank() } - }); + }, {}, {}}; auto result = compile(grammar, "test_grammar"); const GrammarError *error = result.second; diff --git a/spec/compiler/helpers/stream_methods.cc b/spec/compiler/helpers/stream_methods.cc index 84925e13..652c21f7 100644 --- a/spec/compiler/helpers/stream_methods.cc +++ b/spec/compiler/helpers/stream_methods.cc @@ -12,7 +12,7 @@ ostream &operator<<(ostream &stream, const Grammar &grammar) { stream << string("#> &rules) - : rules_(rules), extra_tokens_({}) {} - -const vector> &Grammar::rules() const { - return rules_; -} - -const vector &Grammar::extra_tokens() const { - return extra_tokens_; -} - -const vector> &Grammar::expected_conflicts() const { - return expected_conflicts_; -} - -Grammar &Grammar::extra_tokens(const vector &extra_tokens) { - extra_tokens_ = extra_tokens; - return *this; -} - -Grammar &Grammar::expected_conflicts( - const vector> &expected_conflicts) { - expected_conflicts_ = expected_conflicts; - return *this; -} - -GrammarError::GrammarError(GrammarErrorType type, string message) - : type(type), message(message) {} - -bool GrammarError::operator==(const GrammarError &other) const { - return type == other.type && message == other.message; -} - -} // namespace tree_sitter diff --git a/src/compiler/prepare_grammar/intern_symbols.cc b/src/compiler/prepare_grammar/intern_symbols.cc index cd77e6a9..5a5048df 100644 --- a/src/compiler/prepare_grammar/intern_symbols.cc +++ b/src/compiler/prepare_grammar/intern_symbols.cc @@ -31,8 +31,8 @@ class InternSymbols : public rules::IdentityRuleFn { public: std::shared_ptr symbol_for_rule_name(string rule_name) { - for (size_t i = 0; i < grammar.rules().size(); i++) - if (grammar.rules()[i].first == rule_name) + for (size_t i = 0; i < grammar.rules.size(); i++) + if (grammar.rules[i].first == rule_name) return make_shared(i); return nullptr; } @@ -51,7 +51,7 @@ pair intern_symbols(const Grammar &gramma InternedGrammar result; InternSymbols interner(grammar); - for (auto &pair : grammar.rules()) { + for (auto &pair : grammar.rules) { auto new_rule = interner.apply(pair.second); if (!interner.missing_rule_name.empty()) return { result, missing_rule_error(interner.missing_rule_name) }; @@ -61,14 +61,14 @@ pair intern_symbols(const Grammar &gramma new_rule)); } - for (auto &rule : grammar.extra_tokens()) { + for (auto &rule : grammar.extra_tokens) { auto new_rule = interner.apply(rule); if (!interner.missing_rule_name.empty()) return { result, missing_rule_error(interner.missing_rule_name) }; result.extra_tokens.push_back(new_rule); } - for (auto &names : grammar.expected_conflicts()) { + for (auto &names : grammar.expected_conflicts) { set entry; for (auto &name : names) { auto symbol = interner.symbol_for_rule_name(name); diff --git a/src/compiler/prepare_grammar/prepare_grammar.h b/src/compiler/prepare_grammar/prepare_grammar.h index 1e03e70b..6a57db3a 100644 --- a/src/compiler/prepare_grammar/prepare_grammar.h +++ b/src/compiler/prepare_grammar/prepare_grammar.h @@ -7,7 +7,7 @@ namespace tree_sitter { -class Grammar; +struct Grammar; class GrammarError; namespace prepare_grammar {