Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
tyap(l).doc
Скачиваний:
22
Добавлен:
30.07.2019
Размер:
806.91 Кб
Скачать
  1. Системы автоматической генерации компиляторов. Основные спецификации и идеологии.

Полноценный компилятор (и вообще, любой транслятор) состоит, по крайней мере, из трех модулей: лексического анализатора, синтаксического анализатора и генератора кода.

Первая часть — лексический анализатор занимается преобразованием исходного текста программы в последовательность специальных символов токенов.

Лексический анализатор, с одной стороны, не обязан определять, является ли Myld_123 именем класса, переменной или функции; с другой же стороны, он должен избавить синтаксический анализатор от необходимости распознавать набор символов М, у, I, d, _, 1,2, 3 как некую единую конструкцию, являющуюся идентификатором.

Преобразование символьной последовательности -1.232 в количественное значение — задача лексического анализатора, использование полученного значения его уже не должно заботить.

Генератор лексических анализаторов может быть отдельной программой (классический пример — Lex), а может и встраиваться в компилятор компиляторов, как в случае Coco/R. Единственное замечание: в Coco/R лексический анализатор называется сканером (scanner).

Синтаксис языка описывается с помощью некоторой разновидности контекстно-свободной грамматики, на основании которой парсер может быть сгенерирован автоматически. Чем больше ограничений в правилах грамматики, тем проще и быстрее синтаксический анализатор, но тем уже круг синтаксических средств, этой грамматикой выразимых.

Для описания токенов используются регулярные выражения, для определения синтаксических конструкций — формальные грамматики.

Любой компилятор компи­ляторов должен предоставлять разработчику возможность вставлять в определенные участки описания языка фрагменты на некотором языке программирования. В Coco/R таким языком является С#.

  1. Системы автоматической генерации компиляторов. Проект Coco/r.

Генератор компиляторов Coco/R, разработан в университете г. Линца (Австрия). В отличие от основанных на языке С YACC и Bison, Coco/R использует в качестве базового языка С#. Кроме того, Coco/R достаточно прост.

Сосо/R — автоматизированный генератор компиляторов. На вход Сосо/R подаётся файл с описанием структуры языка, который будет входным языком компилятора. Обычно это файл с расширением .ATG, в котором описаны символы, допускаемые языком, лексемы, состоящие из этих символов, продукции языка, описывающие структуру компилируемого языка, вставки на языке, на котором будет писаться компилятор (обычно С#).

Сосо/R генерирует классы сканера и парсера на языке, на котором пишется компилятор, для синтаксического анализа, которые затем добавляются в основную программу. (Scanner.cs, Parser.cs) Так же автоматически создаётся обработчик ошибок (он входит в состав Parser.cs), что в последствии позволяет выводить при анализе программ пользователя список ошибок с указанием их мест. Таким образом, программа автоматизированной генерации компиляторов Сосо/R значительно облегчает процесс создания компиляторов.

  1. Системы автоматической генерации компиляторов. Проект 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-программа имеет три части:

Объявления

%%

Правила трансляции

%%

С-подпрограммы поддержки