Compare View

switch
from
...
to
 
Commits (4)
fz/Makefile
... ... @@ -3,7 +3,11 @@ OBJ = flatzinc.tab.o
3 3 GENCFILES = flatzinc.tab.c lex.yy.c
4 4 OTHER = flatzinc.output
5 5  
6   -PLFILES = $(wildcard *.pl)
  6 +PLFILES = $(filter-out out-%.pl,$(wildcard *.pl))
  7 +PLOFILES = $(patsubst %.pl,%.o,$(PLFILES))
  8 +
  9 +# out-XXX.pl produces fz-XXX, the flatzinc-to-XXX compiler
  10 +FZSEM = $(patsubst out-%.pl,fz-%,$(wildcard out-*.pl))
7 11  
8 12 # NOTE: we need to pass the `-l' flag to ensure the scanner internal
9 13 # variable `yylineno' is available.
... ... @@ -25,13 +29,16 @@ RM = /bin/rm -f
25 29 %.ast:: %.fzn
26 30 fzp < $< > $@
27 31  
28   -all: fzp fzsem
  32 +all: fzp $(FZSEM) $(PLOFILES) $(patsubst %.pl,%.o,$(wildcard out-*.pl))
29 33  
30 34 fzp: $(OBJ)
31 35 $(CC) $(CFLAGS) -o $@ $(OBJ) $(LEXLIB)
32 36  
33   -fzsem: $(PLFILES)
34   - $(GPLC) -o $@ $(PLFILES)
  37 +fz-%: out-%.o $(PLOFILES)
  38 + $(GPLC) -o $@ $+
  39 +
  40 +%.o: %.pl
  41 + $(GPLC) $(GPLCFLAGS) -c $<
