diff --git a/fz/Makefile b/fz/Makefile index d45a63a..ea8c7b0 100644 --- a/fz/Makefile +++ b/fz/Makefile @@ -6,8 +6,10 @@ OTHER = flatzinc.output PLFILES = $(filter-out out-%.pl,$(wildcard *.pl)) PLOFILES = $(patsubst %.pl,%.o,$(PLFILES)) -# out-XXX.pl produces fz-XXX, the flatzinc-to-XXX compiler -FZSEM = $(patsubst out-%.pl,fz-%,$(wildcard out-*.pl)) +# XXX/output.pl produces fz-XXX, the flatzinc-to-XXX compiler +FZBACKS = $(patsubst %/output.pl,%,$(wildcard */output.pl)) +FZSEM = $(patsubst %/output.pl,fz-%,$(wildcard */output.pl)) +FZOFILES = $(patsubst %,%/*.o,$(FZBACKS)) # NOTE: we need to pass the `-l' flag to ensure the scanner internal # variable `yylineno' is available. @@ -29,12 +31,12 @@ RM = /bin/rm -f %.ast:: %.fzn fzp < $< > $@ -all: fzp $(FZSEM) $(PLOFILES) $(patsubst %.pl,%.o,$(wildcard out-*.pl)) +all: fzp $(FZSEM) $(PLOFILES) $(FZOFILES) fzp: $(OBJ) $(CC) $(CFLAGS) -o $@ $(OBJ) $(LEXLIB) -fz-%: out-%.o $(PLOFILES) +fz-%: %/output.o $(PLOFILES) $(GPLC) -o $@ $+ %.o: %.pl @@ -47,7 +49,7 @@ lex.yy.c: flatzinc.l $(LEX) $(LEXFLAGS) flatzinc.l clean: - $(RM) $(OBJ) $(GENCFILES) $(OTHER) core + $(RM) $(OBJ) $(PLOFILES) $(FZOFILES) $(GENCFILES) $(OTHER) core clobber: clean $(RM) $(EXE_FILE) diff --git a/fz/out-paccs.pl b/fz/out-paccs.pl deleted file mode 100644 index 27c7c8d..0000000 --- a/fz/out-paccs.pl +++ /dev/null @@ -1,103 +0,0 @@ -% == No, Emacs this is -*-Prolog-*- code, not what you thought... ============= - -% == Code generation for PaCCS ================================================ - -cg_emit(fzn(preds(PS), vars(VS), constrs(CS), G), ST) :- - cg_prefix(TEXT, PTXT), - cg_preds(PS, ST, PTXT, VTXT1), - cg_vars(decl, VS, ST, VTXT1, VTXT2), - cg_vars(init, VS, ST, VTXT2, CTXT), - %% cg_constrs(CTXT, GTXT, CS, ST), - %% cg_goal(GTXT, STXT, G, VS, ST), - %% cg_suffix(STXT, []), - cg_suffix(CTXT, []), - format("~s\n", [TEXT]). - -% == DCGs for code generation ================================================= - -% -- predicates --------------------------------------------------------------- - -cg_preds(_PS, _ST) --> []. - -% -- variables ---------------------------------------------------------------- - -cg_vars(OP, [V|Vs], ST) --> cg_var(OP, V, ST), cg_vars(OP, Vs, ST). -cg_vars(_OP, [], _) --> []. - -cg_var(OP, var(N,int,I,A), ST) --> - cg_var(OP, var(N,int(1,999),I,A), ST). % FIXME - -cg_var(decl, var(N,int(LB,UB),_I,_A), _ST) --> - { format_to_codes(S, " fd_int ~w = fd_new(~d, ~d);\n", [N, LB, UB]) }, - S. - -cg_var(init, var(_,int(_,_),_,_), _) --> []. - -% -- array of variables - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -cg_var(decl, var(N,array(_T,LB,UB),[],_), _ST) --> !, - { SZ is UB-LB+1, - format_to_codes(S, " fd_int ~w[~d];\n", [N, SZ]) }, - S. - -cg_var(init, var(N,array(T,ALB,AUB),[],_), _ST) --> !, - { SZ is AUB-ALB+1, bound(lb, T, LB), bound(ub, T, UB) }, - { format_to_codes(S1, " for (i=0; i<~d; ++i)\n", [SZ]) }, S1, - { format_to_codes(S2, " ~w[i] = fd_new(~d, ~d);\n", [N, LB, UB]) }, S2. - -% -- array of constants - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -cg_var(decl, var(N,array(_T,LB,UB),lit(INIT,array(_)),_), _ST) --> - { nonvar(INIT), INIT=[_|_] }, !, - { SZ is UB-LB+1, - format_to_codes(S, " int ~w[~d] = {\n", [N, SZ]) }, - S, - cg_constant_list(INIT, " "), - " };\n". - -cg_var(init, var(_N,array(_T,_LB,_UB),lit(INIT,array(_)),_), _ST) --> - { nonvar(INIT), INIT=[_|_] }, !, - []. - - -% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -cg_constant_list([], _) --> []. -cg_constant_list([C|Cs], PFX) --> - PFX, cg_constant(C), - cg_constant_list(Cs, ", "). - -cg_constant(lit(N,int)) --> { format_to_codes(S, "~w", [N]) }, S. - -% -- constraints -------------------------------------------------------------- - -cg_constrs([C|Cs], ST) --> cg_constr(C, ST), cg_constrs(Cs, ST). -cg_constrs([], _) --> []. - -cg_constr(_C, _ST) --> []. % FIXME: temporary - -% -- goal --------------------------------------------------------------------- - -cg_goal(satisfy, VS, ST) --> - "\n", - " if (fd_solve()) {\n", - cg_var_print(VS, ST, " "), - " }\n". - -cg_var_print([], _, _) --> []. -cg_var_print([var(N,_,_,A)|Vs], ST, PFX) --> - { member(output, A), ! }, - { format_to_codes(S, "~sfd_println(~s);\n", [PFX, N]) }, S, - cg_var_print(Vs, ST, PFX). -cg_var_print([_|Vs], ST, PFX) --> cg_var_print(Vs, ST, PFX). - - -% -- prefix and suffix -------------------------------------------------------- - -cg_prefix --> - "{\n", - " int i, j;\n". - -cg_suffix --> - "}\n". - diff --git a/fz/paccs/output.pl b/fz/paccs/output.pl new file mode 100644 index 0000000..27c7c8d --- /dev/null +++ b/fz/paccs/output.pl @@ -0,0 +1,103 @@ +% == No, Emacs this is -*-Prolog-*- code, not what you thought... ============= + +% == Code generation for PaCCS ================================================ + +cg_emit(fzn(preds(PS), vars(VS), constrs(CS), G), ST) :- + cg_prefix(TEXT, PTXT), + cg_preds(PS, ST, PTXT, VTXT1), + cg_vars(decl, VS, ST, VTXT1, VTXT2), + cg_vars(init, VS, ST, VTXT2, CTXT), + %% cg_constrs(CTXT, GTXT, CS, ST), + %% cg_goal(GTXT, STXT, G, VS, ST), + %% cg_suffix(STXT, []), + cg_suffix(CTXT, []), + format("~s\n", [TEXT]). + +% == DCGs for code generation ================================================= + +% -- predicates --------------------------------------------------------------- + +cg_preds(_PS, _ST) --> []. + +% -- variables ---------------------------------------------------------------- + +cg_vars(OP, [V|Vs], ST) --> cg_var(OP, V, ST), cg_vars(OP, Vs, ST). +cg_vars(_OP, [], _) --> []. + +cg_var(OP, var(N,int,I,A), ST) --> + cg_var(OP, var(N,int(1,999),I,A), ST). % FIXME + +cg_var(decl, var(N,int(LB,UB),_I,_A), _ST) --> + { format_to_codes(S, " fd_int ~w = fd_new(~d, ~d);\n", [N, LB, UB]) }, + S. + +cg_var(init, var(_,int(_,_),_,_), _) --> []. + +% -- array of variables - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +cg_var(decl, var(N,array(_T,LB,UB),[],_), _ST) --> !, + { SZ is UB-LB+1, + format_to_codes(S, " fd_int ~w[~d];\n", [N, SZ]) }, + S. + +cg_var(init, var(N,array(T,ALB,AUB),[],_), _ST) --> !, + { SZ is AUB-ALB+1, bound(lb, T, LB), bound(ub, T, UB) }, + { format_to_codes(S1, " for (i=0; i<~d; ++i)\n", [SZ]) }, S1, + { format_to_codes(S2, " ~w[i] = fd_new(~d, ~d);\n", [N, LB, UB]) }, S2. + +% -- array of constants - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +cg_var(decl, var(N,array(_T,LB,UB),lit(INIT,array(_)),_), _ST) --> + { nonvar(INIT), INIT=[_|_] }, !, + { SZ is UB-LB+1, + format_to_codes(S, " int ~w[~d] = {\n", [N, SZ]) }, + S, + cg_constant_list(INIT, " "), + " };\n". + +cg_var(init, var(_N,array(_T,_LB,_UB),lit(INIT,array(_)),_), _ST) --> + { nonvar(INIT), INIT=[_|_] }, !, + []. + + +% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +cg_constant_list([], _) --> []. +cg_constant_list([C|Cs], PFX) --> + PFX, cg_constant(C), + cg_constant_list(Cs, ", "). + +cg_constant(lit(N,int)) --> { format_to_codes(S, "~w", [N]) }, S. + +% -- constraints -------------------------------------------------------------- + +cg_constrs([C|Cs], ST) --> cg_constr(C, ST), cg_constrs(Cs, ST). +cg_constrs([], _) --> []. + +cg_constr(_C, _ST) --> []. % FIXME: temporary + +% -- goal --------------------------------------------------------------------- + +cg_goal(satisfy, VS, ST) --> + "\n", + " if (fd_solve()) {\n", + cg_var_print(VS, ST, " "), + " }\n". + +cg_var_print([], _, _) --> []. +cg_var_print([var(N,_,_,A)|Vs], ST, PFX) --> + { member(output, A), ! }, + { format_to_codes(S, "~sfd_println(~s);\n", [PFX, N]) }, S, + cg_var_print(Vs, ST, PFX). +cg_var_print([_|Vs], ST, PFX) --> cg_var_print(Vs, ST, PFX). + + +% -- prefix and suffix -------------------------------------------------------- + +cg_prefix --> + "{\n", + " int i, j;\n". + +cg_suffix --> + "}\n". + -- libgit2 0.21.2