2014-01-24 18:25:56 -08:00
|
|
|
#include "expand_repeats.h"
|
2014-02-12 08:30:50 -08:00
|
|
|
#include <map>
|
2014-01-24 18:25:56 -08:00
|
|
|
|
|
|
|
|
namespace tree_sitter {
|
2014-02-12 23:06:26 -08:00
|
|
|
using std::string;
|
|
|
|
|
using std::to_string;
|
|
|
|
|
using std::map;
|
|
|
|
|
using namespace rules;
|
|
|
|
|
|
2014-01-24 18:25:56 -08:00
|
|
|
namespace prepare_grammar {
|
|
|
|
|
class RepeatExpander : rules::Visitor {
|
|
|
|
|
public:
|
|
|
|
|
rule_ptr value;
|
2014-02-12 08:30:50 -08:00
|
|
|
map<const string, const rule_ptr> aux_rules;
|
2014-01-24 18:25:56 -08:00
|
|
|
|
2014-01-28 13:27:30 -08:00
|
|
|
rule_ptr apply(const rule_ptr &rule) {
|
2014-01-24 18:25:56 -08:00
|
|
|
rule->accept(*this);
|
|
|
|
|
return value;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
rule_ptr make_repeat_helper(string name, const rule_ptr &rule) {
|
2014-02-15 15:43:32 -08:00
|
|
|
return choice({
|
|
|
|
|
seq({
|
|
|
|
|
rule,
|
|
|
|
|
aux_sym(name),
|
|
|
|
|
}),
|
|
|
|
|
blank(),
|
2014-01-24 18:25:56 -08:00
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void visit(const Repeat *rule) {
|
|
|
|
|
rule_ptr inner_rule = apply(rule->content);
|
|
|
|
|
string helper_rule_name = string("repeat_helper") + to_string(aux_rules.size() + 1);
|
|
|
|
|
aux_rules.insert({ helper_rule_name, make_repeat_helper(helper_rule_name, inner_rule) });
|
2014-01-28 13:27:30 -08:00
|
|
|
value = aux_sym(helper_rule_name);
|
2014-01-24 18:25:56 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void visit(const Seq *rule) {
|
|
|
|
|
value = seq({ apply(rule->left), apply(rule->right) });
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void visit(const Choice *rule) {
|
|
|
|
|
value = choice({ apply(rule->left), apply(rule->right) });
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void default_visit(const Rule *rule) {
|
|
|
|
|
value = rule->copy();
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
Grammar expand_repeats(const Grammar &grammar) {
|
2014-02-13 13:09:00 -08:00
|
|
|
map<const string, const rule_ptr> rules;
|
|
|
|
|
map<const string, const rule_ptr> aux_rules(grammar.aux_rules);
|
2014-01-24 18:25:56 -08:00
|
|
|
RepeatExpander visitor;
|
2014-01-28 13:27:30 -08:00
|
|
|
|
2014-01-24 18:25:56 -08:00
|
|
|
for (auto pair : grammar.rules)
|
2014-02-13 13:09:00 -08:00
|
|
|
rules.insert({ pair.first, visitor.apply(pair.second) });
|
|
|
|
|
|
|
|
|
|
aux_rules.insert(visitor.aux_rules.begin(), visitor.aux_rules.end());
|
2014-01-28 13:27:30 -08:00
|
|
|
|
2014-02-13 13:09:00 -08:00
|
|
|
return Grammar(grammar.start_rule_name, rules, aux_rules);
|
2014-01-24 18:25:56 -08:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|