16

文脈依存性とあいまいさが互いにどのように影響するかについて、私は混乱しています。

私が正しいと思うのは次のとおりです。

あいまいさ:

あいまいな文法は、左または右の派生を使用して複数の構文木を構築することにつながります。考えられるすべての文法があいまいな言語は、あいまいな言語です。

たとえば、C++ はあいまいな言語です。なぜなら、x * y は常に 2 つの異なることを意味する可能性があるからです: Why can't C++ be parsed with a LR(1) parser? .

状況依存性:

文脈依存文法には、これらの規則の左側に、さまざまな種類の文法のすべての規則の左側に必要な 1 つの非終端記号に加えて、(非) 終端記号を含めることができる規則があります。つまり、下降中に非終端記号を置き換えることはできません。代わりに、最初に周囲の非終端記号を確認する必要があります。


ここで気になるのは、多かれ少なかれ文脈依存パーサーが x * y のような曖昧さを解析できると言っているステートメントです。たとえば、上記のリンクされた質問では、「... [作成中に構文ツリーを装飾する] パーサーはコンテキスト フリーではなく、LR パーサー (純粋なパーサー) はコンテキスト フリーである」と述べられています。私の意見では、これは文脈依存パーサー (文脈自由パーサーの反対?) がこれを行うことができることを意味します。別の例は、C++ 構文の一部は文脈依存ですか? この質問には「はい...」と答えます。ここでも同じです:あいまいな文脈自由文法とは何ですか?

この C++ のあいまいさが文脈依存性と何の関係があるのか​​わかりません。このあいまいさに対処できる文脈依存文法はないと思います。たとえば、Typedef, <other>*, PointerDeclaration -> Ident "*" Ident のような架空のルールを使用する場合

その場合、具体的な最初の Ident (例: "x") が Typedef (例: typedef double x;) で使用されたかどうかを (純粋な解析では) 判断することはできません。


したがって、「文脈依存性」という用語がリンクされた質問内で使用されている可能性はありますが、文脈依存性のような単純なものを意味します (たとえば、単純なパーサーによって提供されるよりも多くの情報が必要です)。または、「実際の」文脈依存性とあいまいさの間に何らかの関係がありますか。

編集より具体的な質問: 文脈依存文法を使用して対処できる、文脈自由文法内に何らかの種類のあいまいさはありますか? リンクされた質問では、C++のあいまいさが文脈依存の問題と呼ばれることがあるように聞こえるため、この質問が私に起こります。

Edit2追加情報: 本Computer Systemsの346 ページには、実パラメータと仮パラメータの量が同じであるなどの要件は、文脈依存文法で表現できると記載されています。しかし、多くの複雑なルールが必要になるため、これは非常に面倒です。しかし、おそらくこれは、前述の C++ のあいまいさにも当てはまる可能性があります。次のようなルールがあるように

"Typedef double x", <other>*, PointerDeclaration -> "x" "*" Ident

もちろん、そのようなルールは非常に限られており、すべての可能性を表現するには膨大な量が必要になります。少なくともこれは、(理論的に)文脈に依存しない自由なあいまいさを文脈依存のルールの使用に置き換えることができるかどうかという質問の答えへのアプローチになる可能性があります

4

3 に答える 3

5

文脈依存性とあいまいさは完全に直交しています。あいまいな文脈自由言語と、あいまいでない文脈依存言語が存在します。

文脈依存言語は、文脈依存文法 (CSG) によって解析できる形式言語です。文脈自由文法は単純化された文脈依存言語であるため、すべての文脈自由言語は文脈依存言語でもあります。ただし、すべての形式言語が文脈依存であるとは限りません。CSG でさえ記述できない言語があります。

于 2011-05-22T13:07:27.153 に答える
0

コンパイラは、構文解析を行うために「純粋な」(それが何を意味するにせよ) 文法を使用しません。コンパイラは、すべての実世界のプログラムが行うことを実行する実世界のプログラムであり、特定の状況でヒューリスティックを適用します。これが、コンパイラ ジェネレータを使用して C++ コンパイラ (および他のほとんどの言語のコンパイラ (学部の演習を除く)) が作成されない理由です。

于 2011-05-22T16:32:38.020 に答える