mirror of
https://github.com/GrammaticalFramework/gf-core.git
synced 2026-04-24 03:52:50 -06:00
tabular linearization in the C and Java runtimes
This commit is contained in:
@@ -128,7 +128,6 @@ typedef struct {
|
|||||||
|
|
||||||
extern GU_DECLARE_TYPE(PgfCncCat, abstract);
|
extern GU_DECLARE_TYPE(PgfCncCat, abstract);
|
||||||
|
|
||||||
typedef GuString PgfToken;
|
|
||||||
typedef GuSeq PgfTokens;
|
typedef GuSeq PgfTokens;
|
||||||
|
|
||||||
bool
|
bool
|
||||||
|
|||||||
@@ -677,6 +677,35 @@ pgf_lzr_linearize_simple(PgfConcr* concr, PgfCncTree ctree,
|
|||||||
pgf_lzr_linearize(concr, ctree, lin_idx, &flin.funcs);
|
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
|
GuString
|
||||||
pgf_get_tokens(PgfSymbols* syms, uint16_t sym_idx, GuPool* pool)
|
pgf_get_tokens(PgfSymbols* syms, uint16_t sym_idx, GuPool* pool)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -71,6 +71,11 @@ pgf_lzr_linearize(PgfConcr* concr, PgfCncTree ctree, size_t lin_idx,
|
|||||||
void
|
void
|
||||||
pgf_lzr_linearize_simple(PgfConcr* concr, PgfCncTree ctree,
|
pgf_lzr_linearize_simple(PgfConcr* concr, PgfCncTree ctree,
|
||||||
size_t lin_idx, GuOut* out, GuExn* err);
|
size_t lin_idx, GuOut* out, GuExn* err);
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
pgf_lzr_linearize_table(PgfConcr* concr, PgfCncTree ctree,
|
||||||
|
size_t* n_lins, GuString** labels);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef PGF_PARSER_H_
|
#ifdef PGF_PARSER_H_
|
||||||
|
|||||||
@@ -35,6 +35,7 @@
|
|||||||
typedef GuString PgfCId;
|
typedef GuString PgfCId;
|
||||||
extern GU_DECLARE_TYPE(PgfCId, typedef);
|
extern GU_DECLARE_TYPE(PgfCId, typedef);
|
||||||
|
|
||||||
|
typedef GuString PgfToken;
|
||||||
|
|
||||||
extern GU_DECLARE_TYPE(PgfExn, abstract);
|
extern GU_DECLARE_TYPE(PgfExn, abstract);
|
||||||
extern GU_DECLARE_TYPE(PgfParseError, abstract);
|
extern GU_DECLARE_TYPE(PgfParseError, abstract);
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
#include <pgf/pgf.h>
|
#include <pgf/pgf.h>
|
||||||
#include <pgf/reader.h>
|
#include <pgf/reader.h>
|
||||||
|
#include <pgf/linearizer.h>
|
||||||
#include <gu/mem.h>
|
#include <gu/mem.h>
|
||||||
#include <gu/exn.h>
|
#include <gu/exn.h>
|
||||||
#include <gu/utf8.h>
|
#include <gu/utf8.h>
|
||||||
@@ -350,6 +351,71 @@ Java_org_grammaticalframework_pgf_Concr_linearize(JNIEnv* env, jobject self, job
|
|||||||
return jstr;
|
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 {
|
typedef struct {
|
||||||
PgfMorphoCallback fn;
|
PgfMorphoCallback fn;
|
||||||
jobject analyses;
|
jobject analyses;
|
||||||
|
|||||||
@@ -21,6 +21,8 @@ public class Concr {
|
|||||||
|
|
||||||
public native String linearize(Expr expr);
|
public native String linearize(Expr expr);
|
||||||
|
|
||||||
|
public native Map<String, String> tabularLinearize(Expr expr);
|
||||||
|
|
||||||
public native List<MorphoAnalysis> lookupMorpho(String sentence);
|
public native List<MorphoAnalysis> lookupMorpho(String sentence);
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////
|
||||||
|
|||||||
Reference in New Issue
Block a user