#include #include #ifndef PORYGONLANG_PARSEDSTATEMENT_HPP #define PORYGONLANG_PARSEDSTATEMENT_HPP #include #include "../ParsedExpressions/ParsedExpression.hpp" enum class ParsedStatementKind{ Script, Block, Expression, }; class ParsedStatement { unsigned int _start; unsigned int _length; public: virtual ParsedStatementKind GetKind() = 0; ParsedStatement(unsigned int start, unsigned int length){ _start = start; _length = length; } virtual ~ParsedStatement() = default; unsigned int GetStartPosition(){ return _start; } unsigned int GetEndPosition(){ return _start + _length - 1; } }; class ParsedBlockStatement : public ParsedStatement{ std::vector _statements; public: explicit ParsedBlockStatement(std::vector statements) : ParsedStatement(statements.front()->GetStartPosition(), statements.back()->GetEndPosition() - statements.front()->GetStartPosition()){ _statements = std::move(statements); } ~ParsedBlockStatement() override { for (auto s: _statements){ delete s; } _statements.clear(); } ParsedStatementKind GetKind() override{ return ParsedStatementKind ::Block; } std::vector GetStatements(){ return _statements; } }; class ParsedScriptStatement : public ParsedBlockStatement{ public: explicit ParsedScriptStatement(vector statements) : ParsedBlockStatement(move(statements)){} ParsedStatementKind GetKind() final{ return ParsedStatementKind ::Script; } }; class ParsedExpressionStatement : public ParsedStatement{ ParsedExpression* _expression; public: explicit ParsedExpressionStatement(ParsedExpression* expression) : ParsedStatement(expression->GetStartPosition(), expression->GetLength()){ _expression = expression; } ~ParsedExpressionStatement() override { delete _expression; } ParsedStatementKind GetKind() final{ return ParsedStatementKind ::Expression; } ParsedExpression* GetExpression(){ return _expression; } }; #endif //PORYGONLANG_PARSEDSTATEMENT_HPP