この問題は、閉じ括弧の一部が省略されている式で括弧を一致させる問題とまったく同じです。ここで、「もし」(または代表文法で)開き括弧と「それ以外」(ある)閉じ括弧です。( sと s のシーケンスから、各前に1つずつ配置し、最後に1つずつ配置することで、機械的に sを挿入できます。)かっこ内の脳によく合うので、それが当面の問題であるかのように書いています。b a b c bababcb
従来の「最も近いものに一致する」ダングリングエルスの解像度は、それぞれの終値を、最新のまだ比類のない始値と一致させます。つまり、一致したオープンとそれに対応するクローズの間に、一致しないオープン(または、クローズ)が存在することは決してありません。
考えられる代替策の1つは、各終値を最も早い実行可能な不一致の始値と一致させることです。オープンは、括弧の入れ子に違反することなく一致させることができることを、「実現可能」ここの手段(例えば。最初で実行可能に最後にマッチすることはできません)。()())(()())
このマッチングは外部で行う必要があるため、すべての囲みペアがマッチングされるまで、クローズのマッチングは試行されません。文字列を完全に一致するセグメントに分割した後、解析は両端から内側に向かって動作する必要があるため(潜在的な一致の範囲を効果的に制限するため)、この事実により、制限付き先読みアルゴリズムで解析を生成することは不可能になります。
ただし、オンラインの左から右へのパーサーが存在しないという事実は、明確なCFGがないことを意味するものではありません。(明らかに:回文言語は両端から中央に向かって解析する必要がありますが、明確な文法を書くのは簡単です)。
「最も一致する」括弧の問題の文法を作成するために、私は一致しないオープンの後に一致するオープンを続けることができないという事実に依存しました。一致している場合、一致しないオープンが一致するオープンの終値と一致している可能性があるため、furthest-matchプロパティは適用されません。そのため、一致しないという事実は、さらに遠い一致プロパティに違反します。
だからここに少し不格好な文法があります:
SUMT→U|M→T|aUbT|aUbc|aMbU→aMbM|c→aT|ac
M U a T a T T U USは開始記号です。は完全に一致したステートメントです。間違いなく、比類のない文である(それらは少なくとも一つの不一致含まれる手段それらが空にすることはできませんので、)及び唯一無比のなる「テール」である S。一致しないオープンについての上記の事実は、文法から直接読み取ることができます。すべての一致しないオープンはから派生し、はの末尾にのみ出現でき、後にはのみが続きます。MUaTaTTUUT
不格好さは、が空の文字列と一致しないようにすることから生じます。これは、私が偽りのあいまいさを考慮しているものの束を防ぎます。オープンとクローズのマッチングがすべての代替解析で同じであるという意味で、それらは誤っています。 nullにできる場合は、完全にバランスの取れた文字列も派生します。以来あり、実際には、、あなたが完全にバランスのとれ検討する可能性がある中で曖昧につながると、一連されるように空に続いて、または1つ少ないが、完全にバランスが続く。UUSM∗USMUMU
おそらく、私が選択したものよりも良い回避策があります。しかし、これは動作するようで、テストに使用したBisonのGLRパーサーでうまく機能します。そのパーサーは、あいまいさを処理する追加のコードを記述しない限り、あいまいな解析について文句を言います。私はそれを20個までのオープン+クローズの文字列でテストしましたが、正しくネストされたシーケンスの解析を生成することなく、正しくネストされたシーケンスごとに明確な解析を生成したようです。