Refactor rule visitor objects

This commit is contained in:
Max Brunsfeld 2014-04-01 13:37:12 -07:00
parent 85b97c4f87
commit f39cb1890d
5 changed files with 35 additions and 36 deletions

View file

@ -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);
}
};

View file

@ -24,7 +24,7 @@ namespace tree_sitter {
using rules::Symbol;
namespace prepare_grammar {
class ExpandRepeats : public rules::RuleFn<rule_ptr> {
class ExpandRepeats : public rules::IdentityRuleFn {
rule_ptr make_repeat_helper(string name, const rule_ptr &rule) {
return Choice::Build({
Seq::Build({ rule, make_shared<Symbol>(name, rules::SymbolTypeAuxiliary) }),
@ -38,18 +38,6 @@ namespace tree_sitter {
value = make_shared<Symbol>(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<pair<string, rules::rule_ptr>> aux_rules;
};

View file

@ -35,7 +35,7 @@ namespace tree_sitter {
}
};
class TokenExtractor : public rules::RuleFn<rule_ptr> {
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<rules::Repeat>(apply(rule->content));
}
public:
vector<pair<string, rules::rule_ptr>> tokens;
};
@ -74,7 +62,7 @@ namespace tree_sitter {
vector<pair<string, rules::rule_ptr>> 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))

View file

@ -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<Repeat>(apply(rule->content));
}
}
}

View file

@ -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<typename T>
@ -38,6 +38,13 @@ namespace tree_sitter {
return value;
}
};
class IdentityRuleFn : public RuleFn<rule_ptr> {
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);
};
}
}