「最短一致」以外の「ぶら下がりelse」問題の別の解決策はありますか?


9

以下の文脈自由文法のプレゼント「ぶら下がりelse」タイプのあいまいさ(と想像を意味し、の略と命令またはブロックのいくつかの他の種類の略): たとえば、はまたはとして解析できます(これは、この文法の最も単純/最短のあいまいな単語です)。b c Saif expr thenbelsec aacbcaacbcaacbc

SaSbS|aS|c
aacbc(a(acbc))(a(ac)bc)

この「ぶら下がりelse」曖昧軍「他」(解決するために、「標準」方法「IF-THEN」(最も近い/最も内側とペアに)ステートメントを)。これは次のようにして実現できます。 この文法は明確です。上記の例では、解析をます。a Sbaaacbc

SaTbS|aS|cTaTbT|c
(a(acbc))

質問:aacbcの解析を強制するあいまいさを解決する別の自然な方法はありますか?言い換えると、私は上記の2つと同じ言語を生成する、明確で、aacbc(a(ac)bc)として解析する文法を探しています。a a c b c a a c b c a a c b c aacbcaacbcaacbcaacbc

備考:私の最初の試みは次のとおりです:

SaSbS|aU|cUaU|c
は、必要に応じてaacbcのあいまいさを解決します。aacbcただし、この文法はあいまいですaacbacbcは、aacbacbcまたは(a(acb(ac))bcとして解析できます。aacbacbc

1
そして、あなたの最後の例では、2つの可能な解析のうち、どちらが「自然な」、または正しいと思いますか。そして、なぜですか?
rici

@riciはい、これはトリッキーな質問です!そして、私は知りません。いずれかの構文解析を生成する明確な文法に満足します。私はほとんど気にすることは、そのある(以上に「よりよ一致したS」)は番目の最後のと番目(葉最も内側のさん比類ありません)。、A 、A 、A ... A 、A 、A 、C 、BのCのBのC ... B 、C 、Bのk個のBのK Aaacbacbcaaaaaacbcbcbcabkbkaa
Gro-Tsen 2017年

回答:


7

この問題は、閉じ括弧の一部が省略されている式で括弧を一致させる問題とまったく同じです。ここで、「もし」(または代表文法で)開き括弧と「それ以外」(ある)閉じ括弧です。( sと s のシーケンスから、各前に1つずつ配置し、最後に1つずつ配置することで、機械的に sを挿入できます。)かっこ内の脳によく合うので、それが当面の問題であるかのように書いています。b a b c bababcb

従来の「最も近いものに一致する」ダングリングエルスの解像度は、それぞれの終値を、最新のまだ比類のない始値と一致させます。つまり、一致したオープンとそれに対応するクローズの間に、一致しないオープン(または、クローズ)が存在することは決してありません。

考えられる代替策の1つは、各終値を最も早い実行可能な不一致の始値と一致させることです。オープンは、括弧の入れ子に違反することなく一致させることができることを、「実現可能」ここの手段(例えば。最初で実行可能に最後にマッチすることはできません)。()())

このマッチングは外部で行う必要があるため、すべての囲みペアがマッチングされるまで、クローズのマッチングは試行されません。文字列を完全に一致するセグメントに分割した後、解析は両端から内側に向​​かって動作する必要があるため(潜在的な一致の範囲を効果的に制限するため)、この事実により、制限付き先読みアルゴリズムで解析を生成することは不可能になります。

ただし、オンラインの左から右へのパーサーが存在しないという事実は、明確なCFGがないことを意味するものではありません。(明らかに:回文言語は両端から中央に向かって解析する必要がありますが、明確な文法を書くのは簡単です)。

「最も一致する」括弧の問題の文法を作成するために、私は一致しないオープンの後に一致するオープンを続けることができないという事実に依存しました。一致している場合、一致しないオープンが一致するオープンの終値と一致している可能性があるため、furthest-matchプロパティは適用されません。そのため、一致しないという事実は、さらに遠い一致プロパティに違反します。

だからここに少し不格好な文法があります:

SU|MUT|aUbT|aUbc|aMbUMaMbM|cTaT|ac

M U a T a T T U USは開始記号です。は完全に一致したステートメントです。間違いなく、比類のない文である(それらは少なくとも一つの不一致含まれる手段それらが空にすることはできませんので、)及び唯一無比のなる「テール」である S。一致しないオープンについての上記の事実は、文法から直接読み取ることができます。すべての一致しないオープンはから派生し、はの末尾にのみ出現でき、後にはのみが続きます。MUaTaTTUUT

不格好さは、が空の文字列と一致しないようにすることから生じます。これは、私が偽りのあいまいさを考慮しているものの束を防ぎます。オープンとクローズのマッチングがすべての代替解析で同じであるという意味で、それらは誤っています。 nullにできる場合は、完全にバランスの取れた文字列も派生します。以来あり、実際には、、あなたが完全にバランスのとれ検討する可能性がある中で曖昧につながると、一連されるように空に続いて、または1つ少ないが、完全にバランスが続く。UUSMUSMUMU

おそらく、私が選択したものよりも良い回避策があります。しかし、これは動作するようで、テストに使用したBisonのGLRパーサーでうまく機能します。そのパーサーは、あいまいさを処理する追加のコードを記述しない限り、あいまいな解析について文句を言います。私はそれを20個までのオープン+クローズの文字列でテストしましたが、正しくネストされたシーケンスの解析を生成することなく、正しくネストされたシーケンスごとに明確な解析を生成したようです。


私が結論したことを達成するためのお祝いはおそらく不可能でした!長さ≤16の単語の場合、この文法は確かに明確であり、私の質問の単語と同じ単語が生成されることを実験的に確認しました。今、私はそれがどのように機能するかを詳細に理解する必要があります!
Gro-Tsen 2017年

@ Gro-Tsen:2番目の段落がそれを説明するのに役立つことを願っています。文法は、次のように見せかけのあいまいさが残っているため、はるかに単純です(私のソリューションのように、)そしてそれが私が問題について考えていたときに私が思いついたものです。あいまいな解析を回避するために nullにできないようにする必要があると自分に納得させるには少し時間がかかりました(ただし、前述のとおり、あいまいさは相対的なものです)。私はそれを強制することにしました。もっとエレガントなプレゼンテーションがあると思います。SaSbT|aMbSMTaT|cU
rici

0

a + b + c + d + eとabcdeを取ります。文法でこれらを解析する方法は2つありますが、使用する方法は1つあります。

「他のぶら下がり」の場合、それは実際に人々がそれを見る方法ではありません。代わりに、構文は「if」として解釈され、その後にゼロ、1つ以上の「else if」、その後にオプションの「else」が続きます。


「if…then…else if…then…else if…then…else…」は、私の表記ではに対応していることにしてください。これは、最初の文法(および私が指定するバリアント)によって明確に解析されるため、尋ねません。これの代替解析について。acbacbacbc
Gro-Tsen 2017年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.