mirror of
https://github.com/GrammaticalFramework/gf-core.git
synced 2026-05-09 03:02:50 -06:00
complete showPGF
This commit is contained in:
@@ -718,6 +718,33 @@ PgfText *pgf_print_category_internal(object o)
|
||||
return printer.get_text();
|
||||
}
|
||||
|
||||
PGF_API
|
||||
PgfText *pgf_print_start_cat_internal(PgfDB *db, PgfRevision revision, PgfExn *err)
|
||||
{
|
||||
PGF_API_BEGIN {
|
||||
DB_scope scope(db, READER_SCOPE);
|
||||
ref<PgfPGF> pgf = PgfDB::revision2pgf(revision);
|
||||
|
||||
PgfText *startcat = (PgfText *)
|
||||
alloca(sizeof(PgfText)+9);
|
||||
startcat->size = 8;
|
||||
strcpy(startcat->text, "startcat");
|
||||
|
||||
ref<PgfFlag> flag =
|
||||
namespace_lookup(pgf->abstract.aflags, startcat);
|
||||
|
||||
if (flag != 0) {
|
||||
PgfInternalMarshaller m;
|
||||
PgfPrinter printer(NULL,0,&m);
|
||||
printer.puts("startcat = ");
|
||||
m.match_lit(&printer, flag->value);
|
||||
return printer.get_text();
|
||||
}
|
||||
} PGF_API_END
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
PGF_API
|
||||
PgfText *pgf_print_function_internal(object o)
|
||||
{
|
||||
@@ -735,6 +762,105 @@ PgfText *pgf_print_function_internal(object o)
|
||||
return printer.get_text();
|
||||
}
|
||||
|
||||
PGF_API
|
||||
void pgf_iter_lincats(PgfDB *db, PgfConcrRevision cnc_revision,
|
||||
PgfItor *itor, PgfExn *err)
|
||||
{
|
||||
PGF_API_BEGIN {
|
||||
DB_scope scope(db, READER_SCOPE);
|
||||
ref<PgfConcr> concr = PgfDB::revision2concr(cnc_revision);
|
||||
|
||||
namespace_iter(concr->lincats, itor, err);
|
||||
} PGF_API_END
|
||||
}
|
||||
|
||||
PGF_API
|
||||
void pgf_iter_lins(PgfDB *db, PgfConcrRevision cnc_revision,
|
||||
PgfItor *itor, PgfExn *err)
|
||||
{
|
||||
PGF_API_BEGIN {
|
||||
DB_scope scope(db, READER_SCOPE);
|
||||
ref<PgfConcr> concr = PgfDB::revision2concr(cnc_revision);
|
||||
|
||||
namespace_iter(concr->lins, itor, err);
|
||||
} PGF_API_END
|
||||
}
|
||||
|
||||
PGF_API
|
||||
void pgf_get_lincat_counts_internal(object o, size_t *counts)
|
||||
{
|
||||
ref<PgfConcrLincat> lincat = o;
|
||||
counts[0] = lincat->fields->len;
|
||||
}
|
||||
|
||||
PGF_API
|
||||
PgfText *pgf_get_lincat_field_internal(object o, size_t i)
|
||||
{
|
||||
ref<PgfConcrLincat> lincat = o;
|
||||
return &(**vector_elem(lincat->fields, i));
|
||||
}
|
||||
|
||||
PGF_API
|
||||
void pgf_get_lin_counts_internal(object o, size_t *counts)
|
||||
{
|
||||
ref<PgfConcrLin> lin = o;
|
||||
counts[0] = lin->res->len;
|
||||
counts[1] = lin->seqs->len / lin->res->len;
|
||||
}
|
||||
|
||||
PGF_API
|
||||
PgfText *pgf_print_lin_sig_internal(object o, size_t i)
|
||||
{
|
||||
ref<PgfConcrLin> lin = o;
|
||||
ref<PgfDTyp> ty = lin->absfun->type;
|
||||
|
||||
PgfInternalMarshaller m;
|
||||
PgfPrinter printer(NULL,0,&m);
|
||||
|
||||
printer.efun(&lin->name);
|
||||
printer.puts(" : ");
|
||||
|
||||
size_t n_args = lin->args->len / lin->res->len;
|
||||
for (size_t j = 0; j < n_args; j++) {
|
||||
if (j > 0)
|
||||
printer.puts(" * ");
|
||||
|
||||
printer.parg(vector_elem(ty->hypos, j)->type,
|
||||
vector_elem(lin->args, i*n_args + j));
|
||||
}
|
||||
|
||||
if (n_args > 0)
|
||||
printer.puts(" -> ");
|
||||
|
||||
printer.efun(&ty->name);
|
||||
puts("(");
|
||||
printer.lparam(*vector_elem(lin->res, i));
|
||||
puts(")");
|
||||
|
||||
return printer.get_text();
|
||||
}
|
||||
|
||||
PGF_API
|
||||
PgfText *pgf_print_lin_seq_internal(object o, size_t i, size_t j)
|
||||
{
|
||||
ref<PgfConcrLin> lin = o;
|
||||
|
||||
PgfInternalMarshaller m;
|
||||
PgfPrinter printer(NULL,0,&m);
|
||||
|
||||
size_t n_seqs = lin->seqs->len / lin->res->len;
|
||||
ref<Vector<PgfSymbol>> syms = *vector_elem(lin->seqs, i*n_seqs + j);
|
||||
|
||||
for (size_t k = 0; k < syms->len; k++) {
|
||||
if (k > 0)
|
||||
printer.puts(" ");
|
||||
|
||||
printer.symbol(*vector_elem(syms, k));
|
||||
}
|
||||
|
||||
return printer.get_text();
|
||||
}
|
||||
|
||||
PGF_API
|
||||
PgfRevision pgf_clone_revision(PgfDB *db, PgfRevision revision,
|
||||
PgfText *name,
|
||||
@@ -1200,7 +1326,8 @@ public:
|
||||
PGF_API
|
||||
void pgf_create_lincat(PgfDB *db,
|
||||
PgfRevision revision, PgfConcrRevision cnc_revision,
|
||||
PgfText *name, size_t n_fields, PgfExn *err)
|
||||
PgfText *name, size_t n_fields, PgfText **fields,
|
||||
PgfExn *err)
|
||||
{
|
||||
PGF_API_BEGIN {
|
||||
DB_scope scope(db, WRITER_SCOPE);
|
||||
@@ -1221,6 +1348,7 @@ void pgf_create_lincat(PgfDB *db,
|
||||
lincat->fields = vector_new<ref<PgfText>>(n_fields);
|
||||
|
||||
for (size_t i = 0; i < n_fields; i++) {
|
||||
*vector_elem(lincat->fields, i) = textdup_db(fields[i]);
|
||||
}
|
||||
|
||||
Namespace<PgfConcrLincat> lincats =
|
||||
|
||||
@@ -371,12 +371,38 @@ PgfText *pgf_print_context(size_t n_hypos, PgfTypeHypo *hypos,
|
||||
PGF_API_DECL
|
||||
PgfType pgf_read_type(PgfText *input, PgfUnmarshaller *u);
|
||||
|
||||
PGF_API
|
||||
PgfText *pgf_print_start_cat_internal(PgfDB *db, PgfRevision revision, PgfExn *err);
|
||||
|
||||
PGF_API_DECL
|
||||
PgfText *pgf_print_category_internal(object o);
|
||||
|
||||
PGF_API_DECL
|
||||
PgfText *pgf_print_function_internal(object o);
|
||||
|
||||
PGF_API_DECL
|
||||
void pgf_iter_lincats(PgfDB *db, PgfConcrRevision cnc_revision,
|
||||
PgfItor *itor, PgfExn *err);
|
||||
|
||||
PGF_API_DECL
|
||||
void pgf_iter_lins(PgfDB *db, PgfConcrRevision cnc_revision,
|
||||
PgfItor *itor, PgfExn *err);
|
||||
|
||||
PGF_API_DECL
|
||||
void pgf_get_lincat_counts_internal(object o, size_t *counts);
|
||||
|
||||
PGF_API_DECL
|
||||
PgfText *pgf_get_lincat_field_internal(object o, size_t i);
|
||||
|
||||
PGF_API_DECL
|
||||
void pgf_get_lin_counts_internal(object o, size_t *counts);
|
||||
|
||||
PGF_API_DECL
|
||||
PgfText *pgf_print_lin_sig_internal(object o, size_t i);
|
||||
|
||||
PGF_API_DECL
|
||||
PgfText *pgf_print_lin_seq_internal(object o, size_t i, size_t j);
|
||||
|
||||
PGF_API_DECL
|
||||
PgfRevision pgf_clone_revision(PgfDB *db, PgfRevision revision,
|
||||
PgfText *name,
|
||||
@@ -432,7 +458,8 @@ void pgf_drop_concrete(PgfDB *db, PgfRevision revision,
|
||||
PGF_API_DECL
|
||||
void pgf_create_lincat(PgfDB *db,
|
||||
PgfRevision revision, PgfConcrRevision cnc_revision,
|
||||
PgfText *name, size_t n_fields, PgfExn *err);
|
||||
PgfText *name, size_t n_fields, PgfText **fields,
|
||||
PgfExn *err);
|
||||
|
||||
PGF_API_DECL
|
||||
void pgf_drop_lincat(PgfDB *db, PgfConcrRevision revision,
|
||||
|
||||
@@ -433,6 +433,89 @@ PgfType PgfPrinter::dtyp(size_t n_hypos, PgfTypeHypo *hypos,
|
||||
return 0;
|
||||
}
|
||||
|
||||
void PgfPrinter::parg(ref<PgfDTyp> ty, ref<PgfPArg> parg)
|
||||
{
|
||||
efun(&ty->name);
|
||||
puts("(");
|
||||
lparam(parg->param);
|
||||
puts(")");
|
||||
}
|
||||
|
||||
void PgfPrinter::lparam(ref<PgfLParam> lparam)
|
||||
{
|
||||
if (lparam->i0 != 0 || lparam->n_terms == 0)
|
||||
nprintf(32,"%ld",lparam->i0);
|
||||
for (size_t k = 0; k < lparam->n_terms; k++) {
|
||||
if (lparam->i0 != 0 || k > 0)
|
||||
puts("+");
|
||||
if (lparam->terms[k].factor != 1) {
|
||||
nprintf(32,"%ld",lparam->terms[k].factor);
|
||||
puts("*");
|
||||
}
|
||||
|
||||
char vars[] = "ijklmnopqr";
|
||||
size_t i = lparam->terms[k].var / sizeof(vars);
|
||||
size_t j = lparam->terms[k].var % sizeof(vars);
|
||||
|
||||
if (i == 0)
|
||||
nprintf(32,"%c",vars[j]);
|
||||
else
|
||||
nprintf(32,"%c%ld",vars[j],i);
|
||||
}
|
||||
}
|
||||
|
||||
void PgfPrinter::symbol(PgfSymbol sym)
|
||||
{
|
||||
switch (ref<PgfSymbol>::get_tag(sym)) {
|
||||
case PgfSymbolCat::tag: {
|
||||
auto sym_cat = ref<PgfSymbolCat>::untagged(sym);
|
||||
nprintf(32, "<%ld,",sym_cat->d);
|
||||
lparam(ref<PgfLParam>::from_ptr(&sym_cat->r));
|
||||
puts(">");
|
||||
break;
|
||||
}
|
||||
case PgfSymbolLit::tag: {
|
||||
auto sym_lit = ref<PgfSymbolLit>::untagged(sym);
|
||||
nprintf(32, "{%ld,",sym_lit->d);
|
||||
lparam(ref<PgfLParam>::from_ptr(&sym_lit->r));
|
||||
puts("}");
|
||||
break;
|
||||
}
|
||||
case PgfSymbolVar::tag: {
|
||||
auto sym_var = ref<PgfSymbolVar>::untagged(sym);
|
||||
nprintf(64, "<%ld,$%ld>",sym_var->d, sym_var->r);
|
||||
break;
|
||||
}
|
||||
case PgfSymbolKS::tag: {
|
||||
auto sym_ks = ref<PgfSymbolKS>::untagged(sym);
|
||||
lstr(&sym_ks->token);
|
||||
break;
|
||||
}
|
||||
case PgfSymbolKP::tag: {
|
||||
auto sym_ks = ref<PgfSymbolKP>::untagged(sym);
|
||||
break;
|
||||
}
|
||||
case PgfSymbolBIND::tag:
|
||||
puts("BIND");
|
||||
break;
|
||||
case PgfSymbolSOFTBIND::tag:
|
||||
puts("SOFT_BIND");
|
||||
break;
|
||||
case PgfSymbolNE::tag:
|
||||
puts("nonExist");
|
||||
break;
|
||||
case PgfSymbolSOFTSPACE::tag:
|
||||
puts("SOFT_SPACE");
|
||||
break;
|
||||
case PgfSymbolCAPIT::tag:
|
||||
puts("CAPIT");
|
||||
break;
|
||||
case PgfSymbolALLCAPIT::tag:
|
||||
puts("ALL_CAPIT");
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void PgfPrinter::free_ref(object x)
|
||||
{
|
||||
}
|
||||
|
||||
@@ -50,6 +50,10 @@ public:
|
||||
|
||||
void hypo(PgfTypeHypo *hypo, int prio);
|
||||
|
||||
void parg(ref<PgfDTyp> ty, ref<PgfPArg> parg);
|
||||
void lparam(ref<PgfLParam> lparam);
|
||||
void symbol(PgfSymbol sym);
|
||||
|
||||
virtual PgfExpr eabs(PgfBindType btype, PgfText *name, PgfExpr body);
|
||||
virtual PgfExpr eapp(PgfExpr fun, PgfExpr arg);
|
||||
virtual PgfExpr elit(PgfLiteral lit);
|
||||
|
||||
Reference in New Issue
Block a user