✨ comments.
parent
7a10a7f330
commit
d8be5d7b0f
|
@ -20,7 +20,9 @@ struct lexer
|
||||||
void lexer_init(struct lexer* self, char const* source);
|
void lexer_init(struct lexer* self, char const* source);
|
||||||
void lexer_free(struct lexer* self);
|
void lexer_free(struct lexer* self);
|
||||||
|
|
||||||
|
bool lexer_is_at_end(struct lexer* self);
|
||||||
void lexer_skip_spaces(struct lexer* self);
|
void lexer_skip_spaces(struct lexer* self);
|
||||||
|
void lexer_skip_comments(struct lexer* self);
|
||||||
bool lexer_is_sep(struct lexer* self, size_t index);
|
bool lexer_is_sep(struct lexer* self, size_t index);
|
||||||
|
|
||||||
bool lexer_next_is(struct lexer* self, TokenKind kind);
|
bool lexer_next_is(struct lexer* self, TokenKind kind);
|
||||||
|
|
|
@ -31,6 +31,13 @@ void lexer_free(struct lexer* self)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool lexer_is_at_end(struct lexer* self)
|
||||||
|
{
|
||||||
|
assert(self);
|
||||||
|
lexer_skip_comments(self);
|
||||||
|
return self->context.cursor >= self->len;
|
||||||
|
}
|
||||||
|
|
||||||
void lexer_skip_spaces(struct lexer* self)
|
void lexer_skip_spaces(struct lexer* self)
|
||||||
{
|
{
|
||||||
assert(self);
|
assert(self);
|
||||||
|
@ -47,6 +54,25 @@ void lexer_skip_spaces(struct lexer* self)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void lexer_skip_comments(struct lexer* self)
|
||||||
|
{
|
||||||
|
assert(self);
|
||||||
|
|
||||||
|
lexer_skip_spaces(self);
|
||||||
|
|
||||||
|
while (self->context.cursor < self->len
|
||||||
|
&& self->source[self->context.cursor] == '#')
|
||||||
|
{
|
||||||
|
while (self->context.cursor < self->len
|
||||||
|
&& self->source[self->context.cursor] != '\n')
|
||||||
|
{
|
||||||
|
self->context.cursor++;
|
||||||
|
}
|
||||||
|
|
||||||
|
lexer_skip_spaces(self);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
bool lexer_is_sep(struct lexer* self, size_t index)
|
bool lexer_is_sep(struct lexer* self, size_t index)
|
||||||
{
|
{
|
||||||
if (index >= self->len) { return true; }
|
if (index >= self->len) { return true; }
|
||||||
|
@ -98,13 +124,13 @@ struct token* lexer_try_new_next(struct lexer* self)
|
||||||
{
|
{
|
||||||
assert(self);
|
assert(self);
|
||||||
|
|
||||||
|
lexer_skip_comments(self);
|
||||||
|
|
||||||
if (!errors_ok())
|
if (!errors_ok())
|
||||||
{
|
{
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
lexer_skip_spaces(self);
|
|
||||||
|
|
||||||
struct token* tok = NULL;
|
struct token* tok = NULL;
|
||||||
|
|
||||||
if ( (tok=lexer_try_scan_int(self)) )
|
if ( (tok=lexer_try_scan_int(self)) )
|
||||||
|
@ -128,6 +154,7 @@ struct token* lexer_try_new_next(struct lexer* self)
|
||||||
SK_SCAN_KEYWORD("or", TOKEN_OR, NULL);
|
SK_SCAN_KEYWORD("or", TOKEN_OR, NULL);
|
||||||
SK_SCAN_KEYWORD("not", TOKEN_NOT, NULL);
|
SK_SCAN_KEYWORD("not", TOKEN_NOT, NULL);
|
||||||
|
|
||||||
|
|
||||||
if (self->context.cursor < self->len)
|
if (self->context.cursor < self->len)
|
||||||
{
|
{
|
||||||
struct str str;
|
struct str str;
|
||||||
|
|
|
@ -50,10 +50,9 @@ struct node* parser_try_root(struct parser* self)
|
||||||
|
|
||||||
node_init(node, NODE_ROOT, tok);
|
node_init(node, NODE_ROOT, tok);
|
||||||
|
|
||||||
while (true)
|
while (!lexer_is_at_end(&self->lexer))
|
||||||
{
|
{
|
||||||
struct node* expr = SK_TRY(parser_try_expr);
|
struct node* expr = SK_TRY(parser_try_expr);
|
||||||
if (!expr) { break; }
|
|
||||||
|
|
||||||
node_push_new_child(node, expr);
|
node_push_new_child(node, expr);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue