Ce problème est un analogue exact du problème de correspondance des parenthèses dans une expression dans laquelle certaines des parenthèses fermées ont été omises. Ici, un "si" (ou dans la grammaire représentative) est une parenthèse ouverte et un "autre" ( b ) est une parenthèse étroite. (À partir de la séquence de a s et b s, vous pouvez insérer mécaniquement c s en plaçant un avant chaque b et un à la fin.) Parce que cela correspond mieux à mon cerveau entre parenthèses, j'écris comme si c'était le problème.ababcb
La résolution traditionnelle "Correspondance la plus proche", sinon correspond à chaque fermeture avec l'ouverture la plus récente encore inégalée. Cela signifie qu'il n'y a jamais d'ouverture ouverte (ou de fermeture, d'ailleurs) entre une ouverture correspondante et sa fermeture correspondante.
Une alternative possible serait de faire correspondre chaque fermeture avec l'ouverture la plus rapprochée possible et inégalée. "Faisable" signifie ici que l'ouverture peut être mise en correspondance sans violer l'imbrication entre parenthèses (par exemple, la première dans ( ) ( ) ne peut pas correspondre à la dernière ) ).(()())
Cette correspondance doit être effectuée de l'extérieur vers l'intérieur, de sorte qu'aucune correspondance pour une fermeture ne soit tentée tant que toutes les paires englobantes n'ont pas été mises en correspondance. Ce fait rend impossible la production d'une analyse avec un algorithme d'anticipation bornée, car l'analyse doit fonctionner vers l'intérieur à partir des deux extrémités, après avoir divisé la chaîne en segments complètement correspondants (car ceux-ci limitent efficacement la plage de correspondances potentielles).
Cependant, le fait qu'il n'existe pas d'analyseur de gauche à droite en ligne n'implique pas qu'il n'y a pas de CFG sans ambiguïté. (Évidemment: une langue palindromique doit être analysée des deux extrémités vers le milieu, mais il est facile d'écrire une grammaire non ambiguë).
Pour produire une grammaire pour le problème de parenthèse "le plus éloigné", je me suis appuyé sur le fait qu'une ouverture sans correspondance ne peut pas être suivie d'une ouverture avec correspondance. Si tel était le cas, la propriété de correspondance la plus éloignée ne s'appliquerait pas car l'ouverture sans correspondance aurait pu correspondre à la fermeture de l'ouverture correspondante, donc le fait qu'elle ne soit pas correspondante viole la propriété de correspondance la plus éloignée.
Voici donc la grammaire légèrement maladroite:
SUMT→U|M→T|aUbT|aUbc|aMbU→aMbM|c→aT|ac
SMUaTaTTUUT
UUSM∗USMUMU
Il existe probablement une meilleure solution de contournement que celle que j'ai choisie. Mais celui-ci semble fonctionner, et il fonctionne bien avec l'analyseur GLR de Bison que j'ai utilisé pour le tester; cet analyseur se plaint des analyses ambiguës sauf si vous écrivez du code supplémentaire pour gérer l'ambiguïté, et j'étais trop paresseux pour le faire. Je l'ai testé avec des chaînes allant jusqu'à 20 ouvert + ferme, et il semble avoir produit une analyse sans ambiguïté pour chaque séquence correctement imbriquée, sans produire d'analyses pour les séquences incorrectement imbriquées.