Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
MетТЯПиМТ-ЛР-2010.doc
Скачиваний:
155
Добавлен:
19.03.2016
Размер:
814.08 Кб
Скачать

6.3 Построение множества first

Для последовательности  определим множество first как множество терминалов, с которых может начинаться последовательность, выводимая из . Если из  можно вывести пустую строку, то в множество first последовательности  должно присутствовать . Определим множество first для некоторого грамматического символа х.

1. Если х - терминал, то first(x)={x}. Так как первым символом последовательности из одного терминала может являться только сам терминал.

2. Если в грамматике присутствует правило Х , то множество first(х) включает . Это означает, что Х может начинаться с пустой последовательности, то есть отсутствовать вообще.

3. Для всех продукций вида XY1 Y2 … Yk выполняем следующее. Добавляем в множество first(Х) множество first(Yi) до тех пор, пока first(Yi-1) содержит , а first(Yi) не содержит . При этом i изменяется от 0 до k. Это необходимо, так как если Yi-1 может отсутствовать, то необходимо выяснить, с чего будет начинаться вся последовательность в этом случае.

Проиллюстрируем третье правило на примере продукции X  A B C. Пусть first(A)={+, }, first(B)={-}, first (C)={id}. При i=1 можно увидеть, что first(Y1)={+, }, то есть добавляем {+} в множество first(X) и продолжаем рассматривать грамматические символы правой части продукции. First(Y2)={-} и уже не содержит , поэтому добавляем {-} в first(X) и прекращаем рассмотрение продукции. Таким образом, first(X) = {+, -}. Заметим, что  отсутствует в first(X), хотя  принадлежит first(A). Из рассматриваемой продукции не следует, что пустая строка выводима из Х, следовательно  не может принадлежать first(X).

Построим множества first для всех грамматических символов языка, описанного на рисунке 16. Согласно первому правилу множество first всех терминалов языка состоит только из самого этого терминала (таблица 1 столбец 2). Так как в грамматике присутствует правило EXPR1, то в множество first(EXPR1) добавляем . Аналогично для множества first(TERM1). Результат шага 2 построения множества first представлен в столбце 3 таблицы 1.

Множество first(FACTOR) строится на основе продукций 10 и 11 согласно правила 3 алгоритма. Исходя из продукций 7 и 8, в множество first(TERM1) должны быть добавлены множества {*} и {/}. В обоих случаях достаточно просмотреть только первый грамматический символ правой части правила. Так как множество first этого символа не содержит , то дальнейший анализ правила не производим. Согласно продукции 6 first(TERM)=first(FACTOR). Остальные продукции рассматриваются аналогичным образом. Результат выполнения третьего шага алгоритма построения множества first представлен в столбце 4 таблицы 2. В столбце 5 этой таблицы представлено множество first грамматического символа, полученное в результате выполнения всех шагов алгоритма.

Таблица 3.

Грамматический символ

Шаг алгоритма

first

1

2

3

1

2

3

4

5

GOAL

{num, id}

{num, id}

EXPR

{num, id}

{num, id}

EXPR1

{+, -}

{, +, -}

TERM

{num, id}

{num, id}

TERM1

{*, /}

{, *, /}

FACTOR

{num, id}

{num, id}

num

{num}

{num}

id

{id}

{id}

+

{+}

{+}

-

{-}

{-}

*

{*}

{*}

/

{/}

{/}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]