Super simple standalone version of the compiler
This commit is contained in:
parent
b8cb7ab1b5
commit
87e5562f74
@ -1,8 +1,13 @@
|
|||||||
{erl_opts, [debug_info]}.
|
{erl_opts, [debug_info]}.
|
||||||
|
|
||||||
|
{escript_name, aesophia}.
|
||||||
|
|
||||||
|
{provider_hooks, [{post, [{compile, escriptize}]}]}.
|
||||||
|
|
||||||
%% NOTE: When possible deps are referenced by Git ref to ensure consistency between builds.
|
%% NOTE: When possible deps are referenced by Git ref to ensure consistency between builds.
|
||||||
{deps, [ {aebytecode, {git, "https://github.com/aeternity/aebytecode.git",
|
{deps, [ {aebytecode, {git, "https://github.com/aeternity/aebytecode.git",
|
||||||
{ref,"99bf097"}}}
|
{ref,"99bf097"}}}
|
||||||
|
, {getopt, "1.0.1"}
|
||||||
]}.
|
]}.
|
||||||
|
|
||||||
|
|
||||||
|
@ -1,4 +1,10 @@
|
|||||||
|
{"1.1.0",
|
||||||
[{<<"aebytecode">>,
|
[{<<"aebytecode">>,
|
||||||
{git,"https://github.com/aeternity/aebytecode.git",
|
{git,"https://github.com/aeternity/aebytecode.git",
|
||||||
{ref,"99bf097759dedbe7553f87a796bc7e1c7322e64b"}},
|
{ref,"99bf097759dedbe7553f87a796bc7e1c7322e64b"}},
|
||||||
0}].
|
0},
|
||||||
|
{<<"getopt">>,{pkg,<<"getopt">>,<<"1.0.1">>},0}]}.
|
||||||
|
[
|
||||||
|
{pkg_hash,[
|
||||||
|
{<<"getopt">>, <<"C73A9FA687B217F2FF79F68A3B637711BB1936E712B521D8CE466B29CBF7808A">>}]}
|
||||||
|
].
|
||||||
|
@ -252,7 +252,7 @@ parse_error({Line,Pos}, ErrorString) ->
|
|||||||
error({parse_errors,[Error]}).
|
error({parse_errors,[Error]}).
|
||||||
|
|
||||||
read_contract(Name) ->
|
read_contract(Name) ->
|
||||||
{ok, Bin} = file:read_file(filename:join(contract_path(), lists:concat([Name, ".aes"]))),
|
{ok, Bin} = file:read_file(Name),
|
||||||
binary_to_list(Bin).
|
binary_to_list(Bin).
|
||||||
|
|
||||||
contract_path() ->
|
contract_path() ->
|
||||||
|
@ -6,6 +6,7 @@
|
|||||||
[kernel,
|
[kernel,
|
||||||
stdlib,
|
stdlib,
|
||||||
syntax_tools,
|
syntax_tools,
|
||||||
|
getopt,
|
||||||
aebytecode
|
aebytecode
|
||||||
]},
|
]},
|
||||||
{env,[]},
|
{env,[]},
|
||||||
|
71
src/aesophia.erl
Normal file
71
src/aesophia.erl
Normal file
@ -0,0 +1,71 @@
|
|||||||
|
-module(aesophia).
|
||||||
|
|
||||||
|
-export([main/1]).
|
||||||
|
|
||||||
|
-define(OPT_SPEC,
|
||||||
|
[ {src_file, undefined, undefined, string, "Sophia source code file"}
|
||||||
|
, {verbose, $v, "verbose", undefined, "Verbose output"}
|
||||||
|
, {help, $h, "help", undefined, "Show this message"}
|
||||||
|
, {outfile, $o, "out", string, "Output file (experimental)"} ]).
|
||||||
|
|
||||||
|
usage() ->
|
||||||
|
getopt:usage(?OPT_SPEC, "aesophia").
|
||||||
|
|
||||||
|
main(Args) ->
|
||||||
|
case getopt:parse(?OPT_SPEC, Args) of
|
||||||
|
{ok, {Opts, []}} ->
|
||||||
|
case proplists:get_value(help, Opts, false) of
|
||||||
|
false ->
|
||||||
|
compile(Opts);
|
||||||
|
true ->
|
||||||
|
usage()
|
||||||
|
end;
|
||||||
|
|
||||||
|
{ok, {_, NonOpts}} ->
|
||||||
|
io:format("Can't understand ~p\n\n", [NonOpts]),
|
||||||
|
usage();
|
||||||
|
|
||||||
|
{error, {Reason, Data}} ->
|
||||||
|
io:format("Error: ~s ~p\n\n", [Reason, Data]),
|
||||||
|
usage()
|
||||||
|
end.
|
||||||
|
|
||||||
|
|
||||||
|
compile(Opts) ->
|
||||||
|
case proplists:get_value(src_file, Opts, undefined) of
|
||||||
|
undefined ->
|
||||||
|
io:format("Error: no input source file\n\n"),
|
||||||
|
usage();
|
||||||
|
File ->
|
||||||
|
compile(File, Opts)
|
||||||
|
end.
|
||||||
|
|
||||||
|
compile(File, Opts) ->
|
||||||
|
Verbose = proplists:get_value(verbose, Opts, false),
|
||||||
|
OutFile = proplists:get_value(outfile, Opts, undefined),
|
||||||
|
|
||||||
|
try
|
||||||
|
Res = aeso_compiler:file(File, [pp_ast || Verbose]),
|
||||||
|
write_outfile(OutFile, Res),
|
||||||
|
io:format("\nCompiled successfully!\n")
|
||||||
|
catch
|
||||||
|
%% The compiler errors.
|
||||||
|
error:{type_errors, Errors} ->
|
||||||
|
io:format("\n~s\n", [string:join(["** Type errors\n" | Errors], "\n")]);
|
||||||
|
error:{parse_errors, Errors} ->
|
||||||
|
io:format("\n~s\n", [string:join(["** Parse errors\n" | Errors], "\n")]);
|
||||||
|
error:{code_errors, Errors} ->
|
||||||
|
ErrorStrings = [ io_lib:format("~p", [E]) || E <- Errors ],
|
||||||
|
io:format("\n~s\n", [string:join(["** Code errors\n" | ErrorStrings], "\n")]);
|
||||||
|
%% General programming errors in the compiler.
|
||||||
|
error:Error ->
|
||||||
|
Where = hd(erlang:get_stacktrace()),
|
||||||
|
ErrorString = io_lib:format("Error: ~p in\n ~p", [Error,Where]),
|
||||||
|
io:format("\n~s\n", [ErrorString])
|
||||||
|
end.
|
||||||
|
|
||||||
|
write_outfile(undefined, _) -> ok;
|
||||||
|
write_outfile(Out, ResMap) ->
|
||||||
|
%% Lazy approach
|
||||||
|
file:write_file(Out, term_to_binary(ResMap)),
|
||||||
|
io:format("Output written to: ~s\n", [Out]).
|
Loading…
x
Reference in New Issue
Block a user