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

  2. Системы автоматической генерации компиляторов. Генерация синтаксического анализатора.

Как уже отмечалось, 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 компилируется как составная часть выходного файла.