Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Теория автоматов и ФЯ.doc
Скачиваний:
29
Добавлен:
01.12.2018
Размер:
818.18 Кб
Скачать

5.4. Генерация опс для присваиваний и арифметических выражений с индексами

Вначале надо расширить грамматику арифметических выражений так, чтобы из начального нетерминала порождалось присваивание, и чтобы операндами могли быть индексируемые элементы массивов.

Пример 14. Грамматика присваиваний и арифметических выражений с индексами для одно- и двумерных массивов (A – начальный нетерминал) будет такой:

A → aH := S

S → T | T

T → F | F

F → (S) | aH

→ [S] | [S, S] | λ

Последняя группа порождающих правил (для нетерминала H) вносит неопределенность: две различные правые части начинаются с одного и того же терминального символа. Поэтому заменим эту группу правил на следующие правила, добавив в грамматику новый нетерминал:

→ [SK | λ

→ ] | , S]

После этого в грамматике устраним левую рекурсию и преобразуем ее к обобщенной нормальной форме Грейбах, в результате получим правила:

A → aH := S

S → (S)VU | aHVU

U → + TU | λ

T → (S)V | aHV

V → * FV | λ

F → (S) | aH

→ [SK | λ

→ ] | , S]

В табл. 17 представлен построенный по этим правилам LL(1)-анализатор, дополненный семантическими действиями для генерации ОПС. При этом правая часть правила A → aH := S в конце дополнена пустым символом □ для того, чтобы знак операции := генерировался после ОПС для выражения в правой части присваивания.

Табл. 17

+

*

(

)

a

[

]

,

:=

A

aH:=S

a□□□:=

S

(S)VU

□□□□□

aHVU

a□□□

U

+TU

□□+

λ

λ

λ

λ

λ

λ

λ

λ

λ

T

(S)V

□□□□

aHV

a□□

V

λ

*FV

□□*

λ

λ

λ

λ

λ

λ

λ

λ

F

(S)

□□□

aH

a

H

λ

λ

λ

λ

λ

[SK

□□□

λ

λ

λ

λ

K

]

<i>

, S]

□□<i2>

Пусть на вход анализатора поступает цепочка M[i] := a*L[i, j + d]. Шаги ее анализа и генерации ОПС представлены в табл. 18. Для сокращения таблицы из нее удалены некоторые шаги, при выполнении которых подряд удаляются из магазина несколько нетерминалов.

Табл. 18

шага

Входные

символы

Содержимое

магазина

Дополнит.

магазин

ОПС

1

M[i] := a*L[i, j + d]

A 

□□

2

M[i] := a*L[i, j + d]

aH:=S 

a□□□:=□

M

3

[i] := a*L[i, j + d]

H:=S

□□□:=□

M

4

[i] := a*L[i, j + d]

[SK:=S

□□□□□:=□

M

5

i] := a*L[i, j + d]

SK:=S

□□□□:=□

M

6

i] := a*L[i, j + d]

aHVUK:=S

a□□□□□□:=□

M i

7

] := a*L[i, j + d]

HVUK:=S

□□□□□□:=□

M i

10

] := a*L[i, j + d]

K:=S

□□□:=□

M i

11

] := a*L[i, j + d]

]:=S

<i>□□:=□

M i <i>

12

:= a*L[i, j + d]

:=S

□□:=□

M i <i>

13

a*L[i, j + d]

S

□:=□

M i <i>

12

a*L[i, j + d]

aHVU

a□□□:=□

M i <i> a

13

*L[i, j + d]

HVU

□□□:=□

M i <i> a

14

*L[i, j + d]

VU

□□:=□

M i <i> a

15

*L[i, j + d]

*FVU

□□*□:=□

M i <i> a 

16

L[i, j + d]

FVU

□*□:=□

M i <i> a 

17

L[i, j + d]

aHVU

a□*□:=□

M i <i> a L

18

[i, j + d]

HVU

□*□:=□

M i <i> a L

19

[i, j + d]

[SKVU

□□□*□:=□

M i <i> a L

20

i, j + d]

SKVU

□□*□:=□

M i <i> a L

21

i, j + d]

aHVUKVU

a□□□□*□:=□

M i <i> a L i

22

, j + d]

HVUKVU

□□□□*□:=□

M i <i> a L i

25

, j + d]

KVU

□*□:=□

M i <i> a L i

26

, j + d]

KVU

□*□:=□

M i <i> a L i

27

, j + d]

, S]VU

□□<i2>*□:=□

M i <i> a L i

28

j + d]

S]VU

□<i2>*□:=□

M i <i> a L i

29

j + d]

aHVU]VU

a□□□<i2> …

M i <i> a L i j

30

+ d]

HVU]VU

□□□<i2> …

M i <i> a L i j

32

+ d]

U]VU

□<i2>*□:=□

M i <i> a L i j

33

+ d]

+TU]VU

□□+<i2>…

M i <i> a L i j

34

d]

TU]VU

□+<i2>*□:=□

M i <i> a L i j 

35

d]

aHVU]VU

a□□+<i2>…

M i <i> a L i j d

36

]

HVU]VU

□□+<i2>…

M i <i> a L i j d

38

]

U]VU

+<i2>*□:=□

M i <i> a L i j d +

39

]

]VU

<i2>*□:=□

M i<i>a L i j d+<i2>

40

VU

*□:=□

M i<i>a L i j d+<i2>*

42

:=□

M i<i>a Li j d+<i2>*:=

43

M i<i>a Li j d+<i2>*:=

Конец примера.