#ifndef TREE_SITTER_COMPILER_H_ #define TREE_SITTER_COMPILER_H_ #include #include #include #include #include namespace tree_sitter { namespace rules { class Rule; typedef std::shared_ptr rule_ptr; enum Associativity { AssociativityLeft = 1, AssociativityRight }; rule_ptr blank(); rule_ptr choice(const std::vector &); rule_ptr repeat(const rule_ptr &); rule_ptr seq(const std::vector &); rule_ptr sym(const std::string &); rule_ptr pattern(const std::string &); rule_ptr str(const std::string &); rule_ptr err(const rule_ptr &); rule_ptr prec(int precedence, const rule_ptr &); rule_ptr prec(int precedence, const rule_ptr &, Associativity); rule_ptr token(const rule_ptr &rule); std::ostream &operator<<(std::ostream &stream, const rules::rule_ptr &rule); } // namespace rules class Grammar { const std::vector> rules_; std::set ubiquitous_tokens_; public: explicit Grammar(const std::vector> &); bool operator==(const Grammar &) const; std::string start_rule_name() const; const rules::rule_ptr rule(const std::string &) const; const std::vector> &rules() const; const std::set &ubiquitous_tokens() const; Grammar &ubiquitous_tokens(const std::set &); }; enum GrammarErrorType { GrammarErrorTypeRegex, GrammarErrorTypeUndefinedSymbol, GrammarErrorTypeInvalidUbiquitousToken, GrammarErrorTypeLexConflict, GrammarErrorTypeParseConflict, }; class GrammarError { public: GrammarError(GrammarErrorType type, std::string message); bool operator==(const GrammarError &other) const; GrammarErrorType type; std::string message; }; std::pair compile(const Grammar &, std::string); std::ostream &operator<<(std::ostream &stream, const Grammar &grammar); std::ostream &operator<<(std::ostream &stream, const GrammarError *error); } // namespace tree_sitter #endif // TREE_SITTER_COMPILER_H_