summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lex.c9
-rw-r--r--main.c7
-rw-r--r--test.lang8
3 files changed, 21 insertions, 3 deletions
diff --git a/lex.c b/lex.c
index 7a1d345..12cd284 100644
--- a/lex.c
+++ b/lex.c
@@ -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) {
diff --git a/main.c b/main.c
index 59a41a2..e8df555 100644
--- a/main.c
+++ b/main.c
@@ -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);
}
}
diff --git a/test.lang b/test.lang
index 7559516..44c3cf4 100644
--- a/test.lang
+++ b/test.lang
@@ -1,3 +1,11 @@
+/* comments! */
+
+/*
+ * var f proc(i32)
+ * var g func(i32) i32
+ * let x = g
+ */
+
proc main {
return 1
}