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
+10 -10
View File
@@ -4,17 +4,17 @@
// Available opcodes
typedef enum
{
FZL_OPCODE_LOADCONST, // Load const into T (temp) reg
FZL_OPCODE_CALL_BUILTIN, // Call builtin function
FZL_OPCODE_PUSHNUM, // Push number into stack
FZL_OPCODE_LOADCONST = 0xF00001, // Load const into T (temp) reg
FZL_OPCODE_CALL_BUILTIN = 0xF00002, // Call builtin function
FZL_OPCODE_PUSHNUM = 0xF00003, // Push number into stack
FZL_OPCODE_ADD, // Sum two numbers in arg strack
FZL_OPCODE_SUB, // Subract two numbers in arg stack
FZL_OPCODE_MUL, // Multiply two numbers in arg stack
FZL_OPCODE_DIV, // Divide two numbers in arg stack
FZL_OPCODE_POW, // Power first number in arg stack by second
FZL_OPCODE_MOD, // Get module of two numbers in arg stack
FZL_OPCODE_NEG, // Negotiate number in arg stack
FZL_OPCODE_ADD = 0xA00001, // Sum two numbers in arg strack
FZL_OPCODE_SUB = 0xA00002, // Subract two numbers in arg stack
FZL_OPCODE_MUL = 0xA00003, // Multiply two numbers in arg stack
FZL_OPCODE_DIV = 0xA00004, // Divide two numbers in arg stack
FZL_OPCODE_POW = 0xA00005, // Power first number in arg stack by second
FZL_OPCODE_MOD = 0xA00006, // Get module of two numbers in arg stack
FZL_OPCODE_NEG = 0xA00007, // Negotiate number in arg stack
} fzl_opcode_t;
#endif // FZL_OPCODES_H
+16 -1
View File
@@ -3,8 +3,23 @@
typedef enum
{
FZL_TYPE_NULL,
FZL_TYPE_STRING,
FZL_TYPE_NUMBER
FZL_TYPE_CHAR,
FZL_TYPE_INT8,
FZL_TYPE_UINT8,
FZL_TYPE_INT16,
FZL_TYPE_UINT16,
FZL_TYPE_INT32,
FZL_TYPE_UINT32,
FZL_TYPE_INT64,
FZL_TYPE_UINT64,
FZL_TYPE_INT, // machine word int
FZL_TYPE_UINT, // machine word unsigned int
FZL_TYPE_BOOL
} fzl_type_t;
#endif // FZL_TYPES_H
+42
View File
@@ -0,0 +1,42 @@
#ifndef FZL_VALUE_H
#define FZL_VALUE_H
#include <common/fzl_types.h>
#include <stdbool.h>
#include <stddef.h>
#include <stdint.h>
// Value container descriptor
typedef struct
{
fzl_type_t type;
union
{
struct
{
const char *value;
size_t length;
} s;
char c;
bool b;
int8_t i8;
uint8_t u8;
int16_t i16;
uint16_t u16;
int32_t i32;
uint32_t u32;
int64_t i64;
uint64_t u64;
intptr_t i;
uintptr_t u;
} as;
} fzl_value_t;
#endif // FZL_VALUE_H
+4 -1
View File
@@ -21,7 +21,10 @@ typedef enum
FZL_NODETYPE_MOD,
FZL_NODETYPE_UNARY_PLUS,
FZL_NODETYPE_UNARY_MINUS
FZL_NODETYPE_UNARY_MINUS,
FZL_NODETYPE_DECLARATION,
FZL_NODETYPE_ASSIGN
} fzl_nodetype_t;
// AST node descriptor
+3 -1
View File
@@ -21,8 +21,10 @@ typedef struct
char *source;
size_t size;
size_t position;
bool at_end;
size_t line_start;
size_t line_n;
} fzl_reader_t;
// Allocate new reader
+7 -3
View File
@@ -9,11 +9,13 @@
typedef enum
{
FZL_TOKTYPE_NAME, // abc
FZL_TOKTYPE_TYPE, // i16
FZL_TOKTYPE_LPAREN, // (
FZL_TOKTYPE_RPAREN, // )
FZL_TOKTYPE_COMMA, // ,
FZL_TOKTYPE_DOT, // .
FZL_TOKTYPE_STR_LITERAL, // ""
FZL_TOKTYPE_NUM_LITERAL, // 123
@@ -24,21 +26,23 @@ typedef enum
FZL_TOKTYPE_MINUS, // -
FZL_TOKTYPE_CARET, // ^
FZL_TOKTYPE_PERCENT, // %
FZL_TOKTYPE_EQ // =
} fzl_toktype_t;
// Token descriptor
typedef struct
{
fzl_toktype_t type;
uint16_t i0;
uint16_t i1;
size_t ln;
size_t cn;
bool store_value;
void *value;
uint16_t value_sz;
} fzl_token_t;
// Allocate new token
fzl_token_t *fzl_mktoken(const fzl_toktype_t type, uint16_t from, uint16_t to,
fzl_token_t *fzl_mktoken(const fzl_toktype_t type, size_t line, size_t col,
void *value, size_t value_sz);
// Free token and its contents
+11
View File
@@ -2,10 +2,21 @@
#define FZL_WALKER_H
#include <common/fzl_opcodes.h>
#include <common/fzl_types.h>
#include <compiler/fzl_parser.h>
#include <compiler/utils/fzl_const_pool.h>
#include <stdbool.h>
#include <stddef.h>
// Internal walk function result
typedef struct
{
fzl_type_t type;
char *error_msg;
bool error;
} fzl_walk_res_t;
// Walker descriptor
typedef struct
{
+11 -2
View File
@@ -1,6 +1,7 @@
#ifndef FZL_VM_H
#define FZL_VM_H
#include <common/fzl_value.h>
#include <compiler/utils/fzl_const_pool.h> // NOTE: move outside compiler scope to common
#include <stddef.h>
#include <stdint.h>
@@ -16,8 +17,16 @@ typedef struct
size_t ip;
fzl_const_t stack[256];
size_t stack_top;
// Data stack
fzl_value_t dstack[256];
size_t dtop;
// Call stack
size_t cstack[256];
size_t ctop;
// Environment stack
// TODO: implement `estack` and `etop`
} fzl_vm_t;
// Allocate FZL VM