diff --git a/src/aeso_ast_to_fcode.erl b/src/aeso_ast_to_fcode.erl index b478822..218fc7d 100644 --- a/src/aeso_ast_to_fcode.erl +++ b/src/aeso_ast_to_fcode.erl @@ -25,6 +25,7 @@ -type sophia_name() :: [string()]. -type binop() :: '+' | '-' | '==' | '::'. +-type unop() :: '!'. -type fexpr() :: {int, integer()} | {string, binary()} @@ -39,7 +40,8 @@ | {tuple, [fexpr()]} | {proj, fexpr(), integer()} | {set_proj, fexpr(), integer(), fexpr()} %% tuple, field, new_value - | {binop, binop(), fexpr(), fexpr()} + | {op, binop(), fexpr(), fexpr()} + | {op, unop(), fexpr()} | {'let', var_name(), fexpr(), fexpr()} | {switch, fsplit()}. @@ -360,7 +362,12 @@ expr_to_fcode(Env, _Type, {block, _, Stmts}) -> %% Binary operator expr_to_fcode(Env, _Type, {app, _Ann, {Op, _}, [A, B]}) when is_atom(Op) -> FOp = binop_to_fcode(Op), - {binop, FOp, expr_to_fcode(Env, A), expr_to_fcode(Env, B)}; + {op, FOp, expr_to_fcode(Env, A), expr_to_fcode(Env, B)}; +expr_to_fcode(Env, _Type, {app, _Ann, {Op, _}, [A]}) when is_atom(Op) -> + case Op of + '-' -> {op, '-', {int, 0}, expr_to_fcode(Env, A)}; + '!' -> {op, '!', expr_to_fcode(Env, A)} + end; expr_to_fcode(_Env, Type, Expr) -> error({todo, {Expr, ':', Type}}). diff --git a/src/aeso_fcode_to_fate.erl b/src/aeso_fcode_to_fate.erl index e134e5d..58cf387 100644 --- a/src/aeso_fcode_to_fate.erl +++ b/src/aeso_fcode_to_fate.erl @@ -217,10 +217,13 @@ to_scode(Env, {set_proj, R, I, E}) -> to_scode(Env, R), aeb_fate_code:setelement(?a, ?i(I), ?a, ?a)]; -to_scode(Env, {binop, Op, A, B}) -> +to_scode(Env, {op, Op, A, B}) -> [ to_scode(notail(Env), B), - to_scode(Env, A), + to_scode(notail(Env), A), binop_to_scode(Op) ]; +to_scode(Env, {op, Op, A}) -> + [ to_scode(notail(Env), A), + unop_to_scode(Op) ]; to_scode(Env, {'let', X, {var, Y}, Body}) -> Env1 = bind_var(X, lookup_var(Env, Y), Env), @@ -351,7 +354,8 @@ binop_to_scode('+') -> aeb_fate_code:add(?a, ?a, ?a); binop_to_scode('-') -> aeb_fate_code:sub(?a, ?a, ?a); binop_to_scode('==') -> aeb_fate_code:eq(?a, ?a, ?a); binop_to_scode('::') -> aeb_fate_code:cons(?a, ?a, ?a). -% binop_to_scode(Op) -> ?TODO(Op). + +unop_to_scode('!') -> aeb_fate_code:not_op(?a, ?a). %% -- Phase II --------------------------------------------------------------- %% Optimize