Лабораторная работа № 6 Моделирование фу. Лабораторная работа 6 Тема работы Моделирование функционирования распознавателя для ll (1) грамматик
Скачать 0.58 Mb.
|
Теорема 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, имеющих правило вида BA, (VTVN)*. Шаг 6. Если существует AVNтакой, что FOLLOWi+1(1,A)FOLLOWi(1,A), то положить i:=i+1 и вернуться к шагу 3, иначе перейти к шагу 7. Шаг 7. Исключить из построенных множеств все нетерминальные симво- лы, т.е. AVNFOLLOW(1, A) = FOLLOWi(1, A)\ N. |