#ifndef DLANG_PARSER_HPP #define DLANG_PARSER_HPP #include #include #include #include "types/include.hpp" #include "program.hpp" #include "parser/expressions.hpp" #include "parser/statements.hpp" #include "language.hpp" class Parser { private: std::vector _tokens; size_t _pos = 0; private: Token& Current(); Token& Consume(); Token& Peek(size_t offset = 1); bool Match(TokenType type, const std::string& value); Token& ShouldBe(TokenType type, const std::string& value = ""); bool Match(TokenType type, char value); Token& ShouldBe(TokenType type, char value); public: Parser(const std::vector& tokens); Program ParseProgram(); private: std::unique_ptr ParseStatement(); std::unique_ptr ParseVariableDeclaration(); std::unique_ptr ParseAssignment(); std::unique_ptr ParseWhileDeclaration(); std::unique_ptr ParseForDeclaration(); std::unique_ptr ParseForeachDeclaration(); std::unique_ptr ParseIfDeclaration(); std::unique_ptr ParseFunctionDeclaration(); std::unique_ptr ParseReturnStatement(); std::unique_ptr ParseIncludeStatement(); std::unique_ptr ParseFunctionCall(std::unique_ptr callee); std::unique_ptr ParseExpression(); std::unique_ptr ParsePrimary(); std::unique_ptr ParseMultiplicative(); std::unique_ptr ParseAdditive(); std::unique_ptr ParseComparison(); std::unique_ptr ParseTableLiteral(); std::unique_ptr ParseListLiteral(); std::unique_ptr ParseLogicalAndOr(); std::unique_ptr ParseFunctionExpression(); std::unique_ptr ParseSizeExpression(); }; #endif