置換語句は、標準(E)BNF文脈自由文法定義の拡張である:置換語句含まNプロダクション(または同等に、非終端)スルー。順列句の位置で、これらの生成物のすべてを正確に1回ずつ見たいと思いますが、これらの非終端記号の順序には興味がありません。A n
例えば:
S <- X { A, B, C } Y
と同等です:
S <- X A B C Y
S <- X A C B Y
S <- X B A C Y
S <- X B C A Y
S <- X C A B Y
S <- X C B A Y
この概念は、「順列句による文脈自由文法の拡張」で紹介されているようです。また、LL(1)パーサーを使用してこれらのフレーズを線形時間で解析する方法も説明されています。
「パーミュテーションフレーズの解析」という論文では、パーサーコンビネータを使用してパーミュテーションフレーズを解析する方法について説明しています。これらは、順列句とその解析方法について説明している唯一の2つの論文です。
これらの種類の置換句をLL(1)ベースのパーサーで簡単に解析できることを見て、LR(1)スタイルのパーサーでも同じことができると思います。したがって、私の質問は次のとおりです。
順列句を含む文法は、適切なサイズのテーブルを維持しながら、LR(1)機構を使用して入力文字列サイズで時間線形に解析できますか?
順列句は、文脈自由言語の能力を拡張するものではありません。上の例のように、考えられるすべての順列を単純に列挙できます。ただし、結果のグラマーのサイズはなる可能性があるため、グラマーは爆発します。これにより、線形時間解析が可能になりますが、文法のサイズが非常に大きくなります。
これは優れていますが、もちろん十分ではありません。30項目の順列フレーズがあると、文法が使用できなくなります。まだ触れていないLR解析の一部があり、それが解析に使用される実際のスタックベースの手順です。スタックにカウンターを保存することで問題を解決できるかもしれないと思いますが、その方法はわかりません。
現在、パーサージェネレーターを実装していますが、問題の分野では、順列フレーズは天からの贈り物になるでしょう。LR(1)機械を使用しているので、上記の質問が続きました。