Чи існує інше вирішення проблеми "звисання іншого", окрім "матчу найближчих"?


9

Наступні контекстно-вільної граматики являє «обірваних ще» тип неоднозначності (уявіть собі , що означає і означає і позначає який - то іншої команди або блоку): Наприклад, може бути проаналізований як або як (це найпростіше / найкоротше неоднозначне слово для цієї граматики).aif expr thenbelsec

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

"Стандартний" спосіб вирішити цю неоднозначність "примушує" твердження "else" ( ) поєднуватися з найближчим / найпотаємнішим "if-then" ( ). Це можна здійснити так: Ця граматика однозначна. У наведеному вище прикладі він змушує синтаксичний розбір .ba

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

Запитання: Чи існує інший природний спосіб вирішити двозначність, який змусив би синтаксичний розбір ? Іншими словами, я шукаю граматику, яка генерує ту саму мову, що і дві вище, що є однозначною і що розбирає як .(a(ac)bc)aacbcaacbc(a(ac)bc)

Зауваження: Першою моєю спробою було таке: який вирішує неоднозначність як потрібно - але ця граматика все-таки неоднозначна: може бути проаналізований як або як .

SaSbS|aU|cUaU|c
aacbcaacbacbc(a(ac)b(acbc))(a(acb(ac))bc)

1
І в останньому прикладі, який із двох можливих синтаксисів ви вважаєте "природним", чи правильним, і чому?
rici

@rici Так, це складне питання !, і я не знаю. Я буду задоволений однозначною граматикою, яка створює або синтаксичний розбір на . Що мене найбільше хвилює, це те, що (з більшою кількістю 's, ніж ' s) відповідає ому останньому з -th (і залишає неперевершеним 's). aacbacbcaaaaaacbcbcbcabkbkaa
Гро-Цен

Відповіді:


7

Ця проблема є точним аналогом проблеми узгодження дужок у виразі, в якому деякі з близьких дужок були опущені. Тут "if" (або у репрезентативній граматиці) - це відкрита дужка, а "else" ( ) - близька дужка. (З послідовності е і з , які ви можете механічно вставити s, поміщаючи одну перед кожною і один в самому кінці.) Тому що він підходить краще з моїм вступним мозком, я пишу , як ніби це проблема під руку.ababcb

Традиційна роздільна здатність "ближче до матчу" збігається з кожним закриттям із найсвіжішим відкритим. Це означає, що ніколи не існує неперевершеного відкритого (або закритого для цього питання) між відповідним відкритим і відповідним ним близьким.

Однією з можливих альтернатив було б поєднання кожного закриття з найбільш ранніми можливими відкритими неперевершеними. "Це можливо" тут означає, що відкритий може бути узгоджений, не порушуючи придушення гнізд (наприклад, перший в не може відповідати останньому ).(()())

Це узгодження повинно проводитись поза межами, щоб не було спроб збігу для закриття, поки всі пари, що складаються укладені, не узгоджуються. Цей факт унеможливлює створення синтаксичного аналізу з алгоритмом обмеженого перегляду, оскільки синтаксичний аналіз повинен працювати всередину з обох кінців, розділивши рядок на повністю відповідні сегменти (адже вони фактично обмежують діапазон потенційних збігів).

Однак той факт, що онлайн-аналізатор зліва направо не існує, не означає, що не існує однозначної CFG. (Очевидно: паліндромна мова повинна бути розібрана з обох кінців до середини, але легко написати однозначну граматику).

Щоб створити граматику для проблеми з дужками "з найбільшою відповідністю", я покладався на те, що незрівняний відкритий не може супроводжуватися відповідним відкритим. Якби воно було, то властивість, що відповідає найбільшій відповідності, не застосовувалась би, тому що невідкритий відкритий міг відповідати закриттю відкритого збігу, тому факт, що він є невідмінним, порушує властивість найбільшого збігу.

Ось ось дещо незграбна граматика:

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

S - символ початку; - цілком відповідні твердження; , безумовно , неузгоджені заяви (що означає , що вони включають в себе , щонайменше , один неперевершених , тому вони не можуть бути порожніми) і є «хвостом» , що складається тільки з неперевершеною s. Вищевказаний факт про неузгоджених відкритих можна прочитати безпосередньо з граматики: все неперевершена відкриває отримані з , А може з'явитися тільки в кінці і може слідувати тільки .MUaTaTTUUT

Незграбність випливає з того, щоб не відповідала порожньому рядку. Це заважає купу того, що я вважаю хибними двозначностями: вони є хибними в тому сенсі, що відповідність відкритих і закритих однакових у всіх альтернативних аналізах. Якщо дозволено бути нульовим, воно також виведе повністю врівноважений рядок. Так є, по суті, , що призводить до двозначності , в якій ви могли б розглянути повністю збалансований буде серія слід порожній , або один менше слід повністю збалансований .UUSMUSMUMU

Напевно, є кращий шлях, ніж той, який я обрав. Але цей, здається, працює, і він добре грає з аналізатором GLR Bison, який я використовував для його тестування; що аналізатор скаржиться на неоднозначні синтаксиси, якщо ви не напишете додатковий код для вирішення неоднозначності, і я був лінивий зробити це. Я протестував це за допомогою рядків до 20 відкритих + закритих, і, здається, він створив однозначний аналіз для кожної правильно введеної послідовності, не створюючи синтаксичного аналізу для неправильно вкладених послідовностей.


Вітання з досягненням того, що я зробив висновок, було, мабуть, неможливим! Я експериментально перевірив, що для слів довжиною ≤16 ця граматика дійсно однозначна і породжує ті самі слова, що й мої запитання. Тепер я мушу детально розібратися, як це працює!
Гро-Цен

@ Гро-Цен: Сподіваюся, другий параграф допоможе пояснити це. Граматика набагато простіша з помилковими двозначностями, залишеними в: ( як у моєму рішенні, ), і ось що я придумав, коли думав про проблему. Мені знадобилося певний час, щоб переконати себе в тому, що потрібно зробити нерегульованим, щоб уникнути неоднозначних розборів (хоча, як я вже сказав, неоднозначність відносна), і ще деякий час, щоб обійти мою неприємність щодо шляху Я вирішив це застосувати. Б'юсь об заклад, є більш елегантна презентація. SaSbT|aMbSMTaT|cU
rici

0

Візьміть a + b + c + d + e і abcde. Є два очевидних способи, як граматика могла би їх розібрати, але є один із способів, який ми використовуємо.

Що стосується «звисаючого іншого», то насправді це не так, як люди дивляться на це. Натомість синтаксис інтерпретується як "якщо", а за ним - нуль, один або більше "ще", а потім необов'язкове "ще".


Зауважте, що "якщо ... тоді ... інше, якщо ... тоді ... інше, якщо ... тоді ... інше ..." відповідає моєму позначенню : це однозначно розбирається моєю початковою граматикою (і варіантами, які я погоджуюсь), тому я не прошу для альтернативного розбору цього. acbacbacbc
Гро-Цен
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.