PorygonLang/src/Binder/BoundExpressions/BoundExpression.hpp

332 lines
9.1 KiB
C++
Raw Normal View History

#ifndef PORYGONLANG_BOUNDEXPRESSION_HPP
#define PORYGONLANG_BOUNDEXPRESSION_HPP
#include <string>
#include <memory>
2019-06-09 18:15:09 +00:00
#include <utility>
#include "../../ScriptType.hpp"
2019-05-21 20:15:51 +00:00
#include "../BoundOperators.hpp"
#include "../BoundVariables/BoundVariableKey.hpp"
using namespace std;
enum class BoundExpressionKind{
Bad,
LiteralInteger,
LiteralFloat,
LiteralString,
LiteralBool,
Variable,
Unary,
Binary,
FunctionCall,
Index,
PeriodIndex,
2019-06-09 18:15:09 +00:00
NumericalTable,
2019-06-12 13:19:28 +00:00
Table,
};
class BoundExpression{
const unsigned int _start;
const unsigned int _length;
const shared_ptr<ScriptType> _type;
public:
BoundExpression(unsigned int start, unsigned int length, shared_ptr<ScriptType> type)
: _start(start),
_length(length),
_type(std::move(type))
{
}
virtual ~BoundExpression() = default;
virtual const BoundExpressionKind GetKind() const = 0;
virtual const std::shared_ptr<ScriptType>& GetType() const{
return _type;
};
const unsigned int GetStartPosition() const{
return _start;
}
const unsigned int GetLength() const{
return _length;
}
const unsigned int GetEndPosition() const{
2019-05-21 20:15:51 +00:00
return _start + _length - 1;
}
};
class BoundBadExpression : public BoundExpression{
public:
BoundBadExpression(unsigned int start, unsigned int length) : BoundExpression(start, length, make_shared<ScriptType>(TypeClass::Error)){}
const BoundExpressionKind GetKind() const final{
return BoundExpressionKind ::Bad;
}
};
class BoundLiteralIntegerExpression : public BoundExpression{
const long _value;
public:
BoundLiteralIntegerExpression(long value, unsigned int start, unsigned int length)
: BoundExpression(start, length, make_shared<NumericScriptType>(true, false)),
_value(value)
{
}
const BoundExpressionKind GetKind() const final{
return BoundExpressionKind ::LiteralInteger;
}
const long GetValue() const{
return _value;
}
};
class BoundLiteralFloatExpression : public BoundExpression{
const double _value;
public:
BoundLiteralFloatExpression(double value, unsigned int start, unsigned int length)
: BoundExpression(start, length, make_shared<NumericScriptType>(true, true)),
_value(value)
{
}
const BoundExpressionKind GetKind() const final{
return BoundExpressionKind ::LiteralFloat;
}
const double GetValue() const{
return _value;
}
};
class BoundLiteralStringExpression : public BoundExpression{
const u16string _value;
public:
2019-06-17 15:43:54 +00:00
BoundLiteralStringExpression(const u16string& value, unsigned int start, unsigned int length)
: BoundExpression(start, length, make_shared<StringScriptType>(true, HashedString::ConstHash(value.c_str()))),
_value(value)
{
}
const BoundExpressionKind GetKind() const final{
return BoundExpressionKind ::LiteralString;
}
const u16string GetValue() const{
return _value;
}
};
class BoundLiteralBoolExpression : public BoundExpression{
const bool _value;
public:
BoundLiteralBoolExpression(bool value, unsigned int start, unsigned int length)
: BoundExpression(start, length, make_shared<ScriptType>(TypeClass::Bool)),
_value(value)
{
}
const BoundExpressionKind GetKind() const final{
return BoundExpressionKind ::LiteralBool;
}
const bool GetValue() const{
return _value;
}
};
class BoundVariableExpression : public BoundExpression{
const BoundVariableKey* _key;
public:
BoundVariableExpression(BoundVariableKey* key, shared_ptr<ScriptType> type, unsigned int start, unsigned int length)
: BoundExpression(start, length, std::move(type)),
_key(key)
{
}
2019-06-13 13:18:20 +00:00
~BoundVariableExpression() override{
delete _key;
}
const BoundExpressionKind GetKind() const final{
return BoundExpressionKind ::Variable;
}
const BoundVariableKey* GetKey() const{
return _key;
}
};
2019-05-21 20:15:51 +00:00
class BoundBinaryExpression : public BoundExpression {
const BoundExpression* _left;
const BoundExpression* _right;
const BoundBinaryOperation _operation;
2019-05-21 20:15:51 +00:00
public:
BoundBinaryExpression(BoundExpression* left, BoundExpression* right, BoundBinaryOperation op, shared_ptr<ScriptType> result,
2019-05-22 10:29:29 +00:00
unsigned int start, unsigned int length)
: BoundExpression(start, length, std::move(result)),
_left(left),
_right(right),
_operation(op)
{
2019-05-21 20:15:51 +00:00
}
2019-05-21 20:15:51 +00:00
~BoundBinaryExpression() final{
delete _left;
delete _right;
}
const BoundExpressionKind GetKind() const final{
2019-05-21 20:15:51 +00:00
return BoundExpressionKind ::Binary;
}
2019-05-23 16:50:09 +00:00
const BoundExpression* GetLeft() const{
2019-05-23 16:50:09 +00:00
return _left;
}
const BoundExpression* GetRight() const{
2019-05-23 16:50:09 +00:00
return _right;
}
const BoundBinaryOperation GetOperation() const{
2019-05-23 16:50:09 +00:00
return _operation;
}
2019-05-21 20:15:51 +00:00
};
2019-05-22 10:22:52 +00:00
class BoundUnaryExpression : public BoundExpression {
const BoundExpression* _operand;
const BoundUnaryOperation _operation;
2019-05-22 10:22:52 +00:00
public:
BoundUnaryExpression(BoundExpression* operand, BoundUnaryOperation op, shared_ptr<ScriptType> result, unsigned int start, unsigned int length)
2019-06-17 15:43:54 +00:00
: BoundExpression(start, length, std::move(result)),
_operand(operand),
_operation(op)
{
2019-05-22 10:22:52 +00:00
}
~BoundUnaryExpression() final{
delete _operand;
}
const BoundExpressionKind GetKind() const final{
2019-05-22 10:22:52 +00:00
return BoundExpressionKind ::Unary;
}
2019-05-25 12:59:12 +00:00
const BoundExpression* GetOperand() const{
2019-05-25 12:59:12 +00:00
return _operand;
}
const BoundUnaryOperation GetOperation() const{
2019-05-25 12:59:12 +00:00
return _operation;
}
2019-05-22 10:22:52 +00:00
};
class BoundFunctionCallExpression : public BoundExpression {
const BoundExpression* _functionExpression;
const vector<BoundExpression*> _parameters;
public:
BoundFunctionCallExpression(BoundExpression *functionExpression, vector<BoundExpression *> parameters, shared_ptr<ScriptType> result,
unsigned int start, unsigned int length)
2019-06-17 15:43:54 +00:00
: BoundExpression(start, length, std::move(result)), _functionExpression(functionExpression), _parameters(std::move(parameters)) {}
~BoundFunctionCallExpression() final{
delete _functionExpression;
for (auto p : _parameters){
delete p;
}
}
const BoundExpressionKind GetKind() const final{
return BoundExpressionKind ::FunctionCall;
}
const BoundExpression* GetFunctionExpression() const{
return _functionExpression;
}
const vector<BoundExpression*>* GetParameters() const{
return &_parameters;
}
};
class BoundIndexExpression : public BoundExpression {
2019-06-17 15:43:54 +00:00
const BoundExpression* _indexableExpression;
const BoundExpression* _indexExpression;
public:
BoundIndexExpression(BoundExpression* indexableExpression, BoundExpression* indexExpression, shared_ptr<ScriptType> result,
unsigned int start, unsigned int length)
: BoundExpression(start, length, std::move(result)), _indexableExpression(indexableExpression), _indexExpression(indexExpression) {}
~BoundIndexExpression() final{
delete _indexableExpression;
delete _indexExpression;
}
const BoundExpressionKind GetKind() const final{
return BoundExpressionKind ::Index;
}
2019-06-17 15:43:54 +00:00
const BoundExpression* GetIndexableExpression() const{
return _indexableExpression;
}
2019-06-17 15:43:54 +00:00
const BoundExpression* GetIndexExpression() const{
return _indexExpression;
}
};
class BoundPeriodIndexExpression : public BoundExpression {
2019-06-17 15:43:54 +00:00
const BoundExpression* _indexableExpression;
const HashedString _index;
public:
BoundPeriodIndexExpression(BoundExpression* indexableExpression, HashedString index, shared_ptr<ScriptType> result,
unsigned int start, unsigned int length)
: BoundExpression(start, length, std::move(result)), _indexableExpression(indexableExpression), _index(index) {}
~BoundPeriodIndexExpression() final{
delete _indexableExpression;
}
const BoundExpressionKind GetKind() const final{
return BoundExpressionKind ::PeriodIndex;
}
const BoundExpression* GetIndexableExpression() const{
return _indexableExpression;
}
const HashedString GetIndex() const{
return _index;
}
};
2019-06-09 18:15:09 +00:00
class BoundNumericalTableExpression : public BoundExpression{
2019-06-17 15:43:54 +00:00
const vector<const BoundExpression*> _expressions;
2019-06-09 18:15:09 +00:00
public:
2019-06-17 15:43:54 +00:00
BoundNumericalTableExpression(vector<const BoundExpression*> expressions, shared_ptr<ScriptType> type, unsigned int start, unsigned int length)
: BoundExpression(start, length, std::move(type)),
_expressions(std::move(expressions))
{}
2019-06-09 18:15:09 +00:00
2019-06-12 13:19:28 +00:00
~BoundNumericalTableExpression() final{
2019-06-09 18:15:09 +00:00
for (auto e: _expressions){
delete e;
}
}
const BoundExpressionKind GetKind() const final{
2019-06-09 18:15:09 +00:00
return BoundExpressionKind ::NumericalTable;
}
2019-06-17 15:43:54 +00:00
const vector<const BoundExpression*>* GetExpressions() const{
return &_expressions;
2019-06-09 18:15:09 +00:00
}
};
#endif //PORYGONLANG_BOUNDEXPRESSION_HPP