ababcb
Die traditionelle "Match Nearest" -Dangling-else-Auflösung entspricht jedem Abschluss mit dem neuesten, noch nicht übereinstimmenden Open. Das bedeutet, dass es zwischen einem übereinstimmenden Öffnen und seinem übereinstimmenden Schließen niemals ein unübertroffenes Öffnen (oder Schließen) gibt.
(()())
Dieser Abgleich muss von außen nach innen erfolgen, damit erst dann ein Abgleich für einen Abschluss versucht wird, wenn alle umschließenden Paare abgeglichen wurden. Diese Tatsache macht es unmöglich, eine Analyse mit einem Bounded-Lookahead-Algorithmus zu erstellen, da die Analyse von beiden Enden nach innen arbeiten muss, nachdem die Zeichenfolge in vollständig übereinstimmende Segmente aufgeteilt wurde (da diese den Bereich potenzieller Übereinstimmungen effektiv einschränken).
Die Tatsache, dass es keinen Online-Parser von links nach rechts gibt, bedeutet jedoch nicht, dass es keine eindeutige CFG gibt. (Offensichtlich: Eine palindromische Sprache muss von beiden Enden zur Mitte hin analysiert werden, aber es ist einfach, eine eindeutige Grammatik zu schreiben.)
Um eine Grammatik für das Klammerproblem "am weitesten übereinstimmend" zu erstellen, habe ich mich auf die Tatsache verlassen, dass auf ein nicht übereinstimmendes Öffnen kein übereinstimmendes Öffnen folgen kann. Wenn dies der Fall wäre, würde die am weitesten übereinstimmende Eigenschaft nicht zutreffen, da das nicht übereinstimmende Öffnen mit dem Schließen des übereinstimmenden Open übereinstimmen könnte. Die Tatsache, dass es nicht übereinstimmt, verstößt also gegen die am weitesten übereinstimmende Eigenschaft.
Hier ist also die etwas klobige Grammatik:
SUMT→U|M→T|aUbT|aUbc|aMbU→aMbM|c→aT|ac
SMUaTaTTUUT
UUSM∗USMUMU
Wahrscheinlich gibt es eine bessere Problemumgehung als die, die ich gewählt habe. Aber dieser scheint zu funktionieren, und er spielt gut mit Bisons GLR-Parser, mit dem ich ihn getestet habe. Dieser Parser beschwert sich über mehrdeutige Analysen, es sei denn, Sie schreiben zusätzlichen Code, um mit der Mehrdeutigkeit umzugehen, und ich war zu faul, dies zu tun. Ich habe es mit Zeichenfolgen von bis zu 20 Öffnen + Schließen getestet, und es scheint eine eindeutige Analyse für jede korrekt verschachtelte Sequenz erzeugt zu haben, ohne Parsen für falsch verschachtelte Sequenzen zu erstellen.