From 62132ecc8d032ef251d6b54177414a9ba29e8610 Mon Sep 17 00:00:00 2001 From: lemon Date: Sat, 13 Aug 2022 07:27:37 +0200 Subject: fix cgen cond --- src/all.hff | 4 ++++ src/parse.cff | 33 ++++++++++++++++++++++++++------- 2 files changed, 30 insertions(+), 7 deletions(-) (limited to 'src') diff --git a/src/all.hff b/src/all.hff index 895657a..f15df13 100644 --- a/src/all.hff +++ b/src/all.hff @@ -133,3 +133,7 @@ fn bswap64(x u64) u64 { return (as(u64)bswap32(x) << 32) | (bswap32(x >> 32)); } + +fn spanz(x *const u8) [#]const u8 { + return x[0::strlen(x)]; +} 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 { 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 { 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 = {}; - let c u8 #?; - let i = 0z; + let delim = c, + str Vec = {}, + c u8 #?, + i = 0z; while (c = chr(P)) != delim { if c == 0 or c == '\n' { fatal(P, P.tokloc, "unterminated %s literal", -- cgit v1.2.3