当サイトの一部ページには、アフィリエイト・アドセンス・アソシエイト・プロモーション広告を掲載しています。

Amazonのアソシエイトとして、Security Akademeiaは適格販売により収入を得ています。

広告配信等の詳細については、プライバシーポリシーページに掲載しています。

消費者庁が、2023年10月1日から施行する景品表示法の規制対象(通称:ステマ規制)にならないよう、配慮して記事を作成しています。もし問題のある表現がありましたら、問い合わせページよりご連絡ください。

参考:令和5年10月1日からステルスマーケティングは景品表示法違反となります。 | 消費者庁

Code generation【NandGame編】

はじめに

いつもブログをご覧いただきありがとうございます。

FIRE生活中のIPUSIRONです😀

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]ボタンを押すと、当該レベルをクリアできます。