From 4e328d1f3311c830300487e3f6afd34069ff8923 Mon Sep 17 00:00:00 2001 From: "kr.angelov" Date: Fri, 6 Sep 2013 07:21:38 +0000 Subject: [PATCH] added exhaustive generation in the Java binding --- src/runtime/java/Test.java | 8 +++++ src/runtime/java/jpgf.c | 22 ++++++++++++++ .../grammaticalframework/pgf/Generator.java | 29 +++++++++++++++++++ .../org/grammaticalframework/pgf/PGF.java | 4 ++- 4 files changed, 62 insertions(+), 1 deletion(-) create mode 100644 src/runtime/java/org/grammaticalframework/pgf/Generator.java 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 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, "", "(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 { + 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 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 generate(Type type); + public Iterable generateAll(String startCat) { + return new Generator(this, startCat); + } public native Expr compute(Expr expr);