simple bytecode compiler

This commit is contained in:
2025-11-06 10:00:37 +03:00
parent 5ea5cd6f24
commit 4a754d6b16
4 changed files with 79 additions and 32 deletions

View File

@@ -9,12 +9,12 @@ int main(int argc, char **argv){
nb_append(&cmd, "gcc");
nb_append(&cmd, "-Wall -Wextra");
nb_append(&cmd, "-static");
nb_append(&cmd, "./src/vm.c");
nb_append(&cmd, "-o vm");
nb_append(&cmd, "./src/hlc.c");
nb_append(&cmd, "-o hlc");
nb_cmd(&cmd);
nb_append(&cmd, "./vm");
nb_append(&cmd, "./hlc");
for (int i=1; i<argc; ++i){
nb_append(&cmd, argv[i]);
}

View File

@@ -1,4 +1,4 @@
print(((1+2923)*3)/5)
print(((1+29.9)*3)/5)
print("hello world")

51
src/hlc.c Normal file
View File

@@ -0,0 +1,51 @@
#define FG_IMPLEMENTATION
#include "flag.h"
#include "vm.h"
VM global_vm = {0};
void emit_bytecode_call(){
printf("[debug] emit_bytecode_call() triggered\n");
emit_bytecode(&global_vm);
}
void flag_handling(int argc, char** argv){
fg_flags flags = {0};
fg_append_ptr(&flags, "emit-bytecode", emit_bytecode_call);
fg_run(&flags, argc, argv);
}
int main(int argc, char **argv) {
if (argc < 2) {
fprintf(stderr, "Usage: %s <source file>\n", argv[0]);
return 1;
}
char* read = nb_read_file(argv[1]);
//printf("INPUT: %s\n", read);
Token tk = tokenize_all(read);
SymbolTable table = {0};
symbol_table_init(&table, 32);
Token rpn = build_rpn(&tk, &table);
//print_token(&rpn);
size_t prog_size = 0;
instruct *prog = rpn_to_bytecode(&rpn, &prog_size);
VM vm = {
.program = prog,
.program_size = prog_size,
.inst_p = 0,
.st_p = 0,
.running = true,
};
global_vm = vm;
flag_handling(argc, argv);
vm_run(&vm);
return 0;
}

View File

@@ -172,33 +172,29 @@ void vm_run(VM *vm) {
}
}
int main(int argc, char **argv) {
if (argc < 2) {
fprintf(stderr, "Usage: %s <source file>\n", argv[0]);
return 1;
char *op_to_str(OPcode o){
switch (o){
case OP_ADD: return "OP_ADD"; break;
case OP_SUB: return "OP_SUB"; break;
case OP_MUL: return "OP_MUL"; break;
case OP_DIV: return "OP_DIV"; break;
case OP_PRINT: return "OP_ADD"; break;
case OP_HALT: return "OP_HALT"; break;
default: break;
}
char* read = nb_read_file(argv[1]);
//printf("INPUT: %s\n", read);
Token tk = tokenize_all(read);
SymbolTable table = {0};
symbol_table_init(&table, 32);
Token rpn = build_rpn(&tk, &table);
//print_token(&rpn);
size_t prog_size = 0;
instruct *prog = rpn_to_bytecode(&rpn, &prog_size);
VM vm = {
.program = prog,
.program_size = prog_size,
.inst_p = 0,
.st_p = 0,
.running = true,
};
vm_run(&vm);
return 0;
return NULL;
}
void emit_bytecode(VM *v){
size_t i =0;
while (i < v->program_size){
if (v->program[i].op == OP_PUSH_INT) printf("OP_PUSH_INT(%f)\n", v->program[i].num);
else if (v->program[i].op == OP_PUSH_FLOAT) printf("OP_PUSH_FLOAT(%f)\n", v->program[i].num);
else if (v->program[i].op == OP_PUSH_STRING) printf("OP_PUSH_STRING(\"%s\")\n", v->program[i].strlit);
else printf("%s\n", op_to_str(v->program[i].op));
i++;
}
printf("\n");
}