#ifndef PORYGONLANG_PARSER_HPP #define PORYGONLANG_PARSER_HPP #include #include #include "ParsedStatements/ParsedStatement.hpp" #include "../Script.hpp" enum class OperatorPrecedence { No, LogicalOr, LogicalAnd, Equality, Additive, Multiplication, Unary, }; class Parser { vector _tokens; unsigned int _position; Script* ScriptData; const IToken* Peek(); const IToken *PeekAt(int offset); const IToken* Next(); ParsedStatement* ParseStatement(const IToken* current); ParsedStatement* ParseAssignment(const IToken* current); ParsedStatement *ParseBlock(const vector& endTokens, const vector& openStatements = {}); ParsedStatement* ParseFunctionDeclaration(const IToken* current); ParsedStatement *ParseReturnStatement(const IToken *current); ParsedStatement *ParseIfStatement(const IToken *current); ParsedExpression* ParseExpression(const IToken* current); ParsedExpression* ParseBinaryExpression(const IToken* current, OperatorPrecedence parentPrecedence); ParsedExpression* ParsePrimaryExpression(const IToken* current); ParsedExpression* ParseParenthesizedExpression(const IToken *current); ParsedExpression* ParseFunctionCallExpression(ParsedExpression* functionExpression); ParsedExpression *ParseIndexExpression(ParsedExpression *indexingExpression); ParsedExpression *ParseTableExpression(const IToken *current); public: ParsedScriptStatement* Parse(); explicit Parser(const vector& tokens, Script* scriptData){ _tokens = tokens; _position = 0; ScriptData = scriptData; } }; #endif //PORYGONLANG_PARSER_HPP