確定的な文法では説明できない実際のコンピュータ言語はどれですか?


7

非決定的である実際のコンピューター言語の例はありますか?

コンピュータ言語ごとに、プログラミング言語、マークアップ言語、クエリ言語、モデリング言語、変換言語などを含めます。

非確定的とは、確定的文法では解析できないことを意味します。


Nitpick:文法は言語を解析しません。回答:有名な、Perlは解析できないまったく
ラファエル

ここにはまともな質問があると思いますが、実際には「非決定的文法」という概念は実際にはありません。それはどのように定義されますか?文法などの複数の定義と相関する非決定的なオートマトンがあります...また、この質問は、RLCFLなどでは大きく異なるようです。NFA(標準アルゴリズム)から同等のDFAを構築する方法があるため、これは注意が必要です。あなたはこれをよりよく/より正確に定式化しようとするいくつかのCFL理論を研究したいかもしれません...
vzn

うーん..おそらく「非決定的プッシュダウンオートマトン」と読むべきでしょう。しかし、質問はかなり意味がありません。それは、解析がどのような種類の分析を期待しているのかに依存します。たとえば、すべての変数が使用前に宣言されていることを認識すると、コンテキストフリーではなくなります。
reinierpost 2016

回答:


4

はい。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かの乗算)を(場合AB変数の名前です)。

コンパイラーは通常、純粋なコンテキストフリー文法の言語の「外に出る」追加のコードを含めることでこれを修正します。それらはスコープ内のすべての変数名と型名を追跡し、これを使用してこのあいまいな場合の解析をガイドします。レクサーハックを参照してください。


コンテキスト内のLLとLRも参照してくださいGLRパーサーの構文解析ツールが難しい理由Bisonのマニュアルページ(C ++文法の別のあいまいなケースの説明が含まれています)。


最後に、この質問には、曖昧性と非決定性の違いについていくつかの混乱があると思います。オートマトンと言語は決定論的/非決定論的ですが、文法はできません。文法と言語は曖昧/曖昧でない場合があります。参照してくださいそこに本質的に曖昧と決定論的文脈自由言語はありますか?そして、文法決定論的文脈自由言語の特性およびパーサが非決定論的な文法を解析することができる場合は、パーサの非決定論的ですか?。上記の例は、あいまいな文法と非決定性言語の両方として実際に適格です。


1
これは回答に近いようですが、言語/ CFLのあいまいさは非決定性と同じではありません...
vzn
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.