Fate compiler #553
@ -25,6 +25,7 @@
|
|||||||
-type sophia_name() :: [string()].
|
-type sophia_name() :: [string()].
|
||||||
|
|
||||||
-type binop() :: '+' | '-' | '==' | '::'.
|
-type binop() :: '+' | '-' | '==' | '::'.
|
||||||
|
-type unop() :: '!'.
|
||||||
|
|
||||||
-type fexpr() :: {int, integer()}
|
-type fexpr() :: {int, integer()}
|
||||||
| {string, binary()}
|
| {string, binary()}
|
||||||
@ -39,7 +40,8 @@
|
|||||||
| {tuple, [fexpr()]}
|
| {tuple, [fexpr()]}
|
||||||
| {proj, fexpr(), integer()}
|
| {proj, fexpr(), integer()}
|
||||||
| {set_proj, fexpr(), integer(), fexpr()} %% tuple, field, new_value
|
| {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()}
|
| {'let', var_name(), fexpr(), fexpr()}
|
||||||
| {switch, fsplit()}.
|
| {switch, fsplit()}.
|
||||||
|
|
||||||
@ -360,7 +362,12 @@ expr_to_fcode(Env, _Type, {block, _, Stmts}) ->
|
|||||||
%% Binary operator
|
%% Binary operator
|
||||||
expr_to_fcode(Env, _Type, {app, _Ann, {Op, _}, [A, B]}) when is_atom(Op) ->
|
expr_to_fcode(Env, _Type, {app, _Ann, {Op, _}, [A, B]}) when is_atom(Op) ->
|
||||||
FOp = binop_to_fcode(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) ->
|
expr_to_fcode(_Env, Type, Expr) ->
|
||||||
error({todo, {Expr, ':', Type}}).
|
error({todo, {Expr, ':', Type}}).
|
||||||
|
@ -217,10 +217,13 @@ to_scode(Env, {set_proj, R, I, E}) ->
|
|||||||
to_scode(Env, R),
|
to_scode(Env, R),
|
||||||
aeb_fate_code:setelement(?a, ?i(I), ?a, ?a)];
|
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(notail(Env), B),
|
||||||
to_scode(Env, A),
|
to_scode(notail(Env), A),
|
||||||
binop_to_scode(Op) ];
|
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}) ->
|
to_scode(Env, {'let', X, {var, Y}, Body}) ->
|
||||||
Env1 = bind_var(X, lookup_var(Env, Y), Env),
|
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:sub(?a, ?a, ?a);
|
||||||
binop_to_scode('==') -> aeb_fate_code:eq(?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('::') -> 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 ---------------------------------------------------------------
|
%% -- Phase II ---------------------------------------------------------------
|
||||||
%% Optimize
|
%% Optimize
|
||||||
|
Loading…
x
Reference in New Issue
Block a user