obelisk/src/parser.h

82 lines
2.5 KiB
C
Raw Normal View History

2022-10-17 22:26:36 -03:00
#ifndef OBELISK_PARSER_H
#define OBELISK_PARSER_H
#include "ast/expression_ast.h"
#include "ast/function_ast.h"
#include "ast/prototype_ast.h"
2022-11-26 00:32:06 -03:00
#include "knowledge_base.h"
2022-10-17 22:26:36 -03:00
#include "lexer.h"
2022-11-26 00:32:06 -03:00
#include "models/fact.h"
2022-10-17 22:26:36 -03:00
#include <memory>
namespace obelisk
{
class Parser
{
private:
2022-11-04 11:19:53 -03:00
std::unique_ptr<obelisk::Lexer> lexer_;
2022-10-17 22:26:36 -03:00
int currentToken_;
void setCurrentToken(int currentToken);
std::unique_ptr<obelisk::ExpressionAST> logError(const char* str);
std::unique_ptr<obelisk::PrototypeAST> logErrorPrototype(
const char* str);
std::unique_ptr<obelisk::ExpressionAST> parseExpression();
std::unique_ptr<obelisk::ExpressionAST> parseNumberExpression();
std::unique_ptr<obelisk::ExpressionAST>
parseParenthesisExpression();
std::unique_ptr<obelisk::ExpressionAST> parseIdentifierExpression();
std::unique_ptr<obelisk::ExpressionAST> parsePrimary();
std::unique_ptr<obelisk::PrototypeAST> parsePrototype();
std::unique_ptr<obelisk::FunctionAST> parseDefinition();
std::unique_ptr<obelisk::FunctionAST> parseTopLevelExpression();
std::unique_ptr<obelisk::PrototypeAST> parseExtern();
2022-11-08 22:27:26 -03:00
std::unique_ptr<obelisk::ExpressionAST> parseAction();
std::unique_ptr<obelisk::ExpressionAST> parseRule();
2022-11-26 00:32:06 -03:00
void parseFact(std::vector<obelisk::Fact>& facts);
2022-10-17 22:26:36 -03:00
public:
Parser();
2022-11-04 11:19:53 -03:00
std::unique_ptr<obelisk::Lexer>& getLexer();
2022-10-17 22:26:36 -03:00
int getCurrentToken();
int getNextToken();
void handleDefinition();
void handleExtern();
void handleTopLevelExpression();
2022-11-26 00:32:06 -03:00
void handleAction(std::unique_ptr<obelisk::KnowledgeBase>& kb);
void handleRule(std::unique_ptr<obelisk::KnowledgeBase>& kb);
void handleFact(std::unique_ptr<obelisk::KnowledgeBase>& kb);
2022-10-17 22:26:36 -03:00
};
2022-11-22 11:34:07 -03:00
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();
}
};
2022-10-17 22:26:36 -03:00
} // namespace obelisk
#endif