From 37fe04b08b3cae7390f75eb1bb25d8fd4e958384 Mon Sep 17 00:00:00 2001 From: Peter Mikkelsen Date: Tue, 11 Jan 2022 23:21:05 +0000 Subject: First try at implementing variables --- lexer.c | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) (limited to 'lexer.c') diff --git a/lexer.c b/lexer.c index 40c7f35..bc5aa50 100644 --- a/lexer.c +++ b/lexer.c @@ -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; -- cgit v1.2.3