非決定的である実際のコンピューター言語の例はありますか?
コンピュータ言語ごとに、プログラミング言語、マークアップ言語、クエリ言語、モデリング言語、変換言語などを含めます。
非確定的とは、確定的文法では解析できないことを意味します。
非決定的である実際のコンピューター言語の例はありますか?
コンピュータ言語ごとに、プログラミング言語、マークアップ言語、クエリ言語、モデリング言語、変換言語などを含めます。
非確定的とは、確定的文法では解析できないことを意味します。
回答:
はい。Algol 60、C、C ++など、多くの最新のプログラミング言語がこの特性を備えています。詳細については、以下を参照してください。
Algol 60には、ぶら下がるelseの問題があったことで有名です。一部のプログラムでは、それらをどのように解析するか(どの解析ツリーが結果となるか)があいまいでした。
多くの現代の言語は、あいまいさを特定の方法で解決する文法を選択することによってこれを解決します。ただし、あいまいさをなくすために文法を注意深く作成する必要があります。多くの場合、文法を記述する最も自然な方法は、文法があいまいになるため、曖昧さを避けるために文法を変換する必要があります。
別のアプローチは、これらの文法を処理できるGLRパーサーを使用することです。次に、実行時にパーサーが複数あるかどうかを確認し、あいまいさを解決できます。
別の古典的な例は、CおよびC ++プログラミング言語です。Cの参照文法はコンテキストフリーではありません。名前が表示された場合、ステートメントの解析方法を知るには、それが型の名前か変数の名前かを知る必要があるためです。たとえば、次の式について考えます。
(A)*B
場合はA
、変数がある、これは、2つの変数の乗算であると同等ですA*B
。ただし、A
が型の名前である場合、これはポインター逆参照および型キャストであり(B
ポインター型を保持する変数名でもあり)、と同等(A) *B
です。
同様に、
A*B;
(あれば変数宣言のいずれかであるA
タイプの名前で、これはという名前の変数宣言してB
タイプのポインタ対であるA
かの乗算)を(場合A
やB
変数の名前です)。
コンパイラーは通常、純粋なコンテキストフリー文法の言語の「外に出る」追加のコードを含めることでこれを修正します。それらはスコープ内のすべての変数名と型名を追跡し、これを使用してこのあいまいな場合の解析をガイドします。レクサーハックを参照してください。
コンテキスト内のLLとLRも参照してください:GLRパーサーの構文解析ツールが難しい理由とBisonのマニュアルページ(C ++文法の別のあいまいなケースの説明が含まれています)。
最後に、この質問には、曖昧性と非決定性の違いについていくつかの混乱があると思います。オートマトンと言語は決定論的/非決定論的ですが、文法はできません。文法と言語は曖昧/曖昧でない場合があります。参照してくださいそこに本質的に曖昧と決定論的文脈自由言語はありますか?そして、文法決定論的文脈自由言語の特性およびパーサが非決定論的な文法を解析することができる場合は、パーサの非決定論的ですか?。上記の例は、あいまいな文法と非決定性言語の両方として実際に適格です。