diff options
| -rw-r--r-- | bootstrap/cgen.c | 2 | ||||
| -rw-r--r-- | src/all.hff | 4 | ||||
| -rw-r--r-- | src/parse.cff | 33 |
3 files changed, 31 insertions, 8 deletions
diff --git a/bootstrap/cgen.c b/bootstrap/cgen.c index baf8999..b164905 100644 --- a/bootstrap/cgen.c +++ b/bootstrap/cgen.c @@ -215,7 +215,7 @@ genexpr(struct expr *ex) { pri("(%e %c %e)", ex->binop.lhs, ex->binop.op, ex->binop.rhs); break; case Econd: - pri("(%e) ? (%e) : (%e)", ex->cond.test, ex->cond.t, ex->cond.f); + pri("((%e) ? (%e) : (%e))", ex->cond.test, ex->cond.t, ex->cond.f); break; case Ecall: pri("%e(", ex->call.callee); 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<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", |