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).
							 |