feat+ref: refactor + new types
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user