aboutsummaryrefslogtreecommitdiff
path: root/src/parse.cff
diff options
context:
space:
mode:
authorlemon <lsof@mailbox.org>2022-08-14 09:25:16 +0200
committerlemon <lsof@mailbox.org>2022-08-14 09:25:16 +0200
commitc129f77ad724aa940b53a125de0e1e4de0ca7240 (patch)
tree57ad369bcfe02d0fb8a311c659e45cf2ae5df075 /src/parse.cff
parent66ed623e65ab9350f08061fe7cf12b989c84f65c (diff)
fix arena
Diffstat (limited to 'src/parse.cff')
-rw-r--r--src/parse.cff23
1 files changed, 20 insertions, 3 deletions
diff --git a/src/parse.cff b/src/parse.cff
index ba8e35d..0843ccf 100644
--- a/src/parse.cff
+++ b/src/parse.cff
@@ -241,7 +241,7 @@ fn lex(P *Parser) Tok {
return tok;
}
}
- if isalpha(c) or c == '_' {
+ if isalpha(c) or c == '_' or c == '$' {
let s [120]u8;
if readtilsep(P, s[0::], #f) < 0 {
fatal(P, tok.loc, "identifier too long");
@@ -250,6 +250,9 @@ fn lex(P *Parser) Tok {
if kw >= 0 {
tok.t = kw;
tok.u.ident = keyword2str[kw];
+ } else if (c == '$') {
+ tok.t = :gensym;
+ tok.u.ident = internstr(&s[1]);
} else {
tok.t = :ident;
tok.u.ident = internstr(s);
@@ -262,6 +265,17 @@ fn lex(P *Parser) Tok {
fatal(P, P.tokloc, "invalid #keyword");
}
switch {
+ case streq(s, "#") and chrpeek(P) == '{';
+ chr(P);
+ let bal = 1;
+ while bal != 0 {
+ switch lex(P).t {
+ case '{'; ++bal;
+ case '}'; --bal;
+ case :eof; fatal(P, tok.loc, "unterminated comment");
+ }
+ }
+ return lex(P);
case streq(s, "#");
tok.t = '#';
case streq(s, "#t") or streq(s, "#f");
@@ -316,7 +330,7 @@ fn lex(P *Parser) Tok {
if delim == '"' {
tok.t = :str;
- tok.u.str = str->compact();
+ tok.u.str = str->move(P.alloc);
} else {
tok.t = :chr;
if str.len == 0 {
@@ -423,12 +437,15 @@ extern fn parse(P *Parser) [#]Decl {
free(ptr);
}
- let alloc = Allocator { #null, &mallocator_allocf, &mallocator_freef };
+ let aralloc = Arena {};
+ let alloc = Allocator { &aralloc, &Arena:allocf, #null };
+ P.alloc = &alloc;
while not P.eof {
let tok = lex(P);
if tok.t == :eof { break; }
efmt("* tok: %qT\n", tok);
}
+ aralloc->destroy();
}
extern fn parser_init(P *Parser, path *const u8) void {