- •Понятие транслятора. Структура транслятора. Фазы трансляции. Основные блоки транслятора.
- •Понятие транслятора. Многопроходная организация взаимодействия блоков транслятора.
- •Понятие транслятора. Однопроходная организация взаимодействия блоков транслятора.
- •Понятие транслятора. Комбинированные взаимодействия блоков транслятора.
- •Способы определения языков. Механизмы порождения и распознавания.
- •Формальные грамматики. Порождающие грамматики Хомского.
- •Конечные автоматы. Детерминированные конечные автоматы.
- •Конечные автоматы. Недетерминированные конечные автоматы.
- •Автоматы с магазинной памятью. Устройство автомата с магазинной памятью.
- •Автоматы с магазинной памятью. Детерминированные и недетерминированные автоматы с магазинной памятью.
- •Машина Тьюринга. Устройство машины Тьюринга. Отличия конечного автомата от машины Тьюринга.
- •Машина Тьюринга. Линейно-ограниченные автоматы.
- •Системы Линденмайера (l-системы). Внутреннее устройство l-систем.
- •Системы автоматической генерации компиляторов. Основные спецификации и идеологии.
- •Системы автоматической генерации компиляторов. Проект Coco/r.
- •Системы автоматической генерации компиляторов. Проект Yacc.
- •Системы автоматической генерации компиляторов. Генерация лексического анализатора.
- •Системы автоматической генерации компиляторов. Генерация синтаксического анализатора.
- •Понятие компилятора. Этапы анализа исходной программы.
- •Понятие компилятора. Лексический анализ.
- •Понятие компилятора. Синтаксический анализ.
- •Понятие компилятора. Семантический анализ.
- •Понятие компилятора. Основные фазы компиляции.
- •Понятие компилятора. Генерация кода. Основные подходы к генерации кода. Понятие целевой машины.
- •Понятие компилятора. Оптимизация кода. Основные источники оптимизации.
Системы автоматической генерации компиляторов. Генерация лексического анализатора.
Системы автоматической генерации компиляторов. Генерация синтаксического анализатора.
Как уже отмечалось, Coco/R генерирует как лексический, так и синтаксический анализаторы по заданному описанию языка. Описание представляет собой обычный текстовый файл с расширением atg (в нашем случае разумно назвать его tinycode.atg), содержащий инструкции, распознаваемые программой Coco/R.
Описание языка начинается с указания его названия вслед за ключевым словом COMPILER
Далее после директивы CHARACTERS можно указать имена, обозначающие любой символ из данного набора;
Теперь можно указать список токенов, распознаваемых лексическим анализатором. В Coco/R приняты следующие соглашения:
Выражение, заключенное в фигурные скобки, может повторяться нуль или более раз (замыкание Клини).
Вертикальная черта обозначает альтернативу (объединение в терминах регулярных выражений).
В квадратные скобки заключается необязательная часть: запись [а] эквивалентна a u e в стандартной нотации.
Каждая запись завершается точкой.
Синтаксические правила описываются после слова PRODUCTIONS.
С помощью компилятора генерируется лексический и синтаксический анализаторы.
Объявления. В Yacc-программе имеется два необязательных раздела объявлений. В первом размешаются обычные объявления С, ограниченные % { и %}. На рис. 4.56 этот раздел содержит только одну директиву #include <ctype.h>, которая заставляет препроцессор С включить стандартный заголовочный файл <ctype.h>, содержащий описание предиката isdigit.
Правила трансляции. В этой части спецификации Yacc после первой пары %% мы размещаем правила трансляции. Каждое правило состоит из продукции грамматики и связанных семантических действий. Множество продукций, которые мы записывали как
С-подпрограммы поддержки. Третья часть спецификации Yacc содержит С-подпрограммы поддержки. Среди них в обязательном порядке должна находиться функция лексического анализатора yylex(). Другие функции, такие как подпрограммы обработки ошибок, могут быть добавлены при необходимости.
Лексический анализатор yylex() производит пары токен-значение. Если функция возвращает токен типа DIGIT, этот токен должен быть объявлен в первой части спецификации Yacc. Значение связанного с токеном атрибута передается синтаксическому анализатору через предопределенную переменную Yacc yylval.
Lex предназначен для создания лексических анализаторов, которые могут использоваться в Yacc. Библиотека Lex 11 предоставляет подпрограмму с именем yylex () .Yacc использует это имя при вызове лексического анализатора. При использовании Lex в качестве генератора лексического анализатора, функция yylex () в третьей части спецификации Yacc заменяется инструкцией
#include "lex.yy.c" и каждый вызов лексического анализатора возвращает известный Yacc терминал. Использование указанной инструкции обеспечивает функции yylex () доступ к именам, используемым Yacc для токенов, поскольку выходной файл Lex компилируется как составная часть выходного файла.