Gramatyka formalna: Różnice pomiędzy wersjami
[wersja przejrzana] | [wersja przejrzana] |
Usunięta treść Dodana treść
m drobne techniczne, WP:SK |
|||
Linia 10:
Gramatyka formalna posiada wyróżniony symbol nieterminalny, zwany '''[[symbol startowy|symbolem startowym]]''', od którego, poprzez stosowanie reguł produkcji, zaczyna się wyprowadzanie wszystkich wyrazów języka formalnego. Tworzenie wyrazu języka formalnego kończy się wówczas gdy zawiera on już tylko symbole terminalne.
Symbole terminalne (równoważne symbolom alfabetu języka) są symbolami, które pozostaną w wyprowadzonym słowie – w przeciwieństwie do symboli nieterminalnych używanych tylko podczas wyprowadzania słowa. Reguły gramatyki postaci <math>S_1 \
Rozważmy przykładową gramatykę z symbolem nieterminalnym S, który jest jednocześnie symbolem startowym, oraz zbiorem symboli terminalnych <math>\{a,b\}.</math>
Reguły tej gramatyki, która umożliwia generowanie słów postaci ba, abab, aababb, aaababbb itd. wyglądają następująco:
* <math>S \
* <math>S \
Zaczynamy od symbolu startowego S, możemy zastąpić go przez aSb zgodnie z pierwszą regułą. Możemy użyć jej jeszcze raz otrzymując aaSbb. Po użyciu drugiej reguły pozostanie nam ciąg aababb. Składa się on tylko z symboli terminalnych, więc wyprowadzenie słowa zostało zakończone.
== Symbol startowy ==
Wymaganie, żeby symbol startowy był jeden, nie ogranicza nam szczególnie możliwości budowania gramatyk. Jeśli chcemy zacząć generację od jakiegoś innego słowa <math>w_1,</math>
== Symbole terminalne i nieterminalne ==
Linia 26:
Jeśli chcemy możemy nawet wymagać, żeby po '''lewej''' stronie każdej reguły były '''tylko symbole nieterminalne'''.
Jeśli mamy w którymś miejscu symbol terminalny <math>a,</math>
to tworzymy specjalny symbol nieterminalny <math>X_a,</math>
Wtedy wszędzie oprócz tej reguły zamiast <math>a</math> używamy <math>X_a.</math>
Dla przykładu, załóżmy że mamy gramatykę:
* <math>S \
* <math>a \
* <math>b \
* <math>c \
I chcemy żeby po lewej stronie były tylko symbole nieterminalne. Dodajemy więc następujące reguły:
* <math>X_a \
* <math>X_b \
* <math>X_c \
A te już istniejące zamieniamy na:
* <math>S \
* <math>X_a \
* <math>X_b \
* <math>X_c \
Tej techniki używa się np. w budowaniu [[
== Alternatywa języków ==
Załóżmy że mamy gramatykę <math>G_1</math> generującą język <math>L_1</math> i <math>G_2,</math>
W tym celu tworzymy symbol startowy <math>S</math> i dodajemy reguły przepisania go na symbol startowy pierwszego bądź drugiego języka:
: <math>S\
: <math>S\
: Oraz wszystkie reguły z obu gramatyk.
Linia 63:
== Klasy gramatyk ==
'''Ograniczając postać reguł''' wyprowadzania, otrzymujemy klasy gramatyk, takie jak (szczegółowo w artykule [[hierarchia
* [[gramatyka regularna|gramatyki regularne]]
* [[gramatyka bezkontekstowa|gramatyki bezkontekstowe]]
** [[
** [[postać normalna Greibach|gramatyki bezkontekstowe w postaci normalnej Greibach]]
* [[gramatyka kontekstowa|gramatyki kontekstowe]]
* [[
Gramatyka regularna (odpowiednio: bezkontekstowa, kontekstowa) '''zawsze''' generuje język regularny (odp.: bezkontekstowy, kontekstowy). Jednak możliwe jest też, że pewna gramatyka, która nie jest regularna (bezkontekstowa, kontekstowa), generuje język regularny (bezkontekstowy, kontekstowy). W takim przypadku '''zawsze istnieje''' też gramatyka o '''regułach prostszej postaci''' generująca ten sam język.
== Zobacz też ==
* [[Analizator składniowy|
{{Kontrola autorytatywna}}
|