diff --git a/src/macro/Expressions.cc b/src/macro/Expressions.cc index 23784ab77b637ad11533a9adf5093a9d0be1fda1..64d6f1e80bcedcee7fa2fab75c1548f869139520 100644 --- a/src/macro/Expressions.cc +++ b/src/macro/Expressions.cc @@ -805,6 +805,16 @@ UnaryOp::eval() return argbt->length(); case codes::UnaryOp::isempty: return argbt->isempty(); + case codes::UnaryOp::isboolean: + return argbt->isboolean(); + case codes::UnaryOp::isreal: + return argbt->isreal(); + case codes::UnaryOp::isstring: + return argbt->isstring(); + case codes::UnaryOp::istuple: + return argbt->istuple(); + case codes::UnaryOp::isarray: + return argbt->isarray(); case codes::UnaryOp::exp: return argbt->exp(); case codes::UnaryOp::ln: @@ -1137,6 +1147,16 @@ UnaryOp::to_string() const noexcept return "length(" + retval + ")"; case codes::UnaryOp::isempty: return "isempty(" + retval + ")"; + case codes::UnaryOp::isboolean: + return "isboolean(" + retval + ")"; + case codes::UnaryOp::isreal: + return "isreal(" + retval + ")"; + case codes::UnaryOp::isstring: + return "isstring(" + retval + ")"; + case codes::UnaryOp::istuple: + return "istuple(" + retval + ")"; + case codes::UnaryOp::isarray: + return "isarray(" + retval + ")"; case codes::UnaryOp::exp: return "exp(" + retval + ")"; case codes::UnaryOp::ln: @@ -1359,6 +1379,21 @@ UnaryOp::print(ostream &output, bool matlab_output) const noexcept case codes::UnaryOp::isempty: output << "isempty("; break; + case codes::UnaryOp::isboolean: + output << "isboolean("; + break; + case codes::UnaryOp::isreal: + output << "isreal("; + break; + case codes::UnaryOp::isstring: + output << "isstring("; + break; + case codes::UnaryOp::istuple: + output << "istuple("; + break; + case codes::UnaryOp::isarray: + output << "isarray("; + break; case codes::UnaryOp::exp: output << "exp("; break; diff --git a/src/macro/Expressions.hh b/src/macro/Expressions.hh index 9153e112bc394d582a486ab01aaa7b408dab8b50..27988de043b246eb0277e9257c73aded7d25965b 100644 --- a/src/macro/Expressions.hh +++ b/src/macro/Expressions.hh @@ -149,6 +149,11 @@ namespace macro virtual BoolPtr contains(const BaseTypePtr &btp) const { throw StackTrace("Second argument of `in` operator must be an array"); } virtual RealPtr length() const { throw StackTrace("Operator `length` does not exist for this type"); } virtual BoolPtr isempty() const { throw StackTrace("Operator `isempty` does not exist for this type"); } + virtual BoolPtr isboolean() const { return make_shared<Bool>(false, env, location); } + virtual BoolPtr isreal() const { return make_shared<Bool>(false, env, location); } + virtual BoolPtr isstring() const { return make_shared<Bool>(false, env, location); } + virtual BoolPtr istuple() const { return make_shared<Bool>(false, env, location); } + virtual BoolPtr isarray() const { return make_shared<Bool>(false, env, location); } virtual RealPtr max(const BaseTypePtr &btp) const { throw StackTrace("Operator `max` does not exist for this type"); } virtual RealPtr min(const BaseTypePtr &btp) const { throw StackTrace("Operator `min` does not exist for this type"); } virtual RealPtr mod(const BaseTypePtr &btp) const { throw StackTrace("Operator `mod` does not exist for this type"); } @@ -208,6 +213,7 @@ namespace macro BoolPtr logical_and(const BaseTypePtr &btp) const override; BoolPtr logical_or(const BaseTypePtr &btp) const override; BoolPtr logical_not() const override; + inline BoolPtr isboolean() const override { return make_shared<Bool>(true, env, location); } inline BoolPtr cast_bool() const override { return make_shared<Bool>(value, env); } inline RealPtr cast_real() const override { return value ? make_shared<Real>(1, env) : make_shared<Real>(0, env); } inline StringPtr cast_string() const override { return make_shared<String>(this->to_string(), env); } @@ -260,6 +266,7 @@ namespace macro BoolPtr is_less_equal(const BaseTypePtr &btp) const override; BoolPtr is_greater_equal(const BaseTypePtr &btp) const override; BoolPtr is_equal(const BaseTypePtr &btp) const override; + inline BoolPtr isreal() const override { return make_shared<Bool>(true, env, location); } BoolPtr logical_and(const BaseTypePtr &btp) const override; BoolPtr logical_or(const BaseTypePtr &btp) const override; BoolPtr logical_not() const override; @@ -337,6 +344,7 @@ namespace macro BoolPtr is_less_equal(const BaseTypePtr &btp) const override; BoolPtr is_greater_equal(const BaseTypePtr &btp) const override; BoolPtr is_equal(const BaseTypePtr &btp) const override; + inline BoolPtr isstring() const override { return make_shared<Bool>(true, env, location); } inline RealPtr length() const override { return make_shared<Real>(value.size(), env); } inline BoolPtr isempty() const override { return make_shared<Bool>(value.empty(), env); } BoolPtr cast_bool() const override; @@ -373,6 +381,7 @@ namespace macro inline vector<ExpressionPtr> getValue() const { return tup; } inline ExpressionPtr at(int i) const { return tup.at(i); } BoolPtr is_equal(const BaseTypePtr &btp) const override; + inline BoolPtr istuple() const override { return make_shared<Bool>(true, env, location); } BoolPtr contains(const BaseTypePtr &btp) const override; inline RealPtr length() const override { return make_shared<Real>(tup.size(), env); } inline BoolPtr isempty() const override { return make_shared<Bool>(empty(), env); } @@ -417,6 +426,7 @@ namespace macro BaseTypePtr times(const BaseTypePtr &bt) const override; BaseTypePtr power(const BaseTypePtr &btp) const override; BoolPtr is_equal(const BaseTypePtr &btp) const override; + inline BoolPtr isarray() const override { return make_shared<Bool>(true, env, location); } ArrayPtr set_union(const BaseTypePtr &btp) const override; ArrayPtr set_intersection(const BaseTypePtr &btp) const override; BoolPtr contains(const BaseTypePtr &btp) const override; diff --git a/src/macro/ForwardDeclarationsAndEnums.hh b/src/macro/ForwardDeclarationsAndEnums.hh index 35112c6ba28173addd221123db9ef13eb01380bd..5b342e8caf3819f6e47c25acb4449667adabd95d 100644 --- a/src/macro/ForwardDeclarationsAndEnums.hh +++ b/src/macro/ForwardDeclarationsAndEnums.hh @@ -77,6 +77,11 @@ namespace macro unary_plus, length, isempty, + isboolean, + isreal, + isstring, + istuple, + isarray, exp, ln, log10, diff --git a/src/macro/Parser.yy b/src/macro/Parser.yy index 98e2b38fc398b7c5070b4ae5f7e3cc2968d1a65e..cb2378cba0fc139200ae0c80aa51929bd0c2e3c7 100644 --- a/src/macro/Parser.yy +++ b/src/macro/Parser.yy @@ -66,6 +66,7 @@ using namespace macro; %token ERF ERFC GAMMA LGAMMA ROUND NORMPDF NORMCDF LENGTH %token ISEMPTY +%token ISBOOLEAN ISREAL ISSTRING ISTUPLE ISARRAY %token BOOL REAL STRING TUPLE ARRAY @@ -344,6 +345,16 @@ expr : LPAREN expr RPAREN { $$ = make_shared<UnaryOp>(codes::UnaryOp::length, $3, driver.env, @$); } | ISEMPTY LPAREN expr RPAREN { $$ = make_shared<UnaryOp>(codes::UnaryOp::isempty, $3, driver.env, @$); } + | ISBOOLEAN LPAREN expr RPAREN + { $$ = make_shared<UnaryOp>(codes::UnaryOp::isboolean, $3, driver.env, @$); } + | ISREAL LPAREN expr RPAREN + { $$ = make_shared<UnaryOp>(codes::UnaryOp::isreal, $3, driver.env, @$); } + | ISSTRING LPAREN expr RPAREN + { $$ = make_shared<UnaryOp>(codes::UnaryOp::isstring, $3, driver.env, @$); } + | ISTUPLE LPAREN expr RPAREN + { $$ = make_shared<UnaryOp>(codes::UnaryOp::istuple, $3, driver.env, @$); } + | ISARRAY LPAREN expr RPAREN + { $$ = make_shared<UnaryOp>(codes::UnaryOp::isarray, $3, driver.env, @$); } | EXP LPAREN expr RPAREN { $$ = make_shared<UnaryOp>(codes::UnaryOp::exp, $3, driver.env, @$); } | LOG LPAREN expr RPAREN diff --git a/src/macro/Tokenizer.ll b/src/macro/Tokenizer.ll index c661d4a1af248d698f197d5075a9219db5569fad..5ec1ffe53dab8d1e3a1e4293c9b59754233f928d 100644 --- a/src/macro/Tokenizer.ll +++ b/src/macro/Tokenizer.ll @@ -141,7 +141,13 @@ CONT \\\\{SPC}* <expr,eval>length { return token::LENGTH; } <expr,eval>normpdf { return token::NORMPDF; } <expr,eval>normcdf { return token::NORMCDF; } + <expr,eval>isempty { return token::ISEMPTY; } +<expr,eval>isboolean { return token::ISBOOLEAN; } +<expr,eval>isreal { return token::ISREAL; } +<expr,eval>isstring { return token::ISSTRING; } +<expr,eval>istuple { return token::ISTUPLE; } +<expr,eval>isarray { return token::ISARRAY; } <expr,eval>bool { return token::BOOL; } <expr,eval>real { return token::REAL; }