aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorlemon <lsof@mailbox.org>2022-08-13 07:27:37 +0200
committerlemon <lsof@mailbox.org>2022-08-13 07:27:37 +0200
commit62132ecc8d032ef251d6b54177414a9ba29e8610 (patch)
treed16f27f85c4dea8c36c70b7125b14b32032ce5ae
parent58af6dcf569c7f83b317d30f8dd85d96d314d785 (diff)
fix cgen cond
-rw-r--r--bootstrap/cgen.c2
-rw-r--r--src/all.hff4
-rw-r--r--src/parse.cff33
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",