diff options
Diffstat (limited to 'lexer.c')
-rw-r--r-- | lexer.c | 22 |
1 files changed, 17 insertions, 5 deletions
@@ -9,7 +9,7 @@ Rune primdyadopnames[] = L"⍣.∘⍤⍥@⍠⌺"; Rune primhybridnames[] = L"/\⌿⍀"; Datum * -lexline(Rune *line, int *ntoks) +lexline(Rune *line, int *ntoks, Symtab *symtab) { int offset = 0; int len = runestrlen(line); @@ -20,7 +20,7 @@ lexline(Rune *line, int *ntoks) 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; @@ -28,19 +28,20 @@ lexline(Rune *line, int *ntoks) 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; } offset++; }else if(p = runestrchr(primfuncnames, line[offset])){ tokens[*ntoks].tag = FunctionTag; - tokens[*ntoks].code = p-primfuncnames; + tokens[*ntoks].func.code = p-primfuncnames; offset++; }else if(p = runestrchr(primmonopnames, line[offset])){ tokens[*ntoks].tag = MonadicOpTag; - tokens[*ntoks].code = p-primmonopnames; + tokens[*ntoks].func.code = p-primmonopnames; offset++; }else if(p = runestrchr(primdyadopnames, line[offset])){ tokens[*ntoks].tag = DyadicOpTag; - tokens[*ntoks].code = p-primdyadopnames; + tokens[*ntoks].func.code = p-primdyadopnames; offset++; }else if(isdigitrune(line[offset])){ char buf[64]; @@ -52,6 +53,17 @@ lexline(Rune *line, int *ntoks) *p = 0; tokens[*ntoks].tag = ArrayTag; tokens[*ntoks].array = mkscalarint(atoll(buf)); + }else if(isalpharune(line[offset])){ + Rune buf[64]; + Rune *p = buf; + while(isalpharune(line[offset])){ + *p = line[offset]; + p++; + offset++; + } + *p = 0; + tokens[*ntoks].tag = NameTag; + tokens[*ntoks].symbol = getsym(symtab, buf); }else{ print("Can't lex: %S\n", &line[offset]); *ntoks = 0; |