aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorShawn O. Pearce <sop@google.com>2011-06-15 09:26:24 -0700
committerShawn O. Pearce <sop@google.com>2011-06-15 09:26:24 -0700
commit5c47a23d2d0b42195c007890ea5bcd89dd9fc8e0 (patch)
tree8a13a230c060d1f23e7b42606a78887341780988
parent4a00bddd45b9001ced99e6ec02dab93ccefc530a (diff)
downloadprolog-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--Makefile19
-rw-r--r--pom.xml18
-rw-r--r--src/builtin/Makefile12
-rw-r--r--src/builtin/PRED_exists_directory_1.java35
-rw-r--r--src/builtin/PRED_exists_file_1.java35
-rw-r--r--src/builtin/PRED_file_directory_name_2.java41
-rw-r--r--src/builtin/PRED_make_directory_1.java36
-rw-r--r--src/compiler/Makefile17
-rw-r--r--src/compiler/am2j.pl53
-rw-r--r--src/compiler/pl2am.pl29
-rw-r--r--src/lang/Makefile2
11 files changed, 235 insertions, 62 deletions
diff --git a/Makefile b/Makefile
index cb2e57b..d291d06 100644
--- a/Makefile
+++ b/Makefile
@@ -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)
diff --git a/pom.xml b/pom.xml
index fe3934b..b2465f6 100644
--- a/pom.xml
+++ b/pom.xml
@@ -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