From 255aa20f6d68a71c9eedd47998480a8b14a3be36 Mon Sep 17 00:00:00 2001 From: dec05eba Date: Sat, 9 Mar 2019 11:37:23 +0100 Subject: Add single line, multiline comments --- src/ast.c | 1 + src/tokenizer.c | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++------ 2 files changed, 52 insertions(+), 6 deletions(-) (limited to 'src') diff --git a/src/ast.c b/src/ast.c index 2154531..5314e90 100644 --- a/src/ast.c +++ b/src/ast.c @@ -115,6 +115,7 @@ void scope_resolve(Scope *self) { static void lhs_resolve(LhsExpr *self) { amal_log_debug("Lhs resolve var name: %.*s", self->var_name.size, self->var_name.data); + /*ast_resolve(&self->rhs_expr);*/ } void ast_resolve(Ast *self) { diff --git a/src/tokenizer.c b/src/tokenizer.c index 9077bb9..b2bd6c5 100644 --- a/src/tokenizer.c +++ b/src/tokenizer.c @@ -20,6 +20,11 @@ static int isAlphaDigit(int c) { return isAlpha(c) || isDigit(c); } +static int tokenizer_get_start_of_line_from_index(Tokenizer *self, int index); +static int tokenizer_get_end_of_line_from_index(Tokenizer *self, int index); +/* Returns -1 if end of multiline comment was not found */ +static int tokenizer_get_end_of_multiline_comment(Tokenizer *self, int index); + int tokenizer_init(Tokenizer *self, ScopedAllocator *allocator, BufferView code, BufferView code_name) { assert(code.size <= INT_MAX); self->code = code; @@ -242,6 +247,23 @@ static CHECK_RESULT int __tokenizer_next(Tokenizer *self, Token *token) { SET_BINOP(BINOP_MUL); } else if(c == '/') { ++self->index; + if(self->index < (int)self->code.size) { + c = tokenizer_get_char(self); + /* Single line comment */ + if(c == '/') { + ++self->index; + self->index = tokenizer_get_end_of_line_from_index(self, self->index); + return __tokenizer_next(self, token); + } else if(c == '*') { + ++self->index; + self->index = tokenizer_get_end_of_multiline_comment(self, self->index); + if(self->index == -1) { + tokenizer_print_error(self, "End of multiline comment not found"); + return TOKENIZER_ERR; + } + return __tokenizer_next(self, token); + } + } SET_BINOP(BINOP_DIV); } else if(c == '=') { ++self->index; @@ -503,10 +525,10 @@ int tokenizer_consume_if(Tokenizer *self, Token expected_token, bool *result) { return TOKENIZER_OK; } -static int tokenizer_get_start_of_line_from_index(Tokenizer *self, int index) { - int c; +int tokenizer_get_start_of_line_from_index(Tokenizer *self, int index) { + char c; while(index >= 0) { - c = self->code.data[(usize)index]; + c = self->code.data[index]; if(c == '\n' || c == '\r') { return index + 1; } @@ -515,10 +537,10 @@ static int tokenizer_get_start_of_line_from_index(Tokenizer *self, int index) { return 0; } -static int tokenizer_get_end_of_line_from_index(Tokenizer *self, int index) { - int c; +int tokenizer_get_end_of_line_from_index(Tokenizer *self, int index) { + char c; while(index < (int)self->code.size) { - c = self->code.data[(usize)index]; + c = self->code.data[index]; if(c == '\n' || c == '\r') break; ++index; @@ -526,6 +548,29 @@ static int tokenizer_get_end_of_line_from_index(Tokenizer *self, int index) { return index; } +int tokenizer_get_end_of_multiline_comment(Tokenizer *self, int index) { + char c; + int comment_count; + comment_count = 1; + + while(index < (int)self->code.size) { + c = self->code.data[index]; + if(c == '*') { + if(index - 1 >= 0 && self->code.data[index - 1] == '/') { + ++comment_count; + } + } else if(c == '/') { + if(index - 1 >= 0 && self->code.data[index - 1] == '*') { + --comment_count; + if(comment_count == 0) + return index + 1; + } + } + ++index; + } + return -1; +} + void tokenizer_print_error(Tokenizer *self, const char *fmt, ...) { va_list args; int line_start; -- cgit v1.2.3