diff options
| -rw-r--r-- | lex.c | 9 | ||||
| -rw-r--r-- | main.c | 7 | ||||
| -rw-r--r-- | test.lang | 8 |
3 files changed, 21 insertions, 3 deletions
@@ -127,10 +127,19 @@ Token ident_to_keyword(Str ident) { #define T(t) (l->tok = t) void lex_next(Lexer *l) { +recurse: int i = l->ofs; + while (i < l->buf.n && is_space(l->buf.s[i])) { i++; } + + if (str_starts(str_skip(l->buf, i), S("/*"))) { + Str f = str_find(str_skip(l->buf, i), S("*/")); + l->ofs = (f.s - l->buf.s) + 2; + goto recurse; + } + int start_ofs = i; l->ident = (Str) { &l->buf.s[start_ofs], 0 }; if (i >= l->buf.n) { @@ -132,19 +132,20 @@ void parse_expr(Lexer *l) { } } -void parse_decl(Lexer *l) { +void parse_toplevel(Lexer *l) { switch (l->tok) { case TOK_PROC: parse_proc(l); break; default: - lex_error(l, LE_ERROR, S("Invalid declaration statement")); + lex_expected(l, TMASK(TOK_PROC)); + break; } } void parse_unit(Lexer *l) { while (l->tok != TOK_EOF) { - parse_decl(l); + parse_toplevel(l); } } @@ -1,3 +1,11 @@ +/* comments! */ + +/* + * var f proc(i32) + * var g func(i32) i32 + * let x = g + */ + proc main { return 1 } |
