diff --git a/src/compiler/build_tables/rule_can_be_blank.cc b/src/compiler/build_tables/rule_can_be_blank.cc index 61b08dbc..3849a893 100644 --- a/src/compiler/build_tables/rule_can_be_blank.cc +++ b/src/compiler/build_tables/rule_can_be_blank.cc @@ -18,19 +18,19 @@ namespace tree_sitter { value = false; } - virtual void visit(const rules::Blank *) { + void visit(const rules::Blank *) { value = true; } - virtual void visit(const rules::Repeat *rule) { + void visit(const rules::Repeat *rule) { value = true; } - virtual void visit(const rules::Choice *rule) { + void visit(const rules::Choice *rule) { value = apply(rule->left) || apply(rule->right); } - virtual void visit(const rules::Seq *rule) { + void visit(const rules::Seq *rule) { value = apply(rule->left) && apply(rule->right); } }; diff --git a/src/compiler/prepare_grammar/expand_repeats.cc b/src/compiler/prepare_grammar/expand_repeats.cc index 4f614b95..a660656d 100644 --- a/src/compiler/prepare_grammar/expand_repeats.cc +++ b/src/compiler/prepare_grammar/expand_repeats.cc @@ -24,7 +24,7 @@ namespace tree_sitter { using rules::Symbol; namespace prepare_grammar { - class ExpandRepeats : public rules::RuleFn { + class ExpandRepeats : public rules::IdentityRuleFn { rule_ptr make_repeat_helper(string name, const rule_ptr &rule) { return Choice::Build({ Seq::Build({ rule, make_shared(name, rules::SymbolTypeAuxiliary) }), @@ -38,18 +38,6 @@ namespace tree_sitter { value = make_shared(helper_rule_name, rules::SymbolTypeAuxiliary); } - void visit(const Seq *rule) { - value = Seq::Build({ apply(rule->left), apply(rule->right) }); - } - - void visit(const Choice *rule) { - value = Choice::Build({ apply(rule->left), apply(rule->right) }); - } - - void default_visit(const Rule *rule) { - value = rule->copy(); - } - public: vector> aux_rules; }; diff --git a/src/compiler/prepare_grammar/extract_tokens.cc b/src/compiler/prepare_grammar/extract_tokens.cc index f3399616..997a0db6 100644 --- a/src/compiler/prepare_grammar/extract_tokens.cc +++ b/src/compiler/prepare_grammar/extract_tokens.cc @@ -35,7 +35,7 @@ namespace tree_sitter { } }; - class TokenExtractor : public rules::RuleFn { + class TokenExtractor : public rules::IdentityRuleFn { string add_token(rule_ptr rule) { for (auto pair : tokens) if (*pair.second == *rule) @@ -54,18 +54,6 @@ namespace tree_sitter { } } - void visit(const rules::Choice *rule) { - value = rules::Choice::Build({ apply(rule->left), apply(rule->right) }); - } - - void visit(const rules::Seq *rule) { - value = rules::Seq::Build({ apply(rule->left), apply(rule->right) }); - } - - void visit(const rules::Repeat *rule) { - value = make_shared(apply(rule->content)); - } - public: vector> tokens; }; @@ -74,7 +62,7 @@ namespace tree_sitter { vector> rules, tokens, aux_rules, aux_tokens; TokenExtractor extractor; - for (auto &pair : input_grammar.rules) { + for (auto &pair : input_grammar.rules) { string name = pair.first; rule_ptr rule = pair.second; if (IsToken().apply(rule)) diff --git a/src/compiler/rules/visitor.cc b/src/compiler/rules/visitor.cc index b583b21e..f29d1b5d 100644 --- a/src/compiler/rules/visitor.cc +++ b/src/compiler/rules/visitor.cc @@ -2,23 +2,39 @@ #include "compiler/rules/rule.h" #include "compiler/rules/blank.h" #include "compiler/rules/symbol.h" +#include "compiler/rules/character_set.h" #include "compiler/rules/choice.h" #include "compiler/rules/seq.h" #include "compiler/rules/string.h" #include "compiler/rules/pattern.h" -#include "compiler/rules/character_set.h" #include "compiler/rules/repeat.h" namespace tree_sitter { namespace rules { void Visitor::default_visit(const Rule *rule) {} void Visitor::visit(const Blank *rule) { default_visit(rule); } - void Visitor::visit(const Symbol *rule) { default_visit(rule); } void Visitor::visit(const CharacterSet *rule) { default_visit(rule); } void Visitor::visit(const Choice *rule) { default_visit(rule); } + void Visitor::visit(const Pattern *rule) { default_visit(rule); } void Visitor::visit(const Repeat *rule) { default_visit(rule); } void Visitor::visit(const Seq *rule) { default_visit(rule); } void Visitor::visit(const String *rule) { default_visit(rule); } - void Visitor::visit(const Pattern *rule) { default_visit(rule); } + void Visitor::visit(const Symbol *rule) { default_visit(rule); } + + void IdentityRuleFn::default_visit(const Rule *rule) { + value = rule->copy(); + } + + void IdentityRuleFn::visit(const Choice *rule) { + value = Choice::Build({ apply(rule->left), apply(rule->right) }); + } + + void IdentityRuleFn::visit(const Seq *rule) { + value = Seq::Build({ apply(rule->left), apply(rule->right) }); + } + + void IdentityRuleFn::visit(const Repeat *rule) { + value = std::make_shared(apply(rule->content)); + } } } \ No newline at end of file diff --git a/src/compiler/rules/visitor.h b/src/compiler/rules/visitor.h index 3973ad9c..001ef978 100644 --- a/src/compiler/rules/visitor.h +++ b/src/compiler/rules/visitor.h @@ -18,13 +18,13 @@ namespace tree_sitter { public: virtual void default_visit(const Rule *rule); virtual void visit(const Blank *rule); - virtual void visit(const Symbol *rule); virtual void visit(const CharacterSet *rule); virtual void visit(const Choice *rule); + virtual void visit(const Pattern *rule); virtual void visit(const Repeat *rule); virtual void visit(const Seq *rule); virtual void visit(const String *rule); - virtual void visit(const Pattern *rule); + virtual void visit(const Symbol *rule); }; template @@ -38,6 +38,13 @@ namespace tree_sitter { return value; } }; + + class IdentityRuleFn : public RuleFn { + virtual void default_visit(const Rule *rule); + virtual void visit(const Seq *rule); + virtual void visit(const Choice *rule); + virtual void visit(const Repeat *rule); + }; } }