Пример 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}}.
Пример 2.1: вычисление функции при k = 1
Поясним построение этих последовательностей.
Шаг 1. Построение 0’(S, S): имеем правило для S AS, в котором нетерминал S встречается слева и справа.
правый контекст для S в правой части этого правила есть . Другого правила для S, в котором справа встречается нетерминал S, не существует. Поэтому 0’(S, S) = {{ }}.
Пример 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) = .
Пример 2.1: вычисление функции при k = 1
Построение 0’(A, A): имеется только одно продуктивное правило A aA, дающее по пустому правому контексту A значение
0’(A, A) = {{ }}.
Пример 2.1: вычисление функции при k = 1
Шаг 2. Построение 1’(S, S): имеем правило для S AS, в котором справа два нетерминала — два источника для пополнения множества 0’(S, S) новыми членами. Именно: можно вычислить новый член по первому вхождению нетерминала в правую часть этого правила ― это A и по второму вхождению нетерминала ― это S:
L L 1 FIRST1G (S ) , где L’ 0’(A, S) = .
Ясно, что из этого источника никакого пополнения не получается.
Пример 2.1: вычисление функции при k = 1
Попробуем воспользоваться другим источником для получения нового члена множества 1’(S, S):
, где L’ 0’(S, S) = {{ }}.
Существует |
единственное множество |
L’ = { }, с помощью которого вычисляется |
новый член |
|
|
G |
L L 1 FIRST1 ( ) { } 1 { } { },
но такое множество уже есть в 1’(S, S) по “наследству” от 0’(S, S) .
Пример 2.1: вычисление функции при k = 1
На рис. 2.2 представлена схема соответствия параметров, используемых при вычислении множества
Отправная точка S
S AS
Отправная точка A
L’ 0’(A, S) L’ 0’(S, S)
L 1 FIRST1G (S) L 1 FIRST1G ( )
Рис. 2.2.
Пример 2.1: вычисление функции при k = 1
Аналогичным образом пополняются
множества 0’(S, A), 0’(A, S) и 0’(A, A).
Однако добавить к этим множествам новые члены, как нетрудно проверить, не удаётся.
Пример 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) = {{ }}.