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.

eval.t.c 1.1KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. #include "parse/parse.h"
  2. #include "vm/vm.h"
  3. #include "vm/print.h"
  4. #include <stdio.h>
  5. #include <snow/snow.h>
  6. static struct l2_lexer lex;
  7. static struct l2_io_mem_reader r;
  8. static struct l2_generator gen;
  9. static struct l2_io_mem_writer w;
  10. static struct l2_vm vm;
  11. static struct l2_parse_error err;
  12. static struct l2_vm_value *var_lookup(const char *name) {
  13. l2_word atom_id = l2_strset_get(&gen.atoms, name);
  14. l2_word id = l2_vm_namespace_get(&vm.values[vm.nstack[0]], atom_id);
  15. return &vm.values[id];
  16. }
  17. static void init(const char *str) {
  18. r.r.read = l2_io_mem_read;
  19. r.idx = 0;
  20. r.len = strlen(str);
  21. r.mem = str;
  22. l2_lexer_init(&lex, &r.r);
  23. w.w.write = l2_io_mem_write;
  24. w.len = 0;
  25. w.mem = NULL;
  26. l2_gen_init(&gen, (struct l2_io_writer *)&w);
  27. }
  28. static void done() {
  29. l2_gen_free(&gen);
  30. free(w.mem);
  31. }
  32. describe(parse) {
  33. test("parse program") {
  34. init("foo := 10");
  35. defer(done());
  36. assert(l2_parse_program(&lex, &gen, &err) >= 0);
  37. l2_vm_init(&vm, (l2_word *)w.mem, w.len / sizeof(l2_word));
  38. l2_vm_run(&vm);
  39. assert(l2_vm_value_type(var_lookup("foo")) == L2_VAL_TYPE_REAL);
  40. assert(var_lookup("foo")->real == 10);
  41. }
  42. }