Poniższa gramatyka bezkontekstowa przedstawia dwuznaczność typu „wiszące inne” (wyobraź to sobie oznacza if expr then
ioznacza else
i oznacza inny rodzaj instrukcji lub bloku):
Na przykład, może być analizowany jako lub jako (jest to najprostsze / najkrótsze niejednoznaczne słowo dla tej gramatyki).
„Standardowy” sposób rozwiązania tej dwuznaczności „zwisające inaczej” wymusza „inne” (), aby sparować z najbliższym / najbardziej wewnętrznym „if-then” (). Można to zrobić w następujący sposób:
Ta gramatyka jest jednoznaczna. W powyższym przykładzie wymusza rozbiór gramatyczny zdania.
Pytanie: Czy istnieje inny naturalny sposób rozwiązania dwuznaczności, która wymusiłaby parsowanie ? Innymi słowy, szukam gramatyki, która generuje ten sam język co dwa powyższe, która jest jednoznaczna i która analizuje tak jak .
Uwaga: Moja pierwsza próba była następująca:
co rozwiązuje niejednoznaczność zgodnie z wymaganiami - ale ta gramatyka jest nadal niejednoznaczna: może być analizowany jako lub jako .
context-free
formal-grammars
parsers
ambiguity
Gro-Tsen
źródło
źródło
Odpowiedzi:
Ten problem jest dokładnym odpowiednikiem problemu dopasowywania nawiasów w wyrażeniu, w którym pominięto niektóre z bliskich nawiasów. Tutaj „if” (luba w gramatyce reprezentatywnej) jest otwartym nawiasiem i „innym” (b ) to ścisły nawias. (Z sekwencjia s i b możesz wstawić mechanicznie c s, umieszczając po jednym przed każdym b i jeden na samym końcu.) Ponieważ lepiej pasuje do mojego nawiasowego mózgu, piszę tak, jakby to był problem.
Tradycyjna rozdzielczość „dopasuj najbliżej”, wisząca w innym przypadku, dopasowuje każde zamknięcie z najnowszą, jak dotąd niedopasowaną otwartą. Oznacza to, że nigdy nie ma niedopasowanego otwarcia (lub zamknięcia, jeśli o to chodzi) między dopasowanym otworem a pasującym zamknięciem.
Jedną z możliwych alternatyw byłoby dopasowanie każdego zamknięcia do najwcześniejszego możliwego niedopasowanego otwarcia. „Wykonalne” oznacza tutaj, że otwartą można dopasować bez naruszania zagnieżdżenia rodzicielskiego (np. Pierwszego( w ()() nie może realnie pasować do ostatniego ) ).
To dopasowanie musi być wykonane na zewnątrz, aby dopasowanie do zamknięcia nie było podejmowane, dopóki wszystkie otaczające pary nie zostaną dopasowane. Fakt ten uniemożliwia utworzenie analizy z użyciem algorytmu z ograniczonym spojrzeniem, ponieważ analiza musi działać do wewnątrz z obu końców po podzieleniu łańcucha na całkowicie dopasowane segmenty (ponieważ te skutecznie ograniczają zakres potencjalnych dopasowań).
Jednak fakt, że internetowy parser od lewej do prawej nie istnieje, nie oznacza, że nie ma jednoznacznego CFG. (Oczywiście: język palindromiczny musi zostać przeanalizowany z obu końców w kierunku środka, ale łatwo jest napisać jednoznaczną gramatykę).
Aby stworzyć gramatykę dla problemu nawiasów „najdalej dopasowanego”, polegałem na tym, że po niedopasowanym otwarciu nie może nastąpić dopasowany otwór. Gdyby tak było, właściwość najodleglejszego dopasowania nie miałaby zastosowania, ponieważ niedopasowane otwarcie mogłoby pasować do zamknięcia dopasowanego otwarcia, więc fakt, że jest ona niedopasowana, narusza właściwość najdalszego dopasowania.
Oto nieco niezgrabna gramatyka:
Niezręczność wynika z zapobieganiaU z dopasowania pustego ciągu. Zapobiega to wielu tym, co uważam za fałszywe dwuznaczności: są one fałszywe w tym sensie, że dopasowanie otwarcia i zamknięcia jest takie samo we wszystkich alternatywnych parsach. GdybyU jest dozwolone zerowanie, będzie również wyprowadzać całkowicie zrównoważony ciąg. OdS jest w efekcie M∗U , prowadzi to do dwuznaczności, w której można uznać za całkowicie zrównoważoną S być serią M następnie pusty U lub jeden mniej M a następnie całkowicie zrównoważony U .
Prawdopodobnie istnieje lepsze obejście niż to, które wybrałem. Ale ten wydaje się działać i dobrze współpracuje z parserem GLR Bison, którego testowałem; ten parser narzeka na niejednoznaczne analizy, chyba że napiszesz dodatkowy kod, aby poradzić sobie z niejednoznacznością, a ja byłem zbyt leniwy, aby to zrobić. Testowałem go z ciągami do 20 otwartych i zamkniętych i wydaje się, że wytworzył jednoznaczną analizę dla każdej poprawnie zagnieżdżonej sekwencji, bez tworzenia analiz dla nieprawidłowo zagnieżdżonych sekwencji.
źródło
Weź + b + c + d + e i abcde. Są dwa oczywiste sposoby, w jaki gramatyka może je przeanalizować, ale jest jeden sposób, którego używamy.
W przypadku „wiszącego innego”, tak naprawdę ludzie na to nie patrzą. Zamiast tego składnia jest interpretowana jako „if”, po której następuje zero, jeden lub więcej „else if”, po których następuje opcjonalny „else”.
źródło