summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/runtime/java/Test.java8
-rw-r--r--src/runtime/java/jpgf.c22
-rw-r--r--src/runtime/java/org/grammaticalframework/pgf/Generator.java29
-rw-r--r--src/runtime/java/org/grammaticalframework/pgf/PGF.java4
4 files changed, 62 insertions, 1 deletions
diff --git a/src/runtime/java/Test.java b/src/runtime/java/Test.java
index 303eaf35f..77de413b3 100644
--- a/src/runtime/java/Test.java
+++ b/src/runtime/java/Test.java
@@ -19,6 +19,14 @@ public class Test {
for (Map.Entry<String,Concr> entry : gr.getLanguages().entrySet()) {
System.out.println(entry.getKey()+" "+entry.getValue()+" "+entry.getValue().getName());
}
+
+ int count = 10;
+ for (ExprProb ep : gr.generateAll("Phrase")) {
+ System.out.println(ep.getExpr());
+
+ if (count-- <= 0)
+ break;
+ }
Concr eng = gr.getLanguages().get("PhrasebookEng");
Concr ger = gr.getLanguages().get("PhrasebookGer");
diff --git a/src/runtime/java/jpgf.c b/src/runtime/java/jpgf.c
index 17ae453cb..a0290aeae 100644
--- a/src/runtime/java/jpgf.c
+++ b/src/runtime/java/jpgf.c
@@ -395,3 +395,25 @@ Java_org_grammaticalframework_pgf_Expr_showExpr(JNIEnv* env, jclass clazz, jlong
gu_pool_free(tmp_pool);
return jstr;
}
+
+JNIEXPORT jobject JNICALL
+Java_org_grammaticalframework_pgf_Generator_generateAll(JNIEnv* env, jclass clazz, jobject jpgf, jstring jstartCat)
+{
+ GuPool* pool = gu_new_pool();
+
+ GuString startCat = j2gu_string(env, jstartCat, pool);
+
+ GuEnum* res =
+ pgf_generate_all(get_ref(env, jpgf), startCat, pool);
+ if (res == NULL) {
+ throw_string_exception(env, "org/grammaticalframework/pgf/PGFError", "The generation failed");
+ gu_pool_free(pool);
+ return NULL;
+ }
+
+ jclass expiter_class = (*env)->FindClass(env, "org/grammaticalframework/pgf/ExprIterator");
+ jmethodID constrId = (*env)->GetMethodID(env, expiter_class, "<init>", "(Lorg/grammaticalframework/pgf/PGF;JJJ)V");
+ jobject jexpiter = (*env)->NewObject(env, expiter_class, constrId, jpgf, p2l(pool), p2l(pool), p2l(res));
+
+ return jexpiter;
+}
diff --git a/src/runtime/java/org/grammaticalframework/pgf/Generator.java b/src/runtime/java/org/grammaticalframework/pgf/Generator.java
new file mode 100644
index 000000000..c9ffde10b
--- /dev/null
+++ b/src/runtime/java/org/grammaticalframework/pgf/Generator.java
@@ -0,0 +1,29 @@
+package org.grammaticalframework.pgf;
+
+import java.util.Iterator;
+
+class Generator implements Iterable<ExprProb> {
+ private PGF gr;
+ private String startCat;
+ private ExprIterator iter;
+
+ public Generator(PGF gr, String startCat) {
+ this.gr = gr;
+ this.startCat = startCat;
+ this.iter = generateAll(gr, startCat);
+ }
+
+ public Iterator<ExprProb> iterator() {
+ if (iter == null) {
+ // If someone has asked for a second iterator over
+ // the same parse results then we have to parse again.
+ return generateAll(gr, startCat);
+ } else {
+ ExprIterator tmp_iter = iter;
+ iter = null;
+ return tmp_iter;
+ }
+ }
+
+ static native ExprIterator generateAll(PGF gr, String startCat);
+}
diff --git a/src/runtime/java/org/grammaticalframework/pgf/PGF.java b/src/runtime/java/org/grammaticalframework/pgf/PGF.java
index 02e5d0c50..c08462b80 100644
--- a/src/runtime/java/org/grammaticalframework/pgf/PGF.java
+++ b/src/runtime/java/org/grammaticalframework/pgf/PGF.java
@@ -22,7 +22,9 @@ public class PGF {
public native Type getFunctionType(String fun);
- public native Iterator<ExprProb> generate(Type type);
+ public Iterable<ExprProb> generateAll(String startCat) {
+ return new Generator(this, startCat);
+ }
public native Expr compute(Expr expr);