35 42  
36 43 flatzinc.tab.c: flatzinc.y lex.yy.c
37 44 $(YACC) $(YACCFLAGS) flatzinc.y
... ...
fz/fznslurp.pl
... ... @@ -1,79 +0,0 @@
1   -% == No, Emacs this is -*-Prolog-*- code, not what you thought... =============
2   -
3   -:- initialization(main).
4   -
5   -main :-
6   - argument_list(A),
7   - main(A).
8   -
9   -main([ACTION_S|REST]) :-
10   - read_term_from_atom(ACTION_S, ACTION, [end_of_term(eof)]),
11   - action(ACTION), !, main(REST).
12   -main([]).
13   -
14   -action(load(F)) :- !, see(F), action(load), seen.
15   -action(load) :- !, load_ast(AST), g_assign(ast, AST).
16   -action(dump(A)) :- !, dump_ast(A).
17   -action(dump) :- !, g_read(ast, AST), dump_ast(AST).
18   -action(name) :- !,
19   - g_read(ast, AST),
20   - sa_names(AST, NAST, ST),
21   - g_assign(ast_n, NAST+ST).
22   -action(type) :- !,
23   - g_read(ast_n, AST+ST),
24   - sa_types(AST, ST),
25   - g_assign(ast_t, AST+ST).
26   -action(halt) :- !, halt.
27   -action(debug) :- g_read(ast_debug, true), !, g_assign(ast_debug, false).
28   -action(debug) :- !, g_assign(ast_debug, true).
29   -action(ACTION) :- format("%w: unknown action.\n", [ACTION]).
30   -
31   -
32   -% -----------------------------------------------------------------------------
33   -
34   -%% beware: fails if load_ast/3 does not finish with 3rd arg singular list
35   -
36   -load_ast(AST) :- g_read(ast_debug, true), !, load_ast_deb(_>[], [], [AST]).
37   -load_ast(AST) :- load_ast(_>[], [], [AST]).
38   -
39   -load_ast(end_of_file, AST, AST).
40   -load_ast((IN > INT :- MOD), IN, OUT) :-
41   - call(MOD),
42   - read(OP), !,
43   - load_ast(OP, INT, OUT).
44   -load_ast((IN > INT), IN, OUT) :-
45   - read(OP), !,
46   - load_ast(OP, INT, OUT).
47   -
48   -load_ast_deb(end_of_file, AST, AST).
49   -load_ast_deb((IN > INT :- MOD), IN, OUT) :-
50   - ( call(MOD) -> format("EXT OK ~q\n", [MOD]) ;
51   - format("EXT FAIL ~q\n", [MOD]), fail ),
52   - read(OP), !,
53   - writeq(IN), write('.'), nl,
54   - writeq(OP), nl,
55   - load_ast_deb(OP, INT, OUT).
56   -load_ast_deb(IN > INT, IN, OUT) :-
57   - read(OP), !,
58   - writeq(IN), write('.'), nl,
59   - writeq(OP), nl,
60   - load_ast_deb(OP, INT, OUT).
61   -
62   -% -----------------------------------------------------------------------------
63   -
64   -dump_ast(fzn(PREDS, VARS, CONSTRS, SOLVE)) :-
65   - !,
66   - format("AST:\n", []),
67   - format(" preds:\n", []), PREDS=preds(PS), dump_list(PS),
68   - format(" vars:\n", []), VARS=vars(VS), dump_list(VS),
69   - format(" constrs:\n", []), CONSTRS=constrs(CS), dump_list(CS),
70   - format(" goal:\n ~w\n", [SOLVE]).
71   -
72   -dump_ast(AST) :- write(AST), nl.
73   -
74   -% -----------------------------------------------------------------------------
75   -
76   -dump_list([]).
77   -dump_list([I|Is]) :- format(" ~w\n", [I]), dump_list(Is).
78   -
79   -% -----------------------------------------------------------------------------
fz/fzsem.pl 0 → 100644
... ... @@ -0,0 +1,82 @@
  1 +% == No, Emacs this is -*-Prolog-*- code, not what you thought... =============
  2 +
  3 +:- initialization(main).
  4 +
  5 +main :-
  6 + argument_list(A),
  7 + main(A).
  8 +
  9 +main([ACTION_S|REST]) :-
  10 + read_term_from_atom(ACTION_S, ACTION, [end_of_term(eof)]),
  11 + action(ACTION), !, main(REST).
  12 +main([]).
  13 +
  14 +action(load(F)) :- !, see(F), action(load), seen.
  15 +action(load) :- !, load_ast(AST), g_assign(ast, AST).
  16 +action(dump(A)) :- !, dump_ast(A).
  17 +action(dump) :- !, g_read(ast, AST), dump_ast(AST).
  18 +action(name) :- !,
  19 + g_read(ast, AST),
  20 + sa_names(AST, NAST, ST),
  21 + g_assign(ast_n, NAST+ST).
  22 +action(type) :- !,
  23 + g_read(ast_n, AST+ST),
  24 + sa_types(AST, ST),
  25 + g_assign(ast_t, AST+ST).
  26 +action(code) :- !,
  27 + g_read(ast_t, AST+ST),
  28 + cg_emit(AST, ST).
  29 +action(halt) :- !, halt.
  30 +action(debug) :- g_read(ast_debug, true), !, g_assign(ast_debug, false).
  31 +action(debug) :- !, g_assign(ast_debug, true).
  32 +action(ACTION) :- format("%w: unknown action.\n", [ACTION]).
  33 +
  34 +
  35 +% -----------------------------------------------------------------------------
  36 +
  37 +%% beware: fails if load_ast/3 does not finish with 3rd arg singular list
  38 +
  39 +load_ast(AST) :- g_read(ast_debug, true), !, load_ast_deb(_>[], [], [AST]).
  40 +load_ast(AST) :- load_ast(_>[], [], [AST]).
  41 +
  42 +load_ast(end_of_file, AST, AST).
  43 +load_ast((IN > INT :- MOD), IN, OUT) :-
  44 + call(MOD),
  45 + read(OP), !,
  46 + load_ast(OP, INT, OUT).
  47 +load_ast((IN > INT), IN, OUT) :-
  48 + read(OP), !,
  49 + load_ast(OP, INT, OUT).
  50 +
  51 +load_ast_deb(end_of_file, AST, AST).
  52 +load_ast_deb((IN > INT :- MOD), IN, OUT) :-
  53 + ( call(MOD) -> format("EXT OK ~q\n", [MOD]) ;
  54 + format("EXT FAIL ~q\n", [MOD]), fail ),
  55 + read(OP), !,
  56 + writeq(IN), write('.'), nl,
  57 + writeq(OP), nl,
  58 + load_ast_deb(OP, INT, OUT).
  59 +load_ast_deb(IN > INT, IN, OUT) :-
  60 + read(OP), !,
  61 + writeq(IN), write('.'), nl,
  62 + writeq(OP), nl,
  63 + load_ast_deb(OP, INT, OUT).
  64 +
  65 +% -----------------------------------------------------------------------------
  66 +
  67 +dump_ast(fzn(PREDS, VARS, CONSTRS, SOLVE)) :-
  68 + !,
  69 + format("AST:\n", []),
  70 + format(" preds:\n", []), PREDS=preds(PS), dump_list(PS),
  71 + format(" vars:\n", []), VARS=vars(VS), dump_list(VS),
  72 + format(" constrs:\n", []), CONSTRS=constrs(CS), dump_list(CS),
  73 + format(" goal:\n ~w\n", [SOLVE]).
  74 +
  75 +dump_ast(AST) :- write(AST), nl.
  76 +
  77 +% -----------------------------------------------------------------------------
  78 +
  79 +dump_list([]).
  80 +dump_list([I|Is]) :- format(" ~w\n", [I]), dump_list(Is).
  81 +
  82 +% -----------------------------------------------------------------------------
