#ifndef TREE_SITTER_COMPILER_H_ #define TREE_SITTER_COMPILER_H_ #include #include #include namespace tree_sitter { namespace rules { class Rule; typedef std::shared_ptr rule_ptr; std::ostream& operator<<(std::ostream& stream, const rule_ptr &rule); rule_ptr blank(); rule_ptr choice(const std::vector &rules); rule_ptr repeat(const rule_ptr &content); rule_ptr seq(const std::vector &rules); rule_ptr sym(const std::string &name); rule_ptr pattern(const std::string &value); rule_ptr str(const std::string &value); rule_ptr keyword(const std::string &value); rule_ptr keypattern(const std::string &value); rule_ptr err(const rule_ptr &rule); rule_ptr prec(int precedence, rule_ptr rule); rule_ptr token(rule_ptr rule); } class Grammar { protected: const std::vector> rules_; std::vector ubiquitous_tokens_; std::vector separators_; public: Grammar(const std::vector> &rules); bool operator==(const Grammar &other) const; std::string start_rule_name() const; const rules::rule_ptr rule(const std::string &name) const; const std::vector> & rules() const; const std::vector & ubiquitous_tokens() const; Grammar & ubiquitous_tokens(const std::vector &ubiquitous_tokens); const std::vector & separators() const; Grammar & separators(const std::vector &separators); }; struct Conflict { Conflict(std::string description); std::string description; bool operator==(const Conflict &other) const; bool operator<(const Conflict &other) const; }; enum GrammarErrorType { GrammarErrorTypeRegex, GrammarErrorTypeUndefinedSymbol }; class GrammarError { public: GrammarError(GrammarErrorType type, std::string message); bool operator==(const GrammarError &other) const; GrammarErrorType type; std::string message; }; std::ostream& operator<<(std::ostream &stream, const Grammar &grammar); std::ostream& operator<<(std::ostream &stream, const Conflict &conflict); std::ostream& operator<<(std::ostream &stream, const GrammarError *error); std::tuple, const GrammarError *> compile(const Grammar &grammar, std::string name); } #endif // TREE_SITTER_COMPILER_H_