aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/all.hff4
-rw-r--r--src/parse.cff33
2 files changed, 30 insertions, 7 deletions
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",