libpgf: few fixes to make the loading of grammars with def rules possible

This commit is contained in:
kr.angelov
2012-01-24 14:47:11 +00:00
parent acc4f352af
commit 58de345f99
4 changed files with 36 additions and 11 deletions

View File

@@ -160,10 +160,7 @@ GU_DEFINE_TYPE(
PGF_PATT_APP, PgfPattApp,
GU_MEMBER(PgfPattApp, ctor, PgfCId),
GU_MEMBER(PgfPattApp, n_args, GuLength),
GU_MEMBER(PgfPattApp, args, PgfPatt)),
GU_CONSTRUCTOR_S(
PGF_PATT_LIT, PgfPattLit,
GU_MEMBER(PgfPattLit, lit, PgfLiteral)),
GU_FLEX_MEMBER(PgfPattApp, args, PgfPatt)),
GU_CONSTRUCTOR_S(
PGF_PATT_VAR, PgfPattVar,
GU_MEMBER(PgfPattVar, var, PgfCId)),
@@ -173,6 +170,9 @@ GU_DEFINE_TYPE(
GU_MEMBER(PgfPattAs, patt, PgfPatt)),
GU_CONSTRUCTOR(
PGF_PATT_WILD, void),
GU_CONSTRUCTOR_S(
PGF_PATT_LIT, PgfPattLit,
GU_MEMBER(PgfPattLit, lit, PgfLiteral)),
GU_CONSTRUCTOR_S(
PGF_PATT_IMPL_ARG, PgfPattImplArg,
GU_MEMBER(PgfPattImplArg, patt, PgfPatt)),
@@ -184,7 +184,7 @@ GU_DEFINE_TYPE(
PgfEquation, struct,
GU_MEMBER(PgfEquation, body, PgfExpr),
GU_MEMBER(PgfEquation, n_patts, GuLength),
GU_MEMBER(PgfEquation, patts, PgfPatt));
GU_FLEX_MEMBER(PgfEquation, patts, PgfPatt));
// Distinct type so we can give it special treatment in the reader
GU_DEFINE_TYPE(PgfEquationsM, GuSeq, gu_type(PgfEquation));

View File

@@ -274,6 +274,8 @@ typedef struct {
} PgfProductionConst;
extern GU_DECLARE_TYPE(PgfPatt, GuVariant);
extern GU_DECLARE_TYPE(PgfProduction, GuVariant);
extern GU_DECLARE_TYPE(PgfBindType, enum);
extern GU_DECLARE_TYPE(PgfLiteral, GuVariant);
@@ -286,10 +288,10 @@ pgf_literal_cat(PgfLiteral lit);
typedef enum {
PGF_PATT_APP,
PGF_PATT_LIT,
PGF_PATT_VAR,
PGF_PATT_AS,
PGF_PATT_WILD,
PGF_PATT_LIT,
PGF_PATT_IMPL_ARG,
PGF_PATT_TILDE,
PGF_PATT_NUM_TAGS

View File

@@ -117,7 +117,7 @@ GU_DEFINE_TYPE(
GU_MEMBER(PgfExprMeta, id, int)),
GU_CONSTRUCTOR_S(
PGF_EXPR_FUN, PgfExprFun,
GU_MEMBER(PgfExprFun, fun, GuStr)),
GU_MEMBER(PgfExprFun, fun, GuString)),
GU_CONSTRUCTOR_S(
PGF_EXPR_VAR, PgfExprVar,
GU_MEMBER(PgfExprVar, var, int)),

View File

@@ -516,7 +516,7 @@ pgf_read_to_GuSeq(GuType* type, PgfReader* rdr, void* to)
}
static void
pgf_read_to_maybe_seq(GuType* type, PgfReader* rdr, void* to)
pgf_read_to_PgfEquationsM(GuType* type, PgfReader* rdr, void* to)
{
GuSeq* sto = to;
uint8_t tag = pgf_read_u8(rdr);
@@ -525,9 +525,32 @@ pgf_read_to_maybe_seq(GuType* type, PgfReader* rdr, void* to)
case 0:
*sto = gu_null_seq;
break;
case 1:
pgf_read_to_GuSeq(type, rdr, to);
case 1: {
GuLength length = pgf_read_len(rdr);
gu_return_on_exn(rdr->err, );
GuSeq seq = gu_new_seq(PgfEquation*, length, rdr->opool);
PgfEquation** data = gu_seq_data(seq);
for (size_t i = 0; i < length; i++) {
GuLength n_patts = pgf_read_len(rdr);
gu_return_on_exn(rdr->err, );
PgfEquation *equ =
gu_malloc(rdr->opool,
sizeof(PgfEquation)+sizeof(PgfPatt)*n_patts);
equ->n_patts = n_patts;
for (int j = 0; j < n_patts; j++) {
pgf_read_to(rdr, gu_type(PgfPatt), &equ->patts[j]);
gu_return_on_exn(rdr->err, );
}
pgf_read_to(rdr, gu_type(PgfExpr), &equ->body);
gu_return_on_exn(rdr->err, );
data[i] = equ;
}
*sto = seq;
break;
}
default:
gu_raise_i(rdr->err, PgfReadTagExn,
.type = type, .tag = tag);
@@ -775,7 +798,7 @@ pgf_read_to_table = GU_TYPETABLE(
PGF_READ_TO(GuString),
PGF_READ_TO(double),
PGF_READ_TO(pointer),
PGF_READ_TO_FN(PgfEquationsM, pgf_read_to_maybe_seq),
PGF_READ_TO(PgfEquationsM),
PGF_READ_TO(GuSeq),
PGF_READ_TO(PgfCCatId),
PGF_READ_TO(PgfCCat),