pythonでコンパイラを自作してみた。
##コンセプトはこんな感じ
- pythonで実装 (C言語とかじゃなくて)
- x86_64アセンブラコードを出力 (自作仮想マシン上で動くとかじゃなくて)
- パーサも自作 (yaccに頼るとかじゃなくて)
- 実用性はとくに考慮しない (楽しく作って動けばOK)
##実装した順に紹介
第一段階
とりあえず動くものを実装
変数宣言や代入や四則演算を実装。パーサも簡単なものなので、ほとんど抽象構文木を手書きしてる感じ。
第二段階
バックエンドを実装
パーサは貧弱なままだけど、配列とか名前空間とか関数呼び出しとかを実装。末尾再帰ぽい機能もオレオレ実装。
第三段階
フロントエンドを実装(完成版)
BNF記法で文法を定義し、SLRパーザを実装。
補足(追記)
Linux環境、python3系で実行してください。
出力はGNU Assemblerです。
また、ソースコードも少し修正しました。
##参考資料
-
滝本宗宏「実践コンパイラ入門」
Ocamlでコンパイラを実装する本。バックエンドは主にこの本を参考にした。 -
宮本衛市「はじめてのコンパイラ」
C言語でコンパイラを実装する本。フロントエンドを実装するときに参考にした。 -
Peter Norvig 「(How to Write a (Lisp) Interpreter (in Python))」
PythonでLispインタプリタを実装する記事。 -
Abdulaziz Ghuloum 「Compilers: Backend to Frontend」
SchemeでSchemeコンパイラを実装する資料。 -
Rui Ueyama 「簡単なプログラミング言語を作るライブコーディング」
C言語でライブコーディングする動画。