tabular linearization in the C and Java runtimes

This commit is contained in:
kr.angelov
2013-10-23 14:49:28 +00:00
parent 51bf4e0380
commit 0882396875
6 changed files with 103 additions and 1 deletions

View File

@@ -128,7 +128,6 @@ typedef struct {
extern GU_DECLARE_TYPE(PgfCncCat, abstract);
typedef GuString PgfToken;
typedef GuSeq PgfTokens;
bool

View File

@@ -677,6 +677,35 @@ pgf_lzr_linearize_simple(PgfConcr* concr, PgfCncTree ctree,
pgf_lzr_linearize(concr, ctree, lin_idx, &flin.funcs);
}
void
pgf_lzr_linearize_table(PgfConcr* concr, PgfCncTree ctree,
size_t* n_lins, GuString** labels)
{
static GuString s_label = "s";
GuVariantInfo cti = gu_variant_open(ctree);
switch (cti.tag) {
case PGF_CNC_TREE_APP: {
PgfCncTreeApp* fapp = cti.data;
PgfCncCat* cnccat =
gu_map_get(concr->cnccats, fapp->fun->absfun->type->cid, PgfCncCat*);
*n_lins = cnccat->n_lins;
*labels = cnccat->labels;
break;
}
case PGF_CNC_TREE_LIT:
case PGF_CNC_TREE_CHUNKS: {
*n_lins = 1;
*labels = &s_label;
break;
}
default:
gu_impossible();
}
}
GuString
pgf_get_tokens(PgfSymbols* syms, uint16_t sym_idx, GuPool* pool)
{

View File

@@ -71,6 +71,11 @@ pgf_lzr_linearize(PgfConcr* concr, PgfCncTree ctree, size_t lin_idx,
void
pgf_lzr_linearize_simple(PgfConcr* concr, PgfCncTree ctree,
size_t lin_idx, GuOut* out, GuExn* err);
void
pgf_lzr_linearize_table(PgfConcr* concr, PgfCncTree ctree,
size_t* n_lins, GuString** labels);
#endif
#ifdef PGF_PARSER_H_

View File

@@ -35,6 +35,7 @@
typedef GuString PgfCId;
extern GU_DECLARE_TYPE(PgfCId, typedef);
typedef GuString PgfToken;
extern GU_DECLARE_TYPE(PgfExn, abstract);
extern GU_DECLARE_TYPE(PgfParseError, abstract);

View File

@@ -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;

View File

@@ -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);
//////////////////////////////////////////////////////////////////