C言語の構文はCFGによって完全に定義されていますか?


7

質問はそれだけで十分だと思います。C言語の構文は、コンテキストフリーの文法によって完全に定義されていますか、それとも、解析中に非コンテキストフリーの定義を必要とする可能性のある言語構成体がありますか?

非CFL構成の例として、使用前の変数の宣言を考えました。しかし、コンパイラ(Aho Ullman Sethi)では、C言語は名前に基づいて識別子を区別しないと述べられています。すべての識別子は、字句解析器によって「id」としてトークン化されます。CがCFGによって完全に定義されていない場合、誰でもCの非CFL構成の例を挙げていただけますか?


答えは、「Cプログラム」の言語をどのように定義するかに完全に依存します。文字列は、構文が正しい場合はCプログラムですか、それとも完全にC言語仕様に準拠している場合はCプログラムですか?または、標準に準拠したCコンパイラ(のサブセット)が操作可能な実行可能ファイルを生成できる場合、それはCプログラムですか?私は常に、セマンティックな妥当性のいくつかの類似性を必要とするプログラミング言語の定義を優先してきましたが、これは通常、説明のように言語がコンテキストフリーではないことを意味します。
Patrick87 2014年

回答:


13

C言語には入力規則があります。たとえば、2つのポインタを除算することはできません。また、ポインタを受け入れるプロシージャを呼び出すときに、doubleを使用することはできません。ACコンパイラは、いくつかのフェーズでソースを分析します。最初に字句分析が行われ、次にソースが解析されます。これらのフェーズは抽象化であり、実際には追加の情報がフェーズからフェーズへと渡されます。たとえば、Cの文法は変数の名前を気にしない場合でも、この情報が渡され、属性付きの文法が型付け規則を検証できます。したがって、文法の上で機能する追加のメカニズムがあります。

さらに簡単な例として、AhoとUllmanの例を取り上げます。解析フェーズでは、すべての変数名は「同じ」に見えますが、宣言されていない限り、変数を使用することはできません。この情報はコンテキストフリーのパーサーからは隠されていますが、字句フェーズの属性として保持され、解析中にチェックされます。Cの文脈自由文法は、高速パーサーの実装に役立つ、正当なCコードの一部の側面のみを表しています。そのパーサーの上で、他のルールがチェックされ、セマンティクスがCコードに与えられ、マシンコードが生成されます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.