Skip to content
Snippets Groups Projects
Verified Commit eaa8b8fa authored by Houtan Bastani's avatar Houtan Bastani
Browse files

macro processor: introduce array casts

parent 2b1eedd1
No related branches found
No related tags found
No related merge requests found
Pipeline #1569 passed
...@@ -775,6 +775,8 @@ UnaryOp::eval() ...@@ -775,6 +775,8 @@ UnaryOp::eval()
return argbt->cast_string(); return argbt->cast_string();
case codes::UnaryOp::cast_tuple: case codes::UnaryOp::cast_tuple:
return argbt->cast_tuple(); return argbt->cast_tuple();
case codes::UnaryOp::cast_array:
return argbt->cast_array();
case codes::UnaryOp::logical_not: case codes::UnaryOp::logical_not:
return argbt->logical_not(); return argbt->logical_not();
case codes::UnaryOp::unary_minus: case codes::UnaryOp::unary_minus:
...@@ -1103,6 +1105,8 @@ UnaryOp::to_string() const noexcept ...@@ -1103,6 +1105,8 @@ UnaryOp::to_string() const noexcept
return "(string)" + retval; return "(string)" + retval;
case codes::UnaryOp::cast_tuple: case codes::UnaryOp::cast_tuple:
return "(tuple)" + retval; return "(tuple)" + retval;
case codes::UnaryOp::cast_array:
return "(array)" + retval;
case codes::UnaryOp::logical_not: case codes::UnaryOp::logical_not:
return "!" + retval; return "!" + retval;
case codes::UnaryOp::unary_minus: case codes::UnaryOp::unary_minus:
...@@ -1315,6 +1319,9 @@ UnaryOp::print(ostream &output, bool matlab_output) const noexcept ...@@ -1315,6 +1319,9 @@ UnaryOp::print(ostream &output, bool matlab_output) const noexcept
case codes::UnaryOp::cast_tuple: case codes::UnaryOp::cast_tuple:
output << "(tuple)"; output << "(tuple)";
break; break;
case codes::UnaryOp::cast_array:
output << "(array)";
break;
case codes::UnaryOp::logical_not: case codes::UnaryOp::logical_not:
output << "!"; output << "!";
break; break;
...@@ -1404,6 +1411,7 @@ UnaryOp::print(ostream &output, bool matlab_output) const noexcept ...@@ -1404,6 +1411,7 @@ UnaryOp::print(ostream &output, bool matlab_output) const noexcept
&& op_code != codes::UnaryOp::cast_double && op_code != codes::UnaryOp::cast_double
&& op_code != codes::UnaryOp::cast_string && op_code != codes::UnaryOp::cast_string
&& op_code != codes::UnaryOp::cast_tuple && op_code != codes::UnaryOp::cast_tuple
&& op_code != codes::UnaryOp::cast_array
&& op_code != codes::UnaryOp::logical_not && op_code != codes::UnaryOp::logical_not
&& op_code != codes::UnaryOp::unary_plus && op_code != codes::UnaryOp::unary_plus
&& op_code != codes::UnaryOp::unary_minus) && op_code != codes::UnaryOp::unary_minus)
......
...@@ -184,6 +184,7 @@ namespace macro ...@@ -184,6 +184,7 @@ namespace macro
virtual DoublePtr cast_double() const { throw StackTrace("This type cannot be cast to a double"); } virtual DoublePtr cast_double() const { throw StackTrace("This type cannot be cast to a double"); }
virtual StringPtr cast_string() const { throw StackTrace("This type cannot be cast to a string"); } virtual StringPtr cast_string() const { throw StackTrace("This type cannot be cast to a string"); }
virtual TuplePtr cast_tuple() const { throw StackTrace("This type cannot be cast to a tuple"); } virtual TuplePtr cast_tuple() const { throw StackTrace("This type cannot be cast to a tuple"); }
virtual ArrayPtr cast_array() const { throw StackTrace("This type cannot be cast to an array"); }
}; };
...@@ -213,6 +214,10 @@ namespace macro ...@@ -213,6 +214,10 @@ namespace macro
{ {
return make_shared<Tuple>(vector<ExpressionPtr>{make_shared<Bool>(value, env)}, env); return make_shared<Tuple>(vector<ExpressionPtr>{make_shared<Bool>(value, env)}, env);
} }
inline ArrayPtr cast_array() const override
{
return make_shared<Array>(vector<ExpressionPtr>{make_shared<Bool>(value, env)}, env);
}
}; };
...@@ -304,6 +309,10 @@ namespace macro ...@@ -304,6 +309,10 @@ namespace macro
{ {
return make_shared<Tuple>(vector<ExpressionPtr>{make_shared<Double>(value, env)}, env); return make_shared<Tuple>(vector<ExpressionPtr>{make_shared<Double>(value, env)}, env);
} }
inline ArrayPtr cast_array() const override
{
return make_shared<Array>(vector<ExpressionPtr>{make_shared<Double>(value, env)}, env);
}
}; };
class String final : public BaseType class String final : public BaseType
...@@ -335,6 +344,10 @@ namespace macro ...@@ -335,6 +344,10 @@ namespace macro
{ {
return make_shared<Tuple>(vector<ExpressionPtr>{make_shared<String>(value, env)}, env); return make_shared<Tuple>(vector<ExpressionPtr>{make_shared<String>(value, env)}, env);
} }
inline ArrayPtr cast_array() const override
{
return make_shared<Array>(vector<ExpressionPtr>{make_shared<String>(value, env)}, env);
}
}; };
...@@ -364,6 +377,7 @@ namespace macro ...@@ -364,6 +377,7 @@ namespace macro
DoublePtr cast_double() const override; DoublePtr cast_double() const override;
inline StringPtr cast_string() const override { return make_shared<String>(this->to_string(), env); } inline StringPtr cast_string() const override { return make_shared<String>(this->to_string(), env); }
inline TuplePtr cast_tuple() const override { return make_shared<Tuple>(tup, env); } inline TuplePtr cast_tuple() const override { return make_shared<Tuple>(tup, env); }
inline ArrayPtr cast_array() const override { return make_shared<Array>(tup, env); }
}; };
...@@ -409,6 +423,7 @@ namespace macro ...@@ -409,6 +423,7 @@ namespace macro
DoublePtr cast_double() const override; DoublePtr cast_double() const override;
inline StringPtr cast_string() const override { return make_shared<String>(this->to_string(), env); } inline StringPtr cast_string() const override { return make_shared<String>(this->to_string(), env); }
inline TuplePtr cast_tuple() const override { return make_shared<Tuple>(arr, env); } inline TuplePtr cast_tuple() const override { return make_shared<Tuple>(arr, env); }
inline ArrayPtr cast_array() const override { return make_shared<Array>(arr, env); }
}; };
......
...@@ -71,6 +71,7 @@ namespace macro ...@@ -71,6 +71,7 @@ namespace macro
cast_double, cast_double,
cast_string, cast_string,
cast_tuple, cast_tuple,
cast_array,
logical_not, logical_not,
unary_minus, unary_minus,
unary_plus, unary_plus,
......
...@@ -65,7 +65,7 @@ using namespace macro; ...@@ -65,7 +65,7 @@ using namespace macro;
%token SQRT CBRT SIGN MAX MIN FLOOR CEIL TRUNC SUM MOD %token SQRT CBRT SIGN MAX MIN FLOOR CEIL TRUNC SUM MOD
%token ERF ERFC GAMMA LGAMMA ROUND NORMPDF NORMCDF LENGTH %token ERF ERFC GAMMA LGAMMA ROUND NORMPDF NORMCDF LENGTH
%token INT DOUBLE STRING TUPLE %token INT DOUBLE STRING TUPLE ARRAY
%left OR %left OR
%left AND %left AND
...@@ -78,7 +78,7 @@ using namespace macro; ...@@ -78,7 +78,7 @@ using namespace macro;
%left PLUS MINUS %left PLUS MINUS
%left TIMES DIVIDE %left TIMES DIVIDE
%precedence UMINUS UPLUS NOT %precedence UMINUS UPLUS NOT
%precedence CAST_INT CAST_DOUBLE CAST_STRING CAST_TUPLE %precedence CAST_INT CAST_DOUBLE CAST_STRING CAST_TUPLE CAST_ARRAY
%nonassoc POWER %nonassoc POWER
%token <string> NAME TEXT QUOTED_STRING NUMBER EOL %token <string> NAME TEXT QUOTED_STRING NUMBER EOL
...@@ -330,6 +330,8 @@ expr : LPAREN expr RPAREN ...@@ -330,6 +330,8 @@ expr : LPAREN expr RPAREN
{ $$ = make_shared<UnaryOp>(codes::UnaryOp::cast_string, $4, driver.env, @$); } { $$ = make_shared<UnaryOp>(codes::UnaryOp::cast_string, $4, driver.env, @$); }
| LPAREN TUPLE RPAREN expr %prec CAST_TUPLE | LPAREN TUPLE RPAREN expr %prec CAST_TUPLE
{ $$ = make_shared<UnaryOp>(codes::UnaryOp::cast_tuple, $4, driver.env, @$); } { $$ = make_shared<UnaryOp>(codes::UnaryOp::cast_tuple, $4, driver.env, @$); }
| LPAREN ARRAY RPAREN expr %prec CAST_ARRAY
{ $$ = make_shared<UnaryOp>(codes::UnaryOp::cast_array, $4, driver.env, @$); }
| NOT expr | NOT expr
{ $$ = make_shared<UnaryOp>(codes::UnaryOp::logical_not, $2, driver.env, @$); } { $$ = make_shared<UnaryOp>(codes::UnaryOp::logical_not, $2, driver.env, @$); }
| MINUS expr %prec UMINUS | MINUS expr %prec UMINUS
......
...@@ -146,6 +146,7 @@ CONT \\\\{SPC}* ...@@ -146,6 +146,7 @@ CONT \\\\{SPC}*
<expr,eval>double { return token::DOUBLE; } <expr,eval>double { return token::DOUBLE; }
<expr,eval>string { return token::STRING; } <expr,eval>string { return token::STRING; }
<expr,eval>tuple { return token::TUPLE; } <expr,eval>tuple { return token::TUPLE; }
<expr,eval>array { return token::ARRAY; }
<expr,eval>((([0-9]*\.[0-9]+)|([0-9]+\.))([ed][-+]?[0-9]+)?)|([0-9]+([ed][-+]?[0-9]+)?)|nan|inf { <expr,eval>((([0-9]*\.[0-9]+)|([0-9]+\.))([ed][-+]?[0-9]+)?)|([0-9]+([ed][-+]?[0-9]+)?)|nan|inf {
yylval->build<string>(yytext); yylval->build<string>(yytext);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment