diff options
author | Shawn O. Pearce <sop@google.com> | 2011-06-15 09:26:24 -0700 |
---|---|---|
committer | Shawn O. Pearce <sop@google.com> | 2011-06-15 09:26:24 -0700 |
commit | 5c47a23d2d0b42195c007890ea5bcd89dd9fc8e0 (patch) | |
tree | 8a13a230c060d1f23e7b42606a78887341780988 | |
parent | 4a00bddd45b9001ced99e6ec02dab93ccefc530a (diff) | |
download | prolog-cafe-5c47a23d2d0b42195c007890ea5bcd89dd9fc8e0.tar.gz |
Write generated sources to proper package structure
By emitting source files using the Java standard
package structure, Eclipse and many other tools
are happier working with the generated files.
-rw-r--r-- | Makefile | 19 | ||||
-rw-r--r-- | pom.xml | 18 | ||||
-rw-r--r-- | src/builtin/Makefile | 12 | ||||
-rw-r--r-- | src/builtin/PRED_exists_directory_1.java | 35 | ||||
-rw-r--r-- | src/builtin/PRED_exists_file_1.java | 35 | ||||
-rw-r--r-- | src/builtin/PRED_file_directory_name_2.java | 41 | ||||
-rw-r--r-- | src/builtin/PRED_make_directory_1.java | 36 | ||||
-rw-r--r-- | src/compiler/Makefile | 17 | ||||
-rw-r--r-- | src/compiler/am2j.pl | 53 | ||||
-rw-r--r-- | src/compiler/pl2am.pl | 29 | ||||
-rw-r--r-- | src/lang/Makefile | 2 |
11 files changed, 235 insertions, 62 deletions
@@ -15,7 +15,7 @@ PSYSTEM = 'SWI-Prolog' JAVA = java JAVAC = javac -JAVACOPTS = -d . -J-Xmx100m +JAVACOPTS = -d . JAR = jar JAROPTS = cf @@ -35,12 +35,16 @@ lang: JAR='$(JAR)' JAROPTS='$(JAROPTS)') cp src/lang/lang.jar . +gen-builtin: + (cd src/builtin && $(MAKE) gen-builtin) builtin: (cd src/builtin; $(MAKE) builtin \ JAVAC='$(JAVAC)' JAVACOPTS='$(JAVACOPTS) -classpath $(PWD)/lang.jar' \ JAR='$(JAR)' JAROPTS='$(JAROPTS)') cp src/builtin/builtin.jar . +gen-compiler: + (cd src/compiler && $(MAKE) gen-compiler) compiler: (cd src/compiler; $(MAKE) compiler \ JAVAC='$(JAVAC)' \ @@ -49,9 +53,13 @@ compiler: cp src/compiler/compiler.jar . plcafe: - $(JAVAC) $(JAVACOPTS) src/lang/*.java src/builtin/*.java \ - target/generated-sources/prologcafe-builtin/com/googlecode/prolog_cafe/builtin/*.java \ - src/compiler/pl2am/*.java src/compiler/am2j/*.java src/compiler/*.java + $(JAVAC) $(JAVACOPTS) \ + src/lang/*.java \ + src/builtin/*.java \ + src/compiler/*.java \ + target/generated-sources/prologcafe-builtin/com/googlecode/prolog_cafe/builtin/*.java \ + target/generated-sources/prologcafe-pl2am/com/googlecode/prolog_cafe/compiler/pl2am/*.java \ + target/generated-sources/prologcafe-am2j/com/googlecode/prolog_cafe/compiler/am2j/*.java $(JAR) $(JAROPTS) plcafe.jar com/googlecode/prolog_cafe plj: @@ -65,8 +73,9 @@ clean: (cd src/compiler; $(MAKE) clean) -rm -f bin/pl2am.plc -rm -f bin/am2j.plc - -rm -f -r jp + -rm -f -r com -rm -f core *~ + -rm -r -f target realclean: clean (cd src/builtin; $(MAKE) realclean) @@ -39,9 +39,8 @@ <target> <exec executable="make"> <arg value="plc" /> - <arg value="lang" /> - <arg value="builtin" /> - <arg value="compiler" /> + <arg value="gen-builtin" /> + <arg value="gen-compiler" /> </exec> </target> </configuration> @@ -51,6 +50,7 @@ </execution> </executions> </plugin> + <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>build-helper-maven-plugin</artifactId> @@ -65,11 +65,14 @@ <configuration> <sources> <source>target/generated-sources/prologcafe-builtin</source> + <source>target/generated-sources/prologcafe-pl2am</source> + <source>target/generated-sources/prologcafe-am2j</source> </sources> </configuration> </execution> </executions> </plugin> + <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> @@ -80,20 +83,17 @@ <encoding>UTF-8</encoding> <debug>false</debug> <optimize>true</optimize> - <excludes> - <exclude>com/googlecode/prolog_cafe/jp/**</exclude> - <exclude>com/googlecode/prolog_cafe/builtin/jp/**</exclude> - <exclude>com/googlecode/prolog_cafe/compiler/jp/**</exclude> - <exclude>com/googlecode/prolog_cafe/lang/jp/**</exclude> - </excludes> </configuration> </plugin> + <plugin> + <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-source-plugin</artifactId> <version>2.1.2</version> <configuration> <includes> <include>**/*.java</include> + <include>**/*.pl</include> </includes> <excludes> <exclude>com/googlecode/prolog_cafe/compiler/am2j/**/*.java</exclude> diff --git a/src/builtin/Makefile b/src/builtin/Makefile index 93c2362..52593c6 100644 --- a/src/builtin/Makefile +++ b/src/builtin/Makefile @@ -14,7 +14,8 @@ JAVAC = javac JAVACOPTS = -d . -Xlint -classpath $$PLCAFEDIR/lang.jar:$$CLASSPATH JAR = jar JAROPTS = cf -T = ../../target/generated-sources/prologcafe-builtin/com/googlecode/prolog_cafe/builtin +T = ../../target/generated-sources/prologcafe-builtin +P = com/googlecode/prolog_cafe/builtin ################################################################ .SUFFIXES: .SUFFIXES: .am .pl $(SUFFIXES) @@ -27,13 +28,14 @@ am_objects = builtins.am \ -mkdir -p $(T) ../../bin/am2j.plc -v -d $(T) $@ -builtin:$(am_objects) - $(JAVAC) $(JAVACOPTS) *.java $(T)/*.java - $(JAR) $(JAROPTS) builtin.jar com/googlecode/prolog_cafe/builtin/ +builtin: gen-builtin + $(JAVAC) $(JAVACOPTS) *.java $(T)/$(P)/*.java + $(JAR) $(JAROPTS) builtin.jar $(P) +gen-builtin: $(am_objects) clean: -rm -f -r $(T) - -rm -f -r jp + -rm -f -r com -rm -f Base/core Base/*~ Base/*.class -rm -f core *~ *.am *.jar *.class diff --git a/src/builtin/PRED_exists_directory_1.java b/src/builtin/PRED_exists_directory_1.java new file mode 100644 index 0000000..c63fff2 --- /dev/null +++ b/src/builtin/PRED_exists_directory_1.java @@ -0,0 +1,35 @@ +package com.googlecode.prolog_cafe.builtin; + +import com.googlecode.prolog_cafe.lang.IllegalDomainException; +import com.googlecode.prolog_cafe.lang.Operation; +import com.googlecode.prolog_cafe.lang.PInstantiationException; +import com.googlecode.prolog_cafe.lang.Predicate; +import com.googlecode.prolog_cafe.lang.Prolog; +import com.googlecode.prolog_cafe.lang.PrologException; +import com.googlecode.prolog_cafe.lang.SymbolTerm; +import com.googlecode.prolog_cafe.lang.Term; + +import java.io.File; + +/** {@code exists_directory(+Directory)} */ +public class PRED_exists_directory_1 extends Predicate.P1 { + public PRED_exists_directory_1(Term a1, Operation next) { + arg1 = a1; + cont = next; + } + + @Override + public Operation exec(Prolog engine) throws PrologException { + engine.setB0(); + + Term a1 = arg1.dereference(); + if (a1.isVariable()) throw new PInstantiationException(this, 1); + if (!a1.isSymbol()) throw new IllegalDomainException(this, 1, "directory", a1); + + File file = new File(a1.name()); + if (file.isDirectory()) + return cont; + else + return engine.fail(); + } +} diff --git a/src/builtin/PRED_exists_file_1.java b/src/builtin/PRED_exists_file_1.java new file mode 100644 index 0000000..4703824 --- /dev/null +++ b/src/builtin/PRED_exists_file_1.java @@ -0,0 +1,35 @@ +package com.googlecode.prolog_cafe.builtin; + +import com.googlecode.prolog_cafe.lang.IllegalDomainException; +import com.googlecode.prolog_cafe.lang.Operation; +import com.googlecode.prolog_cafe.lang.PInstantiationException; +import com.googlecode.prolog_cafe.lang.Predicate; +import com.googlecode.prolog_cafe.lang.Prolog; +import com.googlecode.prolog_cafe.lang.PrologException; +import com.googlecode.prolog_cafe.lang.SymbolTerm; +import com.googlecode.prolog_cafe.lang.Term; + +import java.io.File; + +/** {@code exists_file(+File)} */ +public class PRED_exists_file_1 extends Predicate.P1 { + public PRED_exists_file_1(Term a1, Operation next) { + arg1 = a1; + cont = next; + } + + @Override + public Operation exec(Prolog engine) throws PrologException { + engine.setB0(); + + Term a1 = arg1.dereference(); + if (a1.isVariable()) throw new PInstantiationException(this, 1); + if (!a1.isSymbol()) throw new IllegalDomainException(this, 1, "file", a1); + + File file = new File(a1.name()); + if (file.isFile()) + return cont; + else + return engine.fail(); + } +} diff --git a/src/builtin/PRED_file_directory_name_2.java b/src/builtin/PRED_file_directory_name_2.java new file mode 100644 index 0000000..49aad15 --- /dev/null +++ b/src/builtin/PRED_file_directory_name_2.java @@ -0,0 +1,41 @@ +package com.googlecode.prolog_cafe.builtin; + +import com.googlecode.prolog_cafe.lang.IllegalDomainException; +import com.googlecode.prolog_cafe.lang.Operation; +import com.googlecode.prolog_cafe.lang.PInstantiationException; +import com.googlecode.prolog_cafe.lang.PermissionException; +import com.googlecode.prolog_cafe.lang.Predicate; +import com.googlecode.prolog_cafe.lang.Prolog; +import com.googlecode.prolog_cafe.lang.PrologException; +import com.googlecode.prolog_cafe.lang.SymbolTerm; +import com.googlecode.prolog_cafe.lang.Term; + +import java.io.File; + +/** {@code file_directory_name(+File, -Directory)} */ +public class PRED_file_directory_name_2 extends Predicate.P2 { + public PRED_file_directory_name_2(Term a1, Term a2, Operation next) { + arg1 = a1; + arg2 = a2; + cont = next; + } + + @Override + public Operation exec(Prolog engine) throws PrologException { + engine.setB0(); + + Term a1 = arg1.dereference(); + if (a1.isVariable()) throw new PInstantiationException(this, 1); + if (!a1.isSymbol()) throw new IllegalDomainException(this, 1, "file", a1); + + File file = new File(a1.name()); + File dir = file.getParentFile(); + if (dir == null) throw new IllegalDomainException(this, 1, "file", a1); + + Term a2 = arg2.dereference(); + if (a2.unify(SymbolTerm.makeSymbol(dir.getPath()), engine.trail)) + return cont; + else + return engine.fail(); + } +} diff --git a/src/builtin/PRED_make_directory_1.java b/src/builtin/PRED_make_directory_1.java new file mode 100644 index 0000000..fa9a463 --- /dev/null +++ b/src/builtin/PRED_make_directory_1.java @@ -0,0 +1,36 @@ +package com.googlecode.prolog_cafe.builtin; + +import com.googlecode.prolog_cafe.lang.IllegalDomainException; +import com.googlecode.prolog_cafe.lang.Operation; +import com.googlecode.prolog_cafe.lang.PInstantiationException; +import com.googlecode.prolog_cafe.lang.PermissionException; +import com.googlecode.prolog_cafe.lang.Predicate; +import com.googlecode.prolog_cafe.lang.Prolog; +import com.googlecode.prolog_cafe.lang.PrologException; +import com.googlecode.prolog_cafe.lang.SymbolTerm; +import com.googlecode.prolog_cafe.lang.Term; + +import java.io.File; + +/** {@code make_directory(+Dir)} */ +public class PRED_make_directory_1 extends Predicate.P1 { + public PRED_make_directory_1(Term a1, Operation next) { + arg1 = a1; + cont = next; + } + + @Override + public Operation exec(Prolog engine) throws PrologException { + engine.setB0(); + + Term a1 = arg1.dereference(); + if (a1.isVariable()) throw new PInstantiationException(this, 1); + if (!a1.isSymbol()) throw new IllegalDomainException(this, 1, "dir", a1); + + File file = new File(((SymbolTerm) a1).name()); + if (file.mkdir()) + return cont; + else + throw new PermissionException(this, "open", "dir", a1, "cannot create"); + } +} diff --git a/src/compiler/Makefile b/src/compiler/Makefile index 20ef2fd..d4e1257 100644 --- a/src/compiler/Makefile +++ b/src/compiler/Makefile @@ -23,6 +23,8 @@ JAR = jar JAROPTS = cvf # JAVA : the command of Java Virtual Machine (ex. java) JAVA = java +T = ../../target/generated-sources/prologcafe +P = com/googlecode/prolog_cafe/compiler ################################################################ .SUFFIXES: .SUFFIXES: .plj .txt .am .plc .pl $(SUFFIXES) @@ -33,24 +35,23 @@ JAVA = java .pl.am: ../../bin/pl2am.plc -v -O $< $@ - -mkdir $* - ../../bin/am2j.plc -v -d $* $@ + -mkdir $T-$* + ../../bin/am2j.plc -v -d $T-$* $@ .txt.plj: ./comp_pl -v `pwd`/$*.pl `pwd`/$*.plj $(JAVA) 'PrologCafe' plc: pl2am.plc am2j.plc -compiler:pl2am.am am2j.am - $(JAVAC) $(JAVACOPTS) pl2am/*.java am2j/*.java *.java - $(JAR) $(JAROPTS) compiler.jar com/googlecode/prolog_cafe/compiler +compiler: gen-compiler + $(JAVAC) $(JAVACOPTS) *.java $T-pl2am/$P/pl2am/*.java $T-am2j/$P/am2j/*.java + $(JAR) $(JAROPTS) compiler.jar $P +gen-compiler: pl2am.am am2j.am plj: pl2am.plj am2j.plj clean: - -rm -f -r am2j - -rm -f -r pl2am - -rm -f -r jp + -rm -f -r com -rm -f core *~ *.ql *.sav *.plc *.qlf *.qsav *.am *.plj *.jar system.pl realclean: clean diff --git a/src/compiler/am2j.pl b/src/compiler/am2j.pl index 666828c..bf11804 100644 --- a/src/compiler/am2j.pl +++ b/src/compiler/am2j.pl @@ -74,18 +74,26 @@ write_java(X, _) :- var(X), !, fail. write_java(end_of_file, _) :- !. write_java((:- G), _) :- !, call(G). -write_java(begin_predicate(FA), In) :- +write_java(begin_predicate(P, F/A), In) :- clause(dest_dir(Dir), _), - FA = F/A, + retractall(current_package(_)), retractall(current_arity(_)), + assert(current_package(P)), assert(current_arity(A)), predicate_encoding(F, F1), - list_to_string([Dir, '/PRED',F1,'_',A,'.java'], File), - open(File, write, Out), + package_encoding(P, PDir), + list_to_string([Dir,'/',PDir], SrcDir), + list_to_string([SrcDir,'/','PRED_',F1,'_',A,'.java'], SrcFile), + mkdirs(SrcDir), + open(SrcFile, write, Out), + write(Out, 'package '), + write_package(P, Out), + write(Out, ';'), + nl(Out), repeat, read(In, X), write_java0(X, In, Out), - X == end_predicate(FA), + X == end_predicate(P, F/A), close(Out), !. write_java(X, _) :- @@ -102,7 +110,7 @@ write_java0([], _, _) :- !. write_java0([X|Xs], In, Out) :- !, write_java0(X, In, Out), write_java0(Xs, In, Out). -write_java0(end_predicate(_), _, Out) :- !, +write_java0(end_predicate(_, _), _, Out) :- !, tab(Out, 4), write(Out, '}'), nl(Out), write(Out, '}'), nl(Out). @@ -122,12 +130,6 @@ write_java0(info([FA,File|_]), _, Out) :- !, write(Out, ' This file is generated by Prolog Cafe.'), nl(Out), write(Out, ' PLEASE DO NOT EDIT!'), nl(Out), write(Out, '*/'), nl(Out). -write_java0(package_name(P), _, Out) :- !, - retractall(current_package(_)), - assert(current_package(P)), - write(Out, 'package '), - write_package(P, Out), - write(Out, ';'), nl(Out). write_java0(import_package(P), _, Out) :- !, write(Out, 'import '), write_package(P, Out), @@ -959,6 +961,14 @@ write_insert([X|Xs], _, Out) :- /***************************************************************** Auxiliaries *****************************************************************/ + +% Create a directory if missing +mkdirs(Dir) :- exists_directory(Dir), !. +mkdirs(Dir) :- + file_directory_name(Dir, Parent), + mkdirs(Parent), + make_directory(Dir). + % int java_integer(X) :- integer(X), -2147483648 =< X, X =< 2147483647. @@ -976,7 +986,7 @@ write_package(P, Out) :- !, % Write class name write_class_name(L, Out) :- - write(Out, 'PRED'), write_index(L, Out). + write(Out, 'PRED_'), write_index(L, Out). % Write out base class name write_predicate_base_class(0, Out) :- !, write(Out, 'Predicate'). @@ -1002,11 +1012,21 @@ write_pred_spec(F/A, Out) :- predicate_encoding(F, F1), write(Out, F1), write(Out, '_'), write(Out, A). +% Package name as directory +package_encoding(P, Dir) :- + atom_codes(P, Chs0), + package_encoding(Chs0, Chs, []), + atom_codes(Dir, Chs). + +package_encoding([]) --> !. +package_encoding([46|Xs]) --> !, [47], package_encoding(Xs). +package_encoding([X|Xs]) --> !, [X] , package_encoding(Xs). + % Predicate Encoding predicate_encoding(X, Y) :- atom_codes(X, Chs0), pred_encoding(Chs0, Chs, []), - atom_codes(Y, [95|Chs]). + atom_codes(Y, Chs). pred_encoding([]) --> !. pred_encoding([X|Xs]) --> @@ -1157,10 +1177,9 @@ Other Instructions + comment(Message) + debug(Message) -+ begin_predicate(f/n) -+ end_predicate(f/n) ++ begin_predicate(p, f/n) ++ end_predicate(p, f/n) -+ package_name(p) + import_package(p) + import_package(p, f/n) diff --git a/src/compiler/pl2am.pl b/src/compiler/pl2am.pl index 020345e..36d3ab2 100644 --- a/src/compiler/pl2am.pl +++ b/src/compiler/pl2am.pl @@ -98,10 +98,9 @@ Other Instructions debug(Message) info(Message) - begin_predicate(f/n) - end_predicate(f/n) + begin_predicate(p, f/n) + end_predicate(p, f/n) - package_name(p) import_package(p) import_package(p, f/n) @@ -470,10 +469,10 @@ write_asm(_, []) :- !. write_asm(Out, [Instruction|Instructions]) :- !, write_asm(Out, Instruction), write_asm(Out, Instructions). -write_asm(Out, begin_predicate(FA)) :- !, - writeq(Out, begin_predicate(FA)), write(Out, '.'), nl(Out). -write_asm(Out, end_predicate(FA)) :- !, - writeq(Out, end_predicate(FA)), write(Out, '.'), nl(Out). +write_asm(Out, begin_predicate(P, FA)) :- !, + writeq(Out, begin_predicate(P, FA)), write(Out, '.'), nl(Out). +write_asm(Out, end_predicate(P, FA)) :- !, + writeq(Out, end_predicate(P, FA)), write(Out, '.'), nl(Out). write_asm(Out, comment(Comment0)) :- !, copy_term(Comment0, Comment), numbervars(Comment, 0, _), @@ -519,12 +518,12 @@ assert_init_cls(Cls) :- compile_predicate(Functor, Arity) --> {functor(Head, Functor, Arity)}, {findall((Head :- Body), internal_clause(Head, Body), Clauses)}, - [begin_predicate(Functor/Arity)], - generate_package, - generate_import, + {clause(package_name(P), _)}, + [begin_predicate(P, Functor/Arity)], generate_info(Functor, Arity), - compile_pred(Clauses, Functor/Arity), - [end_predicate(Functor/Arity)]. + generate_import, + compile_pred(Clauses, Functor/Arity), + [end_predicate(P, Functor/Arity)]. %%% Program Code compile_pred([], _) --> [], !. @@ -817,11 +816,7 @@ replace_key(K, _, _) :- pl2am_error([replacement,of,hash,key,K,failed]), fail. -%%% Package and Import Declarations -generate_package --> - {clause(package_name(P), _)}, - [package_name(P)]. - +%%% Import Declarations generate_import --> {findall((P,C), import_package(P, C), X)}, gen_import(X). diff --git a/src/lang/Makefile b/src/lang/Makefile index 1a34792..9fde585 100644 --- a/src/lang/Makefile +++ b/src/lang/Makefile @@ -20,7 +20,7 @@ lang: $(JAR) $(JAROPTS) lang.jar com/googlecode/prolog_cafe/lang/ clean: - -rm -f -r jp + -rm -f -r com -rm -f core *~ *.class *.jar realclean: clean |