私はLexとYACC(実際にFlexとBison)を使ってコンパイラを作成しています。この言語は、任意のシンボル(C#など)への無制限の前方参照を可能にします。問題は、識別子が何であるか知らずに言語を解析することは不可能だということです。コンパイラで前方参照を実装するにはどうすればよいですか?
私が知っている唯一の解決策は、ソース全体をレックスし、次に「幅優先」解析を行うことです。クラス宣言や関数宣言などの上位レベルのものは、関数を使用する関数の前に解析されます。しかし、これは大きなファイルのために大量のメモリを必要とし、YACCで処理するのは難しいでしょう(私は宣言/本体の種類ごとに別々の文法を作成しなければなりません)。私はレクサーを手書きしなければなりません(それはそれほど問題ではありません)。
私はそれを完了したらコンパイラ自体を書き直すつもりだから効率については大したことはないが(まだ重要だが) Lex/YACCで行うことはできないが、手作業で行うことができる高速な一般的なテクニックであり、それらも示唆してください。だから今、開発の容易さが最も重要な要素です。
この問題の解決策はありますか?これはC#やJavaのような言語のコンパイラでどのように行われますか?
からそれらすべてを作ることができるはずのよう
。これは、ABC(パッケージAB)(クラスC)、(パッケージA)(クラスB)(フィールドC)、(フィールドA)(フィールドB)(フィールドC)などです。 – Zifre
次に、私の答えの2番目の段落が適用されます。あなたはそれを知る必要はありません。治療する。あなたの文法の演算子として。 ASTパスでは、シンボルテーブルに対してチェックすることができます。 – U62
さて、私はASTではなく構文解析ツリーを作成しなければならないと思う。あなたが言ったように、彼らは異なっています。私がこれを受け入れるでしょうが、私は本当にこのようにしません... – Zifre