#include #include #include #include "apl9.h" Rune primfuncnames[] = L"+-×÷*⍟⌹○!?|⌈⌊⊥⊤⊣⊢=≠≤<>≥≡≢∨∧⍲⍱↑↓⊂⊃⊆⌷⍋⍒⍳⍸∊⍷∪∩~,⍪⍴⌽⊖⍉⍎⍕"; Rune primmonopnames[] = L"¨⍨⌸⌶&"; Rune primdyadopnames[] = L"⍣.∘⍤⍥@⍠⌺"; Rune primhybridnames[] = L"/\⌿⍀"; Datum * lexline(Rune *line, int *ntoks) { int offset = 0; int len = runestrlen(line); Datum *tokens = mallocz(sizeof(Datum) * MAX_LINE_TOKENS, 1); *ntoks = 0; while(offset < len){ if(isspacerune(line[offset])){ offset++; continue; }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; } offset++; }else if(runestrchr(primfuncnames, line[offset])){ tokens[*ntoks].tag = FunctionTag; offset++; }else if(runestrchr(primmonopnames, line[offset])){ tokens[*ntoks].tag = MonadicOpTag; offset++; }else if(runestrchr(primdyadopnames, line[offset])){ tokens[*ntoks].tag = DyadicOpTag; offset++; }else if(isdigitrune(line[offset])){ char buf[64]; char *p = buf; while(isdigitrune(line[offset])){ p += runetochar(p, &line[offset]); offset++; } *p = 0; tokens[*ntoks].tag = ArrayTag; tokens[*ntoks].array = mkscalarint(atoll(buf)); }else{ print("Can't lex: %S\n", &line[offset]); *ntoks = 0; break; } (*ntoks)++; } return tokens; }