You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

main.c 1.1KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. #include "vm/vm.h"
  2. #include "vm/print.h"
  3. #include "parse/parse.h"
  4. #include "parse/lex.h"
  5. #include "io.h"
  6. #include "bitset.h"
  7. #include <stdio.h>
  8. #include <string.h>
  9. int main(int argc, char **argv) {
  10. if (argc != 1 && argc != 2) {
  11. fprintf(stderr, "Usage: %s [file]\n", argv[0]);
  12. return 1;
  13. }
  14. FILE *inf;
  15. if (argc == 1 || (argc == 2 && strcmp(argv[1], "-") == 0)) {
  16. inf = stdin;
  17. } else {
  18. inf = fopen(argv[1], "r");
  19. }
  20. struct l2_io_file_reader r;
  21. r.r.read = l2_io_file_read;
  22. r.f = inf;
  23. struct l2_lexer lexer;
  24. l2_lexer_init(&lexer, &r.r);
  25. struct l2_io_mem_writer w = {0};
  26. w.w.write = l2_io_mem_write;
  27. struct l2_generator gen;
  28. l2_gen_init(&gen, &w.w);
  29. struct l2_parse_error err;
  30. if (l2_parse_program(&lexer, &gen, &err) < 0) {
  31. fprintf(stderr, "Parse error: %s:%i:%i: %s\n",
  32. (argc == 2 ? argv[1] : "-"), err.line, err.ch, err.message);
  33. return 1;
  34. }
  35. fprintf(stderr, "Generated bytecode:\n");
  36. l2_vm_print_bytecode((l2_word *)w.mem, w.len / sizeof(l2_word));
  37. fprintf(stderr, "\n");
  38. struct l2_vm vm;
  39. l2_vm_init(&vm, (void *)w.mem, w.len / sizeof(l2_word));
  40. l2_vm_run(&vm);
  41. l2_vm_print_state(&vm);
  42. }