A C compiler and preprocessor written from scratch in C that targets x86-64 assembly
Make sure you have cmake installed on your machine, then run
./scripts/build.sh. Then, you can run JCCC with ./build/jccc.
Only lexing is supported at this stage. To lex, run the following:
jccc --token-dump <filename>
Use the normal ./scripts/build.sh that will also build an executable called test_jccc.
Run the executable ./test_jccc and you should see a list of the tests being run.
Running tests from "test_lexer" ...
Running "test_ttype_name"
Running "test_ttype_from_string"
Running "test_ttype_many_chars"
Running "test_ttype_one_char"
Concluded tests from "test_lexer"
Running tests from "test_x86" ...
Running "test_init_int_literal"
Concluded tests from "test_x86"
For errors, no news is good news because tasserts that fail will show the failure but tasserts that succeed will not display anything.
Here is an example usage of the testing. This is from "lexer/test_lexer.c". For each module of code, create a test_{module_name} file. This file should include a test_{module_name} function that includes the testing_setup and the testing_cleanup functions.
#include "lex.h"
#include <testing/test_utils.h>
int test_lexer() {
testing_module_setup();
test_ttype_from_string();
testing_module_cleanup();
return 0;
}After this, include a call to this function in the "testing/main.c" file like how it's done for test_lexer.
#include "lexer/test_lexer.h"
int main() {
test_lexer();
return 0;
}Finally, here is what a test might look like. Make sure to include a call to testing_func_setup at the start.
int test_ttype_from_string() {
testing_func_setup();
tassert(ttype_from_string("1") == TT_LITERAL);
tassert(ttype_from_string("1.2") == TT_LITERAL);
// ...
tassert(ttype_from_string(";") == TT_SEMI);
return 0;
}