CFGで空の文字列を生成する非ターミナルをすばやく見つける


8

与えられた文脈自由言語Gについて、場合、非終端の nullableを呼び出します。つまり、有限数のプロダクションを適用した後、から空の文字列を導出できます。A i ϵ A iAi AiϵAi

ここで見つけることができるように、文法の非終端記号がnull可能であるかを決定するための単純なアルゴリズムがあります

最初に、すべての非ターミナルをnull入力不可と見なすことから始めます。プロダクションがある場合、すべてのをnull可能としてマークします。次に、他のすべてのプロダクションをループ処理し、ターミナルが含まれるプロダクションを除外し、すべてのがnull 可能である場合は、をnull可能としてマークします。このループは、非終端記号をヌル可能としてマークせずにループが終了するまで続けます。A iϵ A iB 1 B 2B k A i B iAiAiϵAiB1B2BkAiBi

このアルゴリズムの私の問題は、実行時間がということです。最悪のケースは、例えば、、、...、、。A 1A 2 A 2A 3 A 3A 4 A n 1A n A nϵO(n2)A1A2A2A3A3A4An1AnAnϵ

よりも実行時間が短いこの問題のアルゴリズムはあり ますか?O(n2)


2
そのアルゴリズムを線形時間で実装するのは初歩的なことではないでしょうか?これは宿題の問題でしょうか?
ウォーレンシュディ

特定のクラスの文法に興味がありますか、または任意の文法に取り組みたいですか?
Raphael

1
任意の文法への取り組みに興味があります。Earleyパーサーを実装しています。これは、非終端記号が空の文字列を導出できるかどうかを知るのに役立ちます。私の最初の反応は、これは線形時間で簡単に解決できるはずだというものでしたが、、ような文法は問題を複雑にします。B AABBA
アレックステンブリンク

そのようなルールを実際的な状況で維持する理由はありますか?
Raphael

1
ここで説明する方法でEarleyパーサーを実装しています:webhome.cs.uvic.ca/~nigelh/Publications/…。その論文で採用されているアプローチでは、ある時点で、文法のNULL可能な非終端記号を見つける必要があります。これらがわかったら、Earleyアルゴリズムを適用してイプシロン生成を処理するのは非常に簡単です。
アレックステンブリンク

回答:


8

次のようにそのアルゴリズムを線形時間で実装することはできませんか?(私はこれを注意深く校正していないため、バグが発生する可能性があります。)

以下で「プロダクション」と言うときはいつでも、端末を含まないものだけを含めることを意味します。それはに表示さプロダクション、各非終端のために、リストを作成します。すべての生産のために聞かせて右手側の非端子が現在非NULL可能とマークされているどのように多くの異なる数を。レッツ NULL可能マークが、まだ処理されていないされている非端末のキューを示します。すべてのを、プロダクション右側にある個別の非ターミナルの数に初期化します。すべての非端末をnullにできないように初期化します。すべての非端末に対する生産によって生成されたと加算にc i Q c i i Z i c i = 0 Z Q ZiciQciiZici=0ZQおよびをヌル可能としてマークします。Z

ながら空でない、任意の非末端削除から、次のように処理します。すべての生産のためのという、デクリメントである。場合ゼロになると、対応する非ターミナルかどうかをチェックしすでにNULL可能とマークされています。そうでない場合は、ヌル可能としてマークし、を追加します。X Q j X c j c j Y Y Y QQXQjXcjcjYYYQ


私が何かを逃していない限り、あなたのアルゴリズムはうまくいくと思います。この問題のアルゴリズムをインターネットで検索すると、最初のページで説明したアルゴリズムのいくつかのバリエーションを説明する最初のページで6ダース以上のヒットを取得するのは非常に奇妙です-なぜn二乗アルゴリズムを与えるのですか単純な線形アルゴリズムが存在する場合?
Alex ten Brink

二次アルゴリズムを与える理由の1つとして、それがさらに単純であることが考えられます。実装の詳細を非表示にするnullの可能性を人々に理解させたいだけの場合は、理にかなっています。
ウォーレンシュディ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.