feat: implement conditions

This commit is contained in:
samsonium
2026-10-14 19:56:27 +03:00
parent 4a908f9fd8
commit 83ff0b5774
11 changed files with 731 additions and 25 deletions
+23 -7
View File
@@ -7,6 +7,7 @@ typedef enum
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_PUSHBOOL = 0xF00004, // Push boolean into stack
FZL_OPCODE_MK_ENVTABLE = 0xF10001, // Allocate new environment table
FZL_OPCODE_RM_ENVTABLE = 0xF10002, // Free environment table
@@ -14,13 +15,28 @@ typedef enum
FZL_OPCODE_LOOKUP_ENV = 0xF10004, // Lookup name in environment table
FZL_OPCODE_WRITE = 0xF10005, // Wirte into variable
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_JMP = 0xF20001, // Jump to specified IP address
FZL_OPCODE_JZ = 0xF20002, // Jump if top value in dstack is zero
FZL_OPCODE_ADD = 0xA00001, // Sum two numbers in dstack
FZL_OPCODE_SUB = 0xA00002, // Subract two numbers in dstack
FZL_OPCODE_MUL = 0xA00003, // Multiply two numbers in dstack
FZL_OPCODE_DIV = 0xA00004, // Divide two numbers in dstack
FZL_OPCODE_POW = 0xA00005, // Power first number in dstack by second
FZL_OPCODE_MOD = 0xA00006, // Get module of two numbers in dstack
FZL_OPCODE_NEG = 0xA00007, // Negotiate number in dstack
FZL_OPCODE_CMP_EQ = 0xB00001, // Equal
FZL_OPCODE_CMP_NEQ = 0xB00002, // Not equal
FZL_OPCODE_CMP_LT = 0xB00003, // Less than
FZL_OPCODE_CMP_LTEQ = 0xB00004, // Less than or equal
FZL_OPCODE_CMP_GT = 0xB00005, // Greater than
FZL_OPCODE_CMP_GTEQ = 0xB00006, // Greater than or equal
FZL_OPCODE_AND = 0xC00001, // A && B
FZL_OPCODE_OR = 0xC00002, // A || B
FZL_OPCODE_NOT = 0xD00001, // !A
} fzl_opcode_t;
#endif // FZL_OPCODES_H
+21
View File
@@ -12,6 +12,7 @@ typedef enum
FZL_NODETYPE_CALL,
FZL_NODETYPE_LITERAL,
FZL_NODETYPE_IDENTIFIER,
FZL_NODETYPE_CONDITIONAL,
FZL_NODETYPE_ADD,
FZL_NODETYPE_SUB,
@@ -23,6 +24,18 @@ typedef enum
FZL_NODETYPE_UNARY_PLUS,
FZL_NODETYPE_UNARY_MINUS,
FZL_NODETYPE_OR,
FZL_NODETYPE_AND,
FZL_NODETYPE_EQUAL,
FZL_NODETYPE_NEQUAL,
FZL_NODETYPE_LESS,
FZL_NODETYPE_LESS_EQUAL,
FZL_NODETYPE_GREATER,
FZL_NODETYPE_GREATER_EQUAL,
FZL_NODETYPE_NOT,
FZL_NODETYPE_DECLARATION,
FZL_NODETYPE_ASSIGN
} fzl_nodetype_t;
@@ -72,6 +85,14 @@ typedef struct fzl_node
fzl_token_t *type;
struct fzl_node *identifier;
} var;
// Conditional blocks
struct
{
struct fzl_node *condition;
struct fzl_node *true_block;
struct fzl_node *else_block;
} cond;
};
} fzl_node_t;
+22 -4
View File
@@ -8,17 +8,35 @@
// Token type
typedef enum
{
FZL_TOKTYPE_IF, // if
FZL_TOKTYPE_ELSE, // else
FZL_TOKTYPE_NAME, // abc
FZL_TOKTYPE_TYPE, // i16
FZL_TOKTYPE_LPAREN, // (
FZL_TOKTYPE_RPAREN, // )
FZL_TOKTYPE_LBRACE, // {
FZL_TOKTYPE_RBRACE, // }
FZL_TOKTYPE_COMMA, // ,
FZL_TOKTYPE_DOT, // .
FZL_TOKTYPE_COMMA, // ,
FZL_TOKTYPE_DOT, // .
FZL_TOKTYPE_SEMICOLON, // ;
FZL_TOKTYPE_STR_LITERAL, // ""
FZL_TOKTYPE_NUM_LITERAL, // 123
FZL_TOKTYPE_STR_LITERAL, // ""
FZL_TOKTYPE_NUM_LITERAL, // 123
FZL_TOKTYPE_BOOL_LITERAL, // true
FZL_TOKTYPE_DAMPERSAND, // &&
FZL_TOKTYPE_DVBAR, // ||
FZL_TOKTYPE_EQEQ, // ==
FZL_TOKTYPE_REQ, // >=
FZL_TOKTYPE_LEQ, // <=
FZL_TOKTYPE_NEQ, // !=
FZL_TOKTYPE_LANGLE, // <
FZL_TOKTYPE_RANGLE, // >
FZL_TOKTYPE_NOT, // !
FZL_TOKTYPE_STAR, // *
FZL_TOKTYPE_SLASH, // /
+3
View File
@@ -30,6 +30,9 @@ typedef struct
fzl_symtable_t *syms[64];
size_t sym_top;
size_t bp_table[64];
size_t bp_top;
} fzl_walker_t;
// Allocate new walker