Niejednoznaczna gramatyka

W informatyce gramatyka niejednoznaczna jest gramatyką bezkontekstową, dla której istnieje ciąg , który może mieć więcej niż jedno lewe wyprowadzenie lub drzewo analizy . Każdy niepusty język bezkontekstowy dopuszcza niejednoznaczną gramatykę, wprowadzając np. regułę powielania. Język, który dopuszcza tylko niejednoznaczne gramatyki, nazywany jest językiem z natury niejednoznacznym . Deterministyczne gramatyki bezkontekstowe są zawsze jednoznaczne i stanowią ważną podklasę gramatyk jednoznacznych; istnieją jednak niedeterministyczne gramatyki jednoznaczne.

języków programowania komputerowego gramatyka referencyjna jest często niejednoznaczna z powodu problemów, takich jak problem wiszącego else . Jeśli występują, te niejasności są na ogół rozwiązywane przez dodanie reguł pierwszeństwa lub innych kontekstowej , więc ogólna gramatyka fraz jest jednoznaczna. [ Potrzebne źródło ] Niektóre algorytmy analizujące (takie jak parsery Earley lub GLR ) mogą generować zestawy drzew analizy (lub „lasy analizy”) z łańcuchów, które są składniowo niejednoznaczne .

Przykłady

Trywialny język

Najprostszym przykładem jest następująca niejednoznaczna gramatyka (z symbolem początkowym A) dla trywialnego języka, który składa się tylko z pustego ciągu:

ZA → ZA | ε

…co oznacza, że ​​nieterminal A może być wyprowadzony albo do samego siebie, albo do pustego łańcucha. Tak więc pusty ciąg ma skrajne lewe wyprowadzenia o długości 1, 2, 3, a nawet dowolnej długości, w zależności od tego, ile razy reguła A → A jest używana.

Język ten posiada również jednoznaczną gramatykę, składającą się z jednej reguły produkcji :

A → ε

…co oznacza, że ​​unikalna produkcja może wytworzyć tylko pusty ciąg, który jest unikalnym ciągiem w języku.

W ten sam sposób każdą gramatykę dla niepustego języka można uczynić niejednoznaczną, dodając duplikaty.

Ciąg jednoargumentowy

Język regularny ciągów jednoargumentowych danego znaku, powiedzmy 'a' (wyrażenie regularne a* ), ma jednoznaczną gramatykę:

A → aA | ε

…ale ma też niejednoznaczną gramatykę:

A → aA | Aa | ε

Odpowiadają one utworzeniu prawego drzewa asocjacyjnego (dla gramatyki jednoznacznej) lub umożliwieniu zarówno lewego, jak i prawego skojarzenia. Zostało to omówione poniżej.

Dodawanie i odejmowanie

Gramatyka bezkontekstowa

ZA → ZA + ZA | A-A | A

jest niejednoznaczne, ponieważ istnieją dwa skrajne lewe wyprowadzenia dla łańcucha a + a + a:

     A → A + A      A → A + A
     → a + A      → A + A + A (Pierwsze A jest zastępowane przez A + A. Zastąpienie drugiego A dałoby podobne wyprowadzenie)
     → za + za + za      → za + za + za
     → za + za + za      → za + za + za
     → za + za + za      → za + za + za

Jako inny przykład, gramatyka jest niejednoznaczna, ponieważ istnieją dwa drzewa analizy dla łańcucha a + a - a:

Leftmostderivations jaredwf.svg

Język, który generuje, nie jest jednak z natury niejednoznaczny; poniżej znajduje się niejednoznaczna gramatyka generująca ten sam język:

ZA → ZA + za | A-a | A

Wiszące inaczej

Typowym przykładem niejednoznaczności w językach programowania komputerów jest problem wiszącego else . W wielu językach else w instrukcji If–then(–else) jest opcjonalne, co powoduje, że zagnieżdżone wyrażenia warunkowe mają wiele sposobów rozpoznawania pod względem gramatyki bezkontekstowej.

Konkretnie, w wielu językach można pisać tryby warunkowe w dwóch ważnych formach: if-then i if-then-else - w efekcie czyniąc klauzulę else opcjonalną:

W gramatyce zawierającej reguły

 Instrukcja →  jeśli  Warunek  to  Instrukcja |  if  Warunek  then  Instrukcja  else  Instrukcja | ... Warunek → ...  

mogą pojawić się pewne niejednoznaczne struktury fraz. Ekspresja

  jeśli  a  to  jeśli  b  to  s  jeszcze  s2 

