Code generation【NandGame編】
はじめに
いつもブログをご覧いただきありがとうございます。
コーストFIRE中のIPUSIRONです😀
コード生成(Code generation)
コード生成は次の流れの最終処理に該当します。
トークン化⇒構文ツリー化⇒コード生成
コード生成をアルゴリズム(入出力を持つ処理)として見れば、式の構文ツリーをインプットとして、式の計算を実現するアセンブリー言語のコード(以下、アセンブリーコードと略す)を生成して出力します。
Code generationレベル
Syntax rulesでは、構文ツリーのルールごとにCode generationを指定します。
この対応をコード生成テンプレート(Code generation templates)と呼ぶことにします。
デフォルトでは「Expression⇒Expression + Number」「Expression⇒Number」という2つのルールに対して、Code generationが埋まっています。
NandGameではスタック操作(ADD、SUB、PUSH_VALUEはマクロ)を使用して、式の計算を実現できたことを思い出してください。
「Expression⇒Number」ルールのアセンブリーコードはこれで正しいですが、「Exprssion⇒Expression + Number」ルールのアセンブリーコードは不完全です。2行目が「[Number]」となっているところを、「PUSH_VALUE [Number]」としなければなりません。
Code generationレベルのゴールは、コード生成テンプレートを完成することです。つまり、構文ツリーの全ルールに対するCode generationを設定することになります。
Code generationレベルを解く
コード生成テンプレートのアセンブリーコードでは、ADD、SUB、NEG、PUSH_VALUEといったスタック操作のマクロを用います。Expression以外について、アセンブリー言語の命令(あるいはマクロ)に対応づけるだけです。
簡単なので正解の画像を並べておきます。
上記のコード生成テンプレートにより、「2 + 2」は次のように処理されます。Generated code部を見ると、3行のアセンブリーコードに変換されていることがわかります。最後のResult of execution部を見ると、エラーが発生せずに4が返っています。
[Check solution]ボタンを押すと、当該レベルをクリアできます。