diff options
author | Peter Mikkelsen <petermikkelsen10@gmail.com> | 2022-01-20 22:53:30 +0000 |
---|---|---|
committer | Peter Mikkelsen <petermikkelsen10@gmail.com> | 2022-01-20 22:53:30 +0000 |
commit | b63ca926df347798ea113d7b197192bd28399f5a (patch) | |
tree | 18f4161678fe0d7239e4ebb735ab76cdb24745dd /lexer.c | |
parent | 35f20421e7a4942b61c4a1910e8da0bf35f21fd9 (diff) |
Implement guards, and start work on ↑ and ↓
Diffstat (limited to 'lexer.c')
-rw-r--r-- | lexer.c | 17 |
1 files changed, 14 insertions, 3 deletions
@@ -14,6 +14,7 @@ lexline(Rune *line) Statement *stmt = emalloc(sizeof(Statement)); stmt->ntoks = 0; stmt->toks = mallocz(sizeof(Datum) * MAX_LINE_TOKENS, 1); + stmt->guard = nil; stmt->next = nil; while(offset < len){ @@ -21,10 +22,8 @@ lexline(Rune *line) if(isspacerune(line[offset])){ offset++; continue; - }else if(runestrchr(L"[]←⋄⍝⍬", line[offset])){ + }else if(runestrchr(L"←⋄⍝⍬", line[offset])){ switch(line[offset]){ - case '[': stmt->toks[stmt->ntoks].tag = LBracketTag; break; - case ']': stmt->toks[stmt->ntoks].tag = RBracketTag; break; case L'←': stmt->toks[stmt->ntoks].tag = ArrowTag; break; case L'⋄': stmt->next = lexline(&line[offset+1]); goto end; case L'⍝': goto end; @@ -35,6 +34,18 @@ lexline(Rune *line) break; } offset++; + }else if(line[offset] == ':'){ + Rune buf[MAX_LINE_LENGTH]; + Rune *p = buf; + offset++; + while(line[offset] != L'⋄' && offset < len){ + *p = line[offset]; + p++; + offset++; + } + *p = 0; + stmt->guard = lexline(buf); + stmt->ntoks--; }else if(line[offset] == '{'){ Rune buf[MAX_LINE_LENGTH]; Rune *p = buf; |