można przeanalizować jako albo

    jeśli  a  to  zacznij  jeśli  b  to  s  koniec  inaczej  s2 

lub jako

   jeśli  a  to  zacznij  jeśli  b  to  s  inaczej  s2  koniec 

w zależności od tego, czy else jest powiązane z pierwszym if czy drugim if .

Jest to rozwiązywane na różne sposoby w różnych językach. Czasami gramatyka jest modyfikowana tak, aby była jednoznaczna, na przykład wymagając endif lub czyniąc else obowiązkowym. W innych przypadkach gramatyka pozostaje niejednoznaczna, ale niejednoznaczność rozwiązuje się, czyniąc ogólną gramatykę kontekstową, na przykład przez powiązanie else z najbliższym if . W tym ostatnim przypadku gramatyka jest jednoznaczna, ale gramatyka bezkontekstowa jest niejednoznaczna. [ wymagane wyjaśnienie ]

Jednoznaczna gramatyka z wieloma pochodnymi

Istnienie wielu pochodnych tego samego ciągu nie wystarczy, aby wskazać, że gramatyka jest niejednoznaczna; tylko wiele skrajnie lewych (lub równoważnie wiele drzew analizy) wskazuje na niejednoznaczność.

Na przykład prosta gramatyka

S → ZA + ZA ZA → 0 | 1

jest jednoznaczną gramatyką dla języka { 0+0, 0+1, 1+0, 1+1 }. Chociaż każda z tych czterech strun ma tylko jedno skrajne lewe wyprowadzenie, ma na przykład dwa różne wyprowadzenia

 S  ZA + ZA ⇒ 0 + ZA ⇒ 0 + 0 

I

S ⇒ ZA + ZA ⇒ ZA + 0 ⇒ 0 + 0

Tylko poprzednie wyprowadzenie jest najbardziej wysunięte na lewo.

Rozpoznawanie niejednoznacznych gramatyk

Problem decyzyjny , czy dowolna gramatyka jest niejednoznaczna, jest nierozstrzygalny , ponieważ można wykazać, że jest równoważny problemowi korespondencji pocztowej . Przynajmniej istnieją narzędzia implementujące procedurę półdecyzyjną do wykrywania niejednoznaczności gramatyk bezkontekstowych.

O wydajności parsowania gramatyki bezkontekstowej decyduje automat, który ją akceptuje. Deterministyczne gramatyki bezkontekstowe są akceptowane przez deterministyczne automaty przesuwające w dół i mogą być analizowane w czasie liniowym, na przykład przez parser LR . Stanowią ścisły podzbiór gramatyk bezkontekstowych , które są akceptowane przez automaty przesuwające i mogą być analizowane w czasie wielomianowym, na przykład przez algorytm CYK .

Jednoznaczne gramatyki bezkontekstowe mogą być niedeterministyczne. Na przykład język parzystych palindromów na alfabecie 0 i 1 ma jednoznaczną gramatykę bezkontekstową S → 0S0 | 1S1 | ε. Dowolnego ciągu znaków tego języka nie można przeanalizować bez uprzedniego odczytania wszystkich jego symboli, co oznacza, że ​​automat przesuwający w dół musi wypróbować alternatywne przejścia stanów, aby dostosować się do różnych możliwych długości częściowo przeanalizowanego łańcucha.

Niemniej jednak usunięcie niejednoznaczności gramatycznej może skutkować deterministyczną gramatyką bezkontekstową, a tym samym pozwolić na bardziej wydajną analizę składniową. Generatory kompilatorów, takie jak YACC , zawierają funkcje rozwiązywania niektórych rodzajów niejednoznaczności, na przykład za pomocą ograniczeń pierwszeństwa i asocjatywności.

Języki z natury niejednoznaczne

Podczas gdy niektóre języki bezkontekstowe (zestaw ciągów znaków, które mogą być generowane przez gramatykę) mają zarówno gramatykę niejednoznaczną, jak i jednoznaczną, istnieją języki bezkontekstowe, dla których nie może istnieć jednoznaczna gramatyka bezkontekstowa. Takie języki nazywane są z natury niejednoznacznymi .

Nie ma z natury niejednoznacznych języków regularnych.

Istnienie z natury niejednoznacznych języków bezkontekstowych zostało udowodnione za pomocą twierdzenia Parikha w 1961 roku przez Rohita Parikha w raporcie z badań MIT.

Język jest z natury niejednoznaczne.

