From da6d2c72d0def4fd07ed8f784d2dd94fb5d67a8f Mon Sep 17 00:00:00 2001 From: Salvador Abreu Date: Thu, 9 Jul 2015 12:00:58 +0900 Subject: [PATCH] new "code" action --- fz/fzsem.pl | 82 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 82 insertions(+), 0 deletions(-) create mode 100644 fz/fzsem.pl diff --git a/fz/fzsem.pl b/fz/fzsem.pl new file mode 100644 index 0000000..d556c7c --- /dev/null +++ b/fz/fzsem.pl @@ -0,0 +1,82 @@ +% == No, Emacs this is -*-Prolog-*- code, not what you thought... ============= + +:- initialization(main). + +main :- + argument_list(A), + main(A). + +main([ACTION_S|REST]) :- + read_term_from_atom(ACTION_S, ACTION, [end_of_term(eof)]), + action(ACTION), !, main(REST). +main([]). + +action(load(F)) :- !, see(F), action(load), seen. +action(load) :- !, load_ast(AST), g_assign(ast, AST). +action(dump(A)) :- !, dump_ast(A). +action(dump) :- !, g_read(ast, AST), dump_ast(AST). +action(name) :- !, + g_read(ast, AST), + sa_names(AST, NAST, ST), + g_assign(ast_n, NAST+ST). +action(type) :- !, + g_read(ast_n, AST+ST), + sa_types(AST, ST), + g_assign(ast_t, AST+ST). +action(code) :- !, + g_read(ast_t, AST+ST), + cg_emit(AST, ST). +action(halt) :- !, halt. +action(debug) :- g_read(ast_debug, true), !, g_assign(ast_debug, false). +action(debug) :- !, g_assign(ast_debug, true). +action(ACTION) :- format("%w: unknown action.\n", [ACTION]). + + +% ----------------------------------------------------------------------------- + +%% beware: fails if load_ast/3 does not finish with 3rd arg singular list + +load_ast(AST) :- g_read(ast_debug, true), !, load_ast_deb(_>[], [], [AST]). +load_ast(AST) :- load_ast(_>[], [], [AST]). + +load_ast(end_of_file, AST, AST). +load_ast((IN > INT :- MOD), IN, OUT) :- + call(MOD), + read(OP), !, + load_ast(OP, INT, OUT). +load_ast((IN > INT), IN, OUT) :- + read(OP), !, + load_ast(OP, INT, OUT). + +load_ast_deb(end_of_file, AST, AST). +load_ast_deb((IN > INT :- MOD), IN, OUT) :- + ( call(MOD) -> format("EXT OK ~q\n", [MOD]) ; + format("EXT FAIL ~q\n", [MOD]), fail ), + read(OP), !, + writeq(IN), write('.'), nl, + writeq(OP), nl, + load_ast_deb(OP, INT, OUT). +load_ast_deb(IN > INT, IN, OUT) :- + read(OP), !, + writeq(IN), write('.'), nl, + writeq(OP), nl, + load_ast_deb(OP, INT, OUT). + +% ----------------------------------------------------------------------------- + +dump_ast(fzn(PREDS, VARS, CONSTRS, SOLVE)) :- + !, + format("AST:\n", []), + format(" preds:\n", []), PREDS=preds(PS), dump_list(PS), + format(" vars:\n", []), VARS=vars(VS), dump_list(VS), + format(" constrs:\n", []), CONSTRS=constrs(CS), dump_list(CS), + format(" goal:\n ~w\n", [SOLVE]). + +dump_ast(AST) :- write(AST), nl. + +% ----------------------------------------------------------------------------- + +dump_list([]). +dump_list([I|Is]) :- format(" ~w\n", [I]), dump_list(Is). + +% ----------------------------------------------------------------------------- -- libgit2 0.21.2