第一回事前課題では、数字と二項演算子のみからなるexpressionをコンパイルし、オブジェクトファイルを得ました。第二回事前課題では、関数定義と関数呼び出しを実装し、C++のmain関数とMC言語で生成したオブジェクトファイルをリンクし、ELFファイルを作り実行しました。
最終回である第三回事前課題ではif, then, elseを用いたコントロールフローを実装し、フィボナッチ数列の計算が再帰的に行えるようにします。
コントロールフローを実装するには何かしらの比較演算子を実装する必要があります。今回は'<'を実装してみますが、'>'や'=='等も是非実装してみて下さい。
codegen.h
のTODO 3.1
とmc.cpp
のTODO 3.1に詳細が書いてあり、これを終えるとtest1.mc
が正常にコンパイルできるようになります。
lexer.h
のTODO 3.2
に詳細が書いてあります。
parser.h
のTODO 3.3
に詳細が書いてあります。
codegen.h
のTODO 3.4
に詳細が書いてあります。3.2から3.4を終えるとtest4.mc
が正常にコンパイルできるようになります。
test/test5.mc
に「整数nを引数にとり、n番目のフィボナッチ数列を返す関数fib」を実装して下さい。
main.cppがfib(10)を呼んで標準出力に表示していいるので、実装が終わったら第二回課題と同様にC++とoutput.oをリンクし、ELFファイルを作って実行して下さい。
test/test5_expected_output.txt
に期待されるLLVM IRの出力があります。
$ make
$ ./mc test/test5.mc
$ clang++ main.cpp output.o -o main
$ ./main
Call fib with 10: 55
余力がある方は、fibよりも複雑な例をMC言語で実装してみて下さい。
課題は以上になります。三週間お疲れ様でした!