diff options
Diffstat (limited to 'lexer.c')
-rw-r--r-- | lexer.c | 32 |
1 files changed, 26 insertions, 6 deletions
@@ -23,10 +23,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 = LParTag; break; - case ')': stmt->toks[stmt->ntoks].tag = RParTag; break; 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; @@ -34,22 +32,44 @@ lexline(Rune *line) case L'⍝': goto end; } offset++; - }else if(line[offset] == L'{'){ + }else if(line[offset] == '{'){ Rune buf[MAX_LINE_LENGTH]; Rune *p = buf; offset++; - while(line[offset] != L'}' && offset < len){ + while(line[offset] != '}' && offset < len){ *p = line[offset]; p++; offset++; } - if(line[offset] != L'}') + if(line[offset] != '}') goto syntax_error; *p = 0; offset++; stmt->toks[stmt->ntoks].tag = FunctionTag; stmt->toks[stmt->ntoks].func.type = FunctypeDfn; stmt->toks[stmt->ntoks].func.dfn = runestrdup(buf); + }else if(line[offset] == '('){ + int unclosed = 1; + Rune buf[MAX_LINE_LENGTH]; + Rune *p = buf; + offset++; + while((line[offset] != ')' || unclosed > 1) && offset < len){ + if(line[offset] == '(') + unclosed++; + else if(line[offset] == ')') + unclosed--; + *p = line[offset]; + p++; + offset++; + } + if(line[offset] != ')') + goto syntax_error; + *p = 0; + offset++; + stmt->toks[stmt->ntoks].tag = LParTag; + stmt->toks[stmt->ntoks].stmt = *lexline(buf); + stmt->ntoks++; + stmt->toks[stmt->ntoks].tag = RParTag; }else if(p = runestrchr(primfuncnames, line[offset])){ stmt->toks[stmt->ntoks].tag = FunctionTag; stmt->toks[stmt->ntoks].func.type = FunctypePrim; |