
- •Содержание
- •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. Организация рейтингового контроля по дисциплине «Системное программное обеспечение. Синтаксические анализаторы»
Контрольные вопросы
Как игнорировать возможные ошибки данных?
Опишите работу с мета-файлом.
Какие переменная и массив служат для взаимосвязи Yacc’a и Lex’a?
Как должна быть описана переменная, чтобы она была доступна функции main, Yacc’у и Lex’у?
Приложение 4. Организация рейтингового контроля по дисциплине «Системное программное обеспечение. Синтаксические анализаторы»
Рейтинг студента по дисциплине определяется суммой баллов, заработанных им и отражающих успешность его обучения и овладения данной дисциплиной. Рейтинговая система контроля в семестре включает три направления оценки успешности обучения.
1. Оценка отношения студента к выполнению своих обязанностей на этапе изучения дисциплины (в течение семестра).
2. Текущий контроль успеваемости студента.
3. Оценка активности и творческого отношения студента к овладению выбранной специальностью при изучении дисциплины.
Для оценки студента по первому из трех представленных выше направлений выделяется общее количество баллов (максимальное) = 64, которые распределяются следующим образом:
· 3 балла – за каждое посещение лекции в семестре;
· 4 балла – за посещение каждого лабораторного занятия
Для оценки успеваемости студента по второму направлению предназначены 3 теста и 4 защиты лабораторных работ. Каждый тест оценивается в 30 баллов (максимум), успешно пройденная защита лабораторной работы в 20 баллов.
Для оценки успеваемости студента по третьему направлению выделяется общее количество баллов = 200, в т.ч.:
· НИРС по кафедре – 20 баллов;
· УИРС по кафедре – 20 баллов;
· Республиканский НИРС – 50 баллов;
· Конкурсные работы 1 – 3 категории – 60 баллов;
· Публикации – 50 баллов.
В конце семестра подводится итог работы студента за период суммированием набранных им баллов. Если рейтинг (набранное количество баллов) студента удовлетворяет условию Р ³ 144 (трети максимально возможного рейтинга), то студент считается выполнившим учебный план по дисциплине и имеет право на автоматическое получение зачета.
1 В литературе встречается также обозначение α0β, которое означает, что цепочка а выводима из цепочки β за 0 шагов — иными словами, в таком случае эти цепочки равны: α=β. Подразумевается, что обозначение вывода α*β допускает и такое толкование — включает в себя вариант α0β.
1 Требование k > 0, безусловно, является разумным — для принятия решения о выборе той или иной альтернативы МП-автомату надо рассмотреть хотя бы один символ входной цепочки. Если представить себе LL-грамматику с k = 0, то в такой грамматике вывод совсем не будет зависеть от входной цепочки. В принципе такая грамматика возможна, но в ней будет всего одна единственная цепочка вывода. Поэтому практическое применение языка, заданного такого рода грамматикой, представляется весьма сомнительным
2 Может показаться, что класс LL(1)-грамматик соответствует классу грамматик, анализируемых методом рекурсивного спуска, где набор альтернативны также основан на текущем символе входной цепочки. На самом деле это не так — класс LL(1)-грамматик является более широким, чем класс грамматик, анализируемым методом рекурсивного спуска. Любая грамматика, анализируемая методом рекурсивного спуска, является LL(1)-грамматикой, но не наоборот: существуют LL(1)-грамматики, которые напрямую методом рекурсивного спуска не анализируются. Дело в том, что распознаватель на базе LL(1)-грамматики (который основан на множествах FIRST и FOLLOW) при выборе альтернативы фактически анализирует не одно, а сразу несколько правил, связанных с текущим символом на верхушке стека, в то время как рекурсивный спуск основан па анализе только одного правила, непосредственно относящегося к этому символу.
3 Можно убедиться, что две приведенные грамматики задают один и тот же язык: L(G) = L(G'). Это легко сделать, поскольку обе они являются не только КС-грамматиками, но и регулярными праволинейными грамматиками Кроме того, формальное преобразование G' в G существует — достаточно устранить в грамматике G' -правила и цепные правила, и будет получена исходная грамматика G. А вот формального преобразования G в G' нет. В общем случае все может быть гораздо сложнее.
4 Устранение левой рекурсии — это, конечно, необходимое, но не достаточное условие для преобразования грамматики к виду LL-грамматики. Это будет видно далее из примера
1 Существование LR(0)-грамматик уже не является бессмыслицей в отличие от LL(О)-грамматик. В данном случае используется расширенный МП-автомат, который анализирует не один, а сразу несколько символов, находящихся на верхушке стека. Причем среди этих символом могут быть и терминальные символы из входной цепочки, попавшие в стек при выполнении сдвигов (переносов). Поэтому даже если автомат при k = 0 и не будет смотреть на текущий символ входной цепочки, построенный им вывод все равно будет зависеть от содержимого стека, а значит, и от содержимого входной цепочки.
1 Говоря о соотношении классов LL-грамматик и LR-грамматик, мм не затрагиваем вопрос о значениях k дли этих грамматик. Если для некоторой LL(k)- грамматики всегда существует эквивалентная ей LR-грамматика, то это вовсе не значит, что она будет LR(k)- грамматикой с тем же значением k, и наоборот. Но если говорится, что существуют LR-грамматики, для которых нет эквивалентных им LL-грамматик, то это означает, что нет эквивалентных им LL(k)- грамматик для всех возможных значении k>0.
1 Более того, доказано даже, что любой детерминированный КС-язык может быть задан LR(1)-грамматикой.
1 Чтобы доказать, что две рассмотренные грамматики эквивалентны (определяют один и тот же язык: L(G) = L(G")), предлагаем читателям выполнить преобразования G в G" самостоятельно. Это несложно: первым шагом будет устранение левой рекурсии, затем необходимо несколько раз выполнить левую факторизацию
2 Безусловно, мри любых значениях k распознаватель для LR(k)- грамматик остается линейным распознавателелем — необходимые вычислительные ресурсы для него линейно зависят от длины входной цепочки символов. Но с ростом k будет расти и коэффициент зависимости. Из алгоритма функционирования распознавателя видно, что это коэффициент напрямую связан с объемом управляющей таблицы, причем се объем возрастает в квадратичной зависимости от величины k.
3 Число состояний управляющей таблицы для практически интересных LR(1)-грамматик также весьма велико. А к классу LR(0)-грамматик такие грамматики почти никогда не относятся. На практике чаще всего используются промежуточные между LR(0) и LR(1) методы, известные под названиями SLR(l) — Simple («Простые») LR(1) — и LALR(l) — Look Ahead («С заглядыванием вперед») LR(1).