summaryrefslogtreecommitdiff
path: root/lexer.c
diff options
context:
space:
mode:
Diffstat (limited to 'lexer.c')
-rw-r--r--lexer.c22
1 files changed, 17 insertions, 5 deletions
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;