tree-sitter/src/compiler/rules/transitions.cpp

67 lines
2.3 KiB
C++
Raw Normal View History

2013-12-18 20:58:05 -08:00
#include "transitions.h"
#include "rules.h"
namespace tree_sitter {
namespace rules {
2013-12-19 23:16:13 -08:00
class TransitionsVisitor : public Visitor {
2013-12-18 20:58:05 -08:00
public:
transition_map<Rule, Rule> value;
2013-12-18 20:58:05 -08:00
void visit(const Blank *rule) {
value = transition_map<Rule, Rule>();
2013-12-18 20:58:05 -08:00
}
void visit(const CharClass *rule) {
value = transition_map<Rule, Rule>({{ char_class(rule->value), blank() }});
2013-12-18 20:58:05 -08:00
}
void visit(const Char *rule) {
value = transition_map<Rule, Rule>({{ character(rule->value), blank() }});
2013-12-18 20:58:05 -08:00
}
void visit(const Symbol *rule) {
value = transition_map<Rule, Rule>({{ sym(rule->name), blank() }});
2013-12-18 20:58:05 -08:00
}
void visit(const Choice *rule) {
value = transitions(rule->left);
value.merge(transitions(rule->right), [&](rule_ptr left, rule_ptr right) -> rule_ptr {
return choice({ left, right });
});
}
void visit(const Seq *rule) {
value = transitions(rule->left).map<Rule>([&](const rule_ptr left_rule) -> rule_ptr {
2013-12-18 20:58:05 -08:00
if (typeid(*left_rule) == typeid(Blank))
return rule->right;
else
return seq({ left_rule, rule->right });
});
}
void visit(const Repeat *rule) {
value = transitions(rule->content).map<Rule>([&](const rule_ptr &value) -> rule_ptr {
return seq({ value, choice({ repeat(rule->content), blank() }) });
});
}
void visit(const String *rule) {
rule_ptr result = character(rule->value[0]);
for (int i = 1; i < rule->value.length(); i++)
result = seq({ result, character(rule->value[i]) });
value = transitions(result);
}
void visit(const Pattern *rule) {
value = transitions(rule->to_rule_tree());
}
};
transition_map<Rule, Rule> transitions(const rule_ptr &rule) {
2013-12-18 20:58:05 -08:00
TransitionsVisitor visitor;
rule->accept(visitor);
return visitor.value;
}
}
}