Extract parser and add x64 assembly emission

This commit is contained in:
Krzosa Karol
2026-05-13 22:48:57 +02:00
parent 4cffa1f69a
commit f41560c5e7
6 changed files with 339 additions and 274 deletions

47
lex.c
View File

@@ -191,4 +191,49 @@ Token_Array lex_file(char *file, char *src, int len) {
}
}
return result;
}
}
void lex_test(void) {
char *src = "12 + 34.5 * 6\n- 7 % 2 / 1 == 1 != 2 <= 3 >= 4 && 3 || 4 << 1 >> 2";
Lexer lex = make_lexer("test.c", src, (int)strlen(src));
assert_token(lex_token(&lex), TOK_INT, "12", 0, 0);
assert_token(lex_token(&lex), TOK_PLUS, "+", 0, 3);
assert_token(lex_token(&lex), TOK_FLOAT, "34.5", 0, 5);
assert_token(lex_token(&lex), TOK_STAR, "*", 0, 10);
assert_token(lex_token(&lex), TOK_INT, "6", 0, 12);
assert_token(lex_token(&lex), TOK_MINUS, "-", 1, 0);
assert_token(lex_token(&lex), TOK_INT, "7", 1, 2);
assert_token(lex_token(&lex), TOK_PERCENT, "%", 1, 4);
assert_token(lex_token(&lex), TOK_INT, "2", 1, 6);
assert_token(lex_token(&lex), TOK_SLASH, "/", 1, 8);
assert_token(lex_token(&lex), TOK_INT, "1", 1, 10);
assert_token(lex_token(&lex), TOK_EQ, "==", 1, 12);
assert_token(lex_token(&lex), TOK_INT, "1", 1, 15);
assert_token(lex_token(&lex), TOK_NEQ, "!=", 1, 17);
assert_token(lex_token(&lex), TOK_INT, "2", 1, 20);
assert_token(lex_token(&lex), TOK_LEQ, "<=", 1, 22);
assert_token(lex_token(&lex), TOK_INT, "3", 1, 25);
assert_token(lex_token(&lex), TOK_GEQ, ">=", 1, 27);
assert_token(lex_token(&lex), TOK_INT, "4", 1, 30);
assert_token(lex_token(&lex), TOK_AND, "&&", 1, 32);
assert_token(lex_token(&lex), TOK_INT, "3", 1, 35);
assert_token(lex_token(&lex), TOK_OR, "||", 1, 37);
assert_token(lex_token(&lex), TOK_INT, "4", 1, 40);
assert_token(lex_token(&lex), TOK_LSHIFT, "<<", 1, 42);
assert_token(lex_token(&lex), TOK_INT, "1", 1, 45);
assert_token(lex_token(&lex), TOK_RSHIFT, ">>", 1, 47);
assert_token(lex_token(&lex), TOK_INT, "2", 1, 50);
Token eof = lex_token(&lex);
assert(eof.kind == TOK_EOF);
assert(eof.len == 0);
assert(eof.line == 1);
assert(eof.column == 51);
Token_Array array = lex_file("test.c", src, (int)strlen(src));
assert(array.len == 28);
printf("lexer tests passed\n");
}