#include "../lexer/lexer.h" #include "../parser/parser.h" #include "../semantic/semantic.h" #include "../ir/ir.h" #include "../ir/ir_gen.h" #include "../runtime/runtime.h" #include #include #include static char* read_file(const char *filename) { FILE *file = fopen(filename, "r"); if (!file) return NULL; fseek(file, 0, SEEK_END); long size = ftell(file); fseek(file, 0, SEEK_SET); char *content = malloc(size + 1); size_t read_bytes = fread(content, 1, size, file); (void)read_bytes; content[size] = '\0'; fclose(file); return content; } int main() { char *source = read_file("examples/08_PascalTriangle.java"); if (!source) return 1; RavaLexer_t *lexer = rava_lexer_create(source); RavaParser_t *parser = rava_parser_create(lexer); RavaASTNode_t *ast = rava_parser_parse(parser); if (parser->had_error) { free(source); return 1; } RavaSemanticAnalyzer_t *analyzer = rava_semantic_analyzer_create(); if (!rava_semantic_analyze(analyzer, ast)) { free(source); return 1; } RavaIRGenerator_t *ir_gen = rava_ir_generator_create(analyzer); RavaProgram_t *program = rava_ir_generate(ir_gen, ast); if (!program) { free(source); return 1; } RavaVM_t *vm = rava_vm_create(program); if (!rava_vm_execute(vm, "PascalTriangle", "main")) { printf("Runtime error\n"); rava_vm_destroy(vm); free(source); return 1; } printf("\nCleaning up VM...\n"); fflush(stdout); rava_vm_destroy(vm); printf("Cleaning up program...\n"); fflush(stdout); rava_program_destroy(program); printf("Cleaning up IR generator...\n"); fflush(stdout); rava_ir_generator_destroy(ir_gen); printf("Cleaning up analyzer...\n"); fflush(stdout); rava_semantic_analyzer_destroy(analyzer); printf("Cleaning up AST...\n"); fflush(stdout); rava_ast_node_destroy(ast); printf("Cleaning up parser...\n"); fflush(stdout); rava_parser_destroy(parser); printf("Cleaning up lexer...\n"); fflush(stdout); rava_lexer_destroy(lexer); printf("Freeing source...\n"); fflush(stdout); free(source); printf("Done!\n"); return 0; }