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
......@@ -775,6 +775,8 @@ UnaryOp::eval()
return argbt->cast_string();
case codes::UnaryOp::cast_tuple:
return argbt->cast_tuple();
case codes::UnaryOp::cast_array:
return argbt->cast_array();
case codes::UnaryOp::logical_not:
return argbt->logical_not();
case codes::UnaryOp::unary_minus:
......@@ -1103,6 +1105,8 @@ UnaryOp::to_string() const noexcept
return "(string)" + retval;
case codes::UnaryOp::cast_tuple:
return "(tuple)" + retval;
case codes::UnaryOp::cast_array:
return "(array)" + retval;
case codes::UnaryOp::logical_not:
return "!" + retval;
case codes::UnaryOp::unary_minus:
......@@ -1315,6 +1319,9 @@ UnaryOp::print(ostream &output, bool matlab_output) const noexcept
case codes::UnaryOp::cast_tuple:
output << "(tuple)";
break;
case codes::UnaryOp::cast_array:
output << "(array)";
break;
case codes::UnaryOp::logical_not:
output << "!";
break;
......@@ -1404,6 +1411,7 @@ UnaryOp::print(ostream &output, bool matlab_output) const noexcept
&& op_code != codes::UnaryOp::cast_double
&& op_code != codes::UnaryOp::cast_string
&& op_code != codes::UnaryOp::cast_tuple
&& op_code != codes::UnaryOp::cast_array
&& op_code != codes::UnaryOp::logical_not
&& op_code != codes::UnaryOp::unary_plus
&& op_code != codes::UnaryOp::unary_minus)
......
......@@ -184,6 +184,7 @@ namespace macro
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 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
{
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
{
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
......@@ -335,6 +344,10 @@ namespace macro
{
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
DoublePtr cast_double() const override;
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 ArrayPtr cast_array() const override { return make_shared<Array>(tup, env); }
};
......@@ -409,6 +423,7 @@ namespace macro
DoublePtr cast_double() const override;
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 ArrayPtr cast_array() const override { return make_shared<Array>(arr, env); }
};
......
......@@ -71,6 +71,7 @@ namespace macro
cast_double,
cast_string,
cast_tuple,
cast_array,
logical_not,
unary_minus,
unary_plus,
......
......@@ -65,7 +65,7 @@ using namespace macro;
%token SQRT CBRT SIGN MAX MIN FLOOR CEIL TRUNC SUM MOD
%token ERF ERFC GAMMA LGAMMA ROUND NORMPDF NORMCDF LENGTH
%token INT DOUBLE STRING TUPLE
%token INT DOUBLE STRING TUPLE ARRAY
%left OR
%left AND
......@@ -78,7 +78,7 @@ using namespace macro;
%left PLUS MINUS
%left TIMES DIVIDE
%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
%token <string> NAME TEXT QUOTED_STRING NUMBER EOL
......@@ -330,6 +330,8 @@ expr : LPAREN expr RPAREN
{ $$ = make_shared<UnaryOp>(codes::UnaryOp::cast_string, $4, driver.env, @$); }
| LPAREN TUPLE RPAREN expr %prec CAST_TUPLE
{ $$ = 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
{ $$ = make_shared<UnaryOp>(codes::UnaryOp::logical_not, $2, driver.env, @$); }
| MINUS expr %prec UMINUS
......
......@@ -146,6 +146,7 @@ CONT \\\\{SPC}*
<expr,eval>double { return token::DOUBLE; }
<expr,eval>string { return token::STRING; }
<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 {
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