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.

lex.t.c 2.2KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. #include "parse/lex.h"
  2. #include <stdio.h>
  3. #include <snow/snow.h>
  4. static struct l2_lexer lexer;
  5. static struct l2_io_mem_reader r;
  6. static void lex(const char *str) {
  7. r.r.read = l2_io_mem_read;
  8. r.idx = 0;
  9. r.len = strlen(str);
  10. r.mem = str;
  11. l2_lexer_init(&lexer, &r.r);
  12. }
  13. describe(lex) {
  14. test("lex assignment") {
  15. lex("foo := 10");
  16. asserteq(l2_lexer_peek(&lexer, 1)->kind, L2_TOK_IDENT);
  17. asserteq(l2_lexer_peek(&lexer, 1)->v.str, "foo");
  18. l2_lexer_consume(&lexer);
  19. asserteq(l2_lexer_peek(&lexer, 1)->kind, L2_TOK_COLON_EQ);
  20. l2_lexer_consume(&lexer);
  21. asserteq(l2_lexer_peek(&lexer, 1)->kind, L2_TOK_NUMBER);
  22. asserteq(l2_lexer_peek(&lexer, 1)->v.num, 10);
  23. l2_lexer_consume(&lexer);
  24. asserteq(l2_lexer_peek(&lexer, 1)->kind, L2_TOK_EOF);
  25. }
  26. test("lex var deref assignment") {
  27. lex("foo := 10\nbar := foo");
  28. asserteq(l2_lexer_peek(&lexer, 1)->kind, L2_TOK_IDENT);
  29. asserteq(l2_lexer_peek(&lexer, 1)->v.str, "foo");
  30. l2_lexer_consume(&lexer);
  31. asserteq(l2_lexer_peek(&lexer, 1)->kind, L2_TOK_COLON_EQ);
  32. l2_lexer_consume(&lexer);
  33. asserteq(l2_lexer_peek(&lexer, 1)->kind, L2_TOK_NUMBER);
  34. asserteq(l2_lexer_peek(&lexer, 1)->v.num, 10);
  35. l2_lexer_consume(&lexer);
  36. asserteq(l2_lexer_peek(&lexer, 1)->kind, L2_TOK_EOL);
  37. l2_lexer_consume(&lexer);
  38. asserteq(l2_lexer_peek(&lexer, 1)->kind, L2_TOK_IDENT);
  39. asserteq(l2_lexer_peek(&lexer, 1)->v.str, "bar");
  40. l2_lexer_consume(&lexer);
  41. asserteq(l2_lexer_peek(&lexer, 1)->kind, L2_TOK_COLON_EQ);
  42. l2_lexer_consume(&lexer);
  43. asserteq(l2_lexer_peek(&lexer, 1)->kind, L2_TOK_IDENT);
  44. asserteq(l2_lexer_peek(&lexer, 1)->v.str, "foo");
  45. l2_lexer_consume(&lexer);
  46. asserteq(l2_lexer_peek(&lexer, 1)->kind, L2_TOK_EOF);
  47. }
  48. test("lex peek multiple") {
  49. lex("foo := 10");
  50. l2_lexer_peek(&lexer, 3);
  51. asserteq(l2_lexer_peek(&lexer, 1)->kind, L2_TOK_IDENT);
  52. asserteq(l2_lexer_peek(&lexer, 1)->v.str, "foo");
  53. l2_lexer_consume(&lexer);
  54. asserteq(l2_lexer_peek(&lexer, 1)->kind, L2_TOK_COLON_EQ);
  55. l2_lexer_consume(&lexer);
  56. asserteq(l2_lexer_peek(&lexer, 1)->kind, L2_TOK_NUMBER);
  57. asserteq(l2_lexer_peek(&lexer, 1)->v.num, 10);
  58. l2_lexer_consume(&lexer);
  59. asserteq(l2_lexer_peek(&lexer, 1)->kind, L2_TOK_EOF);
  60. }
  61. }