Metody rozbioru gramatycznego.
Dla gramatyki:
zbudować tablicę parsera LL(1) i sprawdzić, czy ciąg należy do gramatyki.
Usunięcie lewostronnej rekursji
Usunięcie lewostronnej faktoryzacji
Wyznaczenie zbiorów FIRST i FOLLOW
| FIRST | FOLLOW | |
|---|---|---|
| a | $ | |
| a | =, +, $, ) | |
| (, | =, +, $, ) | |
| a, ( | $, ) | |
| +, | $, ) | |
| a, ( | +, $, ) |
Tworzenie tablicy parsera
| a | ( | ) | + | = | $ | |
|---|---|---|---|---|---|---|
| - 1 | ||||||
| - 2 | ||||||
| - 3 | - 4 | - 4 | - 4 | - 4 | ||
| - 5 | - 5 | |||||
| - 7 | - 6 | - 7 | ||||
| - 8 | - 9 |
Sprawdzenie ciągu
| stos | symbole | produkcje |
|---|---|---|
| #S | a(a+a)=a+a(a)$ | |
| #E=L | a(a+a)=a+a(a)$ | 1 |
| #E=L'a | a(a+a)=a+a(a)$ | 1, 2 |
| #E=L' | (a+a)=a+a(a)$ | 1, 2 |
| #E=)E( | (a+a)=a+a(a)$ | 1, 2, 3 |
| #E=)E | a+a)=a+a(a)$ | 1, 2, 3 |
| #E=)E'V | a+a)=a+a(a)$ | 1, 2, 3, 5 |
| #E=)E'L | a+a)=a+a(a)$ | 1, 2, 3, 5, 8 |
| #E=)E'L'a | a+a)=a+a(a)$ | 1, 2, 3, 5, 8, 2 |
| #E=)E'L' | +a)=a+a(a)$ | 1, 2, 3, 5, 8, 2 |
| #E=)E' | +a)=a+a(a)$ | 1, 2, 3, 5, 8, 2, 4 |
| #E=)E'V+ | +a)=a+a(a)$ | 1, 2, 3, 5, 8, 2, 4, 6 |
| #E=)E'V | a)=a+a(a)$ | 1, 2, 3, 5, 8, 2, 4, 6 |
| #E=)E'L | a)=a+a(a)$ | 1, 2, 3, 5, 8, 2, 4, 6, 8 |
| #E=)E'L'a | a)=a+a(a)$ | 1, 2, 3, 5, 8, 2, 4, 6, 8, 2 |
| #E=)E'L' | )=a+a(a)$ | 1, 2, 3, 5, 8, 2, 4, 6, 8, 2 |
| #E=)E' | )=a+a(a)$ | 1, 2, 3, 5, 8, 2, 4, 6, 8, 2, 4 |
| #E=) | )=a+a(a)$ | 1, 2, 3, 5, 8, 2, 4, 6, 8, 2, 4, 7 |
| #E= | =a+a(a)$ | 1, 2, 3, 5, 8, 2, 4, 6, 8, 2, 4, 7 |
| #E | a+a(a)$ | 1, 2, 3, 5, 8, 2, 4, 6, 8, 2, 4, 7 |
| #E'V | a+a(a)$ | 1, 2, 3, 5, 8, 2, 4, 6, 8, 2, 4, 7, 5 |
| #E'L | a+a(a)$ | 1, 2, 3, 5, 8, 2, 4, 6, 8, 2, 4, 7, 5, 8 |
| #E'L'a | a+a(a)$ | 1, 2, 3, 5, 8, 2, 4, 6, 8, 2, 4, 7, 5, 8, 2 |
| #E'L' | +a(a)$ | 1, 2, 3, 5, 8, 2, 4, 6, 8, 2, 4, 7, 5, 8, 2 |
| #E' | +a(a)$ | 1, 2, 3, 5, 8, 2, 4, 6, 8, 2, 4, 7, 5, 8, 2, 4 |
| #E'V+ | +a(a)$ | 1, 2, 3, 5, 8, 2, 4, 6, 8, 2, 4, 7, 5, 8, 2, 4, 6 |
| #E'V | a(a)$ | 1, 2, 3, 5, 8, 2, 4, 6, 8, 2, 4, 7, 5, 8, 2, 4, 6 |
| #E'L | a(a)$ | 1, 2, 3, 5, 8, 2, 4, 6, 8, 2, 4, 7, 5, 8, 2, 4, 6, 8 |
| #E'L'a | a(a)$ | 1, 2, 3, 5, 8, 2, 4, 6, 8, 2, 4, 7, 5, 8, 2, 4, 6, 8, 2 |
| #E'L' | (a)$ | 1, 2, 3, 5, 8, 2, 4, 6, 8, 2, 4, 7, 5, 8, 2, 4, 6, 8, 2 |
| #E')E( | (a)$ | 1, 2, 3, 5, 8, 2, 4, 6, 8, 2, 4, 7, 5, 8, 2, 4, 6, 8, 2, 3 |
| #E')E | a)$ | 1, 2, 3, 5, 8, 2, 4, 6, 8, 2, 4, 7, 5, 8, 2, 4, 6, 8, 2, 3 |
| #E')E'V | a)$ | 1, 2, 3, 5, 8, 2, 4, 6, 8, 2, 4, 7, 5, 8, 2, 4, 6, 8, 2, 3, 5 |
| #E')E'L | a)$ | 1, 2, 3, 5, 8, 2, 4, 6, 8, 2, 4, 7, 5, 8, 2, 4, 6, 8, 2, 3, 5, 8 |
| #E')E'L'a | a)$ | 1, 2, 3, 5, 8, 2, 4, 6, 8, 2, 4, 7, 5, 8, 2, 4, 6, 8, 2, 3, 5, 8, 2 |
| #E')E'L' | )$ | 1, 2, 3, 5, 8, 2, 4, 6, 8, 2, 4, 7, 5, 8, 2, 4, 6, 8, 2, 3, 5, 8, 2 |
| #E')E' | )$ | 1, 2, 3, 5, 8, 2, 4, 6, 8, 2, 4, 7, 5, 8, 2, 4, 6, 8, 2, 3, 5, 8, 2, 4 |
| #E') | )$ | 1, 2, 3, 5, 8, 2, 4, 6, 8, 2, 4, 7, 5, 8, 2, 4, 6, 8, 2, 3, 5, 8, 2, 4, 7 |
| #E' | $ | 1, 2, 3, 5, 8, 2, 4, 6, 8, 2, 4, 7, 5, 8, 2, 4, 6, 8, 2, 3, 5, 8, 2, 4, 7 |
| # | $ | 1, 2, 3, 5, 8, 2, 4, 6, 8, 2, 4, 7, 5, 8, 2, 4, 6, 8, 2, 3, 5, 8, 2, 4, 7, 7 |
Zadany ciąg należy do tej gramatyki.
Mamy daną gramatykę i zbudowaną tablicę parsera SLR(1). Mamy sprawdzić, czy zadany ciąg należy do tej gramatyki.
| a | b | # | A | B | ||
|---|---|---|---|---|---|---|
| 0 | s3 | s3 | r2 | 1 | 2 | |
| 1 | acc | |||||
| 2 | s3 | s4 | r2 | 5 | 2 | |
| 3 | s3 | s4 | 6 | |||
| 4 | r4 | r4 | r4 | |||
| 5 | r1 | |||||
| 6 | r3 | r3 | r3 |
Ciąg do sprawdzenia:
| stos | symbole | wejście | akcja |
|---|---|---|---|
| 0 | aabb# | przesunięcie | |
| 0 3 | a | abb# | przesunięcie |
| 0 3 3 | aa | bb# | przesunięcie |
| 0 3 3 4 | aab | b# | redukcja |
| 0 3 3 6 | aaB | b# | redukcja |
| 0 3 6 | aB | b# | redukcja |
| 0 2 | B | b# | przesunięcie |
| 0 2 4 | Bb | # | redukcja |
| 0 2 2 | BB | # | redukcja |
| 0 2 2 5 | BBA | # | redukcja |
| 0 2 5 | BA | # | redukcja |
| 0 1 | A | # | akceptacja |