私は(flexとbisonを使用して)独自のコンパイラーを実装する必要があるコンパイラー設計クラスを取っています。私は構文解析(EBNFと再帰下降パーサーの作成)の経験がありますが、コンパイラーを作成するのはこれが初めてです。
言語デザインはかなりオープンエンドです(教授はそれを私たちに任せました)。クラスでは、教授は中間コードの生成をやり直しました。彼は、構文解析中に抽象構文木や構文解析ツリーを構築する必要はなく、途中で中間コードを生成できると述べました。
私はこれを2つの理由で混乱させました:
定義する前に関数を呼び出している場合はどうなりますか?分岐先をどのように解決できますか?関数を使用する前に関数を定義するか、関数を事前に定義する必要があるというルールを作成する必要があると思います(Cのように?)
条件文をどのように扱いますか?
if-else
、または単にを持っている場合、条件が(進行中にコードを生成している場合)if
の場合の分岐ターゲットをどのように解決できますか?if
false
関数とブランチターゲットのアドレスを解決するために、ASTを生成し、作成後にツリーをウォークすることを計画しました。これは正しいですか、それとも何かが足りませんか?