simple bytecode compiler
This commit is contained in:
@@ -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]);
|
||||
}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
|
||||
print(((1+2923)*3)/5)
|
||||
print(((1+29.9)*3)/5)
|
||||
|
||||
print("hello world")
|
||||
|
||||
51
src/hlc.c
Normal file
51
src/hlc.c
Normal 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;
|
||||
}
|
||||
@@ -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");
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user