diff options
| author | kr.angelov <kr.angelov@gmail.com> | 2013-10-23 14:49:28 +0000 |
|---|---|---|
| committer | kr.angelov <kr.angelov@gmail.com> | 2013-10-23 14:49:28 +0000 |
| commit | 0882396875e26995ef996890e022acc3662eb70f (patch) | |
| tree | 4dc9f71182a482f5281f587a167f2cf8505ab129 /src/runtime/java | |
| parent | 51bf4e0380899ca350a002b2c5ee840e61d16b33 (diff) | |
tabular linearization in the C and Java runtimes
Diffstat (limited to 'src/runtime/java')
| -rw-r--r-- | src/runtime/java/jpgf.c | 66 | ||||
| -rw-r--r-- | src/runtime/java/org/grammaticalframework/pgf/Concr.java | 2 |
2 files changed, 68 insertions, 0 deletions
diff --git a/src/runtime/java/jpgf.c b/src/runtime/java/jpgf.c index bf62d8c64..fb5b53bff 100644 --- a/src/runtime/java/jpgf.c +++ b/src/runtime/java/jpgf.c @@ -1,5 +1,6 @@ #include <pgf/pgf.h> #include <pgf/reader.h> +#include <pgf/linearizer.h> #include <gu/mem.h> #include <gu/exn.h> #include <gu/utf8.h> @@ -350,6 +351,71 @@ Java_org_grammaticalframework_pgf_Concr_linearize(JNIEnv* env, jobject self, job return jstr; } +JNIEXPORT jobject JNICALL +Java_org_grammaticalframework_pgf_Concr_tabularLinearize(JNIEnv* env, jobject self, jobject jexpr) +{ + jclass map_class = (*env)->FindClass(env, "java/util/HashMap"); + if (!map_class) + return NULL; + jmethodID constrId = (*env)->GetMethodID(env, map_class, "<init>", "()V"); + if (!constrId) + return NULL; + jobject table = (*env)->NewObject(env, map_class, constrId); + if (!table) + return NULL; + + jmethodID put_method = (*env)->GetMethodID(env, map_class, "put", "(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;"); + if (!put_method) + return NULL; + + PgfConcr* concr = get_ref(env, self); + + GuPool* tmp_pool = gu_local_pool(); + GuExn* err = gu_new_exn(NULL, gu_kind(type), tmp_pool); + + GuEnum* cts = + pgf_lzr_concretize(concr, + gu_variant_from_ptr((void*) get_ref(env, jexpr)), + tmp_pool); + PgfCncTree ctree = gu_next(cts, PgfCncTree, tmp_pool); + if (gu_variant_is_null(ctree)) { + gu_pool_free(tmp_pool); + return NULL; + } + + size_t n_lins; + GuString* labels; + pgf_lzr_linearize_table(concr, ctree, &n_lins, &labels); + + for (size_t lin_idx = 0; lin_idx < n_lins; lin_idx++) { + GuStringBuf* sbuf = gu_string_buf(tmp_pool); + GuOut* out = gu_string_buf_out(sbuf); + + pgf_lzr_linearize_simple(concr, ctree, lin_idx, out, err); + + jstring jstr = NULL; + if (gu_ok(err)) { + GuString str = gu_string_buf_freeze(sbuf, tmp_pool); + jstr = gu2j_string(env, str); + } else { + gu_exn_clear(err); + } + + jstring jname = gu2j_string(env, labels[lin_idx]); + + (*env)->CallObjectMethod(env, table, put_method, jname, jstr); + + (*env)->DeleteLocalRef(env, jname); + + if (jstr != NULL) + (*env)->DeleteLocalRef(env, jstr); + } + + gu_pool_free(tmp_pool); + + return table; +} + typedef struct { PgfMorphoCallback fn; jobject analyses; diff --git a/src/runtime/java/org/grammaticalframework/pgf/Concr.java b/src/runtime/java/org/grammaticalframework/pgf/Concr.java index a824b740f..81f696aaf 100644 --- a/src/runtime/java/org/grammaticalframework/pgf/Concr.java +++ b/src/runtime/java/org/grammaticalframework/pgf/Concr.java @@ -21,6 +21,8 @@ public class Concr { public native String linearize(Expr expr); + public native Map<String, String> tabularLinearize(Expr expr); + public native List<MorphoAnalysis> lookupMorpho(String sentence); ////////////////////////////////////////////////////////////////// |
