Compare View

switch
from
...
to
 
Commits (4)
@@ -3,7 +3,11 @@ OBJ = flatzinc.tab.o @@ -3,7 +3,11 @@ OBJ = flatzinc.tab.o
3 GENCFILES = flatzinc.tab.c lex.yy.c 3 GENCFILES = flatzinc.tab.c lex.yy.c
4 OTHER = flatzinc.output 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 # NOTE: we need to pass the `-l' flag to ensure the scanner internal 12 # NOTE: we need to pass the `-l' flag to ensure the scanner internal
9 # variable `yylineno' is available. 13 # variable `yylineno' is available.
@@ -25,13 +29,16 @@ RM = /bin/rm -f @@ -25,13 +29,16 @@ RM = /bin/rm -f
25 %.ast:: %.fzn 29 %.ast:: %.fzn
26 fzp < $< > $@ 30 fzp < $< > $@
27 31
28 -all: fzp fzsem 32 +all: fzp $(FZSEM) $(PLOFILES) $(patsubst %.pl,%.o,$(wildcard out-*.pl))
29 33
30 fzp: $(OBJ) 34 fzp: $(OBJ)
31 $(CC) $(CFLAGS) -o $@ $(OBJ) $(LEXLIB) 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 flatzinc.tab.c: flatzinc.y lex.yy.c 43 flatzinc.tab.c: flatzinc.y lex.yy.c
37 $(YACC) $(YACCFLAGS) flatzinc.y 44 $(YACC) $(YACCFLAGS) flatzinc.y
fz/fznslurp.pl
@@ -1,79 +0,0 @@ @@ -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 @@ @@ -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 @@ @@ -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 --> [].