Ostatnio dobrze się bawiłem, badając rozwój parserów językowych w kontekście ich dopasowania do hierarchii Chomsky'ego.
Jaki jest dobry (nie teoretyczny) przykład gramatyki kontekstowej?
Ostatnio dobrze się bawiłem, badając rozwój parserów językowych w kontekście ich dopasowania do hierarchii Chomsky'ego.
Jaki jest dobry (nie teoretyczny) przykład gramatyki kontekstowej?
Odpowiedzi:
Dobre pytanie. Chociaż, jak wspomniano w komentarzach, wiele języków programowania jest wrażliwych na kontekst, jednak wrażliwość na kontekst często nie jest rozwiązywana w fazie analizowania, ale w późniejszych fazach - to znaczy, nadzbiór języka jest analizowany przy użyciu gramatyki bezkontekstowej, a niektóre z tych drzew są później filtrowane.
Nie oznacza to jednak, że te języki nie uwzględniają kontekstu , dlatego oto kilka przykładów:
Haskell pozwala definiować funkcje używane jako operatory, a także określać priorytet i asocjatywność tych operatorów. Innymi słowy, nie można zbudować poprawnego drzewa analizy dla wyrażenia operatora, takiego jak:
a @@ b @@ c ## d ## e
chyba że już przeanalizowałeś deklaracje pierwszeństwa / asocjatywności dla @@
i ##
:
infixr 8 @@
infixr 6 ##
Drugim przykładem jest Bencode , język danych, który poprzedza treść swoją długością:
<length>:<contents>
Problem z tym formatem polega na tym, że prawie niemożliwe jest parsowanie bez czegoś kontekstowego, ponieważ jedynym sposobem na określenie rozmiarów „pola” jest ... parsowanie łańcucha.
Trzecim przykładem jest XML, zakładając, że dowolne nazwy znaczników są dozwolone: nazwy znaczników otwierających muszą mieć pasujące znaczniki zamknięcia:
<hi>
<bye>
the closing tag has to match bye
</bye>
</hi> <!-- has to match "hi" -->
Tak długo, jak wiem, Gramatyki kontekstowe są wykorzystywane w przetwarzaniu języka naturalnego, tylko . Tłumacze języków programowania i kompilatory nie próbują analizować gramatyki bezkontekstowej ze względu na złożoność (nawet jeśli w przeszłości podjęto jakąś próbę).
Może znajdziesz przykład rzeczywistego wykorzystania w jednej z tych bibliotek:
http://en.wikipedia.org/wiki/List_of_natural_language_processing_toolkits
Gramatyki wrażliwe na kontekst są czasami używane w opisach semantyki języka programowania. Być może najbardziej wszechstronnym zastosowaniem gramatyk kontekstowych była definicja języka Algol68. Używał dwupoziomowego, wolnego od kontekstu gramatyka (patrz http://en.wikipedia.org/wiki/Two-level_grammar ) do opisania zarówno składni, jak i semantyki programów Algol68.
Kilku moich kolegów używało gramatyki van Wijngaarden do kierowania ich implementacją Algol68 (patrz http://en.wikipedia.org/wiki/FLACC ).