Add x64 emitter tests

This commit is contained in:
Krzosa Karol
2026-05-23 08:35:43 +02:00
parent a0adc03bcb
commit 0058355611
4 changed files with 25 additions and 54 deletions

View File

@@ -1,20 +1,4 @@
# set -euo pipefail set -euo pipefail
assert_eq() {
expected="$1"
actual="$2"
if [ "$expected" != "$actual" ]; then
echo "assert failed: expected '$expected', got '$actual'"
exit 1
fi
}
verify_expr() {
./main "$1"
clang out.s -o test
./test
assert_eq $? $2
}
if [[ ! -e build ]]; then if [[ ! -e build ]]; then
mkdir build mkdir build
@@ -23,10 +7,4 @@ cd build
clang -o meta $(realpath ../meta.c) -g -Wall -Wextra -Wshadow -fdiagnostics-absolute-paths clang -o meta $(realpath ../meta.c) -g -Wall -Wextra -Wshadow -fdiagnostics-absolute-paths
./meta > ../meta_gen.c ./meta > ../meta_gen.c
clang -o main $(realpath ../main.c) -g -Wall -Wextra -Wshadow -fdiagnostics-absolute-paths clang -o main $(realpath ../main.c) -g -Wall -Wextra -Wshadow -fdiagnostics-absolute-paths
./main ./main
verify_expr "2+1-1" 2
verify_expr "(2+1-1)*3" 6
echo done

View File

@@ -32,3 +32,21 @@ void emit_program(FILE *file, Ast *n) {
emit_expr(file, n); emit_expr(file, n);
fprintf(file, " ret\n"); fprintf(file, " ret\n");
} }
void emit_expr_test(char *expr, int value) {
Token_Array tokens = lex_file("expr", expr, strlen(expr));
Parser parser = {tokens.data, tokens.data + tokens.len};
Ast *ast = parse_expr(&parser, 0);
FILE *file = fopen("out.s", "w");
emit_program(file, ast);
fclose(file);
int result = system("clang out.s -o out");
assert(result == 0);
result = system("./out");
assert(WEXITSTATUS(result) == value);
}
void emit_x64_test(void) {
emit_expr_test("10+5*2-10", 10+5*2-10);
printf("x64 tests passed\n");
}

19
lex.c
View File

@@ -44,24 +44,7 @@ void lex_advance(Lexer *lex) {
lex->column++; lex->column++;
} }
if (*lex->at == '\\') { if (*lex->at == '\n') {
lex->at += 1;
if ((lex->at < lex->end) && *lex->at == '\n') {
lex->at += 1;
lex->line += 1; lex->column = 0;
} else if ((lex->at < lex->end) && *lex->at == '\r') {
lex->at += 1;
if ((lex->at < lex->end) && *lex->at == '\n') {
lex->at += 1;
lex->line += 1; lex->column = 0;
} else {
panicf("after \\r missing \\n");
}
} else {
panicf("stray '\\' without follow up new line");
}
} else if (*lex->at == '\n') {
lex->preproc = false; lex->preproc = false;
lex->at += 1; lex->at += 1;
} else { } else {

18
main.c
View File

@@ -12,17 +12,9 @@
#include "parser.c" #include "parser.c"
#include "emit_asm_x64.c" #include "emit_asm_x64.c"
int main(int argc, char **argv) { int main() {
if (argc == 2) { vec_test();
Token_Array tokens = lex_file("expr", argv[1], strlen(argv[1])); lex_test();
Parser parser = {tokens.data, tokens.data + tokens.len}; parser_test();
Ast *ast = parse_expr(&parser, 0); emit_x64_test();
FILE *file = fopen("out.s", "w");
emit_program(file, ast);
fclose(file);
} else {
vec_test();
lex_test();
parser_test();
}
} }