Skip to content
Extraits de code Groupes Projets
Vérifiée Valider 5527fa42 rédigé par Kubat's avatar Kubat
Parcourir les fichiers

WIP: Define the IrExpression classes family API

parent a96219ef
Aucune branche associée trouvée
Aucune étiquette associée trouvée
1 requête de fusion!25Draft: New Vivy module spec
...@@ -5,6 +5,10 @@ ...@@ -5,6 +5,10 @@
#include <cassert> #include <cassert>
/*
** IrExpression
*/
namespace Vivy::Script namespace Vivy::Script
{ {
IrExpression::IrExpression(IrElement *p, Type type) noexcept IrExpression::IrExpression(IrElement *p, Type type) noexcept
...@@ -63,6 +67,10 @@ IrExpression::innerType() const noexcept ...@@ -63,6 +67,10 @@ IrExpression::innerType() const noexcept
} }
} }
/*
** IrEVariableRef
*/
namespace Vivy::Script namespace Vivy::Script
{ {
std::string std::string
...@@ -168,6 +176,10 @@ IrEConstExpr::parse(std::vector<Token> *) ...@@ -168,6 +176,10 @@ IrEConstExpr::parse(std::vector<Token> *)
} }
} }
/*
** IrECall
*/
namespace Vivy::Script namespace Vivy::Script
{ {
std::string std::string
...@@ -181,6 +193,16 @@ IrECall::parse(std::vector<Token> *) ...@@ -181,6 +193,16 @@ IrECall::parse(std::vector<Token> *)
{ {
throw std::logic_error("Not implemented"); throw std::logic_error("Not implemented");
} }
const IrFunction *IrECall::call() const noexcept
{
return callPtr;
}
const std::vector<IrExpression *>& IrECall::args() const noexcept
{
return inArgs;
}
} }
namespace Vivy::Script namespace Vivy::Script
......
...@@ -46,7 +46,6 @@ class IrEConstExpr : public IrExpression { ...@@ -46,7 +46,6 @@ class IrEConstExpr : public IrExpression {
public: public:
std::string toString() const noexcept override; std::string toString() const noexcept override;
void parse(std::vector<Token> *) override;
virtual IrTPrimitive *innerType() const noexcept override; virtual IrTPrimitive *innerType() const noexcept override;
bool getInnerBoolean() const; bool getInnerBoolean() const;
...@@ -59,40 +58,93 @@ public: ...@@ -59,40 +58,93 @@ public:
class IrECall : public IrExpression { class IrECall : public IrExpression {
VIVY_IR_ELEMENT(IrECall) VIVY_IR_ELEMENT(IrECall)
IrFunction *callPtr = nullptr;
std::vector<IrExpression *> inArgs;
public: public:
std::string toString() const noexcept override; std::string toString() const noexcept override;
void parse(std::vector<Token> *) override;
const IrFunction *call() const noexcept;
const std::vector<IrExpression *>& args() const noexcept;
}; };
class IrECompOp : public IrExpression { class IrECompOp : public IrExpression {
VIVY_IR_ELEMENT(IrECompOp) VIVY_IR_ELEMENT(IrECompOp)
public:
enum class OpType { LT, GT, LE, GE, EQ, NEQ };
private:
const OpType selfOpType;
IrExpression *left;
IrExpression *right;
IrECompOp(OpType, IrExpression*&&left, IrExpression*&&right) noexcept;
public: public:
std::string toString() const noexcept override; std::string toString() const noexcept override;
void parse(std::vector<Token> *) override;
OpType opType() const noexcept;
}; };
class IrEArithmeticOp : public IrExpression { class IrEArithmeticOp : public IrExpression {
VIVY_IR_ELEMENT(IrEArithmeticOp) VIVY_IR_ELEMENT(IrEArithmeticOp)
public:
enum class OpType { Add, Sub, Mul, Div, Mod };
private:
const OpType selfOpType;
IrExpression *left;
IrExpression *right;
IrEArithmeticOp(OpType, IrExpression*&&left, IrExpression*&&right) noexcept;
public: public:
std::string toString() const noexcept override; std::string toString() const noexcept override;
void parse(std::vector<Token> *) override;
OpType opType() const noexcept;
}; };
class IrELogicOp : public IrExpression { class IrELogicOp : public IrExpression {
VIVY_IR_ELEMENT(IrELogicOp) VIVY_IR_ELEMENT(IrELogicOp)
public:
enum class OpType { And, Or, Xor };
private:
const OpType selfOpType;
IrExpression *left;
IrExpression *right;
IrELogicOp(OpType, IrExpression*&&left, IrExpression*&&right) noexcept;
public: public:
std::string toString() const noexcept override; std::string toString() const noexcept override;
void parse(std::vector<Token> *) override;
OpType opType() const noexcept;
}; };
class IrEVariableRef : public IrExpression { class IrEVariableRef : public IrExpression {
VIVY_IR_ELEMENT(IrEVariableRef) VIVY_IR_ELEMENT(IrEVariableRef)
IrVariable *const referencedVariable;
IrEVariableRef(IrVariable *) noexcept;
IrEVariableRef(IrVariable *, std::vector<IrExpression*>&&);
template<typename... Args>
IrEVariableRef(IrVariable *var, Args...&&indicies)
: IrEVariableRef(var, std::vector<IrExpression*>{indicies...})
{
}
public: public:
std::string toString() const noexcept override; std::string toString() const noexcept override;
void parse(std::vector<Token> *) override;
}; };
std::string toString(IrELogicOp::OpType) noexcept;
std::string toString(IrEArithmeticOp::OpType) noexcept;
std::string toString(IrECompOp::OpType) noexcept;
} }
0% Chargement en cours ou .
You are about to add 0 people to the discussion. Proceed with caution.
Terminez d'abord l'édition de ce message.
Veuillez vous inscrire ou vous pour commenter