summaryrefslogtreecommitdiff
path: root/src/runtime/c/pgf/loader.c
diff options
context:
space:
mode:
authorkrasimir <krasimir@chalmers.se>2010-06-16 15:14:34 +0000
committerkrasimir <krasimir@chalmers.se>2010-06-16 15:14:34 +0000
commitc760c52223c4737bf2803e2c28699a923c4c12c5 (patch)
tree78a93bc98fe5914105cdbdc747f9968c9c50b446 /src/runtime/c/pgf/loader.c
parent106d056f54ca8cdc887680d822ac31614ccf383b (diff)
grammar loader and unloader in C. Abstract Syntax only!
Diffstat (limited to 'src/runtime/c/pgf/loader.c')
-rw-r--r--src/runtime/c/pgf/loader.c396
1 files changed, 396 insertions, 0 deletions
diff --git a/src/runtime/c/pgf/loader.c b/src/runtime/c/pgf/loader.c
new file mode 100644
index 000000000..0d2f40661
--- /dev/null
+++ b/src/runtime/c/pgf/loader.c
@@ -0,0 +1,396 @@
+#include "../pgf.h"
+#include "data.h"
+#include "panic.h"
+#include <stdio.h>
+#include <stdlib.h>
+
+static int readTag(FILE *f) {
+ return getc(f);
+}
+
+static int readInt16(FILE *f) {
+ int x = getc(f);
+ int y = getc(f);
+ return ((x << 8) | y);
+}
+
+static int readInt(FILE *f) {
+ unsigned int x = (unsigned int) getc(f);
+ if (x <= 0x7f)
+ return (int) x;
+ else {
+ unsigned int y = (unsigned int) readInt(f);
+ return (int) ((y << 7) | (x & 0x7f)) ;
+ }
+}
+
+static double readFloat(FILE *f) {
+ double d;
+ fread(&d, sizeof(d), 1, f);
+ return d;
+}
+
+static String readString(FILE *f) {
+ int len = readInt(f);
+ String str = (String) malloc(sizeof(struct _CId)+len*sizeof(unsigned int));
+ str->len = len;
+
+ int i;
+ for (i = 0; i < len; i++) {
+ int c = fgetc(f);
+ str->chars[i] = c;
+ }
+
+ return str;
+}
+
+static CId readCId(FILE *f) {
+ int len = readInt(f);
+ CId cid = (CId) malloc(sizeof(struct _CId)+len*sizeof(char));
+ cid->len = len;
+ fread(&cid->chars, sizeof(char), len, f);
+ return cid;
+}
+
+static CIdList readCIdList(FILE *f) {
+ int i;
+ int count = readInt(f);
+ CIdList list = (CIdList) malloc(sizeof(struct _CIdList)+count*sizeof(CId));
+
+ list->count = count;
+ for (i = 0; i < count; i++) {
+ list->names[i] = readCId(f);
+ }
+
+ return list;
+}
+
+static Literal readLiteral(FILE *f) {
+ int tag = readTag(f);
+ switch (tag) {
+ case LIT_STR:
+ {
+ LiteralStr lit = (LiteralStr) malloc(sizeof(struct _LiteralStr));
+ lit->_.tag = tag;
+ lit->val = readString(f);
+ return ((Literal) lit);
+ }
+ case LIT_INT:
+ {
+ LiteralInt lit = (LiteralInt) malloc(sizeof(struct _LiteralInt));
+ lit->_.tag = tag;
+ lit->val = readInt(f);
+ return ((Literal) lit);
+ }
+ case LIT_FLOAT:
+ {
+ LiteralFloat lit = (LiteralFloat) malloc(sizeof(struct _LiteralFloat));
+ lit->_.tag = tag;
+ lit->val = readFloat(f);
+ return ((Literal) lit);
+ }
+ default:
+ __pgf_panic("Unknown literal tag");
+ }
+}
+
+static Flags readFlags(FILE *f) {
+ int i;
+ int count = readInt(f);
+ Flags flags = (Flags) malloc(sizeof(struct _Flags)+count*sizeof(struct _Flag));
+
+ flags->count = count;
+ for (i = 0; i < count; i++) {
+ flags->values[i].name = readCId(f);
+ flags->values[i].value = readLiteral(f);
+ }
+
+ return flags;
+}
+
+static Context readContext(FILE *f);
+static Type readType(FILE *f);
+
+static Expr readExpr(FILE *f) {
+ int tag = readTag(f);
+
+ switch (tag) {
+ case TAG_ABS:
+ {
+ ExprAbs e = (ExprAbs) malloc(sizeof(struct _ExprAbs));
+ e->_.tag = tag;
+ e->bt = readTag(f);
+ e->var = readCId(f);
+ e->body = readExpr(f);
+ return ((Expr) e);
+ }
+ case TAG_APP:
+ {
+ ExprApp e = (ExprApp) malloc(sizeof(struct _ExprApp));
+ e->_.tag = tag;
+ e->left = readExpr(f);
+ e->right = readExpr(f);
+ return ((Expr) e);
+ }
+ case TAG_LIT:
+ {
+ ExprLit e = (ExprLit) malloc(sizeof(struct _ExprLit));
+ e->_.tag = tag;
+ e->lit = readLiteral(f);
+ return ((Expr) e);
+ }
+ case TAG_MET:
+ {
+ ExprMeta e = (ExprMeta) malloc(sizeof(struct _ExprMeta));
+ e->_.tag = tag;
+ e->id = readInt(f);
+ return ((Expr) e);
+ }
+ case TAG_FUN:
+ {
+ ExprFun e = (ExprFun) malloc(sizeof(struct _ExprFun));
+ e->_.tag = tag;
+ e->fun = readCId(f);
+ return ((Expr) e);
+ }
+ case TAG_VAR:
+ {
+ ExprVar e = (ExprVar) malloc(sizeof(struct _ExprVar));
+ e->_.tag = tag;
+ e->index = readInt(f);
+ return ((Expr) e);
+ }
+ case TAG_TYP:
+ {
+ ExprTyped e = (ExprTyped) malloc(sizeof(struct _ExprTyped));
+ e->_.tag = tag;
+ e->e = readExpr(f);
+ e->ty = readType(f);
+ return ((Expr) e);
+ }
+ case TAG_IMP:
+ {
+ ExprImplArg e = (ExprImplArg) malloc(sizeof(struct _ExprImplArg));
+ e->_.tag = tag;
+ e->e = readExpr(f);
+ return ((Expr) e);
+ }
+ default:
+ __pgf_panic("Unknown expression tag");
+ }
+}
+
+static Type readType(FILE *f) {
+ Context hypos = readContext(f);
+ CId cat = readCId(f);
+
+ int i;
+ int count = readInt(f);
+ Type ty = (Type) malloc(sizeof(struct _Type)+count*sizeof(Expr));
+
+ ty->hypos = hypos;
+ ty->cat = cat;
+ ty->nArgs = count;
+ for (i = 0; i < count; i++) {
+ ty->args[i] = readExpr(f);
+ }
+
+ return ty;
+}
+
+static void readHypo(FILE *f, Hypo h) {
+ h->bt = readTag(f);
+ h->var = readCId(f);
+ h->ty = readType(f);
+}
+
+static Context readContext(FILE *f) {
+ int i;
+ int size = readInt(f);
+ Context ctxt = (Context) malloc(sizeof(struct _Context)+size*sizeof(struct _Hypo));
+
+ ctxt->size = size;
+ for (i = 0; i < size; i++) {
+ readHypo(f, &ctxt->hypos[i]);
+ }
+
+ return ctxt;
+}
+
+static Patt readPatt(FILE *f) {
+ int tag = readTag(f);
+
+ switch (tag) {
+ case TAG_PAPP:
+ {
+ CId fun = readCId(f);
+
+ int i;
+ int count = readInt(f);
+ PattApp p = (PattApp) malloc(sizeof(struct _PattApp)+count*sizeof(Patt));
+
+ p->_.tag = tag;
+ p->fun = fun;
+ p->args.count = count;
+ for (i = 0; i < count; i++) {
+ p->args.pats[i] = readPatt(f);
+ }
+
+ return ((Patt) p);
+ }
+ case TAG_PVAR:
+ {
+ PattVar p = (PattVar) malloc(sizeof(struct _PattVar));
+ p->_.tag = tag;
+ p->var = readCId(f);
+ return ((Patt) p);
+ }
+ case TAG_PAT:
+ {
+ PattAt p = (PattAt) malloc(sizeof(struct _PattAt));
+ p->_.tag = tag;
+ p->var = readCId(f);
+ p->pat = readPatt(f);
+ return ((Patt) p);
+ }
+ case TAG_PWILD:
+ {
+ PattWild p = (PattWild) malloc(sizeof(struct _PattWild));
+ p->_.tag = tag;
+ return ((Patt) p);
+ }
+ case TAG_PLIT:
+ {
+ PattLit p = (PattLit) malloc(sizeof(struct _PattLit));
+ p->_.tag = tag;
+ p->lit = readLiteral(f);
+ return ((Patt) p);
+ }
+ case TAG_PIMP:
+ {
+ PattImplArg p = (PattImplArg) malloc(sizeof(struct _PattImplArg));
+ p->_.tag = tag;
+ p->pat = readPatt(f);
+ return ((Patt) p);
+ }
+ case TAG_PTILDE:
+ {
+ PattTilde p = (PattTilde) malloc(sizeof(struct _PattTilde));
+ p->_.tag = tag;
+ p->e = readExpr(f);
+ return ((Patt) p);
+ }
+ default:
+ __pgf_panic("Unknown pattern tag");
+ }
+}
+
+static Patts readPatts(FILE *f) {
+ int i;
+ int count = readInt(f);
+ Patts pats = (Patts) malloc(sizeof(struct _Patts)+count*sizeof(Patt));
+
+ pats->count = count;
+ for (i = 0; i < count; i++) {
+ pats->pats[i] = readPatt(f);
+ }
+
+ return pats;
+}
+
+static Equations readEquations(FILE *f) {
+ int i;
+ int count = readInt(f);
+ Equations equs = (Equations) malloc(sizeof(struct _Equations)+count*sizeof(struct _Equation));
+
+ equs->count = count;
+ for (i = 0; i < count; i++) {
+ equs->equs[i].lhs = readPatts(f);
+ equs->equs[i].rhs = readExpr(f);
+ }
+
+ return equs;
+}
+
+static void readAbsFun(FILE *f, AbsFun fun) {
+ fun->name = readCId(f);
+ fun->ty = readType(f);
+ fun->arrity = readInt(f);
+ if (readTag(f) != 0)
+ fun->equs = readEquations(f);
+ else
+ fun->equs = NULL;
+}
+
+static AbsFuns readAbsFuns(FILE *f) {
+ int i;
+ int count = readInt(f);
+ AbsFuns funs = (AbsFuns) malloc(sizeof(struct _AbsFuns)+count*sizeof(struct _AbsFun));
+
+ funs->count = count;
+ for (i = 0; i < count; i++) {
+ readAbsFun(f, &funs->lst[i]);
+ }
+
+ return funs;
+}
+
+static void readAbsCat(FILE *f, AbsCat cat) {
+ cat->name = readCId(f);
+ cat->hypos = readContext(f);
+ cat->funs = readCIdList(f);
+}
+
+static AbsCats readAbsCats(FILE *f) {
+ int i;
+ int count = readInt(f);
+ AbsCats cats = (AbsCats) malloc(sizeof(struct _AbsCats)+count*sizeof(struct _AbsCat));
+
+ cats->count = count;
+ for (i = 0; i < count; i++) {
+ readAbsCat(f, &cats->lst[i]);
+ }
+
+ return cats;
+}
+
+static void readAbstr(FILE *f, Abstract abstr) {
+ abstr->name = readCId(f);
+ abstr->flags = readFlags(f);
+ abstr->funs = readAbsFuns(f);
+ abstr->cats = readAbsCats(f);
+}
+
+static void readConcr(FILE *f, Concrete concr) {
+ concr->name = readCId(f);
+ concr->flags = readFlags(f);
+}
+
+PGF readPGF(char *filename) {
+ FILE *f = fopen(filename, "rb");
+ if (f == NULL)
+ return NULL;
+
+ int maj_ver = readInt16(f);
+ int min_ver = readInt16(f);
+
+ Flags flags = readFlags(f);
+
+ struct _Abstract abstr;
+ readAbstr(f, &abstr);
+
+ int nConcr = readInt(f);
+ PGF pgf = (PGF) malloc(sizeof(struct _PGF)+sizeof(Concrete)*nConcr);
+
+ pgf->flags = flags;
+ pgf->abstract = abstr;
+ pgf->nConcr = nConcr;
+
+ int i;
+// for (i = 0; i < nConcr; i++) {
+// readConcr(f, &pgf->concretes[i]);
+// }
+
+ fclose(f);
+ return pgf;
+}