Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ФОРМАЛЬНЫЕ ЯЗЫКИ И ГРАММАТИКИ.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
1.42 Mб
Скачать

7. Алгоритмы обхода вершин дерева разбора.

При анализе текстов формального языка с помощью синтаксического дерева необходимо совершать упорядоченный обход его вершин так, чтобы в каждой вершине быть не более одного раза. В результате такого обхода будет сформирована правильная последовательность символов, к которой можно применить систему составляющих.

Разработаны два алгоритма обхода синтаксического дерева: "сверху-вниз" и "снизу-вверх".

7.1 Алгоритм обхода "сверху-вниз".

шаг 1. выбрать корень дерева, соответствующий начальному символу J;

шаг 2. выбрать последовательно слева-направо каждую вершину-сток для самой левой вершины-истока;

шаг 3. если вершин-стоков больше нет, то конец, иначе перейти к шагу 2.

Пример 24. Написать правильную цепочку и найти систему составляющих для синтаксического дерева, представленного на рис.6.

Совершая обход вершин дерева согласно правилам алгоритма, правильная цепочка терминальных и нетерминальных символов, отображающая структуру предложения естественного языка, будет иметь вид:

JACc1Da1BEbFGc2Ha2 .

В этой цепочке можно выделить составляющие подцепочки на уровне слов: Cc1 - имя и значение первого прилагательного, Da1 - имя и значение первого существительного, Eb - имя и значение сказуемого, Gc2 - имя и значение второго прилагательного, Ha2 - имя и значение второго существительного, на уровне членов предложения: AСc1Da1 - имя и значение группы подлежащего, FGc2Ha2 - имя и значение дополнения, BEbFGc2Ha2 - имя и значение сказуемого. Головой каждой подцепочки является синтаксическая переменная, что определяет условия для использования левосторонней грамматики

Система составляющих имеет вид

на уровне членов предложения:

CJ = { ( A,2); ( B,7); ( F,10) };

на уровне слов:

СJ = { (C,3); (D,5); (E,8); (G,11); (H,13) }.

Каждая составляющая начинается в узле дерева и охватывает все множество вершин-стоков, связанных с этой вершиной-истоком. Составляющие (С,3) и (D,5) вложены в составляющую (A,2), составляющие (G,11) и (H,13) вложены в составляющую (F,10), cоставляющие (E,8) и (F,10) вложены в составляющую (B,7).

Пример 25. Написать правильную последовательность символов и найти систему составляющих для синтаксического дерева, представленного на рис.7.

Совершая обход дерева "сверху-вниз", получим цепочку терминальных и нетерминальных символов, раскрывающую синтаксическую конструкцию синтаксической переменной <программа> языка программирования Паскаль:

JA1a1A2a2c1B1B2a3B3B4C1А3ib1C2a4c2 .

Основными составляющими в написании программы являются:

<заголовок-программы> - A1a1A2a2c1 ;

";" - c1 ;

<блок > - B1B2a3B3B4C1b1C2a4 ;

"." - c2 .

Система составляющих для этой цепочки может быть записана так:

CJ = { (A1,2); (c1,6); (B1,10); (c2,19) }.

В каждую из составляющих вложены другие составляющие, имеющие меньшую длину. Так, например,

СA1 = { (A2,3) }.

Cоставляющая, голова которой есть терминальный символ, определяет служебное слово или специальный символ, имеющий фиксированный смысл.

Пример 26. Написать правильную последовательность символов и найти систему составляющих для синтаксического дерева, представленного на рис. 8.

Совершая обход дерева "сверху-вниз", получим следующую цепочку:

С2С3С4С1A3iD2xC4C1A3iD1+C3C4C1A3iD2xC4C1A3i.

Если принять основными составляющими цепочки нетерминальные символы С1 и С3, то систему составляющих можно записать так:

СС2 = { (C1,4);(C1,10);(C1,17);(C1,23);(C3,2);(C3,15)}.

Составляющая С1 есть голова подцепочки С1A3i.