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.3KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  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. // Init lexer with its input reader
  21. struct l2_io_file_reader r;
  22. r.r.read = l2_io_file_read;
  23. r.f = inf;
  24. struct l2_lexer lexer;
  25. l2_lexer_init(&lexer, &r.r);
  26. // Init gen with its output writer
  27. struct l2_io_mem_writer w = {0};
  28. w.w.write = l2_io_mem_write;
  29. struct l2_generator gen;
  30. l2_gen_init(&gen, &w.w);
  31. struct l2_parse_error err;
  32. if (l2_parse_program(&lexer, &gen, &err) < 0) {
  33. fprintf(stderr, "Parse error: %s:%i:%i: %s\n",
  34. (argc == 2 ? argv[1] : "-"), err.line, err.ch, err.message);
  35. l2_gen_free(&gen);
  36. fclose(inf);
  37. return 1;
  38. }
  39. l2_gen_free(&gen);
  40. fclose(inf);
  41. printf("Generated bytecode:\n");
  42. l2_vm_print_bytecode((l2_word *)w.mem, w.len / sizeof(l2_word));
  43. fprintf(stderr, "\n");
  44. struct l2_vm vm;
  45. l2_vm_init(&vm, (void *)w.mem, w.len / sizeof(l2_word));
  46. l2_vm_run(&vm);
  47. free(w.mem);
  48. printf("State after executing:\n");
  49. l2_vm_print_state(&vm);
  50. l2_vm_free(&vm);
  51. }