Powyższe odpowiedzi podają całkiem dobrą definicję tego, co to jest. Zobaczmy, czy mogę to wyrazić własnymi słowami, tak abyś miał 23 wyjaśnienia zamiast 20. Cała gramatyka, każda gramatyka, polega na ustaleniu, czy dane zdanie jest zdaniem w danym języku. Jednak tak naprawdę używamy gramatyki i analizowania, aby dowiedzieć się, co to zdanie oznacza. To jest jak stare schematy zdania, które mogłeś, ale nie musiałeś, powtórzyć na lekcji angielskiego w szkole. Zdanie składa się z części podmiotowej i predykatowej, część tematyczna ma rzeczownik i może niektóre przymiotniki, część predykatowa ma czasownik, a może rzeczownik rzeczowy, z kilkoma przymiotnikami itp.
Gdyby istniała gramatyka języka angielskiego (i nie sądzę, by istniała, nie w sensie informatyki), wówczas obowiązywałyby ją zasady następującej formy, zwane produkcjami.
Sentence -> SubjectPart PredicatePart
SubjectPart -> Adjective Noun
itp...
Następnie możesz napisać program i przekazać mu dowolne zdanie, a program może użyć gramatyki, aby dowiedzieć się, która część zdania to każde słowo i jaki mają związek ze sobą.
Jeśli w każdej produkcji jest tylko jedna rzecz po lewej stronie, oznacza to, że ilekroć widzisz prawą stronę w zdaniu, możesz zastępować po lewej stronie. Na przykład za każdym razem, gdy widziałeś rzeczownik przymiotnikowy, możesz powiedzieć „That's a SubjectPart”, nie zwracając uwagi na nic poza tym wyrażeniem.
Jednak angielski (nawet uproszczony opis angielskiego, który podałem powyżej) jest zależny od kontekstu. „Przymiotnik” nie zawsze jest podmiotem, może być wyrażeniem rzeczownikowym w predykacie. To zależy od kontekstu. Rozwińmy nieco naszą pseudo-angielską gramatykę:
Sentence -> SubjectPart PredicatePart
SubjectPart -> Adjective Noun
PredicatePart -> VerbPhrase ObjectNounPhrase
VerbPhrase ObjectNounPhrase -> VerbPhrase Adjective Noun
Możesz utworzyć „rzeczownik przymiotnikowy” w wyrażeniu ObjectNounPhrase, tylko jeśli występuje ono po wyrażeniu czasownikowym.
Zasadniczo, jeśli masz produkcję i możesz ją zastosować w dowolnym momencie, bez względu na to, co go otacza, jest on pozbawiony kontekstu.
Zawsze możesz łatwo stwierdzić, czy gramatyka jest pozbawiona kontekstu. Po prostu sprawdź, czy po lewej stronie strzałek jest więcej niż jeden symbol.
Każdy język może być opisany przez więcej niż jedną gramatykę. Jeśli jakaś gramatyka języka jest pozbawiona kontekstu, język jest pozbawiony kontekstu. W przypadku niektórych języków można udowodnić, że nie jest możliwa gramatyka bezkontekstowa. Przypuszczam, że może istnieć gramatyka bezkontekstowa dla uproszczonego pseudo-angielskiego podzbioru, który opisuję powyżej.
Jeśli chodzi o to, dlaczego ma to znaczenie, wymaga prostszego programu do parsowania gramatyki bezkontekstowej. Jak zauważono w innych odpowiedziach, nie wymaga pełnej mocy maszyny Turinga, aby parsować gramatykę bezkontekstową. Analizator składni LR (1) lookahead (który jest rodzajem maszyny wypychającej) dla konkretnej gramatyki bezkontekstowej może analizować dowolne zdanie w tej gramatyce w czasie i przestrzeni liniowej do długości zdania. Jeśli zdanie jest w języku, analizator składni utworzy drzewo struktury identyfikujące, co oznacza każdy symbol w zdaniu (lub przynajmniej jaką rolę odgrywa w strukturze). Jeśli zdania nie ma w gramatyce, parser zauważy i zatrzyma się na pierwszym symbolu, którego nie da się pogodzić z gramatyką i poprzedzającymi symbolami (na pierwszym „błędzie”).
Jeszcze lepsze jest to, że istnieją programy, w których możesz podać opis gramatyki oraz listę instrukcji dotyczących tego, co zrobić z każdą częścią (w pewnym sensie przypisując „znaczenie” do każdej produkcji), a program napisze parser dla Was. Program przeanalizuje zdanie, znajdzie strukturę i uruchomi instrukcje dla każdej części struktury. Ten rodzaj programu nazywa się generatorem analizatora składni lub kompilatorem-kompilatorem.
Ten rodzaj analizy języka został wymyślony do automatycznej analizy języka naturalnego (np. Angielskiego), ale okazuje się, że jest to najbardziej przydatne do analizy języków komputerowych. Projektant języka może napisać gramatykę, która przechwytuje jego nowy język, a następnie uruchomić go za pomocą generatora analizatora składni, aby uzyskać program, który analizuje jego język i tłumaczy, interpretuje, kompiluje, wykonuje itp., Jeśli chce.
W rzeczywistości w większości przypadków tak naprawdę nie można tego zrobić. Na przykład zrównoważone nawiasy są językiem bezkontekstowym, ale język, w którym wymagane jest zadeklarowanie wszystkich zmiennych przed ich użyciem, jest zależny od kontekstu. Analizator składni jest częścią kompilatora, ale wymagana jest dodatkowa logika w celu wymuszenia tych innych wymagań. Następnie musisz napisać gramatykę, która przechwytuje jak najwięcej twojego języka, uruchom go przez generator parsera, a następnie napisz kod, który egzekwuje pozostałe wymagania (moduł obsługi tabeli symboli itp.).
Zasadniczo nie używamy gramatyk kontekstowych, ponieważ są one znacznie słabiej obsługiwane. Nie wiem, czy istnieje odpowiednik generatora analizatora składni LR (k) dla języków kontekstowych. Tak, maszyna Turinga (lub maszyna związana liniowo) może parsować jedną, ale nie wiem, czy istnieje ogólny algorytm przekształcania gramatyki kontekstowej w program dla maszyny Turinga w tym sensie, że LR (1 ) generator tworzy tabele analizujące dla maszyny pushdown. Domyślam się, że tabele leżące u podstaw parsera byłyby wykładniczo większe. W każdym razie studenci CS (podobnie jak ja, w przeszłości) zwykle uczą się gramatyki bezkontekstowej i generatorów analizatora składni LR (1), takich jak YACC.