Compiler Example
BAP Online Manuals : Compiler
Reference Manual : Appendix
: Compiler Example
Previous: Compiler Error Messages
Next: Datentypen
BAP Online Manuals : Compiler Reference Manual : Appendix : Compiler Example
Previous: Compiler Error Messages
Next: Datentypen
Previous: Compiler Error Messages
Next: Datentypen
3.6.3. Compiler Example Tools
'compiler.bap' : An interactive compiler front-end
MODULE compiler. INCLUDE 'constant.h' INCLUDE 'msglib.h' INCLUDE 'iolib.h' INCLUDE 'prolib.h' INCLUDE 'winlib.h' INCLUDE 'sysman.h' EXPORT compiler. % make the predicate accessible % predicate = module name => % can be started from the host server PREDICATE compiler. compiler:- load_compiler, % install compiler pipeline first makewindow(_,40,86,10,30,"Compiler Input"), process_name(compiler_input), % gives this process a name for the<p> % host servers process list trace(on), % in case you want to see BAP working repeat, % final commitment clearwindow, % start a new game write(' BRAIN AID PROLOG V1.1 '),nl, write(' (c) 1993 by Frank Bergmann,'),nl, write(' Martin Ostermann'),nl, write(' Guido von Walter'),nl, nl, get_params(Name,Flags), % prompt the user to set options compile(Name,Flags), % pass the command to the compiler fail. PREDICATE get_params(string,voidlist). get_params(_,_):- % initialize database not(database(flags(_))), % for use in display_flags asserta(flags([])), fail. get_params(Name,Flags):- display_flags(Flags), % do the actual work readln(Name),!. PREDICATE display_flags(voidlist). display_flags(Flags):- write("Press escape to change flags\n"), database(flags(Flags)), write("Flags: ",Flags,"\n"), write("Name : "). % know the readln in get_params % becomes active. If the user <p> % presses escape it will fail % and the second clause is entered: display_flags(_):- retractall(flags(_)), % make a new start asserta(flags([])), clearwindow, write("Press <RETURN> to confirm\nPress <ESC> to ignore\n\n"), % first get possible options and % their descriptions out of a list member(flag(String,Flag),[ flag("Trace on? ",trace), flag("disable optimizing? ",no_opt) ]), write("\t",String), readln(_), % display and prompt for each option retract(flags(Old)), % readln(_) succeeded, thus the user append(Old,[Flag],New), % wants this option active: asserta(flags(New)), % add it to the list ... fail. % ... and loop % that's all
'make.bap': UNIX like make utility
%**************************************************************** % % % MAKE Utility % % Version 1.00, 16.10.93 by Gbr Frank Bergmann % Martin Ostermann % Guido von Walter<p> % BRAIN AID SYSTEMS % %**************************************************************** MODULE make. INCLUDE 'prolib.h' INCLUDE 'msglib.h' INCLUDE 'iolib.h' EXPORT make(string). % this is the entry point PREDICATE get_makefile(atom). get_makefile(no):- % don't reload upon recursion database(loaded),!. get_makefile(_):- consult('bap.mkf'), % get current 'makefile' assertz(loaded), % remember we did it retract(bap2lkd(Name,Rest)), % treat any short notations concat(Name,".lkd",Target), concat(Name,".bap",Dependence), assertz(entry(Target,[Dependence|Rest],compile(Name))), fail. get_makefile(yes):- write("consulting done"),nl. PREDICATE make(string). make(Target):- free(Target), % if target is unbound database(entry(Target,_,_)),!,% get the first entry make(Target). % as default target make(Target):- get_makefile(Loaded), % see if makefile must be loaded ( database(entry(Target,Dependencies,Actions)), ( Dependencies = [], % the user put it in to execute(Actions) % do some actions no matter % what! ; member(X,Dependencies), % no check all dependencies make(X), % if they need to be remaked fail ; % see if WE need a remake test_make(Target,Dependencies,Actions) ),fail ; Loaded = yes, % we loaded it, so we retractall(entry(_,_,_)), % clean it up as well retractall(loaded) ; Loaded = no % just a recursion done ... ). PREDICATE test_make(string,string,string). test_make(Target,Dependencies,Actions):- member(X,Dependencies), % for all dependencies newer(X,Target),!, % check their existence execute(Actions). % execute if target % is older than dependency PREDICATE newer(string,string). newer(Dependence,Target):- not(filedate(_,Target)),! % check if target does not exists % than we must built it no matter % what ; filedate(TargetDate,Target), % get both filedates filedate(DependenceDate,Dependence), TargetDate < DependenceDate,!.% that's it PREDICATE execute(void). % inform user and execute execute(Actions):- ( Actions = true ; write(Actions),nl ),!, call(Actions),!. % that's all
Example: 'bap.mkf'
entry(demo,["demo.lkd","queens.lkd","pie.lkd"],true). bap2lkd(demo,[]). bap2lkd(queens,[]). bap2lkd(pie,[]). bap2lkd(par,[]). entry(world ,[ "world.lkd", "worldinc.lkd", "worlddrw.lkd", "worldobj.lkd", "auxpred.lkd", "worldspc.lkd" ],true). bap2lkd(world,[]). bap2lkd(worldinc,[]). bap2lkd(worlddrw,[]). bap2lkd(worldobj,[]). bap2lkd(worldspc,[]). bap2lkd(auxpred,[]).
You might want to step some examples through. E.g. try make('par.lkd'), make(world), make(_).
Remember that build only reacts if something has to be done! So you cannot repeat an example without deleting the target file first (or redateing the dependency (source) ).
BAP Online Manuals : Compiler Reference Manual : Appendix : Compiler Example
Previous: Compiler Error Messages
Next: Datentypen