Extract parser and add x64 assembly emission
This commit is contained in:
47
lex.c
47
lex.c
@@ -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");
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user