Ця проблема є точним аналогом проблеми узгодження дужок у виразі, в якому деякі з близьких дужок були опущені. Тут "if" (або у репрезентативній граматиці) - це відкрита дужка, а "else" ( ) - близька дужка. (З послідовності е і з , які ви можете механічно вставити s, поміщаючи одну перед кожною і один в самому кінці.) Тому що він підходить краще з моїм вступним мозком, я пишу , як ніби це проблема під руку.ababcb
Традиційна роздільна здатність "ближче до матчу" збігається з кожним закриттям із найсвіжішим відкритим. Це означає, що ніколи не існує неперевершеного відкритого (або закритого для цього питання) між відповідним відкритим і відповідним ним близьким.
Однією з можливих альтернатив було б поєднання кожного закриття з найбільш ранніми можливими відкритими неперевершеними. "Це можливо" тут означає, що відкритий може бути узгоджений, не порушуючи придушення гнізд (наприклад, перший в не може відповідати останньому ).(()())
Це узгодження повинно проводитись поза межами, щоб не було спроб збігу для закриття, поки всі пари, що складаються укладені, не узгоджуються. Цей факт унеможливлює створення синтаксичного аналізу з алгоритмом обмеженого перегляду, оскільки синтаксичний аналіз повинен працювати всередину з обох кінців, розділивши рядок на повністю відповідні сегменти (адже вони фактично обмежують діапазон потенційних збігів).
Однак той факт, що онлайн-аналізатор зліва направо не існує, не означає, що не існує однозначної CFG. (Очевидно: паліндромна мова повинна бути розібрана з обох кінців до середини, але легко написати однозначну граматику).
Щоб створити граматику для проблеми з дужками "з найбільшою відповідністю", я покладався на те, що незрівняний відкритий не може супроводжуватися відповідним відкритим. Якби воно було, то властивість, що відповідає найбільшій відповідності, не застосовувалась би, тому що невідкритий відкритий міг відповідати закриттю відкритого збігу, тому факт, що він є невідмінним, порушує властивість найбільшого збігу.
Ось ось дещо незграбна граматика:
SUMT→U|M→T|aUbT|aUbc|aMbU→aMbM|c→aT|ac
S - символ початку; - цілком відповідні твердження; , безумовно , неузгоджені заяви (що означає , що вони включають в себе , щонайменше , один неперевершених , тому вони не можуть бути порожніми) і є «хвостом» , що складається тільки з неперевершеною s. Вищевказаний факт про неузгоджених відкритих можна прочитати безпосередньо з граматики: все неперевершена відкриває отримані з , А може з'явитися тільки в кінці і може слідувати тільки .MUaTaTTUUT
Незграбність випливає з того, щоб не відповідала порожньому рядку. Це заважає купу того, що я вважаю хибними двозначностями: вони є хибними в тому сенсі, що відповідність відкритих і закритих однакових у всіх альтернативних аналізах. Якщо дозволено бути нульовим, воно також виведе повністю врівноважений рядок. Так є, по суті, , що призводить до двозначності , в якій ви могли б розглянути повністю збалансований буде серія слід порожній , або один менше слід повністю збалансований .UUSM∗USMUMU
Напевно, є кращий шлях, ніж той, який я обрав. Але цей, здається, працює, і він добре грає з аналізатором GLR Bison, який я використовував для його тестування; що аналізатор скаржиться на неоднозначні синтаксиси, якщо ви не напишете додатковий код для вирішення неоднозначності, і я був лінивий зробити це. Я протестував це за допомогою рядків до 20 відкритих + закритих, і, здається, він створив однозначний аналіз для кожної правильно введеної послідовності, не створюючи синтаксичного аналізу для неправильно вкладених послідовностей.