
- •Входные языки сапр и
- •Предисловие
- •1. Языки формулировки задания
- •1.1. Функции. Программ перевода.
- •Общие требования к языкам формулировки задания.
- •1.1.2. Требования к языкам формулировки задания с точки зрения их использования.
- •1.2.Лексический и синтаксический анализ.
- •1.3.Проверка контекста и порождение сценария.
- •2.Теория формальных языков.
- •2.1. Порождающие грамматики
- •2.2. Иерархия распознающих автоматов
- •3. Синтаксис языков программирования.
- •3.1. Основные характеристики языков.
- •3.2. Нормальные формы Бекуса
- •3.3. Определение и общие свойства порождающих грамматик
- •3.4. Контекстно-свободные грамматики
- •3.4.1. Определение дерева вывода.
- •3.4.2. Алгоритм получения скобочной записи синтаксического дерева вывода.
- •3.4.3. Операции над бинарными отношениями.
- •3.5. Автоматные грамматики.
- •3.6. Методы распознавания и анализа языков.
- •3.6.1. Машина Тьюринга как распознающее устройство.
- •3.6.2. Автоматы и преобразователи с магазинной памятью.
- •3.7. Построение анализаторов кс-языков по порождающим грамматикам.
- •3.7.1. Анализаторы предшествования.
- •3.7.2. Lr(k)-анализатор
- •3.7.3. Глобальный анализатор
- •3.8. Контекстные условия языков программирования
3.4. Контекстно-свободные грамматики
Свойства контекстно-свободных ( КС) грамматик.
Дают возможность изучения структур синтаксических деревьев вывода.
Обладают способностью порождать бесконечные языки.
Определение: 1) Цепочку будем называть подцепочкой цепочки , если последняя может быть представлена в виде . Здесь и – некоторые (возможно, пустые ) цепочки.
2) Вхождением подцепочки в цепочку будем называть пару объектов ( i) , где – данная подцепочка, а i – порядковый номер левого символа подцепочки в цепочке .
Пример 9: Цепочка acac включает в себя две подцепочки ac. Таким образом, можно рассматривать два возможных вхождения подцепочки ac: (ac,1) и (ac,3).
3.4.1. Определение дерева вывода.
Под деревом понимается конечный ориентированный граф, обладающий следующими свойствами:
имеется вершина, в которую не входит ни одна дуга; эта вершина – корень дерева;
в каждую из его остальных вершин входит лишь одна дуга;
граф не содержит контуров.
Уровень вершины дерева – длина от этой вершины до корня, т.е. число дуг.
Высота дерева – максимальный уровень вершин.
Рассмотрим две вершины: х и у. Если в дереве существует путь из х в у, то х – предшествует у, а у –следует из х.
Вершины, не предшествующие никаким вершинам – заключительные.
Пример 10: Дерево вывода числа +23.6e-2
. .ю
3.4.2. Алгоритм получения скобочной записи синтаксического дерева вывода.
Линейная скобочная запись является терминальной цепочкой, вывод которой представлен соответствующим деревом, с выделенными в ней синтаксическими конструкциями. Для обозначения начала и конца каждой конструкции используются скобки. После левой и перед правой скобкой, которые ограничивают какую-либо выделяемую подцепочку, записывается породивший ее в данном выводе нетерминальный символ. Построение цепочки происходит путем приписывания справа символов к уже построенной части цепочки.
Будем считать, что в начальный момент времени обозревается корень дерева, помеченных дуг нет, а построенная часть цепочки пуста. При этих предположениях процесс построения цепочки описывается следующим алгоритмом:
Если обозреваемая вершина имеет выходящие из нее дуги, то переходим к шагу 2, иначе – к шагу 5.
Приписываем цепочке левую скобку и символ, соответствующий обозреваемой вершине. Переходим к шагу 3.
Если среди дуг, выходящих из обозреваемой вершины есть непомеченные, помечаем левую из них, т.е. ведущую в наименьшую вершину и переходим к шагу 1. В противном случае – к шагу 4.
Приписываем к цепочке символ, соответствующий обозреваемой вершине и правую скобку. Если в данную вершину входит дуга, обозреваем вершину из которой она выходит и переходим к шагу 3. Если входящей дуги нет – это корень.
приписываем цепочке соответствующий терминальный символ, обозреваем предыдущую вершину, переходим к шагу 3.
Пример 11: Линейная скобочная запись дерева вывода, приведенная в примере 9 выглядит следующим образом:
(Ч+(Н(Д(Б(Б(Ц2Ц)Б) (Ц5Ц)Б) (М.(Б(Ц6Ц)Б)М)Д) (Пe (Ф-(Б(Ц2Ц)Б)Ф)П)Н)Ч) .
Определение: 1) Вывод в КС-грамматике будем называть левосторонним (правосторонним), если правило вывода применяется к самому левому (правому) вхождению нетерминальной цепочки вывода.
2) КС-грамматику, в которой существует более чем один левосторонний вывод некоторой терминальной цепочки, будем называть неоднозначной, а язык, порождаемый такой грамматикой, – синтаксически неоднозначным.
3) Язык, все порождающие КС-грамматики которого неоднозначны, будем называть существенно синтаксически неоднозначным.
При помощи КС-грамматик можно представить не все, а лишь часть синтаксических правил языков программирования. Те же правила, которые средствами КС-грамматик не описываются, называются контекстными условиями и задаются обычно неформально – при помощи английского, русского и других естественных языков.