From dcd33c9578a2b913b6dd60bf2c2607ac5d371a08 Mon Sep 17 00:00:00 2001 From: shabani005 Date: Wed, 5 Nov 2025 23:21:29 +0300 Subject: [PATCH] better structure etc --- builder.c | 2 +- examples/main.hl | 4 ++ parser.c | 119 ------------------------------- simpleparser.c | 150 --------------------------------------- lexer.h => src/lexer.h | 2 +- parser.h => src/parser.h | 16 ++--- vm.c => src/vm.c | 0 7 files changed, 14 insertions(+), 279 deletions(-) create mode 100644 examples/main.hl delete mode 100644 parser.c delete mode 100644 simpleparser.c rename lexer.h => src/lexer.h (99%) rename parser.h => src/parser.h (94%) rename vm.c => src/vm.c (100%) diff --git a/builder.c b/builder.c index 49fb867..ee47998 100644 --- a/builder.c +++ b/builder.c @@ -8,7 +8,7 @@ int main(int argc, char **argv){ nb_append(&cmd, "gcc"); nb_append(&cmd, "-Wall -Wextra"); - nb_append(&cmd, "vm.c"); + nb_append(&cmd, "./src/vm.c"); nb_append(&cmd, "-o vm"); nb_cmd(&cmd); diff --git a/examples/main.hl b/examples/main.hl new file mode 100644 index 0000000..031ff14 --- /dev/null +++ b/examples/main.hl @@ -0,0 +1,4 @@ + +print(((1+2923)*3)/5) + +print("hello world") diff --git a/parser.c b/parser.c deleted file mode 100644 index a2c9177..0000000 --- a/parser.c +++ /dev/null @@ -1,119 +0,0 @@ -#include -#include -#include -#define NB_IMPLEMENTATION -#include "lexer.h" -#include "nb.h" - -typedef struct { - Token *left; - Token *right; - size_t prec; - symbols op; -} ASTNode; - -typedef struct { - ASTNode *nodes; - size_t size; -} ASTTree; - -Token *copy_single_token(const Token *src, size_t i) { - Token *t = calloc(1, sizeof(Token)); - assert(t); - - t->size = 1; - t->type = malloc(sizeof(int)); - t->text = malloc(sizeof(char*)); - assert(t->type && t->text); - - t->type[0] = src->type[i]; - t->text[0] = strdup(src->text[i]); - - return t; -} - -ssize_t find_prev_token(const Token *tok, size_t start) { - for (ssize_t i = (ssize_t)start; i >= 0; --i) { - if (tok->type[i] != TOKEN_SPACE && - tok->type[i] != TOKEN_NEWLINE && - tok->type[i] != TOKEN_EOF) { - return i; - } - } - return -1; -} - -ssize_t find_next_token(const Token *tok, size_t start) { - for (size_t i = start; i < tok->size; ++i) { - if (tok->type[i] != TOKEN_SPACE && - tok->type[i] != TOKEN_NEWLINE && - tok->type[i] != TOKEN_EOF) { - return i; - } - } - return -1; -} - - -size_t token_precedence(Token token, size_t idx){ - switch (token.type[idx]) { - case TOKEN_PLUS: - return 1; - break; - case TOKEN_MINUS: - return 1; - break; - case TOKEN_MUL: - return 2; - break; - case TOKEN_DIV: - return 3; - break; - - default: - return 0; - break; - } -} - -ASTTree ast_walk(Token token) { - ASTTree ops = {0}; - - ops.nodes = calloc(token.size, sizeof(ASTNode)); - assert(ops.nodes); - - for (size_t i = 0; i < token.size; ++i) { - switch (token_precedence(token, i) > 0) { - case true: { - ssize_t l = find_prev_token(&token, i - 1); - ssize_t r = find_next_token(&token, i + 1); - assert(l >= 0 && r >= 0); - - ASTNode op = {0}; - op.left = copy_single_token(&token, l); - op.right = copy_single_token(&token, r); - op.prec = token_precedence(token, i); - op.op = token.type[i]; - ops.nodes[ops.size++] = op; - break; - } - } - } - - return ops; -} - -int main(int argc, char **argv){ - Token to_tokenize = {0}; - if (argc > 1) { - to_tokenize = tokenize_all(nb_read_file(argv[1])); - } - for (size_t i=0; itext[0], walked.nodes[i].right->text[0], walked.nodes[i].prec); - } - return 0; -} diff --git a/simpleparser.c b/simpleparser.c deleted file mode 100644 index 0fee2fc..0000000 --- a/simpleparser.c +++ /dev/null @@ -1,150 +0,0 @@ -#include "lexer.h" -#include - -typedef struct { - char* left; - char* right; - symbols node; - size_t cursor; - size_t prec; -} ASTNode; - -typedef struct { - ASTNode* nodes; - size_t size; - size_t capacity; -} ASTTree; - -void tree_init(ASTTree* a){ - if (a->capacity == 0) a->capacity = 128; - a->nodes = malloc(sizeof(*a->nodes)*a->capacity); -} - -void construct_nodes(ASTTree* a, Token t){ - if (a->capacity == 0) tree_init(a); - if (a->size >= a->capacity) { - a->capacity *=2; - a->nodes = realloc(a->nodes, sizeof(*a->nodes)*a->capacity); - } - size_t nc = 0; - for (size_t i=0; i 0 && i < t.size - 1); - a->nodes[nc].node = TOKEN_PLUS; - a->nodes[nc].left = t.text[i-1]; - a->nodes[nc].right = t.text[i+1]; - a->nodes[nc].prec = 1; - a->nodes[nc].cursor = nc; - nc++; - break; - case TOKEN_MINUS: - assert(i > 0 && i < t.size - 1); - a->nodes[nc].node = TOKEN_MINUS; - a->nodes[nc].left = t.text[i-1]; - a->nodes[nc].right = t.text[i+1]; - a->nodes[nc].prec = 1; - a->nodes[nc].cursor = nc; - nc++; - break; - case TOKEN_DIV: - assert(i > 0 && i < t.size - 1); - a->nodes[nc].node = TOKEN_DIV; - a->nodes[nc].left = t.text[i-1]; - a->nodes[nc].right = t.text[i+1]; - a->nodes[nc].prec = 2; - a->nodes[nc].cursor = nc; - nc++; - break; - case TOKEN_MUL: - assert(i > 0 && i < t.size - 1); - a->nodes[nc].node = TOKEN_MUL; - a->nodes[nc].left = t.text[i-1]; - a->nodes[nc].right = t.text[i+1]; - a->nodes[nc].prec = 2; - a->nodes[nc].cursor = nc; - nc++; - break; - default: - break; - } - } - a->size = nc; -} - - -// void eval(ASTTree *tree){ -// for (size_t i=0; isize; ++i){ -// ASTNode curr = tree->nodes[i]; -// size_t n = tree->size; -// float total = 0.0f; -// switch (curr.node){ -// case TOKEN_PLUS: -// if (tree->size > 1){ -// for (size_t i=0; isize; ++i){ -// total += atof(tree->nodes[i].left) + atof(tree->nodes[i].right); -// } -// // for (size_t i=0; isize && (tree->size%i != 0); ++i){ -// // total -= atof(tree->nodes[i].right); -// printf("%zu\n", i); -// } - -// printf("%f\n", total); -// break; -// default: -// break; -// } -// } -// } - - -void eval(ASTTree* tree) { - if (!tree || !tree->nodes || tree->size == 0) { - fprintf(stderr, "Invalid or empty ASTTree\n"); - return; - } - - float total = 0.0f; - int initialized = 0; - - for (size_t i = 0; i < tree->size; ++i) { - ASTNode* curr = &tree->nodes[i]; - - switch (curr->node) { - case TOKEN_PLUS: - if (!initialized && curr->left) { - total = atof(curr->left); - initialized = 1; - } - if (curr->right) - total += atof(curr->right); - break; - - - default: - fprintf(stderr, "Unknown token at node %zu\n", i); - break; - } - } - - printf("Result: %.2f\n", total); -} - - -int main(int argc, char** argv){ - // Token tokens = tokenize_all("1+2 3-4 1/2 2*7"); //invalid syntax - Token tokens = tokenize_all("1+2+3+4"); //invalid syntax - ASTTree tree = {0}; - construct_nodes(&tree, tokens); - eval(&tree); - // for (size_t i=0; i