feat: implement math in compiler

This commit is contained in:
samsonium
2026-10-11 02:10:54 +03:00
parent 981603105b
commit b9c43c6ad2
8 changed files with 506 additions and 83 deletions
+58 -8
View File
@@ -1,5 +1,7 @@
#include "compiler/fzl_token.h"
#include <compiler/fzl_reader.h>
#include <stdbool.h>
#include <stddef.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
@@ -97,6 +99,44 @@ fzl_token_t *parse_string_literal(fzl_reader_t *reader)
return tok;
}
// Parse numeric literal
fzl_token_t *parse_number(fzl_reader_t *reader)
{
if (!reader)
return NULL;
size_t size = 0;
size_t lpos = reader->position;
do
{
size++;
lpos++;
} while ((reader->source[lpos] >= '0' && reader->source[lpos] <= '9') &&
lpos < reader->size);
char *value = malloc(size * sizeof(char) + 1);
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);
free(value);
if (!tok)
return NULL;
reader->position += 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);
}
int fzl_read(fzl_reader_t *reader)
{
if (reader->position >= reader->size)
@@ -117,17 +157,27 @@ int fzl_read(fzl_reader_t *reader)
if (curr == '\'' || curr == '"')
token = parse_string_literal(reader);
else if (curr == '(')
{
token = fzl_mktoken(FZL_TOKTYPE_LPAIR, p, p, NULL, 0);
reader->position++;
}
token = add_single(reader, FZL_TOKTYPE_LPAREN);
else if (curr == ')')
{
token = fzl_mktoken(FZL_TOKTYPE_RPAIR, p, p, NULL, 0);
reader->position++;
}
token = add_single(reader, FZL_TOKTYPE_RPAREN);
else if (curr == ',')
token = add_single(reader, FZL_TOKTYPE_COMMA);
else if (curr == '*')
token = add_single(reader, FZL_TOKTYPE_STAR);
else if (curr == '/')
token = add_single(reader, FZL_TOKTYPE_SLASH);
else if (curr == '+')
token = add_single(reader, FZL_TOKTYPE_PLUS);
else if (curr == '-')
token = add_single(reader, FZL_TOKTYPE_MINUS);
else if (curr == '^')
token = add_single(reader, FZL_TOKTYPE_CARET);
else if (curr == '%')
token = add_single(reader, FZL_TOKTYPE_PERCENT);
else if (curr >= 'A' && curr <= 'Z' || curr >= 'a' && curr <= 'z')
token = parse_name(reader);
else if (curr >= '0' && curr <= '9')
token = parse_number(reader);
else
{
sprintf(last_err, "undefined token '%c'", curr);