From 5527fa428989a91711359a6500adaf47fbef8096 Mon Sep 17 00:00:00 2001 From: Kubat <mael.martin31@gmail.com> Date: Fri, 11 Feb 2022 15:37:29 +0100 Subject: [PATCH] WIP: Define the IrExpression classes family API --- src/Lib/Script/Ast/IrExpression.cc | 22 ++++++++++ src/Lib/Script/Ast/IrExpression.hh | 64 +++++++++++++++++++++++++++--- 2 files changed, 80 insertions(+), 6 deletions(-) diff --git a/src/Lib/Script/Ast/IrExpression.cc b/src/Lib/Script/Ast/IrExpression.cc index 63e95cc2..7669714d 100644 --- a/src/Lib/Script/Ast/IrExpression.cc +++ b/src/Lib/Script/Ast/IrExpression.cc @@ -5,6 +5,10 @@ #include <cassert> +/* +** IrExpression +*/ + namespace Vivy::Script { IrExpression::IrExpression(IrElement *p, Type type) noexcept @@ -63,6 +67,10 @@ IrExpression::innerType() const noexcept } } +/* +** IrEVariableRef +*/ + namespace Vivy::Script { std::string @@ -168,6 +176,10 @@ IrEConstExpr::parse(std::vector<Token> *) } } +/* +** IrECall +*/ + namespace Vivy::Script { std::string @@ -181,6 +193,16 @@ IrECall::parse(std::vector<Token> *) { 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 diff --git a/src/Lib/Script/Ast/IrExpression.hh b/src/Lib/Script/Ast/IrExpression.hh index ff66f433..95688f62 100644 --- a/src/Lib/Script/Ast/IrExpression.hh +++ b/src/Lib/Script/Ast/IrExpression.hh @@ -46,7 +46,6 @@ class IrEConstExpr : public IrExpression { public: std::string toString() const noexcept override; - void parse(std::vector<Token> *) override; virtual IrTPrimitive *innerType() const noexcept override; bool getInnerBoolean() const; @@ -59,40 +58,93 @@ public: class IrECall : public IrExpression { VIVY_IR_ELEMENT(IrECall) + IrFunction *callPtr = nullptr; + std::vector<IrExpression *> inArgs; + public: 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 { 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: std::string toString() const noexcept override; - void parse(std::vector<Token> *) override; + + OpType opType() const noexcept; }; class IrEArithmeticOp : public IrExpression { 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: std::string toString() const noexcept override; - void parse(std::vector<Token> *) override; + + OpType opType() const noexcept; }; class IrELogicOp : public IrExpression { 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: std::string toString() const noexcept override; - void parse(std::vector<Token> *) override; + + OpType opType() const noexcept; }; class IrEVariableRef : public IrExpression { 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: 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; } -- GitLab