102 lines
3.9 KiB
C
102 lines
3.9 KiB
C
#include "compiler/fzl_token.h"
|
|
#include <compiler/fzl_reader.h>
|
|
#include <compiler/internals/reader.h>
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
|
|
// Try parse name
|
|
fzl_token_t *rd_name(fzl_reader_t *reader)
|
|
{
|
|
size_t lpos = reader->position;
|
|
size_t size = 0;
|
|
|
|
do
|
|
{
|
|
lpos++;
|
|
size++;
|
|
} while ((reader->source[lpos] >= 'A' && reader->source[lpos] <= 'Z') ||
|
|
(reader->source[lpos] >= 'a' && reader->source[lpos] <= 'z') ||
|
|
(reader->source[lpos] >= '0' && reader->source[lpos] <= '9') ||
|
|
(reader->source[lpos] == '_'));
|
|
|
|
char *value = malloc(size + 1);
|
|
memcpy(value, reader->source + reader->position, size);
|
|
value[size] = '\0';
|
|
|
|
size_t start = reader->position;
|
|
move(reader, size);
|
|
|
|
fzl_token_t *tok;
|
|
fzl_file_loc l;
|
|
bool ok = fzl_linked_getpos(reader->linked, start, &l);
|
|
if (!ok)
|
|
{
|
|
snprintf(last_err, sizeof(last_err), "failed to locate line:col");
|
|
return NULL;
|
|
}
|
|
|
|
if (strcmp(value, "class") == 0)
|
|
tok =
|
|
fzl_mktoken(FZL_TOKTYPE_CLASS, l.line, l.col, value, size, l.filename);
|
|
else if (strcmp(value, "import") == 0)
|
|
tok =
|
|
fzl_mktoken(FZL_TOKTYPE_IMPORT, l.line, l.col, value, size, l.filename);
|
|
else if (strcmp(value, "extern") == 0)
|
|
tok =
|
|
fzl_mktoken(FZL_TOKTYPE_EXTERN, l.line, l.col, value, size, l.filename);
|
|
else if (strcmp(value, "type") == 0)
|
|
tok = fzl_mktoken(FZL_TOKTYPE_TYPEDEF, l.line, l.col, value, size,
|
|
l.filename);
|
|
else if (strcmp(value, "handle") == 0)
|
|
tok =
|
|
fzl_mktoken(FZL_TOKTYPE_HANDLE, l.line, l.col, value, size, l.filename);
|
|
else if (strcmp(value, "struct") == 0)
|
|
tok =
|
|
fzl_mktoken(FZL_TOKTYPE_STRUCT, l.line, l.col, value, size, l.filename);
|
|
else if (strcmp(value, "ref") == 0)
|
|
tok = fzl_mktoken(FZL_TOKTYPE_REFERENCE, l.line, l.col, value, size,
|
|
l.filename);
|
|
else if (strcmp(value, "out") == 0)
|
|
tok = fzl_mktoken(FZL_TOKTYPE_OUT, l.line, l.col, value, size, l.filename);
|
|
else if (strcmp(value, "for") == 0)
|
|
tok = fzl_mktoken(FZL_TOKTYPE_FOR, l.line, l.col, value, size, l.filename);
|
|
else if (strcmp(value, "while") == 0)
|
|
tok =
|
|
fzl_mktoken(FZL_TOKTYPE_WHILE, l.line, l.col, value, size, l.filename);
|
|
else if (strcmp(value, "break") == 0)
|
|
tok =
|
|
fzl_mktoken(FZL_TOKTYPE_BREAK, l.line, l.col, value, size, l.filename);
|
|
else if (strcmp(value, "new") == 0)
|
|
tok = fzl_mktoken(FZL_TOKTYPE_NEW, l.line, l.col, value, size, l.filename);
|
|
else if (strcmp(value, "fn") == 0)
|
|
tok = fzl_mktoken(FZL_TOKTYPE_FUNCTION, l.line, l.col, value, size,
|
|
l.filename);
|
|
else if (strcmp(value, "return") == 0)
|
|
tok =
|
|
fzl_mktoken(FZL_TOKTYPE_RETURN, l.line, l.col, value, size, l.filename);
|
|
else if (strcmp(value, "if") == 0)
|
|
tok = fzl_mktoken(FZL_TOKTYPE_IF, l.line, l.col, value, size, l.filename);
|
|
else if (strcmp(value, "else") == 0)
|
|
tok = fzl_mktoken(FZL_TOKTYPE_ELSE, l.line, l.col, value, size, l.filename);
|
|
else if (strcmp(value, "true") == 0 || strcmp(value, "false") == 0)
|
|
tok = fzl_mktoken(FZL_TOKTYPE_BOOL_LITERAL, l.line, l.col, value, size,
|
|
l.filename);
|
|
else if (strcmp(value, "null") == 0)
|
|
tok = fzl_mktoken(FZL_TOKTYPE_NULL_LITERAL, l.line, l.col, value, size,
|
|
l.filename);
|
|
else if (strcmp(value, "str") == 0 || strcmp(value, "char") == 0 ||
|
|
strcmp(value, "bool") == 0 || strcmp(value, "uint") == 0 ||
|
|
strcmp(value, "int") == 0 || strcmp(value, "i8") == 0 ||
|
|
strcmp(value, "i16") == 0 || strcmp(value, "i32") == 0 ||
|
|
strcmp(value, "i64") == 0 || strcmp(value, "u8") == 0 ||
|
|
strcmp(value, "u16") == 0 || strcmp(value, "u32") == 0 ||
|
|
strcmp(value, "u64") == 0)
|
|
tok = fzl_mktoken(FZL_TOKTYPE_TYPE, l.line, l.col, value, size, l.filename);
|
|
else
|
|
tok = fzl_mktoken(FZL_TOKTYPE_NAME, l.line, l.col, value, size, l.filename);
|
|
free(value);
|
|
|
|
return tok;
|
|
}
|