
- •Содержание
- •1.Рабочая программа
- •2.Модуль Вводный
- •3.Модуль Формальные грамматики и языки
- •3.1.Языки и цепочки символов. Способы задания языков
- •3.1.1.Цепочки символов. Операции над цепочками символов
- •3.1.2.Понятие языка. Формальное определение языка
- •3.1.3.Способы задания языков
- •3.1.4.Синтаксис и семантика языка
- •3.2.Определение грамматики
- •3.2.1.Особенности языков программирования
- •3.2.2.Определение грамматики. Форма Бэкуса—Наура
- •3.2.3.Принцип рекурсии в правилах грамматики
- •3.2.4.Другие способы задания грамматик
- •3.3.Классификация языков и грамматик
- •3.3.1.Классификация грамматик
- •3.3.2.Классификация языков
- •3.4.Контроль
- •4.Модуль Распознаватели, механизм вывода цепочек символов
- •4.1.Цепочки вывода. Сентенциальная форма.
- •4.1.1.Сентенциальная форма грамматики. Язык, заданный грамматикой
- •4.1.2.Левосторонний и правосторонний выводы
- •4.1.3.Однозначные и неоднозначные грамматики
- •4.1.4.Эквивалентность и преобразование грамматик
- •4.2.Распознаватели. Задача разбора
- •4.2.1.Общая схема распознавателя
- •4.2.2.Виды распознавателей
- •4.2.3.Классификация распознавателей по типам языков
- •4.3.Контроль
- •5.Модуль Регулярные грамматики и языки
- •5.1.Регулярные языки и грамматики
- •5.2.Леволинейные и праволинейные грамматики. Автоматные грамматики
- •5.3.Алгоритм преобразования регулярной грамматики к автоматному виду
- •5.4.Конечные автоматы
- •5.4.1.Определение конечного автомата
- •5.4.2.Детерминированные и недетерминированные конечные автоматы
- •5.4.3.Преобразование конечного автомата к детерминированному виду
- •5.5.Контроль
- •6.Модуль Контекстно-свободные грамматики и языки
- •6.1.Контекстно-свободные языки
- •6.1.1.Распознаватели кс-языков. Автоматы с магазинной памятью. Определение мп-автомата
- •6.2.Классы кс-языков и грамматик. Класс ll(k) грамматик.
- •6.3.Принципы построения распознавателей для ll(k)-грамматик
- •6.4.Левая факторизация
- •6.5.Удаление левой рекурсии
- •6.6.Алгоритм разбора для ll(1)-грамматик
- •6.7.Алгоритм построения множества first(1,a)
- •6.8.Алгоритм построения множества follow(1,a)
- •6.9.Восходящие распознаватели кс-языков без возвратов
- •6.9.1.Определение lr(k)-грамматики
- •6.10.Принципы построения распознавателей для lr(k)-грамматик
- •6.10.1.Грамматики простого предшествования
- •6.11.Распознаватели для lr(0) и lr(1) грамматик
- •6.11.1.Распознаватель для lr(0)-грамматики
- •6.11.2.Распознаватель для lr(1) грамматики
- •6.12.Контроль
- •7.Модуль Инструментальные средства для построения трансляторов
- •7.1.Инструментальные средства для построения компиляторов
- •7.1.1.Построитель лексических анализаторов Lex
- •7.2.Контроль
- •8.Модуль Особенности программирование трансляторов
- •8.1.Использование значений произвольных типов, алгоритм разбора
- •8.1.1.Алгоритм синтаксического разбора
- •8.1.2.Семантический стек
- •8.2.Неоднозначности и конфликты
- •8.3.Старшинство операций
- •8.4.Дополнительные возможности программ yacc и lex
- •8.4.1.Обработка ошибок
- •8.5.Совместное использование lex и yacc
- •8.5.1.Кодировка лексем и интерфейс
- •8.5.2.Сборка yacc-программ
- •8.6.Советы по подготовке спецификаций
- •8.6.1.Стиль
- •8.6.2.Использование левой рекурсии
- •8.6.3.Уловки анализа лексики
- •8.6.4.Входной синтаксис yacc'а
- •8.7.Контроль
- •9.Модуль Заключение
- •10.Обеспечение лабораторного практикума
- •11.Дополнительная информация. Примеры
- •11.4.Пример простейшего интерпретатора формул
- •11.5.Простой пример
- •11.6.Более сложный пример
- •11.7.Генераторы лексических и синтаксических анализаторов
- •11.8.Генераторы лексических и синтаксических анализаторов на java
- •11.9.Пакеты для разработки компиляторов
- •Список сокращений
- •Литература
- •Приложения Приложение 1. Учебно–методическая карта дисциплины “Системное программное обеспечение. Синтаксические анализаторы”
- •Приложение 2. Вопросы для зачета по дисциплине “Системное программное обеспечение. Синтаксические анализаторы”
- •Приложение 3. Методические указания к лабораторным работам по дисциплине «Системное программное обеспечение. Синтаксические анализаторы»
- •Порядок выполнения работы:
- •Контрольные вопросы
- •Лексический анализатор lex. Анализ структуры программ
- •Краткая теория:
- •Рассмотрим примеры:
- •Порядок выполнения работы:
- •Контрольные вопросы
- •Лексический анализатор lex, синтаксический анализатор yacc. Алгебраические вычисления
- •Краткая теория:
- •Порядок выполнения работы:
- •Контрольные вопросы
- •Лексический анализатор lex и синтаксический анализатор yacc. Изображение геометрических фигур
- •Краткая теория:
- •Создание метафайла и работа сним
- •Порядок выполнения работы:
- •Контрольные вопросы
- •Приложение 4. Организация рейтингового контроля по дисциплине «Системное программное обеспечение. Синтаксические анализаторы»
3.4.Контроль
На данном этапе изучения материала учащимся предлагаются вопросы и задачи для самоконтроля, например:
Раскройте скобки и упростите выражение в выражении с цепочками символов
.
Как обозначается множество всех цепочек над алфавитом V, включая ?
Что такое лексика формального языка?
Математически определите каждый класс формальных грамматик и сконструируйте пример грамматики для каждого класса.
Постройте грамматику, описывающую поезд (на базе 2-х терминальных символов <локомотив> и <вагон>):
- все локомотивы должны быть сосредоточены в начале поезда;
- поезд начинается и заканчивается локомотивом;
- поезд не должен содержать 2 локомотива или 2 и вагона подряд.
Согласно условию 5 постройте грамматику с использованием метасимволов языка описания регулярных выражений для описания поезда, содержащего не более 60 вагонов.
4.Модуль Распознаватели, механизм вывода цепочек символов
4.1.Цепочки вывода. Сентенциальная форма.
Выводом называется процесс порождения предложения языка на основе правил определяющей язык грамматики. Чтобы дать формальное определение процессу вывода, необходимо ввести еще несколько дополнительных понятий.
Цепочка β = 12 называется непосредственно выводимой из цепочки β = 12 в грамматике G(VT,VN,P,S), V = VTVN, 1, , 2 V*, V+, если в грамматике G существует правило: → Р.
Непосредственная выводимость цепочки β из цепочки α обозначается так: αβ. Иными словами, цепочка β выводима из цепочки α в том случае, если можно взять несколько символов в цепочке α, заменить их на другие символы согласно некоторому правилу грамматики и получить цепочку β. В формальном определении непосредственной выводимости любая из цепочек 1 или 2 (а равно и обе эти цепочки) может быть пустой. В предельном случае вся цепочка α может быть заменена на цепочку β, тогда в грамматике G должно существовать правило: α→β Р.
Цепочка β называется выводимой из цепочки α (обозначается α*β) в том случае, если выполняется одно из двух условий:
β непосредственно выводима из α (αβ);
, такая, что: у выводима из α и β непосредственно выводима из (α* и β).
Это рекурсивное определение выводимости цепочки. Суть его заключается в том, что цепочка β выводима из цепочки α, если αβ или же если можно построить последовательность непосредственно выводимых цепочек от α к β следующего вида: α1…i…nβ, n≥1 этой последовательности каждая последующая цепочка , непосредственно выводима из предыдущей цепочки i-1.
Такая последовательность непосредственно выводимых цепочек называется выводом или цепочкой вывода. Каждый переход от одной непосредственно выводимой цепочки к следующей в цепочке вывода называется шагом вывода. Очевидно, что шагов вывода в цепочке вывода всегда на один больше, чем промежуточных цепочек. Если цепочка р непосредственно выводима из цепочки α: αβ, то имеется всего один шаг вывода.
Если цепочка вывода из α к β содержит одну или более промежуточных цепочек (два или более шагов вывода), то она имеет специальное обозначение α+β (говорят, что цепочка β нетривиально выводима из цепочки α). Если количество шагов вывода известно, то его можно указать непосредственно у знака выводимости цепочек. Например, запись α4β означает, что цепочка β выводится из цепочки а за 4 шага вывода1.
Возьмем в качестве примера ту же грамматику для целых десятичных чисел со знаком G({0,1,2,3,4,5,6,7,8,9,-,+},{S,Т,F},P,S):
Р:
S → Т | +Т | -Т
Т → F | TF
F → 0 | l | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
Построим в ней несколько произвольных цепочек вывода:
1. S -Т -TF -TFF -FFF -4FF -47F -479
2. S Т TF Т8 F8 18
3. Т TF ТО TFO Т50 F50 350
4. TFT TFFT TFFF FFFF 1FFF 1FF4 10F4 1004
5. F 5
Получили следующие выводы:
1. S * -479 или S + -479 или S 7 -479
2. S * 18 или S + 18 или S 5 18
3. Т * 350 или Т + 350 или Т б 350
4. TFT * 1004 или TFT + 1004 или TFT 7 1004
5. F * 5 или F ' 5 (утверждение F + 5 неверно!)
Все эти выводы построены на основе грамматики G. В принципе в этой грамматике (как, практически, и в любой другой грамматике реального языка) можно построить сколь угодно много цепочек вывода.
Возьмем в качестве второго примера грамматику G3({a,b,c},{B,C,D,S},P,S) с правилами Р, которая уже рассматривалась выше:
S → BD
В → аВbС | ab
Сb → bС
CD → Dc
bDc → bcc
abD → abc
Как было сказано ранее, она задает язык L(G3) = {0n ln | n > 0}. Рассмотрим пример вывода предложения «aaaabbbbcccc » языка L(G3) на основе грамматики G3: S BD aBbCD aaBbCbCD аааВbСbСbСD aaaabbCbCbCD aaaabbbCCbCD aaaabbbCbCCD aaaabbbbCCCD aaaabbbbCCDc aaaabbbbCDcc aaaabbbbDccc aaaabbbbcccc. Тогда для грамматики G3 получаем вывод: S * aaaabbbbcccc.
Иногда, чтобы пояснить ход вывода, над стрелкой, обозначающей каждый шаг вывода, пишут обозначение того правила грамматики, на основе которого сделан этот шаг (для этой цели правила грамматики проще всего просто пронумеровать в порядке их следования). Грамматика, рассмотренная в приведенных здесь примерах, содержит всего 15 правил, и на каждом шаге в цепочках вывода можно понять, на основании какого правила сделан этот шаг (читатели могут легко сделать это самостоятельно), но в более сложных случаях пояснения к шагам вывода с указанием номеров правил грамматики могут быть весьма полезными.