Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Пономарев_ФЯиГ.doc
Скачиваний:
0
Добавлен:
01.03.2025
Размер:
1.42 Mб
Скачать

10.2. Разбор цепочки "снизу-вверх".

Первым шагом в разборе цепочки является поиск маршрута среди левых поддеревьев по матрице связей от вершины, соответствующей первому слева символу цепочки, до первого узла двоичного дерева. Этот узел является кандидатом на корень куста, а правило грамматики определяет переход к таблице постановок для задания начальных вершин левых поддеревьев. Следующим шагом выполняется поиск маршрута среди левых поддеревьев от концевой вершины, cоответствующей следующему символу цепочки до первой начальной вершины. Порядок следования начальных вершин максимальных левых поддеревьев задан порядком их записи в таблице подстановок. Если для узла маршруты от концевых вершин до всех начальных вершин найдены правильно, то данный узел является корнем куста, а разобранная часть цепочки синтаксически правильной.

Следующим шагом определяется маршрут от корня куста до очередного узла среди левых поддеревьев по матрице связей. Далее процесс поиска маршрутов между вершинами следующих символов цепочки и найденным узлом повторяется. Найденный очередной куст свидетельствует о синтаксической правильности очередной подцепочки терминальных символов. Найденный маршрут между последним символом цепочки и начальным символом грамматики J заканчивает грамматический разбор всей цепочки снизу-вверх.

Пример 36. Выполнить грамматический разбор арифметического выражения b), приведенного в примере 23.

Правила грамматики те же, что в примере 34. Для удобства изложения у левых поддеревьев поменяем местами вершину-исток и вершину-сток.

Первым символом цепочки является "a". Маршрут среди левых деревьев до первого узла - кандидата на первый куст -опирается на вершины ( "a",K,M,T). Правило 21 ( T ::= TS2M ) формирует правое поддерево для первого узла. По этому правилу определены в таблице подстановок начальные вершины левых поддеревьев S2 и M. Следующий символ цепочки "x" связан с вершиной S2 левым поддеревом ("x",S2). Очередной символ цепочки "a" связан со следующей вершиной M максимальным левым поддеревом (("a",K),(K,M)). Других вершин у правого поддерева нет. Поэтому вершина Т есть корень куста, а цепочка "axa"- "фраза".

Маршрут от корня куста T до очередного узла левого поддерева по матрице связей есть ((T,T),(T,J)). Правило 11 ( J ::= JS1T ) формирует очередное правое подерево, а вершина J становится кандидатом на формирование корня куста. По этому правилу определены в таблице подстановок начальные вершины левых поддеревьев S1 и T. Очередной символ цепочки "+" связан с вершиной S1 левым поддеревом ("+",S1). Следующий символ цепочки "b" соединяется с вершиной T цепочкой левых деревьев (("b",K), (K,M), (M,T), (T,T)), но на этом маршруте есть узел для правого поддерева по правилу 21 (T ::= TS2M ). Следовательно, вершина T становится вторым кандидатом на формирование корня другого куста. По правилу 21 в таблице подстановок определены начальные вершины левых поддеревьев S2 и M. Очередной символ цепочки "x" связан с вершиной S2 левым поддеревом ("x",S2). Следующий символ цепочки "b" связан с вершиной M максимальным левым поддеревом (("b",K),(K,M)). Других вершин, связанных с узлом T, нет. Поэтому вершина Т есть корень куста для цепочки bxb. Разобранная цепочка bxb является фразой.

В цепочке больше символов нет. Поэтому следует вернуться к вершине J, являющейся кандидатом на формирование куста. Так как все подчиненные узлы сформировали кусты, а каждый куст формирует "фразу", то вершина J также формирует куст, но для всей цепочки J=axa + bxb.

Так доказана правильность синтаксической конструкции всей цепочки.

Пример 37. Выполнить грамматический разбор арифметического выражения с), приведенного в примере 23.

Правила грамматики те же, что в примере 34.

Первым символом цепочки является "(". Вершина S31 левого поддерева ("(",S31) является узлом и первым кандидатом на формирование куста. Правилом 32 заданы в таблице подстановок начальные символы левых поддеревьев J и S32. Следующий символ цепочки "a" соединен с первой вершиной J маршрутом ("a",K,M,T,J). Так сформировано максимальное левое поддерево (("a",K),(K,M),(M,T),(T,J),(J,J)). На этом маршрут есть узел J. Он является кандидатом на формирование очередного куста. Правилом 11 в таблице подстановок заданы начальные символы левых поддеревьев S1 и T. Очередной символ цепочки "+" соединен с первой вершиной S1 левым деревом ("+",S1). Следующий символ цепочки "b" соединен с вершиной T максимальным левым поддеревом (("b",K),(K,M),(M,T)). Так как все вершины куста соединены c концевыми вершинами, отображающими фразу, то узел J есть корень первого куста.

Теперь следует вернуться к первому кандидату на формирование куста S31. Для вершины S32 есть левое поддерево (")",S32). Так как свободных вершин для узла S31 нет, то сформирован второй куст, который соответствует фразе "(a + b)" и корень которого S31.

Следующим узлом левого поддерева от корня куста S31 будет вершина T. Правило 21 в таблице подстановок определяет начальные вершины максимальных левых поддеревьев S2 и M. Вершина T становится кандидатом на формирование куста. Первой вершиной является S2, которая соединена с вершиной "x", отображающей очередной символ цепочки. Второй вершиной является M, которая соединена с концевой вершиной для очередного символа цепочки "(" максимальным левым поддеревом (("(",S31),(S31,M)). На этом маршруте вершина S31 является узлом, т.е. претендует на формирование куста. По правилу 32 в таблице подстановок определены начальные вершины левых поддеревьев J и S32. Следующий символ цепочки "a" связан с вершиной J максимальным левым поддеревом (("a",K), (K,M), (M,T), (T,J), (J,J)). Для этого поддерева вершина J есть узел, т.е. она также претендует на формирование куста. По правилу 11 в таблице подстановок найдены начальные вершины левых поддеревьев S1 и T. Очередной символ цепочки "+" связан с вершиной S1 левым поддеревом ("+",S1). Следующий символ "b" соединяется с вершиной T максимальным левым поддеревом (("b",K),(K,M),(M,T)). Итак, все вершины, связанные с узлом J, определены правильно. Следовательно, узел J является корнем третьего куста для фразы "a + b".

Вернувшись к предшествующему кандидату куста, найдем для очередного символа ")" левое поддерево (")",S32). Так сформирован четвертый куст с корнем S31 для фразы "(a + b ).

Наконец, для корня куста T определены все кусты-потомки. Поэтому вершина T формирует куст для фразы "(a + b)x(a + b)".

Левое поддерево ((T,T),(T,J)) соединяет корень куста T с начальным символом грамматики J. Следовательно, фраза "(a + b)x(a + b)" полностью соответствует грамматике, имеющей начальным символом J.