Refactor rule visitor objects
This commit is contained in:
parent
85b97c4f87
commit
f39cb1890d
5 changed files with 35 additions and 36 deletions
|
|
@ -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);
|
||||
}
|
||||
};
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
};
|
||||
|
|
|
|||
|
|
@ -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))
|
||||
|
|
|
|||
|
|
@ -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));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -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);
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue