1. Главная
  2. Библиотека
  3. Программирование
  4. Написать для данной грамматики (предварительно преобраз...
Решение задачи на тему

Написать для данной грамматики (предварительно преобразовав ее, если это требуется) таблицу - анализатор, действующий методом LL(1), показать разбор на предложении 1 S → P = E | while E do S P -> I | I (E A) A->e|,E A E -> E + T | T T -> T * F | F F -> P

  • Программирование
  • #Основы алгоритмизации и программирования
  • #Структуры и алгоритмы обработки данных
Написать для данной грамматики (предварительно преобразовав ее, если это требуется) таблицу - анализатор, действующий методом LL(1), показать разбор на предложении 1 S → P = E | while E do S P -> I | I (E A) A->e|,E A E -> E + T | T T -> T * F | F F -> P

Условие:

Написать для данной грамматики (предварительно преобразовав ее,
если это требуется) таблицу - анализатор, действующий методом LL(1),
показать разбор на предложении
1
S → P = E | while E do S
P -> I | I (E A)
A->e|,E A
E -> E + T | T
T -> T * F | F
F -> P | (E)
I -> a | b | c
2
S → type I = T B ⊥
T -> int | record I: T B end
B->e|;I:T B
I -> a | b | c
3
S → P := E | if E then S | if E then S else S
P → I | I (E)
E → E+T |T
T →Τ∗ F |F
F → P | (E)
I → a | b
4
F −> function I(I) S; I:=E end
S −> ; I:=E S | ε
E −> E*I | E+I | I
I -> a | b

Решение:

Для начала, давайте преобразуем каждую из предложенных грамматик, если это необходимо, чтобы они соответствовали требованиям 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) = {=, (, ;}

Теперь мы можем заполнить таблицу:

abc(while=do+*,;EOF
S1
P222
A3
E4444
E#039;5
T6666
T#039;7
F8889
I101010

Номера в таблице соответствуют правилам грамматики.

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) = {=, :, ;}

Таблица будет выглядеть так:

typeintrecordabc=;EOF
S1
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, )}

Таблица будет выглядеть так:

ab(if:=thenelse+*EOF
S123
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) = {), :=, ;}

Таблица будет выглядеть так:

functionab;endEOF
F1
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) и показали разбор на примерах.