Fate compiler #553

Merged
zxq9 merged 87 commits from fate-compiler into master 2019-05-07 22:48:47 +09:00
2 changed files with 16 additions and 5 deletions
Showing only changes of commit a4bbe2bc2f - Show all commits

View File

@ -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}}).

View File

@ -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