diff options
Diffstat (limited to 'src/parse.cff')
| -rw-r--r-- | src/parse.cff | 23 |
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 { |