diff options
Diffstat (limited to 'symbol.c')
-rw-r--r-- | symbol.c | 122 |
1 files changed, 121 insertions, 1 deletions
@@ -10,6 +10,13 @@ DfnFrame *currentdfn; Symtab *newsymtab(void); void freesymtab(Symtab *); +Datum *getalpha(void); +Datum *getomega(void); +Datum *getalphao(void); +Datum *getomegao(void); +void setalpha(Datum); +void setsyntaxerr(Datum); + Symbol * getsym(Rune *name, int fresh) { @@ -70,6 +77,26 @@ void initsymtab(void) { globalsymtab = newsymtab(); + Symbol *s; + s = getsym(L"⍺", 1); + s->getfn = getalpha; + s->setfn = setalpha; + s->undefined = 0; + + s = getsym(L"⍵", 1); + s->getfn = getomega; + s->setfn = setsyntaxerr; + s->undefined = 0; + + s = getsym(L"⍶", 1); + s->getfn = getalphao; + s->setfn = setsyntaxerr; + s->undefined = 0; + + s = getsym(L"⍹", 1); + s->getfn = getomegao; + s->setfn = setsyntaxerr; + s->undefined = 0; } DfnFrame * @@ -79,11 +106,20 @@ getcurrentdfn(void) } DfnFrame * -pushdfnframe(Rune *code) +pushdfnframe(Rune *code, Datum *lefto, Datum *righto, Array *left, Array *right) { DfnFrame *new = malloc(sizeof(DfnFrame)); new->code = code; new->symtab = newsymtab(); + new->lefto = lefto; + new->righto = righto; + if(left){ + new->left = mallocz(sizeof(Datum), 1); + new->left->tag = ArrayTag; + new->left->array = left; + }else + new->left = nil; + new->right = right; new->prev = currentdfn; currentdfn = new; return new; @@ -138,4 +174,88 @@ globalDIVset(int div) currentdfn->symtab->div = div; else globalsymtab->div = div; +} + +/* getters and setters for ⍺⍵⍶⍹ */ +Datum * +getalpha(void) +{ + DfnFrame *dfn = getcurrentdfn(); + Datum *res = nil; + if(dfn == nil) + throwerror(nil, ESyntax); + else{ + res = malloc(sizeof(Datum)); + *res = *dfn->left; + if(res->tag == ArrayTag) + incref(res->array); + return res; + } + return res; +} + +Datum * +getomega(void) +{ + DfnFrame *dfn = getcurrentdfn(); + Datum *res = nil; + if(dfn == nil) + throwerror(nil, ESyntax); + else{ + res = mallocz(sizeof(Datum), 1); + res->tag = ArrayTag; + res->array = dfn->right; + incref(res->array); + } + return res; +} + +Datum * +getalphao(void) +{ + DfnFrame *dfn = getcurrentdfn(); + Datum *res = nil; + if(dfn == nil) + throwerror(nil, ESyntax); + else{ + res = malloc(sizeof(Datum)); + *res = *dfn->lefto; + if(res->tag == ArrayTag) + incref(res->array); + } + return res; +} + +Datum * +getomegao(void) +{ + DfnFrame *dfn = getcurrentdfn(); + Datum *res = nil; + if(dfn == nil) + throwerror(nil, ESyntax); + else{ + res = malloc(sizeof(Datum)); + *res = *dfn->righto; + if(res->tag == ArrayTag) + incref(res->array); + } + return res; +} + +void +setalpha(Datum new) +{ + DfnFrame *dfn = getcurrentdfn(); + if(dfn == nil) + throwerror(nil, ESyntax); + if(dfn->left == nil){ + dfn->left = malloc(sizeof(Datum)); + *dfn->left = new; + } +} + +void +setsyntaxerr(Datum) +{ + throwerror(nil, ESyntax); }
\ No newline at end of file |