
- •Понятие транслятора. Структура транслятора. Фазы трансляции. Основные блоки транслятора.
- •Понятие транслятора. Многопроходная организация взаимодействия блоков транслятора.
- •Понятие транслятора. Однопроходная организация взаимодействия блоков транслятора.
- •Понятие транслятора. Комбинированные взаимодействия блоков транслятора.
- •Способы определения языков. Механизмы порождения и распознавания.
- •Формальные грамматики. Порождающие грамматики Хомского.
- •Конечные автоматы. Детерминированные конечные автоматы.
- •Конечные автоматы. Недетерминированные конечные автоматы.
- •Автоматы с магазинной памятью. Устройство автомата с магазинной памятью.
- •Автоматы с магазинной памятью. Детерминированные и недетерминированные автоматы с магазинной памятью.
- •Машина Тьюринга. Устройство машины Тьюринга. Отличия конечного автомата от машины Тьюринга.
- •Машина Тьюринга. Линейно-ограниченные автоматы.
- •Системы Линденмайера (l-системы). Внутреннее устройство l-систем.
- •Системы автоматической генерации компиляторов. Основные спецификации и идеологии.
- •Системы автоматической генерации компиляторов. Проект Coco/r.
- •Системы автоматической генерации компиляторов. Проект Yacc.
- •Системы автоматической генерации компиляторов. Генерация лексического анализатора.
- •Системы автоматической генерации компиляторов. Генерация синтаксического анализатора.
- •Понятие компилятора. Этапы анализа исходной программы.
- •Понятие компилятора. Лексический анализ.
- •Понятие компилятора. Синтаксический анализ.
- •Понятие компилятора. Семантический анализ.
- •Понятие компилятора. Основные фазы компиляции.
- •Понятие компилятора. Генерация кода. Основные подходы к генерации кода. Понятие целевой машины.
- •Понятие компилятора. Оптимизация кода. Основные источники оптимизации.
Системы автоматической генерации компиляторов. Основные спецификации и идеологии.
Полноценный компилятор (и вообще, любой транслятор) состоит, по крайней мере, из трех модулей: лексического анализатора, синтаксического анализатора и генератора кода.
Первая часть — лексический анализатор — занимается преобразованием исходного текста программы в последовательность специальных символов — токенов.
Лексический анализатор, с одной стороны, не обязан определять, является ли Myld_123 именем класса, переменной или функции; с другой же стороны, он должен избавить синтаксический анализатор от необходимости распознавать набор символов М, у, I, d, _, 1,2, 3 как некую единую конструкцию, являющуюся идентификатором.
Преобразование символьной последовательности -1.232 в количественное значение — задача лексического анализатора, использование полученного значения его уже не должно заботить.
Генератор лексических анализаторов может быть отдельной программой (классический пример — Lex), а может и встраиваться в компилятор компиляторов, как в случае Coco/R. Единственное замечание: в Coco/R лексический анализатор называется сканером (scanner).
Синтаксис языка описывается с помощью некоторой разновидности контекстно-свободной грамматики, на основании которой парсер может быть сгенерирован автоматически. Чем больше ограничений в правилах грамматики, тем проще и быстрее синтаксический анализатор, но тем уже круг синтаксических средств, этой грамматикой выразимых.
Для описания токенов используются регулярные выражения, для определения синтаксических конструкций — формальные грамматики.
Любой компилятор компиляторов должен предоставлять разработчику возможность вставлять в определенные участки описания языка фрагменты на некотором языке программирования. В Coco/R таким языком является С#.
Системы автоматической генерации компиляторов. Проект Coco/r.
Генератор компиляторов Coco/R, разработан в университете г. Линца (Австрия). В отличие от основанных на языке С YACC и Bison, Coco/R использует в качестве базового языка С#. Кроме того, Coco/R достаточно прост.
Сосо/R — автоматизированный генератор компиляторов. На вход Сосо/R подаётся файл с описанием структуры языка, который будет входным языком компилятора. Обычно это файл с расширением .ATG, в котором описаны символы, допускаемые языком, лексемы, состоящие из этих символов, продукции языка, описывающие структуру компилируемого языка, вставки на языке, на котором будет писаться компилятор (обычно С#).
Сосо/R генерирует классы сканера и парсера на языке, на котором пишется компилятор, для синтаксического анализа, которые затем добавляются в основную программу. (Scanner.cs, Parser.cs) Так же автоматически создаётся обработчик ошибок (он входит в состав Parser.cs), что в последствии позволяет выводить при анализе программ пользователя список ошибок с указанием их мест. Таким образом, программа автоматизированной генерации компиляторов Сосо/R значительно облегчает процесс создания компиляторов.
Системы автоматической генерации компиляторов. Проект Yacc.
YACC — компьютерная программа, служащая стандартным генератором синтаксических анализаторов (парсеров) в Unix-системах. Название является сокращением от «Yet Another Compiler Compiler» («ещё один генератор компиляторов»). Yacc генерирует парсер на основе аналитической грамматики, описанной в нотации BNF. На выходе yacc выдаётся код парсера на языке программирования Си.
Создание транслятора с использованием Yacc схематично показано на рис. 4.55. Вначале создается файл, скажем, translate. у, содержащий Yacc-спецификацию разрабатываемого транслятора. Команда UNIX yacc translate.у
преобразует файл translate,у в программу у,tab.с на языке С с использованием LALR-метода, описанного в алгоритме4.13. Программа у.tab.с является синтаксическим анализатором, написанным на языке С и объединенным с другими подпрограммами на языке С, которые могут быть подготовлены пользователем. Таблица LALR-анализа уплотнена с помощью технологии, описанной в разделе 4.7. С помощью компиляции у.tab.с вместе с библиотекой 1у, содержащей программу LR-анализа, по команде
ее у.tab.с -1у
получаем требуемую объектную программу а. out, которая выполняет трансляцию» определенную исходной программой Yacc. Если необходимы другие процедуры, они могут быть скомпилированы или загружены вместе с у. tab. с, как и с любой другой программой на языке С.
Исходная Yacc-программа имеет три части:
Объявления
%%
Правила трансляции
%%
С-подпрограммы поддержки