diff options
author | Peter Mikkelsen <petermikkelsen10@gmail.com> | 2022-01-15 22:46:56 +0000 |
---|---|---|
committer | Peter Mikkelsen <petermikkelsen10@gmail.com> | 2022-01-15 22:46:56 +0000 |
commit | f02e90b27e37f91d4409842dd21cd00c999c805d (patch) | |
tree | 26117d12dadf2a15cc57bfc8b34c221ae0378dec /lexer.c | |
parent | d464a1d3a62d620b6336131c355467bdc273e3c5 (diff) |
Implement quad names for variables
Diffstat (limited to 'lexer.c')
-rw-r--r-- | lexer.c | 29 |
1 files changed, 22 insertions, 7 deletions
@@ -101,21 +101,36 @@ lexline(Rune *line) stmt->toks[stmt->ntoks].tag = NameTag; stmt->toks[stmt->ntoks].symbol = getsym(currentsymtab, name); offset++; - }else if(isalpharune(line[offset]) || line[offset] == L'⎕'){ - int quadname = L'⎕' == line[offset]; + }else if(isalpharune(line[offset])){ Rune buf[64]; Rune *p = buf; - while(isalpharune(line[offset]) || (line[offset] == L'⎕' && p == buf)){ - if(quadname) - *p = toupperrune(line[offset]); - else - *p = line[offset]; + while(isalpharune(line[offset])){ + *p = line[offset]; p++; offset++; } *p = 0; stmt->toks[stmt->ntoks].tag = NameTag; stmt->toks[stmt->ntoks].symbol = getsym(currentsymtab, buf); + }else if(runestrchr(L"⎕⍞", line[offset])){ + /* quad names */ + Rune buf[64]; + Rune *p = buf; + *p++ = line[offset++]; + while(isalpharune(line[offset])) + *p++ = toupperrune(line[offset++]); + *p = 0; + int valid = 0; + for(int i = 0; quadnames[i].name != nil && !valid; i++){ + if(runestrcmp(buf, quadnames[i].name) != 0) + continue; + valid = 1; + stmt->toks[stmt->ntoks] = quadnamedatum(quadnames[i]); + } + if(!valid){ + offset -= runestrlen(buf); + goto syntax_error; + } }else{ syntax_error: print("Can't lex: %S\n", &line[offset]); |