Chickenというクールな言語のインタープリターを作成する必要があります。
チキンプログラムは、ファイル、標準入力、プログラムまたは関数の引数など、言語にとって最も便利なもの、およびプログラムへの入力から読み取る必要があります。
チキン言語仕様に従ってプログラムを解釈した結果を印刷または返す必要があります。
鶏肉プログラムの概要
Chickenは、メモリモデル全体を構成する単一のスタックで動作します。命令が実行されると、プログラムはスタックから値をプッシュおよびポップしますが、プログラムがスタックの他の部分を自由に変更できるようにする命令もあります。
スタックには3つのセグメントがあります。
- インデックス0および1のレジスター。インデックス0はスタック自体への参照であり、インデックス1はユーザー入力への参照です。主に手順6で使用されます(下記参照)。
- ロードされたコード:コードの各行について、このセグメントにはセルがあり、その行には「鶏」の数が含まれています。これには最後に0(プログラム終了のオペコード)が埋め込まれます。
- プログラムの実行時に値がプッシュ/ポップされる実際のプログラムスタック。セグメントは分離されていないことに注意してください。つまり、スタックスペースのこのセグメントから自己変更コードを作成したり、コードを実行したりできます。
チキンISA
チキンの命令セットは、プログラムの各行に「チキン」という単語が現れる回数に基づいています。空の行はプログラムを終了し、スタックの最上位の値を出力します。
1行あたりの「鶏」の数による鶏の指示セット:
- リテラル文字列 "chicken"をスタックにプッシュします
- 上位2つのスタック値を自然数として追加し、結果をプッシュします。
- 上位2つの値を自然数として減算し、結果をプッシュします。
- 上位2つの値を自然数として乗算し、結果をプッシュします。
- 上位2つの値が等しいかどうかを比較し、等しい場合は1を、そうでない場合は0をプッシュします。
- 次の命令を見て、どのソースからロードするかを決定します。0はスタックからロードし、1はユーザー入力からロードします。スタックのトップは、指定されたソースからロードするアドレス/インデックスを指します。その値をロードしてスタックにプッシュします。これは倍幅の命令であるため、命令ポインタはソースを決定するために使用される命令をスキップします。
- スタックのトップは、格納するアドレス/インデックスを指します。その下の値はポップされ、指定されたインデックスでスタックに格納されます。
- スタックの先頭は、ジャンプする相対オフセットです。その下の値が正しい場合、プログラムはオフセットでジャンプします。
- スタックの先頭をASCIIとして解釈し、対応する文字をプッシュします。
- (10 + N)リテラル数n-10をスタックにプッシュします。
例
プログラムは次のとおりです。
chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken
chicken chicken chicken chicken chicken chicken
(an empty line)
(猫のプログラム。前の行に6つの「鶏」があるため、空の行が必要であることに注意してください。)
鶏肉プログラムに提供される入力
Chicken
出力
Chicken
エラー検出
インタプリタはエラーを残し、「ニワトリ」ではない単語がソースに存在する場合に終了する必要があります。
幸運を!