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
+12 -3
View File
@@ -4,9 +4,18 @@
// Available opcodes
typedef enum
{
FZL_OPCODE_LOADCONST, // Load const into T (temp) reg
FZL_OPCODE_PUSHARG, // Push argument from T into args stack
FZL_OPCODE_CALL_BUILTIN // Call builtin function
FZL_OPCODE_LOADCONST, // Load const into T (temp) reg
FZL_OPCODE_PUSHARG, // Push argument from T into args stack
FZL_OPCODE_CALL_BUILTIN, // Call builtin function
FZL_OPCODE_PUSHNUM, // 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_t;
#endif // FZL_OPCODES_H
+34
View File
@@ -11,6 +11,17 @@ typedef enum
FZL_NODETYPE_BLOCK,
FZL_NODETYPE_CALL,
FZL_NODETYPE_LITERAL,
FZL_NODETYPE_IDENTIFIER,
FZL_NODETYPE_ADD,
FZL_NODETYPE_SUB,
FZL_NODETYPE_MUL,
FZL_NODETYPE_DIV,
FZL_NODETYPE_POW,
FZL_NODETYPE_MOD,
FZL_NODETYPE_UNARY_PLUS,
FZL_NODETYPE_UNARY_MINUS
} fzl_nodetype_t;
// AST node descriptor
@@ -23,11 +34,34 @@ typedef struct fzl_node
union
{
// Array of nested nodes (for blocks, etc)
struct
{
struct fzl_node **entries;
size_t entry_count;
} list;
// Call data
struct
{
struct fzl_node *callee;
struct fzl_node **args;
size_t args_count;
} call;
// Binary operations
struct
{
struct fzl_node *left;
struct fzl_node *right;
} binary_op;
// Unary operations
struct
{
struct fzl_node *operand;
} unary_op;
};
} fzl_node_t;
+16 -5
View File
@@ -8,11 +8,22 @@
// Token type
typedef enum
{
FZL_TOKTYPE_NAME,
FZL_TOKTYPE_LPAIR,
FZL_TOKTYPE_RPAIR,
FZL_TOKTYPE_COMMA,
FZL_TOKTYPE_STR_LITERAL
FZL_TOKTYPE_NAME, // abc
FZL_TOKTYPE_LPAREN, // (
FZL_TOKTYPE_RPAREN, // )
FZL_TOKTYPE_COMMA, // ,
FZL_TOKTYPE_STR_LITERAL, // ""
FZL_TOKTYPE_NUM_LITERAL, // 123
FZL_TOKTYPE_STAR, // *
FZL_TOKTYPE_SLASH, // /
FZL_TOKTYPE_PLUS, // +
FZL_TOKTYPE_MINUS, // -
FZL_TOKTYPE_CARET, // ^
FZL_TOKTYPE_PERCENT, // %
} fzl_toktype_t;
// Token descriptor