- •Входные языки сапр и
- •Предисловие
- •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. Контекстные условия языков программирования
Общие требования к языкам формулировки задания.
За счет стандартизации лексических структур языков должна быть обеспечена возможность проведения единообразного лексического анализа.
Синтаксическая структура языка должна обеспечивать детерминированный анализ.
Допускаемая в разумных пределах избыточность (однозначное применение ключевых слов и разделителей и однозначное завершение синтаксических единиц) должна обеспечивать достаточную степень возможности обнаружения и обработки ошибок.
Максимально простое соответствие между символами языка и сценами должно обеспечить несложное преобразование текста задания в сценарий.
1.1.2. Требования к языкам формулировки задания с точки зрения их использования.
Возможность быстрого изучения языка даже при отсутствии специальных знаний по программированию.
Простой и наглядный синтаксис и семантика.
Согласованность символов языка с рассматриваемым классом задач (с учетом принятых обозначений). Должна быть предусмотрена возможность использования синонимов.
Модульное построение языка и возможность его расширения.
1.2.Лексический и синтаксический анализ.
Различают следующие виды лексем:
идентификаторы;
ключевые слова;
числа;
последовательности знаков;
особые знаки и их комбинации;
комментарии.
Каждой лексеме (кроме комментариев) приписывается код. Комментарии и пробелы подавляются. Всем идентификаторам приписывается одинаковый код, также как числам и последовательностям знаков. Для лексического анализа порядок следования лексем не важен. Анализ происходит до тех пор пока не встретится лексема «конец текста».
Пример1: Структура лексического анализа.
СЛ – модуль, распознающий следующую лексему;
СЗ – модуль, распознающий следующий знак;
БУ – буква;
ЦИ – цифра.
Допустимы следующие символы:
/* */, —подавляются,
идентификаторы (начинаются с буквы) – код 9,
:= – код 10,
:> – код 11,
: – код 12,
|| – код 13,
; – код 14,
, – код 15,
( – код 16,
) – код 17,
– код 0.
Если верно, то направо, если неверно, то вниз.
При синтаксическом анализе проверяется, следуют ли лексемы в правильном порядке, образуют ли они правильные комбинации.
Для синтаксического анализа могут применяться сценарии лексического анализа со следующими изменениями:
проверки относятся не к последнему знаку, а к коду последней лексемы;
функция «возврат кода» лексему кодом не заменяет. Параметр служит для различения мест возврата;
кроме модуля следующей лексемы могут вызываться другие модули, представленные в виде сценария;
ошибка приводит к остановке анализа.
Пример2: Структура синтаксического анализа.
Каждый подсценарий анализирует определенные отрезки текста, которые называются синтаксическими единицами: ввод, вывод, имя и т.д. В каждом сценарии определенные лексемы проверяются непосредственно, а для проверки синтаксических единиц вызываются другие сценарии.
Пример3: Вид подсценария.
Пример4: Программа, написанная на входном языке,анализ которого разобран выше.
СТАРТ СОБРАТЬ
В SD, ZG, BK;
ИЗ SDO, AUSG, AUSZ;
AUSG:=AG(BK:>(SD||ZG));
SDO:=SD||ZG;
AUSZ:=BK:>ZG;
СТОП.
Описанный выше принцип анализа называется LF(1) – метод или метод рекурсивного спуска.
При синтаксическом анализе строится дерево синтаксического разбора, листья которого – лексемы исходного текста, вершины отвечают синтаксическим единицам, каждая из которых состоит из лексем либо из других синтаксических единиц.
Пример5: Построение синтаксического дерева.
Выражение: SDO:=SD||ZG;
Для машины удобнее одномерное представление дерева в виде свернутой строки.
[[SDO]результат:=[[SD]операнд[||]оператор[ZG]операнд]выражение;]присваивание.
Такой текст может быть порожден в ходе анализа по следующему алгоритму:
При вызове модуля СЛ выдается последняя проанализированная лексема.
При входе в сценарий выдается открывающая синтаксическая скобка.
При выходе из сценария выдается закрывающая синтаксическая скобка и название сценария, из которого производится выход.