160 lines
4.8 KiB
Perl
160 lines
4.8 KiB
Perl
|
/* $Id: chr_swi_bootstrap.pl,v 1.1 2005-10-28 17:41:30 vsc Exp $
|
||
|
|
||
|
Part of CHR (Constraint Handling Rules)
|
||
|
|
||
|
Author: Tom Schrijvers
|
||
|
E-mail: Tom.Schrijvers@cs.kuleuven.ac.be
|
||
|
WWW: http://www.swi-prolog.org
|
||
|
Copyright (C): 2003-2004, K.U. Leuven
|
||
|
|
||
|
This program is free software; you can redistribute it and/or
|
||
|
modify it under the terms of the GNU General Public License
|
||
|
as published by the Free Software Foundation; either version 2
|
||
|
of the License, or (at your option) any later version.
|
||
|
|
||
|
This program is distributed in the hope that it will be useful,
|
||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||
|
GNU General Public License for more details.
|
||
|
|
||
|
You should have received a copy of the GNU Lesser General Public
|
||
|
License along with this library; if not, write to the Free Software
|
||
|
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||
|
|
||
|
As a special exception, if you link this library with other files,
|
||
|
compiled with a Free Software compiler, to produce an executable, this
|
||
|
library does not by itself cause the resulting executable to be covered
|
||
|
by the GNU General Public License. This exception does not however
|
||
|
invalidate any other reasons why the executable file might be covered by
|
||
|
the GNU General Public License.
|
||
|
*/
|
||
|
|
||
|
|
||
|
|
||
|
:- module(chr,
|
||
|
[ chr_compile_step1/2 % +CHRFile, -PlFile
|
||
|
, chr_compile_step2/2 % +CHRFile, -PlFile
|
||
|
, chr_compile_step3/2 % +CHRFile, -PlFile
|
||
|
, chr_compile_step4/2 % +CHRFile, -PlFile
|
||
|
]).
|
||
|
|
||
|
:- use_module(library(listing)). % portray_clause/2
|
||
|
|
||
|
:- include('chr_op').
|
||
|
|
||
|
/*******************************
|
||
|
* FILE-TO-FILE COMPILER *
|
||
|
*******************************/
|
||
|
|
||
|
% chr_compile(+CHRFile, -PlFile)
|
||
|
%
|
||
|
% Compile a CHR specification into a Prolog file
|
||
|
|
||
|
chr_compile_step1(From, To) :-
|
||
|
use_module('chr_translate_bootstrap.pl'),
|
||
|
chr_compile(From, To, informational).
|
||
|
chr_compile_step2(From, To) :-
|
||
|
use_module('chr_translate_bootstrap1.pl'),
|
||
|
chr_compile(From, To, informational).
|
||
|
chr_compile_step3(From, To) :-
|
||
|
use_module('chr_translate_bootstrap2.pl'),
|
||
|
chr_compile(From, To, informational).
|
||
|
chr_compile_step4(From, To) :-
|
||
|
use_module('chr_translate.pl'),
|
||
|
chr_compile(From, To, informational).
|
||
|
|
||
|
chr_compile(From, To, MsgLevel) :-
|
||
|
print_message(MsgLevel, chr(start(From))),
|
||
|
read_chr_file_to_terms(From,Declarations),
|
||
|
% read_file_to_terms(From, Declarations,
|
||
|
% [ module(chr) % get operators from here
|
||
|
% ]),
|
||
|
print_message(silent, chr(translate(From))),
|
||
|
chr_translate(Declarations, Declarations1),
|
||
|
insert_declarations(Declarations1, NewDeclarations),
|
||
|
print_message(silent, chr(write(To))),
|
||
|
writefile(To, From, NewDeclarations),
|
||
|
print_message(MsgLevel, chr(end(From, To))).
|
||
|
|
||
|
|
||
|
insert_declarations(Clauses0, Clauses) :- %vsc
|
||
|
( Clauses0 = [(:- module(M,E))|FileBody]
|
||
|
-> Clauses = [ (:- module(M,E)),
|
||
|
(:- use_module('chr_runtime')),
|
||
|
(:- style_check(-singleton)),
|
||
|
(:- style_check(-discontiguous))
|
||
|
| FileBody
|
||
|
]
|
||
|
; Clauses = [ (:- use_module('chr_runtime')),
|
||
|
(:- style_check(-singleton)),
|
||
|
(:- style_check(-discontiguous))
|
||
|
| Clauses0
|
||
|
]
|
||
|
).
|
||
|
|
||
|
% writefile(+File, +From, +Desclarations)
|
||
|
%
|
||
|
% Write translated CHR declarations to a File.
|
||
|
|
||
|
writefile(File, From, Declarations) :-
|
||
|
open(File, write, Out),
|
||
|
writeheader(From, Out),
|
||
|
writecontent(Declarations, Out),
|
||
|
close(Out).
|
||
|
|
||
|
writecontent([], _).
|
||
|
writecontent([D|Ds], Out) :-
|
||
|
portray_clause(Out, D), % SWI-Prolog
|
||
|
writecontent(Ds, Out).
|
||
|
|
||
|
|
||
|
writeheader(File, Out) :-
|
||
|
get_time(Now),
|
||
|
convert_time(Now, Date),
|
||
|
format(Out, '/* Generated by CHR bootstrap compiler~n', []),
|
||
|
format(Out, ' From: ~w~n', [File]),
|
||
|
format(Out, ' Date: ~w~n~n', [Date]),
|
||
|
format(Out, ' DO NOT EDIT. EDIT THE CHR FILE INSTEAD~n', []),
|
||
|
format(Out, '*/~n~n', []).
|
||
|
|
||
|
|
||
|
/*******************************
|
||
|
* MESSAGES *
|
||
|
*******************************/
|
||
|
|
||
|
|
||
|
:- multifile
|
||
|
prolog:message/3.
|
||
|
|
||
|
prolog:message(chr(start(File))) -->
|
||
|
{ file_base_name(File, Base)
|
||
|
},
|
||
|
[ 'Translating CHR file ~w'-[Base] ].
|
||
|
prolog:message(chr(end(_From, To))) -->
|
||
|
{ file_base_name(To, Base)
|
||
|
},
|
||
|
[ 'Written translation to ~w'-[Base] ].
|
||
|
|
||
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||
|
read_chr_file_to_terms(Spec, Terms) :-
|
||
|
absolute_file_name(Spec, [ access(read) ],
|
||
|
Path),
|
||
|
open(Path, read, Fd, []),
|
||
|
read_chr_stream_to_terms(Fd, Terms),
|
||
|
close(Fd).
|
||
|
|
||
|
read_chr_stream_to_terms(Fd, Terms) :-
|
||
|
read_term(Fd, C0, [ module(chr) ]),
|
||
|
read_chr_stream_to_terms(C0, Fd, Terms).
|
||
|
|
||
|
read_chr_stream_to_terms(end_of_file, _, []) :- !.
|
||
|
read_chr_stream_to_terms(C, Fd, [C|T]) :-
|
||
|
( ground(C),
|
||
|
C = (:- op(Priority,Type,Name)) ->
|
||
|
op(Priority,Type,Name)
|
||
|
;
|
||
|
true
|
||
|
),
|
||
|
read_term(Fd, C2, [module(chr)]),
|
||
|
read_chr_stream_to_terms(C2, Fd, T).
|