Главная страница

Лабораторная работа № 6 Моделирование фу. Лабораторная работа 6 Тема работы Моделирование функционирования распознавателя для ll (1) грамматик


Скачать 0.58 Mb.
НазваниеЛабораторная работа 6 Тема работы Моделирование функционирования распознавателя для ll (1) грамматик
Дата11.12.2022
Размер0.58 Mb.
Формат файлаdoc
Имя файлаЛабораторная работа № 6 Моделирование фу.doc
ТипЛабораторная работа
#838399
страница2 из 5
1   2   3   4   5

Теорема 6.1. Необходимое и достаточное условие LL(1)-грамматики



Для того чтобы грамматика G(VN, VT, P, S) была LL(1)-грамматикой необ- ходимо и достаточно, чтобы для каждого символа АVN, у которого в грамма- тике существует более одного правила вида А1 | 2 |…| n, выполнялось тре- бование:
FIRST(1, iFOLLOW(1, A)) FIRST(1, jFOLLOW(1, A)) = ,

ij, 0<in, 0<jn.
Т.е. если для символа А отсутствует правило вида А, то все множества FIRST(1, 1), FIRST(1, 2),…, FIRST(1, n) должны попарно не пересекаться, ес- ли же присутствует правило А, то они не должны также пересекаться с мно- жеством FOLLOW(1, A).
Для построения распознавателей для LL(1)-грамматик необходимо по- строить множества FIRST(1, x) и FOLLOW(1, A). Причем, если строка х будет начинаться с терминального символа а, то FIRST(1, x)=a, и если она будет на- чинаться с нетерминального символа А, то FIRST(1, x)=FIRST(1, A). Следова- тельно, достаточно рассмотреть алгоритмы построения множеств FIRST(1, A) и FOLLOW(1, A) для каждого нетерминального символа А.

Алгоритм 6.1. Построение множества FIRST(1, A)


Для выполнения алгоритма необходимо предварительно преобразовать исходную грамматику G в грамматику G, не содержащую -правил (см. лабо- раторную работу № 4). Алгоритм построения множества FIRST(1, A) использу- ет грамматику G.

Шаг 1. Первоначально внести во множество первых символов для каждо- го нетерминального символа А все символы, стоящие в начале правых частей правил для этого нетерминала, т.е.

АVNFIRST0(1, A) = {X|AX P, X(VTVN), (VTVN)*}.

Шаг 2. Для всех АVNположить:

FIRSTi+1(1, A) = FIRSTi(1, A) FIRSTi(1, B), В(FIRST(1, A)VN).

Шаг 3. Если существует АVN, такой что FIRSTi+1(1, A)  FIRSTi(1, A), то присвоить i=i+1 и вернуться к шагу 2, иначе перейти к шагу 4.

Шаг 4. Исключить из построенных множеств все нетерминальные симво- лы, т.е.

AVNFIRST(1, A) = FIRSTi(1, A) \ N.

Алгоритм 6.2. Построение множества FOLLOW(1, A)


Алгоритм основан на использовании правил вывода грамматики G.

Шаг 1. Первоначально внести во множество последующих символов для каждого нетерминального символа А все символы, которые в правых частях правил вывода встречаются непосредственно за символом А, т.е.

AVNFOLLOW0(1, A) = {X| B AX P, B VN, X (VTVN),

, (VTVN)*}.

Шаг 2. Внести пустую строку во множество FOLLOW(1, S), т.е.

FOLLOW(1, S) = FOLLOW(1, S){}.

Шаг 3. Для всех АVNвычислить:

FOLLOWi(1,A)=FOLLOWi(1,A)FIRST(1,B),B(FOLLOWi(1,A)VN).

Шаг 4. Для всех АVNположить:

FOLLOWi(1, A)=FOLLOWi(1, A)FOLLOWi(1, B),

B(FOLLOWi(1, A)VN), если правило B.

Шаг 5. Для всех АVNопределить:

FOLLOWi+1(1, A) = FOLLOWi(1, A)FOLLOWi(1, B),

для всех нетерминальных символов BVN, имеющих правило вида

BA, (VTVN)*.

Шаг 6. Если существует AVNтакой, что FOLLOWi+1(1,A)FOLLOWi(1,A), то положить i:=i+1 и вернуться к шагу 3, иначе перейти к шагу 7.

Шаг 7. Исключить из построенных множеств все нетерминальные симво- лы, т.е. AVNFOLLOW(1, A) = FOLLOWi(1, A)\ N.
1   2   3   4   5


написать администратору сайта