Files
PorygonLang/src/Parser/ParsedStatements/ParsedStatement.hpp

90 lines
2.2 KiB
C++

#include <utility>
#include <utility>
#ifndef PORYGONLANG_PARSEDSTATEMENT_HPP
#define PORYGONLANG_PARSEDSTATEMENT_HPP
#include <vector>
#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<ParsedStatement*> _statements;
public:
explicit ParsedBlockStatement(std::vector<ParsedStatement*> 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<ParsedStatement*> GetStatements(){
return _statements;
}
};
class ParsedScriptStatement : public ParsedBlockStatement{
public:
explicit ParsedScriptStatement(vector<ParsedStatement*> 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