Fate compiler #553
@ -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}}).
|
||||
|
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user