https://www.sigbus.info/compilerbook
build
git clone https://github.com/CaseyNelson314/c-compiler.git
cd c-compiler/minc
make
unit test
make test
-
字句解析 <tokenizer.c>
文字列をトークン列に分割
長いトークンから解析する
-
構文解析 <parser.c>
BNF 記法で表された C 言語の文法規則を基に、構文木を作成
BNF の定義次第でパーサーの書きやすさが変わる
-
コード生成 <condegen.c>
構文木を末端から評価していき、アセンブリコードを生成
評価値を rax レジスタへ乗せると楽
テストコードをコンパイルさせ、実行し、目的の値が得られるかを検証する。
テストコードは自作コンパイラによってコンパイルされるため、常に 0 を返す(成功)様なコンパイラを作れてしまうことを考えると、テストの信頼性がなくなる。
そこでテストで使用している機能(テスト用関数呼び出し)の動作検証をシェルスクリプト上で検証することで信頼性を上げている。
テスト用関数は別ファイルに定義し既存のコンパイルでコンパイルすることで、シェルスクリプト上での検証量を減らしている。