Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
62
Добавлен:
16.04.2015
Размер:
1.47 Mб
Скачать

Пример 2.11. Пусть G = ({S, A}, {a, b}, P, S),

где P = {S AS, S , A aA, A b}.

Вычислим функции (S) и (A) при k = 1. Сначала получаем

FIRST1G(S) { , a, b} и FIRST1G( A) {a, b}.

Затем построим последовательности

i′ (X, Y), где (X, Y) VN VN (табл. 2.5).

За два шага получаем

(S) = {{ }}, (A) = {{ , a, b}}.

201

 

 

Таблица 2.5

 

 

 

 

i

i = 0

 

i = 1

 

 

 

 

(S, S)

{{ }}

 

(S) =

 

 

 

{{ }}

 

 

 

 

(S, A)

{{ , a, b}}

 

(A) =

 

 

 

{{ , a, b}}

 

 

 

 

(A, S)

 

 

 

 

 

 

 

(A, A)

{{ }}

 

{{ }}

 

 

 

 

202

Пример 2.1: вычисление функции при k = 1

Поясним построение этих последовательностей.

Шаг 1. Построение 0(S, S): имеем правило для S AS, в котором нетерминал S встречается слева и справа.

Вычисляется

FIRST

G

( ) { },

1

 

 

поскольку

правый контекст для S в правой части этого правила есть . Другого правила для S, в котором справа встречается нетерминал S, не существует. Поэтому 0(S, S) = {{ }}.

203

Пример 2.1: вычисление функции при k = 1

Построение 0(S, A): существует только одно правило с нетерминалом S в левой части и нетерминалом A — в правой. Это

правило S AS. Вычисляется

G

от

FIRST1

правого контекста A, т. е.

G

(S ) { , a, b}.

FIRST1

 

 

Соответственно 0(S, A) = {{ , a, b}}. Построение 0(A, S): не существует ни одного правила с нетерминалом A в левой части и нетерминалом S — в правой.

Поэтому 0(A, S) = .

204

Пример 2.1: вычисление функции при k = 1

Построение 0(A, A): имеется только одно продуктивное правило A aA, дающее по пустому правому контексту A значение

0(A, A) = {{ }}.

205

Пример 2.1: вычисление функции при k = 1

Шаг 2. Построение 1(S, S): имеем правило для S AS, в котором справа два нетерминала — два источника для пополнения множества 0(S, S) новыми членами. Именно: можно вычислить новый член по первому вхождению нетерминала в правую часть этого правила ― это A и по второму вхождению нетерминала ― это S:

L L 1 FIRST1G (S ) , где L0(A, S) = .

Ясно, что из этого источника никакого пополнения не получается.

206

Пример 2.1: вычисление функции при k = 1

Попробуем воспользоваться другим источником для получения нового члена множества 1(S, S):

L L

FIRST

G

( )

 

1

1

 

, где L0(S, S) = {{ }}.

Существует

единственное множество

L= { }, с помощью которого вычисляется

новый член

 

 

G

L L 1 FIRST1 ( ) { } 1 { } { },

но такое множество уже есть в 1(S, S) по “наследству” от 0(S, S) .

207

Пример 2.1: вычисление функции при k = 1

На рис. 2.2 представлена схема соответствия параметров, используемых при вычислении множества

1(S, S).

Общая цель S

Отправная точка S

S AS

Отправная точка A

L0(A, S) L0(S, S)

L 1 FIRST1G (S) L 1 FIRST1G ( )

Рис. 2.2.

208

Пример 2.1: вычисление функции при k = 1

Аналогичным образом пополняются

множества 0(S, A), 0(A, S) и 0(A, A).

Однако добавить к этим множествам новые члены, как нетрудно проверить, не удаётся.

209

Пример 2.1: вычисление функции при k = 1

Теперь все готово для тестирования данной cfg G на предмет её принадлежности к классу LL(1)-грамматик.

Имеем два альтернативных правила для

нетерминала S:

S AS,

S .

 

 

Требуется вычислить

 

 

 

(FIRST

G

( AS) L) (FIRST

G

( ) L),

 

 

1

 

1

1

1

где L (S) = {{ }}.

210

Соседние файлы в папке lectures