diff options
| author | 2022-08-13 07:27:37 +0200 | |
|---|---|---|
| committer | 2022-08-13 07:27:37 +0200 | |
| commit | 62132ecc8d032ef251d6b54177414a9ba29e8610 (patch) | |
| tree | d16f27f85c4dea8c36c70b7125b14b32032ce5ae /src/parse.cff | |
| parent | 58af6dcf569c7f83b317d30f8dd85d96d314d785 (diff) | |
fix cgen cond
Diffstat (limited to 'src/parse.cff')
| -rw-r--r-- | src/parse.cff | 33 |
1 files changed, 26 insertions, 7 deletions
diff --git a/src/parse.cff b/src/parse.cff index 07158fb..9181e70 100644 --- a/src/parse.cff +++ b/src/parse.cff @@ -148,7 +148,8 @@ static keyword2str []*const u8 = { }; fn str2keyword(s *const u8) int { - let i = 0, j = keyword2str.#len - 1; + let i = 0zs, + j = keyword2str.#len - 1; while i <= j { let k = (j + i) / 2; let cmp = strcmp(keyword2str[k], s); @@ -174,6 +175,7 @@ fn readnumber(s *const u8) Option<Tok> { suffix *const u8 = #null; for let i = 0; (c = s[i]) != 0; ++i { + printf("<%c>\n",c); if i == 0 and c == '0' { --nused; } @@ -201,7 +203,7 @@ fn readnumber(s *const u8) Option<Tok> { acc = (acc * base) + (c <= '9' ? c - '0' : (c - 'a') + 10); } } - + let tok = Tok {}; if flt { tok.t = :flo; @@ -264,16 +266,33 @@ fn lex(P *Parser) Tok { switch { case streq(s, "#"); tok.t = '#'; + case streq(s, "#t") or streq(s, "#f"); + tok.t = :bool; + tok.u.bool = s[1] == 't'; + case streq(s, "#null"); + tok.t = :null; + case streq(s, "##"); + tok.t = '##'; + case streq(s, "#len"); + tok.t = '#len'; + case streq(s, "#tag"); + tok.t = '#tag'; + case streq(s, "#?"); + tok.t = '#?'; + case s[0] == '#' and s[1] == '\''; + tok.t = :label; + tok.u.str = spanz(internstr(s)); case else - fatal(P, P.tokloc, "invalid #keyword"); + fatal(P, P.tokloc, "invalid #keyword `%s'", s); } + return tok; } if c == '"' or c == '\'' { chr(P); - let delim = c; - let str Vec<u8> = {}; - let c u8 #?; - let i = 0z; + let delim = c, + str Vec<u8> = {}, + c u8 #?, + i = 0z; while (c = chr(P)) != delim { if c == 0 or c == '\n' { fatal(P, P.tokloc, "unterminated %s literal", |