A tiny compiler for a simple synthetic language featuring LL(2) grammar, written in pure C
- Lexer (
lex.c
) - Parser (
parser.c
) - Assembler like code generator (
gen.c
) - Virtual machine (
vm.c
) - Symbol table (
sym.c
) - Abstract syntax tree (
ast.c
)
It is by no means a complete industry standard implementation. Some parts are simplified for the sake of better understanding
$ cmake -S . -B 'build' && cmake --build 'build'
$ ./build/tinycompiler <source>
cath1 = 3;
cath2 = 4;
hypsquare = cath1 * cath1 + cath2 * cath2;
Execution result:
hypsquare = 25
Generated ASM:
PUSH 3
WRITE cath1
PUSH 4
WRITE cath2
READ cath1
READ cath1
MUL POP, POP
READ cath2
READ cath2
MUL POP, POP
ADD POP, POP
WRITE hypsquare
The language description in EBNF:
program = expr, ";", { program } ;
expr = id, "=", expr | term, { ("+"|"-"), term } ;
term = factor, { ("*"|"/"), factor } ;
factor = "id" | "num" | "(", expr, ")" ;