diff --git a/src/runtime/java/jpgf.c b/src/runtime/java/jpgf.c index b684a89fb..6f88250f0 100644 --- a/src/runtime/java/jpgf.c +++ b/src/runtime/java/jpgf.c @@ -388,9 +388,58 @@ Java_org_grammaticalframework_pgf_Parser_parse return jexpiter; } +JNIEXPORT jobject JNICALL +Java_org_grammaticalframework_pgf_Completer_complete(JNIEnv* env, jclass clazz, jobject jconcr, jstring jstartCat, jstring js, jstring jprefix) +{ + GuPool* pool = gu_new_pool(); + + GuString startCat = j2gu_string(env, jstartCat, pool); + GuString s = j2gu_string(env, js, pool); + GuString prefix = j2gu_string(env, jprefix, pool); + GuExn* parse_err = gu_new_exn(NULL, gu_kind(type), pool); + + GuEnum* res = + pgf_complete(get_ref(env, jconcr), startCat, s, prefix, parse_err, pool); + + if (!gu_ok(parse_err)) { + if (gu_exn_caught(parse_err) == gu_type(PgfExn)) { + GuString msg = (GuString) gu_exn_caught_data(parse_err); + throw_string_exception(env, "org/grammaticalframework/pgf/PGFError", msg); + } else if (gu_exn_caught(parse_err) == gu_type(PgfParseError)) { + GuString tok = (GuString) gu_exn_caught_data(parse_err); + throw_string_exception(env, "org/grammaticalframework/pgf/ParseError", tok); + } + + gu_pool_free(pool); + return NULL; + } + + jclass tokiter_class = (*env)->FindClass(env, "org/grammaticalframework/pgf/TokenIterator"); + jmethodID constrId = (*env)->GetMethodID(env, tokiter_class, "", "(JJ)V"); + jobject jtokiter = (*env)->NewObject(env, tokiter_class, constrId, p2l(pool), p2l(res)); + + return jtokiter; +} + +JNIEXPORT jobject JNICALL +Java_org_grammaticalframework_pgf_TokenIterator_fetchTokenProb(JNIEnv* env, jclass clazz, jlong enumRef, jobject jpool) +{ + GuEnum* res = (GuEnum*) l2p(enumRef); + + PgfTokenProb* tp = gu_next(res, PgfTokenProb*, get_ref(env, jpool)); + if (tp == NULL) + return NULL; + + jclass tp_class = (*env)->FindClass(env, "org/grammaticalframework/pgf/TokenProb"); + jmethodID tp_constrId = (*env)->GetMethodID(env, tp_class, "", "(Ljava/lang/String;D)V"); + jobject jtp = (*env)->NewObject(env, tp_class, tp_constrId, gu2j_string(env,tp->tok), tp->prob); + + return jtp; +} + JNIEXPORT jobject JNICALL Java_org_grammaticalframework_pgf_ExprIterator_fetchExprProb - (JNIEnv* env, jobject self, jlong enumRef, jobject pool, jobject gr) + (JNIEnv* env, jclass clazz, jlong enumRef, jobject pool, jobject gr) { GuEnum* res = (GuEnum*) l2p(enumRef); diff --git a/src/runtime/java/org/grammaticalframework/pgf/Concr.java b/src/runtime/java/org/grammaticalframework/pgf/Concr.java index 9bc73ea5a..2612a8827 100644 --- a/src/runtime/java/org/grammaticalframework/pgf/Concr.java +++ b/src/runtime/java/org/grammaticalframework/pgf/Concr.java @@ -20,6 +20,10 @@ public class Concr { } } + public Iterable complete(String startCat, String s, String prefix) throws ParseError { + return new Completer(this, startCat, s, prefix); + } + public native String linearize(Expr expr); public native Map tabularLinearize(Expr expr); diff --git a/src/runtime/java/org/grammaticalframework/pgf/ExprIterator.java b/src/runtime/java/org/grammaticalframework/pgf/ExprIterator.java index 6babda66d..ffd8a45cb 100644 --- a/src/runtime/java/org/grammaticalframework/pgf/ExprIterator.java +++ b/src/runtime/java/org/grammaticalframework/pgf/ExprIterator.java @@ -18,7 +18,7 @@ class ExprIterator implements Iterator { this.fetched = false; } - private native ExprProb fetchExprProb(long ref, Pool pool, PGF gr); + private native static ExprProb fetchExprProb(long ref, Pool pool, PGF gr); private void fetch() { if (!fetched) { diff --git a/src/runtime/java/org/grammaticalframework/pgf/FullFormIterator.java b/src/runtime/java/org/grammaticalframework/pgf/FullFormIterator.java index 6a4c5efd7..556a9539d 100644 --- a/src/runtime/java/org/grammaticalframework/pgf/FullFormIterator.java +++ b/src/runtime/java/org/grammaticalframework/pgf/FullFormIterator.java @@ -18,7 +18,7 @@ class FullFormIterator implements Iterator { this.fetched = false; } - private native FullFormEntry fetchFullFormEntry(long ref, Pool pool, Concr concr); + private native static FullFormEntry fetchFullFormEntry(long ref, Pool pool, Concr concr); private void fetch() { if (!fetched) { diff --git a/src/runtime/java/org/grammaticalframework/pgf/Generator.java b/src/runtime/java/org/grammaticalframework/pgf/Generator.java index c9ffde10b..5f28568fe 100644 --- a/src/runtime/java/org/grammaticalframework/pgf/Generator.java +++ b/src/runtime/java/org/grammaticalframework/pgf/Generator.java @@ -16,7 +16,7 @@ class Generator implements Iterable { 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. + // the same results then we have to generate again. return generateAll(gr, startCat); } else { ExprIterator tmp_iter = iter; @@ -25,5 +25,5 @@ class Generator implements Iterable { } } - static native ExprIterator generateAll(PGF gr, String startCat); + private native static ExprIterator generateAll(PGF gr, String startCat); } diff --git a/src/runtime/java/org/grammaticalframework/pgf/TokenIterator.java b/src/runtime/java/org/grammaticalframework/pgf/TokenIterator.java new file mode 100644 index 000000000..4ce8f4d27 --- /dev/null +++ b/src/runtime/java/org/grammaticalframework/pgf/TokenIterator.java @@ -0,0 +1,44 @@ +package org.grammaticalframework.pgf; + +import java.util.*; + +class TokenIterator implements Iterator { + private Pool pool; + private long ref; + private TokenProb tp; + private boolean fetched; + + public TokenIterator(long pool, long ref) { + this.pool = new Pool(pool); + this.ref = ref; + this.tp = null; + this.fetched = false; + } + + private native static TokenProb fetchTokenProb(long ref, Pool pool); + + private void fetch() { + if (!fetched) { + tp = fetchTokenProb(ref, pool); + fetched = true; + } + } + + public boolean hasNext() { + fetch(); + return (tp != null); + } + + public TokenProb next() { + fetch(); + fetched = false; + + if (tp == null) + throw new NoSuchElementException(); + return tp; + } + + public void remove() { + throw new UnsupportedOperationException(); + } +} diff --git a/src/runtime/java/org/grammaticalframework/pgf/TokenProb.java b/src/runtime/java/org/grammaticalframework/pgf/TokenProb.java new file mode 100644 index 000000000..b064e747b --- /dev/null +++ b/src/runtime/java/org/grammaticalframework/pgf/TokenProb.java @@ -0,0 +1,19 @@ +package org.grammaticalframework.pgf; + +public class TokenProb { + private String tok; + private double prob; + + public TokenProb(String tok, double prob) { + this.tok = tok; + this.prob = prob; + } + + public String getToken() { + return tok; + } + + public double getProb() { + return prob; + } +}