feat+ref: refactor + new types

This commit is contained in:
samsonium
2026-10-11 08:51:54 +03:00
parent e3b8ec6b7d
commit 83e20d78f3
13 changed files with 532 additions and 341 deletions
+55 -42
View File
@@ -12,22 +12,42 @@ static char last_err[256] = {0};
fzl_reader_t *fzl_mkreader(char *source)
{
fzl_reader_ll_t *first_node = malloc(sizeof(fzl_reader_ll_t));
first_node->token = NULL;
first_node->next = NULL;
first_node->token = NULL;
first_node->next = NULL;
fzl_reader_t *reader = malloc(sizeof(fzl_reader_t));
reader->first = first_node;
reader->last = first_node;
reader->source = source;
reader->size = strlen(source);
reader->position = 0;
reader->at_end = true;
reader->first = first_node;
reader->last = first_node;
reader->source = source;
reader->size = strlen(source);
reader->position = 0;
reader->line_n = 1;
reader->line_start = 0;
return reader;
}
// --- Read zone ---
// Move cursor forward
static size_t move(fzl_reader_t *reader, size_t len)
{
if (!reader)
return 0;
char *src = reader->source;
for (size_t i = 0; i < len; i++)
{
if (src[reader->position + i] == '\n')
{
reader->line_n++;
reader->line_start = reader->position + i + 1;
}
}
return reader->position += len;
}
// Try parse name
fzl_token_t *parse_name(fzl_reader_t *reader)
{
@@ -45,10 +65,10 @@ fzl_token_t *parse_name(fzl_reader_t *reader)
memcpy(value, reader->source + reader->position, size);
size_t start = reader->position;
reader->position += size;
move(reader, size);
fzl_token_t *tok =
fzl_mktoken(FZL_TOKTYPE_NAME, start, reader->position - 1, value, size);
fzl_token_t *tok = fzl_mktoken(FZL_TOKTYPE_NAME, reader->line_n,
start - reader->line_start, value, size);
free(value);
return tok;
@@ -63,7 +83,7 @@ fzl_token_t *parse_string_literal(fzl_reader_t *reader)
if (reader->source[lpos] != '\'' && reader->source[lpos] != '"')
return NULL;
char open_symbol = reader->source[lpos];
char open_symbol = reader->source[lpos];
char close_symbol = '\0';
do
@@ -78,23 +98,27 @@ fzl_token_t *parse_string_literal(fzl_reader_t *reader)
size++;
if (close_symbol != open_symbol)
{
snprintf(last_err, sizeof(last_err), "unterminated string at %ld:%ld",
reader->line_n, reader->position - reader->line_start);
return NULL;
}
if (size == 2)
{
fzl_token_t *tok = fzl_mktoken(FZL_TOKTYPE_STR_LITERAL, reader->position,
reader->position + 1, "", 0);
reader->position += 2;
fzl_token_t *tok =
fzl_mktoken(FZL_TOKTYPE_STR_LITERAL, reader->line_n,
reader->position - reader->line_start, "", 0);
move(reader, 2);
return tok;
}
char *value = malloc(size - 2);
memcpy(value, reader->source + reader->position + 1, size - 2);
fzl_token_t *tok = fzl_mktoken(FZL_TOKTYPE_STR_LITERAL, reader->position,
lpos, value, size - 2);
fzl_token_t *tok = fzl_mktoken(FZL_TOKTYPE_STR_LITERAL, reader->line_n,
lpos - reader->line_start, value, size - 2);
free(value);
reader->position += size;
move(reader, size);
return tok;
}
@@ -119,22 +143,22 @@ fzl_token_t *parse_number(fzl_reader_t *reader)
memcpy(value, reader->source + reader->position, size);
value[size] = '\0';
fzl_token_t *tok =
fzl_mktoken(FZL_TOKTYPE_NUM_LITERAL, reader->position, lpos, value, size);
fzl_token_t *tok = fzl_mktoken(FZL_TOKTYPE_NUM_LITERAL, reader->line_n,
lpos - reader->line_start, value, size);
free(value);
if (!tok)
return NULL;
reader->position += size;
move(reader, size);
return tok;
}
// Add single-char token
fzl_token_t *add_single(fzl_reader_t *reader, fzl_toktype_t type)
{
size_t p = reader->position++;
return fzl_mktoken(type, p, p, NULL, 0);
size_t p = move(reader, 1);
return fzl_mktoken(type, reader->line_n, p - reader->line_start, NULL, 0);
}
int fzl_read(fzl_reader_t *reader)
@@ -180,37 +204,26 @@ int fzl_read(fzl_reader_t *reader)
token = parse_number(reader);
else
{
sprintf(last_err, "undefined token '%c'", curr);
sprintf(last_err, "undefined token '%c' at %ld:%ld", curr, reader->line_n,
p - reader->line_start);
return -1;
}
if (!token)
{
size_t line = 1, linepos = 1;
for (size_t i = 0; i < p; i++)
{
char sym = reader->source[i];
if (sym == '\n')
{
linepos = 1;
line++;
}
else
linepos++;
}
sprintf(last_err, "cannot parse token (%ld:%ld)", line, linepos);
if (!last_err[0])
sprintf(last_err, "cannot parse token at %ld:%ld", reader->line_n,
p - reader->line_start);
return -1;
}
fzl_reader_ll_t *tok_node = malloc(sizeof(fzl_reader_ll_t));
tok_node->token = token;
tok_node->token = token;
reader->last->next = tok_node;
reader->last = tok_node;
reader->last = tok_node;
} while (reader->position < reader->size);
reader->at_end = true;
return 0;
}