#ifndef OBELISK_PARSER_H #define OBELISK_PARSER_H #include "ast/expression_ast.h" #include "ast/function_ast.h" #include "ast/prototype_ast.h" #include "knowledge_base.h" #include "lexer.h" #include "models/fact.h" #include namespace obelisk { class Parser { private: std::unique_ptr lexer_; int currentToken_; void setCurrentToken(int currentToken); std::unique_ptr logError(const char* str); std::unique_ptr logErrorPrototype( const char* str); std::unique_ptr parseExpression(); std::unique_ptr parseNumberExpression(); std::unique_ptr parseParenthesisExpression(); std::unique_ptr parseIdentifierExpression(); std::unique_ptr parsePrimary(); std::unique_ptr parsePrototype(); std::unique_ptr parseDefinition(); std::unique_ptr parseTopLevelExpression(); std::unique_ptr parseExtern(); std::unique_ptr parseAction(); std::unique_ptr parseRule(); void parseFact(std::vector& facts); public: Parser(); std::unique_ptr& getLexer(); int getCurrentToken(); int getNextToken(); void handleDefinition(); void handleExtern(); void handleTopLevelExpression(); void handleAction(std::unique_ptr& kb); void handleRule(std::unique_ptr& kb); void handleFact(std::unique_ptr& kb); }; class ParserException : public std::exception { private: const std::string errorMessage_; public: ParserException() : errorMessage_("an unknown error ocurred") { } ParserException(const std::string& errorMessage) : errorMessage_(errorMessage) { } const char* what() const noexcept { return errorMessage_.c_str(); } }; } // namespace obelisk #endif