... ...
fz/out-paccs.pl 0 → 100644
... ... @@ -0,0 +1,61 @@
  1 +% == No, Emacs this is -*-Prolog-*- code, not what you thought... =============
  2 +
  3 +% == Code generation for PaCCS ================================================
  4 +
  5 +cg_emit(fzn(preds(PS), vars(VS), constrs(CS), G), ST) :-
  6 + cg_prefix(TEXT, PTXT),
  7 + cg_preds(PTXT, VTXT, PS, ST),
  8 + cg_vars(VTXT, CTXT, VS, ST),
  9 + cg_constrs(CTXT, GTXT, CS, ST),
  10 + cg_goal(GTXT, STXT, G, VS, ST),
  11 + cg_suffix(STXT, []),
  12 + format("%s", [TEXT]).
  13 +
  14 +% == DCGs for code generation =================================================
  15 +
  16 +% -- predicates ---------------------------------------------------------------
  17 +
  18 +cg_preds(_PS, _ST) --> [].
  19 +
  20 +% -- variables ----------------------------------------------------------------
  21 +
  22 +cg_vars([V|Vs], ST) --> cg_var(V, ST), cg_vars(Vs, ST).
  23 +cg_vars([], _) --> [].
  24 +
  25 +cg_var(var(N,int(LB,UB),_I,_A), _ST) -->
  26 + "fd_int ",
  27 + { name(N, NN) }, NN,
  28 + { format_to_codes(S, " = fd_new(%d, %d);\n", [LB, UB]) }, S.
  29 +cg_var(var(N,int,_I,_A), _ST) -->
  30 + "fd_int ",
  31 + { name(N, NN) }, NN,
  32 + " = fd_new(1, 999);\n". % FIXME: replace with "maxint"
  33 +
  34 +
  35 +% -- constraints --------------------------------------------------------------
  36 +
  37 +cg_constrs([C|Cs], ST) --> cg_constr(C, ST), cg_constrs(Cs, ST).
  38 +cg_constrs([], _) --> [].
  39 +
  40 +cg_constr(_C, _ST) --> []. % FIXME: temporary
  41 +
  42 +% -- goal ---------------------------------------------------------------------
  43 +
  44 +cg_goal(satisfy, VS, ST) -->
  45 + "\n",
  46 + " if (fd_solve()) {\n",
  47 + cg_var_print(VS, ST, " "),
  48 + " }\n".
  49 +
  50 +cg_var_print([], _, _) --> [].
  51 +cg_var_print([var(N,_,_,A)|Vs], ST, PFX) -->
  52 + { member(output, A), ! },
  53 + { format_to_codes(S, "%sfd_println(%s);\n", [PFX, N]) }, S,
  54 + cg_var_print(Vs, ST, PFX).
  55 +cg_var_print([_|Vs], ST, PFX) --> cg_var_print(Vs, ST, PFX).
  56 +
  57 +
  58 +% -- prefix and suffix --------------------------------------------------------
  59 +
  60 +cg_prefix --> [].
  61 +cg_suffix --> [].
... ...