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"
|
|
|
|
#include "lexer.h"
|
|
|
|
|
|
|
|
#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();
|
|
|
|
std::unique_ptr<obelisk::ExpressionAST> parseFact();
|
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-08 22:27:26 -03:00
|
|
|
void handleAction();
|
|
|
|
void handleRule();
|
|
|
|
void handleFact();
|
2022-10-17 22:26:36 -03:00
|
|
|
};
|
|
|
|
} // namespace obelisk
|
|
|
|
|
|
|
|
#endif
|