#ifndef PORYGONLANG_PARSER_HPP #define PORYGONLANG_PARSER_HPP #include #include #include "ParsedStatements/ParsedStatement.hpp" #include "../Script.hpp" namespace Porygon::Parser { enum class OperatorPrecedence { No, LogicalOr, LogicalAnd, Equality, Additive, Multiplication, Unary, }; class Parser { vector _tokens; unsigned int _position; Porygon::Script *ScriptData; const IToken *Peek(); const IToken *PeekAt(int offset); const IToken *Next(); // Statements ParsedStatement *ParseStatement(const IToken *current); ParsedStatement *ParseVariableAssignment(const IToken *current); ParsedStatement *ParseIndexAssignment(ParsedExpression *indexer); ParsedStatement *ParseBlock(const vector &endTokens, const vector &openStatements = {}); ParsedStatement *ParseFunctionDeclaration(const IToken *current); ParsedStatement *ParseReturnStatement(const IToken *current); ParsedStatement *ParseIfStatement(const IToken *current); ParsedStatement *ParseForStatement(); ParsedStatement *ParseNumericForStatement(const IToken *current); ParsedStatement *ParseGenericForStatement(const IToken *current); ParsedStatement *ParseWhileStatement(const IToken *current); // Expressions 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 *ParsePeriodIndexExpression(ParsedExpression *indexingExpression); ParsedExpression *ParseTableExpression(const IToken *current); public: ParsedScriptStatement *Parse(); explicit Parser(const vector &tokens, Porygon::Script *scriptData) { _tokens = tokens; _position = 0; ScriptData = scriptData; } }; } #endif //PORYGONLANG_PARSER_HPP