summaryrefslogtreecommitdiff
path: root/lexer.c
diff options
context:
space:
mode:
authorPeter Mikkelsen <petermikkelsen10@gmail.com>2022-01-12 18:46:55 +0000
committerPeter Mikkelsen <petermikkelsen10@gmail.com>2022-01-12 18:46:55 +0000
commitd596e90554816e62d39fbaf68713810ed1eaf764 (patch)
treecf06e3beab322bd261248761a90cf93d4d520bd7 /lexer.c
parent85aa2ad424c68343ef09e5f6df243ad6499e47d5 (diff)
Add statements separated by ⋄
Diffstat (limited to 'lexer.c')
-rw-r--r--lexer.c61
1 files changed, 35 insertions, 26 deletions
diff --git a/lexer.c b/lexer.c
index a7557c2..d269e11 100644
--- a/lexer.c
+++ b/lexer.c
@@ -8,40 +8,46 @@ Rune primmonopnames[] = L"¨⍨⌸⌶&";
Rune primdyadopnames[] = L"⍣.∘⍤⍥@⍠⌺";
Rune primhybridnames[] = L"/\⌿⍀";
-Datum *
-lexline(Rune *line, int *ntoks, Symtab *symtab)
+Statement *
+lexline(Rune *line, Symtab *symtab)
{
int offset = 0;
int len = runestrlen(line);
- Datum *tokens = mallocz(sizeof(Datum) * MAX_LINE_TOKENS, 1);
- *ntoks = 0;
+ Statement *stmt = malloc(sizeof(Statement));
+ stmt->ntoks = 0;
+ stmt->toks = mallocz(sizeof(Datum) * MAX_LINE_TOKENS, 1);
+ stmt->next = nil;
+
while(offset < len){
Rune *p;
if(isspacerune(line[offset])){
offset++;
continue;
- }else if(runestrchr(L"(){}[]←", line[offset])){
+ }else if(runestrchr(L"(){}[]←⋄", line[offset])){
switch(line[offset]){
- case '(': tokens[*ntoks].tag = LParTag; break;
- case ')': tokens[*ntoks].tag = RParTag; break;
- case '{': tokens[*ntoks].tag = LCurlTag; break;
- case '}': tokens[*ntoks].tag = RCurlTag; break;
- case '[': tokens[*ntoks].tag = LBracketTag; break;
- case ']': tokens[*ntoks].tag = RBracketTag; break;
- case L'←': tokens[*ntoks].tag = ArrowTag; break;
+ case '(': stmt->toks[stmt->ntoks].tag = LParTag; break;
+ case ')': stmt->toks[stmt->ntoks].tag = RParTag; break;
+ case '{': stmt->toks[stmt->ntoks].tag = LCurlTag; break;
+ case '}': stmt->toks[stmt->ntoks].tag = RCurlTag; break;
+ case '[': stmt->toks[stmt->ntoks].tag = LBracketTag; break;
+ case ']': stmt->toks[stmt->ntoks].tag = RBracketTag; break;
+ case L'←': stmt->toks[stmt->ntoks].tag = ArrowTag; break;
+ case L'⋄':
+ stmt->next = lexline(&line[offset+1], symtab);
+ goto end;
}
offset++;
}else if(p = runestrchr(primfuncnames, line[offset])){
- tokens[*ntoks].tag = FunctionTag;
- tokens[*ntoks].func.code = p-primfuncnames;
+ stmt->toks[stmt->ntoks].tag = FunctionTag;
+ stmt->toks[stmt->ntoks].func.code = p-primfuncnames;
offset++;
}else if(p = runestrchr(primmonopnames, line[offset])){
- tokens[*ntoks].tag = MonadicOpTag;
- tokens[*ntoks].func.code = p-primmonopnames;
+ stmt->toks[stmt->ntoks].tag = MonadicOpTag;
+ stmt->toks[stmt->ntoks].func.code = p-primmonopnames;
offset++;
}else if(p = runestrchr(primdyadopnames, line[offset])){
- tokens[*ntoks].tag = DyadicOpTag;
- tokens[*ntoks].func.code = p-primdyadopnames;
+ stmt->toks[stmt->ntoks].tag = DyadicOpTag;
+ stmt->toks[stmt->ntoks].func.code = p-primdyadopnames;
offset++;
}else if(isdigitrune(line[offset])){
char buf[64];
@@ -51,8 +57,8 @@ lexline(Rune *line, int *ntoks, Symtab *symtab)
offset++;
}
*p = 0;
- tokens[*ntoks].tag = ArrayTag;
- tokens[*ntoks].array = mkscalarint(atoll(buf));
+ stmt->toks[stmt->ntoks].tag = ArrayTag;
+ stmt->toks[stmt->ntoks].array = mkscalarint(atoll(buf));
}else if(isalpharune(line[offset]) || line[offset] == L'⎕'){
int quadname = L'⎕' == line[offset];
Rune buf[64];
@@ -66,14 +72,17 @@ lexline(Rune *line, int *ntoks, Symtab *symtab)
offset++;
}
*p = 0;
- tokens[*ntoks].tag = NameTag;
- tokens[*ntoks].symbol = getsym(symtab, buf);
+ stmt->toks[stmt->ntoks].tag = NameTag;
+ stmt->toks[stmt->ntoks].symbol = getsym(symtab, buf);
}else{
print("Can't lex: %S\n", &line[offset]);
- *ntoks = 0;
- break;
+ free(stmt->toks);
+ free(stmt);
+ return 0;
}
- (*ntoks)++;
+ stmt->ntoks++;
}
- return tokens;
+end:
+ stmt->toks = realloc(stmt->toks, sizeof(Datum) * stmt->ntoks);
+ return stmt;
} \ No newline at end of file