2011-08-13 14 views

答えて

8

C99標準の附属書A(linked by Wikipedia)は、文法のように見えます。

typedefの名前を他の識別子と区別するための文法上の問題があります。つまり、yaccに入力して動作させることはできませんが、それは最も信頼できるソースです。

+0

実際にあります。 Typedefの名前は、定義された後は効果的にキーワードになりますが、スコープ外に出るとキーワードではなくなります。つまり、シンボルテーブルからパーサへの何らかのフィードバックが必要です。他の多くの言語では必要としないものと思います。ちょうど1つの例: 'foo'がtypedefかどうかを知らなくても' sizeof(foo [10]) 'を解析することはできません。 (歴史的には、これはtypedefがK&Rより前の言語に比較的遅れていたためですが、型システムが定義された後です) –

+0

... typedefの問題を処理した後でさえ、抽象的な宣言子を解析することは驚くことではありません複合体。大学院生として、私は研究プロジェクト用のCパーサーを書いていました。それを正しく理解する方法を見つけようとしたとき、GCCのパーサーを含めて、私が掘り下げた既存の実装のそれぞれについて、反例を発見しました。私は現在の反例のどれか、あるいは他の詳細を思い出すことができません。彼らは毛深かった。 –

+0

さて、私は気が狂っているだろう、今は気が気にならない。文法の文脈感受性については、私は先に進んで無視しようと思っています...私は完全に機能するコンパイラをまだ書いていません... – Alex