Cは厳密に順番に解析されます。つまり、使用する前にすべてを宣言する必要があります。特に、型はそれらの型の変数の前に宣言する必要があります。型の名前が何であるか、何がそうでないかがわからない場合、たとえば、型に名前を付けるa * b
かどうかによって、文法があいまいになるため、これは理にかなっていますa
。
一方、一部のCファミリ言語には、この制限を緩和するという望ましい特性があります(したがって、ヘッダーファイルの手動ジャグリングを排除します)。同様にその制限を緩和することを目的としたCスーパーセット言語のパーサーを書いているので、今度はそれを行う方法を理解する必要があります。
私が思い浮かぶ1つの方法は、2つのパスを実行することです。最初のパスは、トップレベルのすべてがステートメントではなく宣言でなければならないという事実を利用して、すべてを通過し、すべてのタイプを取得します。この段階では、関数本体は検査されずに残され、中括弧を一致させることによって区切られたトークンストリームとして取得されます。2番目のパスは、関数本体を解析します。関数内のローカル宣言は適切である必要がありますが、それは実際には問題ではありません。
その方法で私が考えていなかった障害はありますか?
C ++、Java、C#などのコンパイラは、通常、宣言を順番に必要としない言語の部分に対してどのように処理しますか?