Add evaluator with environment and file-based execution

Implements recursive AST evaluator with variable environment,
reads .j files from command line args, and executes programs
end-to-end (lexer -> parser -> eval).
This commit is contained in:
Jose Luis Montañes Ojados
2026-02-16 02:08:54 +01:00
parent e2896fac5b
commit 01740d4892
4 changed files with 116 additions and 24 deletions

View File

@@ -1,38 +1,40 @@
#include "frontend/parser.h"
#include "objects/object.h"
#include "vm/eval.h"
int main() {
int main(int argc, char **argv) {
if (argc != 2) {
printf("usage: %s <path to .j file>\n", argv[0]);
exit(1);
}
// Creamos un allocator
JLANG_memory_allocator *allocPtr = JLANG_CreateAllocator();
size_t stringVar1 = obj_new_string(allocPtr, "Hello world!");
size_t floatVar1 = obj_new_float(allocPtr, 3.14);
size_t listVar1 = obj_new_list(allocPtr, 3);
Object *list = (Object *)JLANG_RESOLVE(allocPtr, listVar1);
// Read file from argv
FILE *fptr = fopen(argv[1], "r");
if (fptr == NULL) {
printf("error leyendo: %s\n", argv[1]);
exit(1);
}
size_t *items = (size_t *)JLANG_RESOLVE(allocPtr, list->data.list_val.items);
items[0] = floatVar1;
items[1] = stringVar1;
items[2] = listVar1;
fseek(fptr, 0, SEEK_END); // ir al final
long length = ftell(fptr); // cuántos bytes tiene
fseek(fptr, 0, SEEK_SET); // volver al inicio
char *buff = malloc(length + 1);
size_t bytesRead = fread(buff, 1, length, fptr);
buff[bytesRead] = '\0';
obj_print(allocPtr, listVar1, "");
fclose(fptr);
obj_free(allocPtr, stringVar1);
stringVar1 = obj_new_string(allocPtr, "Hola Mundo!");
items[1] = stringVar1;
items[2] = stringVar1;
obj_print(allocPtr, listVar1, "");
JLANG_visualize(allocPtr);
printf("%s\n", buff);
// Lexer test
int totalTokens = 0;
Token *tokens = tokenize("x = 10\ny = 5\nz = x + y\nprint z", &totalTokens);
Token *tokens = tokenize(buff, &totalTokens);
printf("totalTokens=%d\n", totalTokens);
ASTNode* block = parse(tokens, totalTokens);
ASTNode *block = parse(tokens, totalTokens);
ast_debug(block);
Environment env = {0};
eval(block, &env, allocPtr);
return 0;
}