|
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384 |
- #include "parse/lex.h"
-
- #include <stdio.h>
- #include <snow/snow.h>
-
- static struct l2_lexer lexer;
- static struct l2_io_mem_reader r;
-
- static void lex(const char *str) {
- r.r.read = l2_io_mem_read;
- r.idx = 0;
- r.len = strlen(str);
- r.mem = str;
- l2_lexer_init(&lexer, &r.r);
- }
-
- describe(lex) {
- test("lex assignment") {
- lex("foo := 10");
-
- asserteq(l2_lexer_peek(&lexer, 1)->kind, L2_TOK_IDENT);
- asserteq(l2_lexer_peek(&lexer, 1)->v.str, "foo");
- l2_lexer_consume(&lexer);
-
- asserteq(l2_lexer_peek(&lexer, 1)->kind, L2_TOK_COLON_EQ);
- l2_lexer_consume(&lexer);
-
- asserteq(l2_lexer_peek(&lexer, 1)->kind, L2_TOK_NUMBER);
- asserteq(l2_lexer_peek(&lexer, 1)->v.num, 10);
- l2_lexer_consume(&lexer);
-
- asserteq(l2_lexer_peek(&lexer, 1)->kind, L2_TOK_EOF);
- }
-
- test("lex var deref assignment") {
- lex("foo := 10\nbar := foo");
-
- asserteq(l2_lexer_peek(&lexer, 1)->kind, L2_TOK_IDENT);
- asserteq(l2_lexer_peek(&lexer, 1)->v.str, "foo");
- l2_lexer_consume(&lexer);
-
- asserteq(l2_lexer_peek(&lexer, 1)->kind, L2_TOK_COLON_EQ);
- l2_lexer_consume(&lexer);
-
- asserteq(l2_lexer_peek(&lexer, 1)->kind, L2_TOK_NUMBER);
- asserteq(l2_lexer_peek(&lexer, 1)->v.num, 10);
- l2_lexer_consume(&lexer);
-
- asserteq(l2_lexer_peek(&lexer, 1)->kind, L2_TOK_EOL);
- l2_lexer_consume(&lexer);
-
- asserteq(l2_lexer_peek(&lexer, 1)->kind, L2_TOK_IDENT);
- asserteq(l2_lexer_peek(&lexer, 1)->v.str, "bar");
- l2_lexer_consume(&lexer);
-
- asserteq(l2_lexer_peek(&lexer, 1)->kind, L2_TOK_COLON_EQ);
- l2_lexer_consume(&lexer);
-
- asserteq(l2_lexer_peek(&lexer, 1)->kind, L2_TOK_IDENT);
- asserteq(l2_lexer_peek(&lexer, 1)->v.str, "foo");
- l2_lexer_consume(&lexer);
-
- asserteq(l2_lexer_peek(&lexer, 1)->kind, L2_TOK_EOF);
- }
-
- test("lex peek multiple") {
- lex("foo := 10");
-
- l2_lexer_peek(&lexer, 3);
-
- asserteq(l2_lexer_peek(&lexer, 1)->kind, L2_TOK_IDENT);
- asserteq(l2_lexer_peek(&lexer, 1)->v.str, "foo");
- l2_lexer_consume(&lexer);
-
- asserteq(l2_lexer_peek(&lexer, 1)->kind, L2_TOK_COLON_EQ);
- l2_lexer_consume(&lexer);
-
- asserteq(l2_lexer_peek(&lexer, 1)->kind, L2_TOK_NUMBER);
- asserteq(l2_lexer_peek(&lexer, 1)->v.num, 10);
- l2_lexer_consume(&lexer);
-
- asserteq(l2_lexer_peek(&lexer, 1)->kind, L2_TOK_EOF);
- }
- }
|