Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
системное ПО / Лабораторная работа № 3 / Михайлов Н. Л. Форма Бекуса-Наура для записи грамматики языка Паскаль.doc
Скачиваний:
37
Добавлен:
20.03.2016
Размер:
69.12 Кб
Скачать

9

Министерство общего и профессионального образования рф

РЫБИНСКАЯ ГОСУДАРСТВЕННАЯ АВИАЦИОННАЯ ТЕХНОЛОГИЧЕСКАЯ АКАДЕМИЯ

КАФЕДРА "ВЫЧИСЛИТЕЛЬНЫЕ СИСТЕМЫ"

Н. Л. МИХАЙЛОВ

ФОРМА БЕКУСА - НАУРА ДЛЯ ЗАПИСИ

ГРАММАТИКИ ЯЗЫКА ПАСКАЛЬ

Лабораторная работа по курсу:

"Системное программное обеспечение"

РЫБИНСК

1999

Цель работы: ознакомиться с методикой построения формы Бекуса - Наура - одной из форм записи грамматики языка программирования.

1. Методические указания к выполнению

лабораторной работы

1.1. Компиляция программы

Реализация языка программирования на конкретной электронной вычислительной машине заключается в создании некоторого способа преобразования произвольного текста на этом языке в программу для данной машины. С этой целью разрабатываются трансляторы.

Под транслятором понимается специальная программа, которая переводит исходную программу в эквивалентную ей объектную программу.

Транслятор, преобразующий текст на языке высокого уровня в объектную программу на языке низкого уровня (близкого к машинному) называется компилятором. После компиляции объектная программа обычно не может быть исполнена непосредственно. Дальнейшая ее обработка связана с применением специальной программы - загрузчика, которая преобразует программу на языке, близком к машинному, таким образом, чтобы она могла быть размещена в оперативной памяти для исполнения.

Для облегчения построения компиляторов / 1 / язык высокого уровня обычно описывается в терминах некоторой грамматики. Эта грамматика определяет форму (синтаксис) допустимых предложений языка. Например, оператор присваивания может быть определен в грамматике как имя переменной, за которой следует оператор присваивания (:=), за которым следует выражение. Проблема компиляции может быть сформулирована как проблема поиска соответствия написанных программистом предложений структурам, определенным грамматикой, и генерации соответствующего кода для каждого предложения.

В качестве примера для описания программы на языке высокого уровня в терминах грамматики рассмотрим программу на Паскале, изображенную на рис.1.

Предложения исходной программы удобнее представлять в виде последовательности лексем (­­tokens), чем просто как строку символов. Лексемы можно понимать как фундаментальные кирпичики, из которых строится язык. Например, лексемой может быть ключевое слово, имя целой переменной, арифметический оператор и т. д. Просмотр исходного текста, распознавание и классификация различных лексем называются лексическим анализом. Часть компилятора, которая выполняет эту функцию, обычно называют сканером или лексическим анализатором.

1 PROGRAM STATS;

2 ­­ VAR

З SUM, SUMSQ, I, VALUE, MEAN, VARIANCE : INTEGER;

4 BEGIN

5 SUM := 0;

6 SUMSQ := 0;

7 FOR I = 1 TO 100 DO

8 BEGIN

9 READ(VALUE);

10 SUM := SUM + VALUE;

11 SUMSQ := SUMSQ + VALUE * VALUE

12 END;

13 MEAN := SUM DIV 100;

14 VARIANCE := SUMSQ DIV 100 - MEAN * MEAN;

15 WRITE(MEAN, VARIANCE)

16 END.

Рис. 1. Пример программы на Паскале

Как только лексемы выделены, каждое предложение программы может быть распознано как некоторая конструкция языка, как, например, декларативные операторы или оператор присваивания, описанные с помощью грамматики. Процесс, называемый синтаксическим анализом или синтаксическим разбором, осуществляется той частью компилятора, которая обычно называется синтаксическим анализатором (parser). Последним шагом базовой схемы процесса трансляции является генерация объектного кода. Большинство компиляторов генерирует непосредственно программу в машинных кодах, а не программу на ассемблере, предназначенную для последующей трансляции в машинные коды.