Для начала, давайте преобразуем каждую из предложенных грамматик, если это необходимо, чтобы они соответствовали требованиям LL(1). Затем мы создадим таблицы анализаторов для каждой грамматики и покажем разбор на предложениях.
Грамматика 1
1.
Исходная грамматика:
S → P = E | while E do S
P → I | I (E A)
A → ε | , E A
E → E + T | T
T → T * F | F
F → P | (E)
I → a | b | c
2.
Преобразование грамматики:
У нас есть леворекурсивные правила (E → E + T и T → T * F). Мы можем убрать леворекурсию:
E → T E
E → + T E | ε
T → F T
T → * F T | ε
Теперь грамматика выглядит так:
S → P = E | while E do S
P → I | I (E A)
A → ε | , E A
E → T E
E → + T E | ε
T → F T
T → * F T | ε
F → P | (E)
I → a | b | c
3.
Создание таблицы LL(1):
Для создания таблицы LL(1) нам нужно вычислить FIRST и FOLLOW множества для каждого нетерминала.
- FIRST(S) = {I, while}
- FIRST(P) = {a, b, c}
- FIRST(A) = {ε, ,}
- FIRST(E) = {a, b, c, (}
- FIRST(E) = {+, ε}
- FIRST(T) = {a, b, c, (}
- FIRST(T) = {*, ε}
- FIRST(F) = {a, b, c, (}
- FIRST(I) = {a, b, c}
- FOLLOW(S) = {EOF}
- FOLLOW(P) = {=, (, ;}
- FOLLOW(A) = {EOF, )}
- FOLLOW(E) = {=, do, +, )}
- FOLLOW(E) = {=, do, +, )}
- FOLLOW(T) = {+, =, do, )}
- FOLLOW(T) = {+, =, do, )}
- FOLLOW(F) = {*, +, =, do, )}
- FOLLOW(I) = {=, (, ;}
Теперь мы можем заполнить таблицу:
| a | b | c | ( | while | = | do | + | * | , | ; | EOF |
|---|
| S | | | | | 1 | | | | | | | |
| P | 2 | 2 | 2 | | | | | | | | | |
| A | | | | | | | | | | 3 | | |
| E | 4 | 4 | 4 | 4 | | | | | | | | |
| E#039; | | | | | | | | 5 | | | | |
| T | 6 | 6 | 6 | 6 | | | | | | | | |
| T#039; | | | | | | | | | 7 | | | |
| F | 8 | 8 | 8 | 9 | | | | | | | | |
| I | 10 | 10 | 10 | | | | | | | | | |
Номера в таблице соответствуют правилам грамматики.
4.
Разбор на предложении:
Рассмотрим предложение:
a = b + c.
- Начинаем с S.
- S → P = E (выбираем правило 1)
- P → I (выбираем правило 2)
- I → a (выбираем правило 10)
- Теперь у нас
a = E.
- E → T E (выбираем правило 4)
- T → F (выбираем правило 6)
- F → P (выбираем правило 8)
- P → I (выбираем правило 2)
- I → b (выбираем правило 10)
- Теперь у нас
a = b E.
- E → + T E (выбираем правило 5)
- T → F (выбираем правило 6)
- F → P (выбираем правило 8)
- P → I (выбираем правило 2)
- I → c (выбираем правило 10)
- Теперь у нас
a = b + c.
Грамматика 2
1.
Исходная грамматика:
S → type I = T B
T → int | record I: T B end
B → ε | ; I: T B
I → a | b | c
2.
Преобразование грамматики:
Здесь нет леворекурсии, поэтому мы можем сразу создать таблицу.
3.
Соз...
- FIRST(S) = {type}
- FIRST(T) = {int, record}
- FIRST(B) = {ε, ;}
- FIRST(I) = {a, b, c}
- FOLLOW(S) = {EOF}
- FOLLOW(T) = {=, ;}
- FOLLOW(B) = {EOF}
- FOLLOW(I) = {=, :, ;}
Таблица будет выглядеть так:
4.
Рассмотрим предложение: .
- Начинаем с S.
- S → type I = T B (выбираем правило 1)
- I → a (выбираем правило 6)
- Теперь у нас .
- T → int (выбираем правило 2)
- Теперь у нас .
- B → ; (выбираем правило 4)
- Разбор завершен.
S → P := E | if E then S | if E then S else S
P → I | I (E)
E → E + T | T
T → T * F | F
F → P | (E)
I → a | b
Убираем леворекурсию аналогично предыдущему примеру.
-
FIRST(S) = {I, if}
-
FIRST(P) = {a, b}
-
FIRST(E) = {a, b, (}
-
FIRST(T) = {a, b, (}
-
FIRST(F) = {a, b, (}
-
FIRST(I) = {a, b}
-
FOLLOW(S) = {EOF, else}
-
FOLLOW(P) = {:=, (, ;}
-
FOLLOW(E) = {:=, then, +, )}
-
FOLLOW(T) = {+, :=, then, )}
-
FOLLOW(F) = {*, +, :=, then, )}
Таблица будет выглядеть так:
4.
Рассмотрим предложение: .
- Начинаем с S.
- S → P := E (выбираем правило 1)
- P → I (выбираем правило 4)
- I → a (выбираем правило 9)
- Теперь у нас .
- E → T E (выбираем правило 5)
- T → F (выбираем правило 6)
- F → P (выбираем правило 7)
- P → I (выбираем правило 4)
- I → b (выбираем правило 9)
- Теперь у нас .
- E → + T E (выбираем правило 10)
- T → F (выбираем правило 6)
- F → P (выбираем правило 7)
- P → I (выбираем правило 4)
- I → c (выбираем правило 9)
- Разбор завершен.
F → function I(I) S; I := E end
S → ; I := E S | ε
E → E * I | E + I | I
I → a | b
Убираем леворекурсию в E.
-
FIRST(F) = {function}
-
FIRST(S) = {;, ε}
-
FIRST(E) = {a, b, (}
-
FIRST(I) = {a, b}
-
FOLLOW(F) = {EOF}
-
FOLLOW(S) = {EOF}
-
FOLLOW(E) = {;, end}
-
FOLLOW(I) = {), :=, ;}
Таблица будет выглядеть так:
4.
Рассмотрим предложение: .
- Начинаем с F.
- F → function I(I) S; I := E end (выбираем правило 1)
- I → a (выбираем правило 6)
- Теперь у нас .
- I → b (выбираем правило 6)
- Теперь у нас .
- S → ; I := E S (выбираем правило 2)
- I → a (выбираем правило 6)
- Теперь у нас .
- E → E + I (выбираем правило 5)
- I → b (выбираем правило 6)
- Теперь у нас .
Таким образом, мы разобрали все предложенные грамматики, создали таблицы LL(1) и показали разбор на примерах.