90 lines
2.2 KiB
C++
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
|