#include "rules.h" using std::make_shared; using std::string; using std::initializer_list; namespace tree_sitter { namespace rules { rule_ptr blank() { return make_shared(); } rule_ptr character(char value) { return make_shared(value); } rule_ptr character(CharacterClass value) { return make_shared(value); } rule_ptr character(const std::unordered_set &matches, bool is_affirmative) { return make_shared(matches, is_affirmative); } rule_ptr choice(const initializer_list &rules) { rule_ptr result; for (auto rule : rules) result = result.get() ? make_shared(result, rule) : rule; return result; } rule_ptr pattern(const string &value) { return make_shared(value); } rule_ptr repeat(const rule_ptr content) { return std::make_shared(content); } rule_ptr seq(const initializer_list &rules) { rule_ptr result = blank(); for (auto rule : rules) result = (typeid(*result) != typeid(Blank)) ? make_shared(result, rule) : rule; return result; } rule_ptr str(const string &value) { return make_shared(value); } rule_ptr sym(const string &name) { return make_shared(name, false); } rule_ptr aux_sym(const string &name) { return make_shared(name, true); } } }