
- •Содержание
- •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. Организация рейтингового контроля по дисциплине «Системное программное обеспечение. Синтаксические анализаторы»
8.6.4.Входной синтаксис yacc'а
В данном разделе в форме yacc-спецификации описывается входной синтаксис yacc'а. Не рассматриваются контекстные зависимости и аналогичные вопросы. Ирония заключается в том, что, хотя yacc воспринимает LALR(1)-грамматики, сам входной язык спецификаций yacc'а наиболее естественным образом задается LR(2)-грамматикой: трудным оказывается случай, когда идентификатор идет сразу за действием. Если после идентификатора стоит двоеточие, то это начало следующего правила, в противном случае, это продолжение текущего правила, которое идет за внутренним действием. Реализация такова: лексический анализатор, обнаружив идентификатор, просматривает входной текст вперед и определяет, является ли следующая лексема двоеточием. Если является, лексический анализатор возвращает C_IDENTIFIER. Если нет, возвращается IDENTIFI-ER. Литералы (в апострофах) также распознаются как IDENTIFIER, но не как C_IDENTIFIER.
/* грамматика yacc-спецификаций */
/* основные компоненты */
%token IDENTIFIER /* идентификаторы и литералы */
%token C_IDENTIFIER /* идентификатор (но не литерал), */
/* за которым следует двоеточие */
/* зарезервированные слова: %type=>TYPE %left=>LEFT и т.д.*/
%token LEFT RIGHT NONASSOC TOKEN PREC TYPE START UNION
%token MARK /* знак %% */
%token LCURL /* знак %{ */
%token RCURL /* знак %} */
/* ASCII-символы указываются непосредственно */
%%
spec : defs MARK rules tail
;
tail : MARK
{
В этом действии обрабатывается
оставшаяся часть файла
}
/* пусто: второй MARK необязателен */
;
defs : /* пусто */
defs def
;
def : START IDENTIFIER
UNION
{
Копирование определения объединения
в выходной файл
}
LCURL
{
Копирование C-кода в выходной файл
}
RCURL
rword tag nlist
;
rword : TOKEN
LEFT
RIGHT
NONASSOC
TYPE
;
tag : /* пусто: тег необязателен */
'<' IDENTIFIER '>'
;
nlist : nmno
nlist nmno
nlist ',' nmno
;
nmno : IDENTIFIER
/* Замечание: литерал нельзя использовать с %type */
IDENTIFIER NUMBER
/* Замечание: нельзя использовать с %type */
;
/* секция правил */
rules : C_IDENTIFIER rbody prec
rules rule
;
rule : C_IDENTIFIER rbody prec
'|' rbody prec
;
rbody : /* пусто */
| rbody IDENTIFIER
| rbody act
;
act : '{'
{
Копирование действия, обработка $$ и т.п.
}
'}'
;
prec : /* пусто */
| PREC IDENTIFIER
| PREC IDENTIFIER act
| prec ';'
;
8.7.Контроль
Контроль успеваемости на данном этапе обучения выполняется по результатам защиты лабораторных работ.
9.Модуль Заключение
В заключение хочется очертить перспективы развития теории формальных грамматик, технологий построения синтаксических и лексических анализаторов и роли их в системе современных знаний.
Если проследить эволюционный путь, который прошли формальные языки, то наблюдается тенденция к повышению читабельности и выразительности языковых средств. Однако, эта тенденция на современном этапе ослабевает, поскольку формальные языки, как инструмент общения человека с компьютером перестают играть доминирующую роль. Их место постепенно занимают более выразительные способы общения посредством визуальных сред проектирования, CASE системы. Например, принятый в качестве международного стандарта универсальный язык моделирования объектно-ориентированных систем UML уже представляет собой совокупность разноплановых диаграмм, а не языковые описания.
Следующий аспект заключается в появлении готовых специализированных распознавателей, умеющих «читать» универсальные языки, такие как XML-основанные языки разметки. Сужается спектр необходимых лексем до возможного минимума, алгоритмы распознавания, соответственно оттачиваются до максимально возможной производительности. Именно высокоскоростные универсальные распознаватели-трансляторы в прямом и обратном направлении на лету – будущее сетевых сервисов.
Возможно, в будущем будут построены и высокоскоростные распознаватель контекстно-зависимых языков, что позволить усовершенствовать системы машинного перевода и даст новый виток эволюции систем искусственного интеллекта.
Важно, что роль теории формальных языков в сфере информационных технологий постоянно растет. С ее использованием оказывается возможным получать действительно качественные решения целого ряда задач по обработке информации.