
- •Формальные языки и грамматики Введение
- •1. Предварительные обсуждения
- •2. Формальные грамматики
- •3. Классификация формальных грамматик
- •4. Система составляющих
- •5. Синтаксические диаграммы
- •6. Синтаксическое дерево
- •7. Алгоритмы обхода вершин дерева разбора.
- •7.1 Алгоритм обхода "сверху-вниз".
- •7.2 Алгоритм обхода "снизу-вверх".
- •8. Двоичное дерево
- •9. Свойства двоичного дерева
- •10. Грамматический разбор цепочек
- •10.1. Разбор цепочки "сверху-вниз".
- •10.2. Разбор цепочки "снизу-вверх".
- •11. Операции над языками
- •Заключение
- •Контрольные вопросы и задачи
- •Индивидуальное задание
- •Указатель обозначений
- •Предметный указатель
- •Список литературы
- •1. Предварительные обсуждения.................................................... 4
5. Синтаксические диаграммы
Для понимания процессов формирования сложных выражений и предложений формального языка и наглядного изображения этих процессов используют синтаксические диаграммы, которые позволяют в графической форме изобразить возможные синтаксические конструкции, описываемые формулами БНФ. Основными элементами синтаксической диаграммы являются узлы, изображающие синтаксические переменные и лексемы языка, и линии связи, изображающие их соединения. Синтаксические переменные изображаются на диаграмме прямоугольником, а лексемы - овалом:
Все многообразие соединений узлов может быть сведено к их последовательному соединению, что является образом соединительной связки "и", и параллельному соединению, что является образом разъединительной связки "или" ( рис.2 ).
Пример 18. Составить синтаксические диаграммы для некоторых синтаксических переменных и лексем языка программирования Паскаль (см. рис.3 и рис.4 ).
Особо можно выделить синтаксическую диаграмму синтаксической переменной <программа> (условные обозначения см. (17)).
Синтаксические диаграммы представляют любую формулу БНФ или синтаксическую конструкцию любого выражения формального языка в графической форме, что своей наглядностью оказывает помощь в написании программы и в устранении ошибок при ее отладке.
6. Синтаксическое дерево
В теории формальных языков для разбора синтаксической конструкции цепочки используют синтаксические деревья. Синтаксическое дерево - это дерево с одной выделенной вершиной, называемой корнем. Такое дерево позволяет описать одну, но синтаксически правильную последовательность символов в цепочке. Синтаксическое дерево называют также деревом разбора. Такое дерево есть ориентированный граф, в котором каждая вершина, кроме корня, связана не более чем с одной предшествующей. Множество вершин графа есть образ терминальных - VT и нетерминальных - VN символов, а множество дуг - образ правил формальной грамматики Р. Корень дерева - это образ начального символа J формальной грамматики.
Вершина-исток, инцидентная дуге, есть образ левой части продукции. Для КС-грамматики - это образ одного символа множества VN. Вершина-сток, инцидентная дуге, есть образ правой части продукции. Для КС-грамматики - это образ одного символа из множества V = VTVN . Если вершина-сток есть образ нетерминального символа VN, то к ней присоединяется новое дерево, корнем которого является данная вершина. Так формируются узлы на дереве. Если вершина-сток есть образ терминального символа VT, то она формирует концевую вершину на дереве. Концевые вершины дерева часто называют листьями, а все множество листьев - кроной.
Так как граф ориентирован от корня к листьям, то каждая вершина-исток называется "предком", а вершина-сток - "потомком". Множество вершин-стоков для вершины-истока называют "братьями". Множество братьев упорядочено по старшинству расположением в цепочке символов слева-направо. Самая левая вершина-сток, соответствующая самому левому символу цепочки правой части правила, является старшим братом. Старшинство следующих братьев определяется местом соответствующего символа в цепочке слева-направо.
Множество концевых вершин-стоков вместе с вершиной-истоком формируют куст. Вершину-исток куста называют корнем куста. Имя этого корня есть имя синтаксической переменной, описывающей часть цепочки. Иногда эту часть цепочки называют "фразой".
Множество корней кустов вместе с общей для всех вершиной-истоком также формируют куст для старшего уровня синтаксической переменной. Вершину-исток этого куста также называют корнем, а имя его есть имя синтаксической переменной, составными частями которой будут имена синтаксических переменных всех вершин-стоков. Часть цепочки, которую описывает этот куст также называют "фразой", но она содержит в себе составляющие, которые описаны подчиненными данному корню кустами. Так формируется иерархия "фраз".
Последней вершиной-истоком синтаксического дерева является вершина начального символа J, которая охватывает всю синтаксическую конструкцию цепочки. Последовательность ветвей дерева, связывающая начальную вершину J и вершину-сток для самого левого терминального символа цепочки формальной грамматики называют левым поддеревом.
Так как вершина-исток есть образ одного символа левой части продукции, то синтаксические деревья нашли применение в синтаксическом анализе текстов программ и в разработке алгоритмов их трансляции на язык вычислительной машины.
Пример 19. Построить синтаксические деревья для формирования правильных цепочек в грамматике G7 ( см. пример 9 ).
В данной грамматике только два правила:
P = { p1: J ::= ab; p2 : J ::= aJb }.
На рис. 5a) представлено синтаксическое дерево для правила J ::= ab. Вершина J является корнем дерева и предком для вершин a и b. Концевые вершины a и b формируют крону дерева. Кроме того, вершины a и b являются братьями ( старшим братом является вершина a ) и потомками вершины J. На рис.5б) представлено дерево для правила J ::= aJb. Вершина J является корнем дерева и предком для вершин a, J и b. Вершины a, J и b являются братьями ( старшим братом также является вершина a ) и потомками вершины J. Среди концевых вершин есть нетерминальный символ J. Поэтому множество вершин { a; J; b } не формирует крону. Вершина, соответствующая нетерминальному символу J, представляет узел на дереве, к которому может быть присоединено другое дерево с одноименным корнем. На рис.5в),5г) и т.д. показано "развитие" синтаксического дерева для данной грамматики.
Множество деревьев, имеющих кроны, часто называют лесом. Лес является образом множества предложений, т.е. текста формального языка.
Пример 20. Пусть дано предложение на естественном языке "хороший алгоритм имеет умеренную сложность".
Необходимо нарисовать дерево разбора предложения, используя грамматику естественного языка, написать правильную цепочку терминальных и нетерминальных символов и сформировать систему составляющих .
Правила естественного языка и условные обозначения синтаксических переменных и лексем, указанные в круглых скобках, необходимы следующие:
<предложение - (J)> ::= <группа-подлежащего - (A)> <группа-сказуемого -(B)> ;
<группа-подлежащего - (A)> ::= <прилаг.1 - (С)> <сущест.1 -(D)> ;
<группа-сказуемого - (B)> ::= <глагол - (E)> <дополнение - (F)> ;
<дополнение - (F)> ::= <прилаг.2 - G)> <сущест.2 - (H)> ;
<сущест.1 - (D)> ::="алгоритм"-(a1);
<сущест.2 - (H)> ::= "cложность" - (a2 ) ;
<глагол -(E)> ::= "имеет"- (b) ;
<прилаг.1 -(C)> ::= "хороший - (c1) ;
<прилаг.2 -(G)> ::= "умеренную"- (c2).
Синтаксические переменные <сущест.1> и сущест. 2> принадлежат классу <сущест>, <прилаг.1> и <прилаг.2> - классу <прилаг>. Однако индексация каждого члена одного класса оказывается удобной для устранения неоднозначности в семантике цепочки, отображающей все предложение.
На рис .6 представлено дерево разбора этого предложения.
<группа-подлежащего - (A)> и <группа-сказуемого - (B)> являются братьями и потомками для <предложение - (J)>, <прилаг.1 - (C)> и <cущест.1 - (D)> - братьями и потомками для <группа-подлежащего - (A)>, <глагол - (E)> и <дополнение - (F)> - братьями и потомками для <группа-сказуемого - (B)>, <прилаг.2 - (G)> и <сущест.2 - (H)> - братьями и потомками для <дополнения - (F)>. Последовательность ветвей, связывающая вершины <предложение - (J)>, <группа-подлежащего - (A)>, <прилаг.1> и "хороший", формируют левое поддерево синтаксического дерева.
Пример 21. Построить синтаксическое дерево для фрагмента программы на языке программирования Паскаль, имеющем начальным символом синтаксическую переменную <программа> .
Правила грамматики языка программирования Паскаль приведены в 2 (пример 3), а условные обозначения синтаксических переменных - в 4 .
Начальной вершиной этого дерева является синтаксическая переменная <программа>, концевыми вершинами - лексемы текста программы и необходимые синтаксические переменные, взятые из множество правил языка Паскаль. Синтаксическое дерево для начального символа <программа> представлено на рис. 7a), а для начального символа J - на рис. 7b).
Полученное в результате разбора дерево не имеет кроны, т.к. концевая вершина <выражение> сохраняет образ нетерминального символа. Требуется написать еще несколько правил, определяющих c помощью терминальных символов это понятие. Последовательность ветвей, связывающих вершины <программа>, <заголовок-программы>, "PROGRAM", формирует левое поддерево синтаксического дерева.
Пример 22. Построить синтаксическое дерево для фрагмента программы на языке программирования Паскаль,имеющем начальным символом синтаксическую переменную <выражение> .
Небходимые правила грамматики языка программирования Паскаль приведены в 2 (пример 3), а условные обозначения синтаксических переменных - в 4.
Начальной вершиной этого дерева является синтаксическая переменная <выражение>, концевыми вершинами - лексемы текста программы. Синтаксическое дерево для начального символа <выражение> представлено на рис. 8a), а для начального символа С2 - на рис. 8b).
Полученное дерево имеет крону, т.к. все концевые вершины есть образы терминальных символов. Последовательность ветвей, связывающая вершины <выражение>, <терм>, <множ-ль>, <перем-я>, <идент-перем>, "i", формирует левое поддерево синтаксического дерева.
Можно отметить, что при построении синтаксических деревьев всюду использовали только соединительную связку "и", т.е. в правых частях используемых продукций не было разделительной связки "или". При наличии в правой части хотя бы одной продукции разделительной связки "или" формируется второе альтернативное синтаксическое дерево, позволяющее делать выбор синтаксической конструкции под заданную цепочку терминальных символов.
Пример 23. Пусть дана грамматика G9 ( пример 14). Построить синтаксические деревья для арифметических выражений, заданных начальным символом грамматики J:
a) J= a + b2; см.рис. 9; b) J= a 2+ b2; см.рис.10;
c) J= (a + b ) 2; см.рис.11; d) J= axb + a/(a - b); см.рис.12;
Левыми поддеревьями являются последовательности ветвей, соединяющие вершины синтаксических деревьев:
a) J-J-T-M-K-a; b) J-J-T-T-M-K-a;
c) J-T-M-S3-(; d) J-J-T-T-M-K-a.
Обзор синтаксических деревьев для четырех арифметических выражений позволяет допустить выводимость многих арифметических выражений, подчиняющихся правилам грамматики G9.