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

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  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_token_get_kind(l2_lexer_peek(&lexer, 1)), L2_TOK_IDENT);
  17. asserteq(l2_lexer_peek(&lexer, 1)->v.strbuf, "foo");
  18. l2_lexer_consume(&lexer);
  19. asserteq(l2_token_get_kind(l2_lexer_peek(&lexer, 1)), L2_TOK_COLON_EQ);
  20. l2_lexer_consume(&lexer);
  21. asserteq(l2_token_get_kind(l2_lexer_peek(&lexer, 1)), L2_TOK_NUMBER);
  22. asserteq(l2_lexer_peek(&lexer, 1)->v.num, 10);
  23. l2_lexer_consume(&lexer);
  24. asserteq(l2_token_get_kind(l2_lexer_peek(&lexer, 1)), L2_TOK_EOF);
  25. }
  26. test("lex assignment, non-sso") {
  27. lex("foo-very-long-name := 10");
  28. asserteq(l2_token_get_kind(l2_lexer_peek(&lexer, 1)), L2_TOK_IDENT);
  29. asserteq(l2_lexer_peek(&lexer, 1)->v.str, "foo-very-long-name");
  30. l2_lexer_consume(&lexer);
  31. asserteq(l2_token_get_kind(l2_lexer_peek(&lexer, 1)), L2_TOK_COLON_EQ);
  32. l2_lexer_consume(&lexer);
  33. asserteq(l2_token_get_kind(l2_lexer_peek(&lexer, 1)), L2_TOK_NUMBER);
  34. asserteq(l2_lexer_peek(&lexer, 1)->v.num, 10);
  35. l2_lexer_consume(&lexer);
  36. asserteq(l2_token_get_kind(l2_lexer_peek(&lexer, 1)), L2_TOK_EOF);
  37. }
  38. test("lex var deref assignment") {
  39. lex("foo := 10\nbar := foo");
  40. asserteq(l2_token_get_kind(l2_lexer_peek(&lexer, 1)), L2_TOK_IDENT);
  41. asserteq(l2_lexer_peek(&lexer, 1)->v.strbuf, "foo");
  42. l2_lexer_consume(&lexer);
  43. asserteq(l2_token_get_kind(l2_lexer_peek(&lexer, 1)), L2_TOK_COLON_EQ);
  44. l2_lexer_consume(&lexer);
  45. asserteq(l2_token_get_kind(l2_lexer_peek(&lexer, 1)), L2_TOK_NUMBER);
  46. asserteq(l2_lexer_peek(&lexer, 1)->v.num, 10);
  47. l2_lexer_consume(&lexer);
  48. asserteq(l2_token_get_kind(l2_lexer_peek(&lexer, 1)), L2_TOK_EOL);
  49. l2_lexer_consume(&lexer);
  50. asserteq(l2_token_get_kind(l2_lexer_peek(&lexer, 1)), L2_TOK_IDENT);
  51. asserteq(l2_lexer_peek(&lexer, 1)->v.strbuf, "bar");
  52. l2_lexer_consume(&lexer);
  53. asserteq(l2_token_get_kind(l2_lexer_peek(&lexer, 1)), L2_TOK_COLON_EQ);
  54. l2_lexer_consume(&lexer);
  55. asserteq(l2_token_get_kind(l2_lexer_peek(&lexer, 1)), L2_TOK_IDENT);
  56. asserteq(l2_lexer_peek(&lexer, 1)->v.strbuf, "foo");
  57. l2_lexer_consume(&lexer);
  58. asserteq(l2_token_get_kind(l2_lexer_peek(&lexer, 1)), L2_TOK_EOF);
  59. }
  60. test("lex peek multiple") {
  61. lex("foo := 10");
  62. l2_lexer_peek(&lexer, 3);
  63. asserteq(l2_token_get_kind(l2_lexer_peek(&lexer, 1)), L2_TOK_IDENT);
  64. asserteq(l2_lexer_peek(&lexer, 1)->v.strbuf, "foo");
  65. l2_lexer_consume(&lexer);
  66. asserteq(l2_token_get_kind(l2_lexer_peek(&lexer, 1)), L2_TOK_COLON_EQ);
  67. l2_lexer_consume(&lexer);
  68. asserteq(l2_token_get_kind(l2_lexer_peek(&lexer, 1)), L2_TOK_NUMBER);
  69. asserteq(l2_lexer_peek(&lexer, 1)->v.num, 10);
  70. l2_lexer_consume(&lexer);
  71. asserteq(l2_token_get_kind(l2_lexer_peek(&lexer, 1)), L2_TOK_EOF);
  72. }
  73. }