Lemat Ogdena może być użyty do udowodnienia, że ​​pewne języki bezkontekstowe, takie jak , są z natury niejednoznaczne. Zobacz tę stronę , aby uzyskać dowód.

związek z jest z natury niejednoznaczne. Ten zestaw jest bezkontekstowy, ponieważ połączenie dwóch języków bezkontekstowych jest zawsze bezkontekstowe. Ale Hopcroft i Ullman (1979) podają dowód, że jakakolwiek gramatyka bezkontekstowa dla tego języka związkowego nie może jednoznacznie analizować łańcuchów postaci za .

Więcej przykładów i ogólny przegląd technik dowodzenia nieodłącznej niejednoznaczności języków bezkontekstowych można znaleźć w Bassino i Nicaud (2011).

Zobacz też

  1. ^   Willem JM Levelt (2008). Wprowadzenie do teorii języków formalnych i automatów . Wydawnictwo Johna Benjamina. ISBN 978-90-272-3250-2 .
  2. ^ Scott, Elżbieta (1 kwietnia 2008). „Przetwarzanie w stylu SPPF od Earley Recognizer” . Notatki elektroniczne w informatyce teoretycznej . 203 (2): 53–67. doi : 10.1016/j.entcs.2008.03.044 .
  3. Bibliografia _ „ Wydajny algorytm analizowania bez kontekstu rozszerzonego ”. Lingwistyka komputerowa 13.1-2 (1987): 31-46.
  4. Bibliografia   _ _ Motwani, Rajeev ; Ullman, Jeffrey (2001). Wprowadzenie do teorii automatów, języków i obliczeń (wyd. 2). Addison-Wesley. Twierdzenie 9.20, s. 405–406. ISBN 0-201-44124-1 .
  5. ^   Axelsson, Roland; Heljanko, Keijo; Lange, Martin (2008). „Analiza gramatyk bezkontekstowych za pomocą przyrostowego narzędzia SAT Solver” (PDF) . Materiały z 35. Międzynarodowego Kolokwium Automatów, Języków i Programowania (ICALP'08), Reykjavik, Islandia . Notatki z wykładów z informatyki . Tom. 5126. Springer Verlag. s. 410–422. doi : 10.1007/978-3-540-70583-3_34 . ISBN 978-3-540-70582-6 .
  6. ^ Knuth, DE (lipiec 1965). „O tłumaczeniu języków od lewej do prawej” . Informacji i Kontroli . 8 (6): 607–639. doi : 10.1016/S0019-9958(65)90426-2 .
  7. Bibliografia   _ _ Motwani, Rajeev ; Ullman, Jeffrey (2001). Wprowadzenie do teorii automatów, języków i obliczeń (wyd. 2). Addison-Wesley. s. 249–253. ISBN 0-201-44124-1 .
  8. ^   Książka, R .; Nawet S.; Greibach S.; Ott, G. (luty 1971). „Niejednoznaczność wykresów i wyrażeń” . Transakcje IEEE na komputerach . C-20 (2): 149–153. doi : 10.1109/tc.1971.223204 . ISSN 0018-9340 .
  9. ^ „Języki formalne - Czy wyrażenia regularne mogą być jednoznaczne?” . Przepełnienie matematyki . Źródło 2023-02-23 .
  10. ^ Parikh, Rohit (styczeń 1961). Urządzenia generujące język . Kwartalny raport z postępów, Research Laboratory of Electronics, MIT.
  11. ^   Parikh, Rohit J. (1966-10-01). „O językach bezkontekstowych” . Dziennik ACM . 13 (4): 570–581. doi : 10.1145/321356.321364 . ISSN 0004-5411 . Tutaj: Twierdzenie 3.
  12. ^   Ogden, William (wrzesień 1968). „Pomocny wynik do udowodnienia nieodłącznej niejednoznaczności” . Teoria systemów matematycznych . 2 (3): 191–194. doi : 10.1007/bf01694004 . ISSN 0025-5661 .
  13. ^ s. 99-103, sekcja 4.7
  14. ^ Fredérique Bassino i Cyril Nicaud (16 grudnia 2011). „Philippe Flajolet i analityczna kombinatoryka: nieodłączna niejednoznaczność języków bezkontekstowych” (PDF) . Zarchiwizowane (PDF) od oryginału w dniu 2022-09-25.

Notatki

Linki zewnętrzne

  • dk.brics.grammar - analizator niejednoznaczności gramatycznych.
  • CFGAnalyzer - narzędzie do analizy gramatyk bezkontekstowych pod kątem uniwersalności języka, niejednoznaczności i podobnych właściwości.