#ifndef CAMELLYA_PARSER_H #define CAMELLYA_PARSER_H #include "lexer.h" #include "ast.h" #include namespace camellya { class ParseError : public std::runtime_error { public: explicit ParseError(const std::string& message) : std::runtime_error(message) {} }; class Parser { public: explicit Parser(std::vector tokens); Program parse(); private: std::vector tokens_; size_t current_ = 0; // Utility methods Token peek() const; Token previous() const; bool is_at_end() const; Token advance(); bool check(TokenType type) const; bool match(std::initializer_list types); Token consume(TokenType type, const std::string& message); ParseError error(const Token& token, const std::string& message); void synchronize(); // Parsing methods StmtPtr declaration(); StmtPtr class_declaration(); StmtPtr function_declaration(); StmtPtr var_declaration(); StmtPtr statement(); StmtPtr if_statement(); StmtPtr while_statement(); StmtPtr for_statement(); StmtPtr return_statement(); StmtPtr break_statement(); StmtPtr continue_statement(); StmtPtr block_statement(); StmtPtr expression_statement(); ExprPtr expression(); ExprPtr assignment(); ExprPtr logical_or(); ExprPtr logical_and(); ExprPtr equality(); ExprPtr comparison(); ExprPtr term(); ExprPtr factor(); ExprPtr unary(); ExprPtr call(); ExprPtr primary(); ExprPtr finish_call(ExprPtr callee); }; } // namespace camellya #endif // CAMELLYA_PARSER_H