簡単なパーサーを書くのは簡単で、私は何年にもわたっていくつか実装してきました。大学では、私たちもそれを書かなければなりませんでした。しかし、この方法を使用して意味のある出力を生成する必要はありませんでした。バックエンドの作成方法を学んだことはありません。
単純化された Pascal で動作する再帰降下パーサーがあり、そのコードを C++ に変換したい場合、どうすればよいでしょうか? 抽象構文ツリーの生成などの中間ステップが必要だとは思いません。
では、コンパイルまたは変換されたコードを出力するにはどうすればよいでしょうか。これについて私が見つけた唯一の有用な例は、Jack Crenshaw のチュートリアルにありますが、他のほとんどのリソースと同様に、フロント エンドに重点を置いています。パーサー コードと文法の関係は非常に明白です。パーサーのメソッドと出力の関係はどうですか? 関数宣言用の私のパーサー メソッドは、正確に 1 つの EmitLn(ここでは C++ コード) 呼び出しに関連付けることができます。しかし、式など、それほど簡単ではないパーサー メソッドについてはどうでしょう。式はさらに多くの呼び出しに分割される可能性があるため、式の出力コードを 1 つずつ分割できるようにする Emit() 関数が必要であることを暗示しています。コードを出力するための定型コードはありますか?Jack Crenshaw の Lets Build a Compiler? の EmitLn 関数など。これは、基本的なシンボル テーブルを維持する必要があることも示しています。これは、ほとんどの例で省略されていることがよくあります。
私は正しいですか?他に何を知っておくべきですか?ヒント/提案、またはリソースはありますか? 私の大きな質問は、コンパイラのフロント エンドに関するチュートリアルがたくさんありますが、バック エンドについての説明はどうですか? 私は言語を解析できますが、それを他の言語に翻訳してコンパイルできるように進化させたいと考えています。