summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/runtime/java/jpgf.c51
-rw-r--r--src/runtime/java/org/grammaticalframework/pgf/Concr.java4
-rw-r--r--src/runtime/java/org/grammaticalframework/pgf/ExprIterator.java2
-rw-r--r--src/runtime/java/org/grammaticalframework/pgf/FullFormIterator.java2
-rw-r--r--src/runtime/java/org/grammaticalframework/pgf/Generator.java4
-rw-r--r--src/runtime/java/org/grammaticalframework/pgf/TokenIterator.java44
-rw-r--r--src/runtime/java/org/grammaticalframework/pgf/TokenProb.java19
7 files changed, 121 insertions, 5 deletions
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, "<init>", "(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, "<init>", "(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<TokenProb> 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<String, String> 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<ExprProb> {
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<FullFormEntry> {
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<ExprProb> {
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.
+ // 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<ExprProb> {
}
}
- 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<TokenProb> {
+ 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;
+ }
+}