101 lines
2.4 KiB
C
101 lines
2.4 KiB
C
#include "../include/data.h"
|
|
#include "../include/define.h"
|
|
#include <string.h>
|
|
|
|
void advance_char(lexer_t *lexer) {
|
|
if (lexer->current_char == '\n') {
|
|
lexer->line++;
|
|
lexer->column = 1;
|
|
} else {
|
|
lexer->column++;
|
|
}
|
|
lexer->pos++;
|
|
lexer->current_char = lexer->input[lexer->pos];
|
|
}
|
|
|
|
void skip_whitespace(lexer_t *lexer) {
|
|
while (isspace(lexer->current_char) && lexer->current_char != '\n') {
|
|
advance_char(lexer);
|
|
}
|
|
}
|
|
|
|
void skip_comment(lexer_t *lexer) {
|
|
if (lexer->current_char == '/' && lexer->input[lexer->pos + 1] == '/') {
|
|
while (lexer->current_char != '\n' && lexer->current_char != '\0') {
|
|
advance_char(lexer);
|
|
}
|
|
}
|
|
}
|
|
|
|
// Node creation functions
|
|
node_t *create_node(node_type_t type) {
|
|
node_t *node = malloc(sizeof(node_t));
|
|
if (!node)
|
|
return NULL;
|
|
|
|
memset(node, 0, sizeof(node_t));
|
|
node->type = type;
|
|
return node;
|
|
}
|
|
|
|
node_t *create_symbol_node(const char *symbol) {
|
|
node_t *node = create_node(NODE_SYMBOL);
|
|
if (node) {
|
|
strncpy(node->data.symbol, symbol, MAX_SYMBOL_LENGTH - 1);
|
|
node->data.symbol[MAX_SYMBOL_LENGTH - 1] = '\0';
|
|
}
|
|
return node;
|
|
}
|
|
|
|
node_t *create_string_node(const char *string) {
|
|
node_t *node = create_node(NODE_STRING);
|
|
if (node) {
|
|
strncpy(node->data.string, string, MAX_STRING_LENGTH - 1);
|
|
node->data.string[MAX_STRING_LENGTH - 1] = '\0';
|
|
}
|
|
return node;
|
|
}
|
|
|
|
node_t *create_number_node(double number) {
|
|
node_t *node = create_node(NODE_NUMBER);
|
|
if (node) {
|
|
node->data.number = number;
|
|
}
|
|
return node;
|
|
}
|
|
|
|
node_t *create_boolean_node(bool value) {
|
|
node_t *node = create_node(NODE_BOOLEAN);
|
|
if (node) {
|
|
node->data.boolean = value;
|
|
}
|
|
return node;
|
|
}
|
|
|
|
node_t *create_function_ref_node(const char *function_name) {
|
|
node_t *node = create_node(NODE_FUNCTION_REF);
|
|
if (node) {
|
|
strncpy(node->data.function_ref, function_name, MAX_SYMBOL_LENGTH - 1);
|
|
node->data.function_ref[MAX_SYMBOL_LENGTH - 1] = '\0';
|
|
}
|
|
return node;
|
|
}
|
|
|
|
node_t *create_function_call_node(const char *function_name) {
|
|
node_t *node = create_node(NODE_FUNCTION_CALL);
|
|
if (node) {
|
|
strncpy(node->data.call.function_name, function_name,
|
|
MAX_SYMBOL_LENGTH - 1);
|
|
node->data.call.function_name[MAX_SYMBOL_LENGTH - 1] = '\0';
|
|
node->data.call.arg_count = 0;
|
|
}
|
|
return node;
|
|
}
|
|
|
|
void add_arg_to_call(node_t *call, node_t *arg) {
|
|
if (call->type == NODE_FUNCTION_CALL &&
|
|
call->data.call.arg_count < MAX_ARGS) {
|
|
call->data.call.args[call->data.call.arg_count++] = arg;
|
|
}
|
|
}
|