summaryrefslogtreecommitdiff
path: root/lexer.c
diff options
context:
space:
mode:
Diffstat (limited to 'lexer.c')
-rw-r--r--lexer.c76
1 files changed, 38 insertions, 38 deletions
diff --git a/lexer.c b/lexer.c
index 864bb3c..ed2c2e4 100644
--- a/lexer.c
+++ b/lexer.c
@@ -55,7 +55,7 @@ lexline(InputStream *input, int toplevel)
{
Statement *stmt = emalloc(sizeof(Statement));
stmt->ntoks = 0;
- stmt->toks = mallocz(sizeof(Datum) * MAX_LINE_TOKENS, 1);
+ stmt->toks = emallocz(sizeof(Datum*) * MAX_LINE_TOKENS, 1);
stmt->guard = nil;
stmt->next = nil;
@@ -67,7 +67,7 @@ lexline(InputStream *input, int toplevel)
continue;
}else if(runestrchr(L"←⋄\n⍝⍬", peek)){
switch(peek){
- case L'←': stmt->toks[stmt->ntoks].tag = ArrowTag; break;
+ case L'←': stmt->toks[stmt->ntoks] = allocdatum(ArrowTag, 0); break;
case L'\n':
case L'⋄':
if(stmt->ntoks == 0)
@@ -81,9 +81,9 @@ lexline(InputStream *input, int toplevel)
ungetrune(input);
goto end;
case L'⍬':
- stmt->toks[stmt->ntoks].tag = ArrayTag;
- stmt->toks[stmt->ntoks].array = allocarray(AtypeInt, 1, 0);
- stmt->toks[stmt->ntoks].array->shape[0] = 0;
+ stmt->toks[stmt->ntoks] = allocdatum(ArrayTag, 0);
+ stmt->toks[stmt->ntoks]->array = allocarray(AtypeInt, 1, 0);
+ stmt->toks[stmt->ntoks]->array->shape[0] = 0;
break;
}
}else if(!toplevel && peek == ':'){
@@ -115,14 +115,14 @@ lexline(InputStream *input, int toplevel)
goto syntax_error;
*p = 0;
if(oplevel == 0){
- stmt->toks[stmt->ntoks].tag = FunctionTag;
- stmt->toks[stmt->ntoks].func.type = FunctypeDfn;
- stmt->toks[stmt->ntoks].func.dfn = runestrdup(buf);
+ stmt->toks[stmt->ntoks] = allocdatum(FunctionTag, 0);
+ stmt->toks[stmt->ntoks]->func.type = FunctypeDfn;
+ stmt->toks[stmt->ntoks]->func.dfn = runestrdup(buf);
}else{
- stmt->toks[stmt->ntoks].tag = oplevel == 1 ? MonadicOpTag : DyadicOpTag;
- stmt->toks[stmt->ntoks].operator.type = OperatortypeDop;
- stmt->toks[stmt->ntoks].operator.dyadic = oplevel == 2;
- stmt->toks[stmt->ntoks].operator.dop = runestrdup(buf);
+ stmt->toks[stmt->ntoks] = allocdatum(oplevel == 1 ? MonadicOpTag : DyadicOpTag, 0);
+ stmt->toks[stmt->ntoks]->operator.type = OperatortypeDop;
+ stmt->toks[stmt->ntoks]->operator.dyadic = oplevel == 2;
+ stmt->toks[stmt->ntoks]->operator.dop = runestrdup(buf);
}
}else if(peek == '('){
int unclosed = 1;
@@ -138,27 +138,27 @@ lexline(InputStream *input, int toplevel)
if(peek != ')')
goto syntax_error;
*p = 0;
- stmt->toks[stmt->ntoks].tag = LParTag;
- stmt->toks[stmt->ntoks].stmt = *lexlinestr(buf, toplevel);
+ stmt->toks[stmt->ntoks] = allocdatum(LParTag, 0);
+ stmt->toks[stmt->ntoks]->stmt = *lexlinestr(buf, toplevel);
stmt->ntoks++;
- stmt->toks[stmt->ntoks].tag = RParTag;
+ stmt->toks[stmt->ntoks] = allocdatum(RParTag, 0);
}else if(p = runestrchr(primfuncnames, peek)){
- stmt->toks[stmt->ntoks].tag = FunctionTag;
- stmt->toks[stmt->ntoks].func.type = FunctypePrim;
- stmt->toks[stmt->ntoks].func.code = p-primfuncnames;
+ stmt->toks[stmt->ntoks] = allocdatum(FunctionTag, 0);
+ stmt->toks[stmt->ntoks]->func.type = FunctypePrim;
+ stmt->toks[stmt->ntoks]->func.code = p-primfuncnames;
}else if(p = runestrchr(primmonopnames, peek)){
- stmt->toks[stmt->ntoks].tag = MonadicOpTag;
- stmt->toks[stmt->ntoks].operator.type = OperatortypePrim;
- stmt->toks[stmt->ntoks].operator.dyadic = 0;
- stmt->toks[stmt->ntoks].operator.code = p-primmonopnames;
+ stmt->toks[stmt->ntoks] = allocdatum(MonadicOpTag, 0);
+ stmt->toks[stmt->ntoks]->operator.type = OperatortypePrim;
+ stmt->toks[stmt->ntoks]->operator.dyadic = 0;
+ stmt->toks[stmt->ntoks]->operator.code = p-primmonopnames;
}else if(p = runestrchr(primdyadopnames, peek)){
- stmt->toks[stmt->ntoks].tag = DyadicOpTag;
- stmt->toks[stmt->ntoks].operator.type = OperatortypePrim;
- stmt->toks[stmt->ntoks].operator.dyadic = 1;
- stmt->toks[stmt->ntoks].operator.code = p-primdyadopnames;
+ stmt->toks[stmt->ntoks] = allocdatum(DyadicOpTag, 0);
+ stmt->toks[stmt->ntoks]->operator.type = OperatortypePrim;
+ stmt->toks[stmt->ntoks]->operator.dyadic = 1;
+ stmt->toks[stmt->ntoks]->operator.code = p-primdyadopnames;
}else if(p = runestrchr(primhybridnames, peek)){
- stmt->toks[stmt->ntoks].tag = HybridTag;
- stmt->toks[stmt->ntoks].hybrid = p-primhybridnames;
+ stmt->toks[stmt->ntoks] = allocdatum(HybridTag, 0);
+ stmt->toks[stmt->ntoks]->hybrid = p-primhybridnames;
}else if(isdigitrune(peek) || peek == L'¯'){
char buf[64];
char *p = buf;
@@ -180,12 +180,12 @@ get_digits:
}
*p = 0;
ungetrune(input);
- stmt->toks[stmt->ntoks].tag = ArrayTag;
- stmt->toks[stmt->ntoks].array = floating ? mkscalarfloat(atof(buf)) : mkscalarint(atoll(buf));
+ stmt->toks[stmt->ntoks] = allocdatum(ArrayTag, 0);
+ stmt->toks[stmt->ntoks]->array = floating ? mkscalarfloat(atof(buf)) : mkscalarint(atoll(buf));
}else if(runestrchr(L"⍺⍵⍶⍹", peek)){
Rune name[2] = {peek, 0};
- stmt->toks[stmt->ntoks].tag = NameTag;
- stmt->toks[stmt->ntoks].name = runestrdup(name);
+ stmt->toks[stmt->ntoks] = allocdatum(NameTag, 0);
+ stmt->toks[stmt->ntoks]->name = runestrdup(name);
}else if(isalpharune(peek) || peek == '_'){
Rune buf[64];
Rune *p = buf;
@@ -195,8 +195,8 @@ get_digits:
}
*p = 0;
ungetrune(input);
- stmt->toks[stmt->ntoks].tag = NameTag;
- stmt->toks[stmt->ntoks].name = runestrdup(buf);
+ stmt->toks[stmt->ntoks] = allocdatum(NameTag, 0);
+ stmt->toks[stmt->ntoks]->name = runestrdup(buf);
}else if(runestrchr(L"⎕⍞", peek)){
/* quad names */
Rune buf[64];
@@ -241,11 +241,11 @@ get_digits:
}
if(!done)
goto syntax_error;
- stmt->toks[stmt->ntoks].tag = ArrayTag;
+ stmt->toks[stmt->ntoks] = allocdatum(ArrayTag, 0);
if(runestrlen(buf) == 1)
- stmt->toks[stmt->ntoks].array = mkscalarrune(buf[0]);
+ stmt->toks[stmt->ntoks]->array = mkscalarrune(buf[0]);
else
- stmt->toks[stmt->ntoks].array = mkrunearray(buf);
+ stmt->toks[stmt->ntoks]->array = mkrunearray(buf);
}else{
Rune *err;
syntax_error:
@@ -259,7 +259,7 @@ syntax_error:
peek = getrune(input);
}
end:
- stmt->toks = realloc(stmt->toks, sizeof(Datum) * stmt->ntoks);
+ stmt->toks = erealloc(stmt->toks, sizeof(Datum) * stmt->ntoks);
return stmt;
}