Лекция 2 Лексический анализ и компиляция программы

Вид материалаЛекция

Содержание


2.2 Определение лексемы.
2.3 Типы лексем.
2.4 Специальные символы.
2.5 Зарезервированные слова.
2.7 Квалифицируемые идентификаторы.
2.8 Стандартные идентификаторы.
Borland Pascal - язык программирования записывается в программе в виде строчной переменной ‘Borland Pascal - язык программирован
‘Borland Pascal’ - язык программирования
2.2.2 Синтаксическая диаграмма заголовка программы.
2.3.2 Лексический и синтаксический анализаторы.
For I:=1 To 20 Do содержит семь лексем, отделённых друг от друга разделителями. Это: For, I, :=, 1, Tto, 20, Do
For I:= 1 To 20 Do
For I:=:= 1 to 20 Do
Error 42: Error in expression.
2.3.3 Генератор кода.
Подобный материал:

Лекция 2 Лексический анализ и компиляция программы

2.1 Лексемы

2.1 Символы. Основой любого естественного языка, в том числе алгоритмического, является алфавит. Обратимся к тексту программы о вычислении массы на рис. 1.1. Первые два слова Program Massa составлены из букв латинского алфавита. Далее следует знак точки с запятой. В фигурных скобках имеется комментарий с использованием алфавита кириллицы. По тексту программы встречаются знаки равенства = и звёздочка * и т. д. Алфавит языка Турбо Паскаль являются подмножеством символов кода ASCII, которое допускает возможность использования строго определённых знаков. К ним относятся:

- арабские цифры 0, 1,...9 (коды 48 - 57);

- строчные буквы латиницы a, b, ...z (коды 97 - 122);

- прописные буквы латиницы A, B, ...Z (коды 65 - 90);
  • управляющие символы (коды 0-31) табуляции (код 09);

- символ подчёркивания _ (код 95);
  • пробел (код 32);
  • 22 специальных символов # $ ‘ ( ) * + , - . / : ; < = > @ [ ] { } (коды ASII 35, 36, 39-47, 58-62, 64, 91, 93, 94, 123, 125).

Все остальные символы, в том числе буквы кириллицы, &, !, %, ~, ? и некоторые другие, могут использоваться только в комментариях, а также при работе с константами и переменными символьных и строчных типов.

2.2 Определение лексемы. Любой связный текст, несущий полезную информацию и составленный, скажем, на русском языке, состоит из слов. Отдельные слова такого текста написаны с использованием алфавита кириллицы. Каждое слово несёт лексическую нагрузку и являются базовым элементом русского языка. Единичным элементом языка Паскаль служит лексема. Это минимально значимая часть текста. В качестве примера рассмотрим лексемы из текста программы на рис. 1.1:

Program - служебное слово, используемое для обозначения программного продукта;

Massa - имя данной программы;

; - сдвоенный символ точка с запятой;

Var - служебное слово, предназначенное для описания типа переменных;

Mass - имя переменной и т. д.

Каждая из перечисленных лексем представляет собой минимально значимую часть программы в том смысле, что дальнейшее расчленение этих частей приведёт к смысловой потери соответствующего элемента. Действительно, если в первой лексеме программы убрать два последних символа, то оставшаяся часть Progr окажется набором из четырёх символов, который в рамках языка Турбо Паскаль не имеет смыслового значения. Попробуйте вместо слова Program в начале программы поставить символы Progr и запустить программу на выполнение - на дисплее высветится сообщение об ошибке. Программа не пошла.

2.3 Типы лексем. Интегрированная cреда Турбо Паскаль использует шесть категорий лексем: специальные символы, зарезервированные слова, иногда называемые служебными или ключевыми, идентификаторы, числа, строки и комментарии. Латинские буквы, используемые при написании лексем, могут быть строчными или заглавными, причём различия между ними не делается. Например, буквы G и g в именах лексем принимаются за один и тот же символ.

2.4 Специальные символы. Все специальные символы, используемые в среде Турбо Паскаль, за исключением символа штрих ’, являются лексемами, это 21 символ: # $ ( ) * + , - . / : ; < = > @ [ ] { }.

К лексемам также относятся восемь парных комбинаций следующих символов:

.. := <= >= (* *) (. .)

Последние четыре лексемы идентичны одинарным лексемам { } [ ].

2.5 Зарезервированные слова. Язык Турбо Паскаль содержит так называемые зарезервированные слова. Их также называют служебными или ключевыми. Они не могут быть заменены другими словами или переобозначены. Их также нельзя использовать для идентификации констант, переменных, типов данных, функций, процедур и других элементов языка. К служебным словам относятся:

And Asm Array Begin Case Const Constructor Destructor Div Do Downto Else End Exports File For Function Goto If Implementation In Inherited Inline Interface Label Library Mod Nil Not Object Of Or Packed Procedure Program Record Repeat Set Shl Shr String Then To Type Unit Until Uses Var While With Xor.

2.6 Идентификаторы. Идентификаторы языка Турбо Паскаль занимают особое место среди лексем. Они являются именами различных элементов программы, к которым относятся: метки, константы, типы, переменные, процедуры, функции, программы, модули, объекты, поля.

Определение. Идентификатором называется любая последовательность букв латиницы, цифр и знака подчёркивания _, которая начинается с буквы или знака подчёркивания.

Служебные слова не могут быть идентификаторами.

Компилятор не делает различия между строчными и заглавными буквами в идентификаторах. Так идентификатор Mass может быть записан в виде MASS или maSS. Примеры правильных идентификаторов:

desk1 f FAGOT Sum

E1R2T3 g777 _type _ _type

_3456 R_ _ Маss Mass_1

Примеры неправильных идентификаторов:

5GUT - на первом месте стоит цифра;

day# - использован запрещённый знак #;

Begin – служебное слово.

Количество символов в идентификаторе не регламентируется, но во внимание принимаются только первые 63 символа. Следовательно, два идентификатора

W01234567890123456789012345678901234567890123456789012345678901

и

W01234567890123456789012345678901234567890123456789012345678901asdfgh

будут считаться одинаковыми.

2.7 Квалифицируемые идентификаторы. Два разных по смыслу идентификатора с одним именем не могут использоваться в пределах одного модуля программы (понятие модуля будет рассмотрено позднее). В различных модулях это допускается. В последнем случае имя идентификатора начинается с имени модуля, далее ставится точка, за которой следует собственно имя идентификатора. Подобные идентификаторы называются квалифицируемыми или уточнёнными.

Квалифицируемыми идентификаторами могут быть объекты и первые шесть из ранее перечисленных девяти видов идентификаторов, т. е. метки, константы, типы, переменные, процедуры, функции. Программы, модули и поля не могут быть квалифицируемыми.

2.8 Стандартные идентификаторы. Большая часть идентификаторов устанавливаются программистом. Некоторые из них предопределены самой интегрированной средой языка. Такие идентификаторы называются стандартными или предопределёнными. К последним относятся:
  • имена встроенных в язык процедур и функций (Sin, Cos. ClrScr, Delay, Exit, FreeMem, Halt, IoResult, Read, Write и др.);
  • идентификаторы типов данных (Byte, Integer, Real, Char и др.);
  • имена встроенных директив (absolute, export, forward, index, public и др.);
  • имена операций not, div, mod, and, in и т.д.

При необходимости стандартные идентификаторы могут переопределяться, однако подобное переопределение не желательно.

2.9 Метки. Структура языка Турбо Паскаль предусматривает два типа меток: числовые и символьные. Числовая метка является целым числом от 0 до 9999. В качестве символьной метки используется любой идентификатор. Метками могут, например, служить имена операторов и процедур. Служебное слово никогда не может быть меткой. Пример правильных меток:

343 021 3740 _dok k301_1 RUTER

Пример неправильных меток:

23290 - число больше максимально допустимого значения 9999,

№ВВ - использован неразрешённый знак,

program - использовано зарезервированное слово.

Описание метки начинается служебным словом Label. Пример описания меток:

Label


343;

Label

_dok;

Метка, содержащаяся в тексте программы, отделяется от последующего за ней части программы двоеточием. Пример:

WriteLn(‘’);

_doc:WriteLn(‘’);

2.10 Числа. Используемые в языке Турбо Паскаль числа делятся на три группы:
  • вещественные десятичные;
  • целые десятичные от -2147483648 до 2147483647;

- целые шестнадцатеричные, перед которыми стоит обязательный знак $, от $00000000 до $FFFFFFFF.

Вещественные десятичные числа записываются в виде десятичной дроби или в показательной форме с основанием 10 (вместо основания ставится буква е или Е):

739.3 - 0.00005 - 73.1E-47 3.9e167

Данные числовых типов будут описаны позднее.

2.11 Строки и комментарии. Строка представляет собой любой набор символов из кода ASCII c обязательным заключением в одиночные кавычки. Пример. Сообщение

Borland Pascal - язык программирования


записывается в программе в виде строчной переменной

‘Borland Pascal - язык программирования’


Если имеется необходимость записать в строке символ одинарной кавычки, то используются два символа ‘’. Например, сообщение

‘Borland Pascal’ - язык программирования


записывается в программе в виде строчной переменной

‘’‘Borland Pascal’’ - язык программирования’

Если два символа ‘’ встречаются не в строке, а в тексте самой программы, то они воспринимаются как пустая строка.

Все программы, как правило, содержат пояснения, уточнения и различного рода описания, которые оформляются в виде комментариев. В общем случае комментарий представляет собой любую последовательность символов или фрагмент программы, ограниченный символами { и } или (* и *).

Комментарий никогда не выполняется. Присутствие или отсутствие его никак не сказывается на выполнении программы. Пример комментариев:

(*Различают десять разновидностей идентификаторов*)

{Приведение матрицы коэффициентов системы М уравнений}

Вспомним программу на рис. 1.1. Она содержит несколько поясняющих комментариев. Первый из них

{Программа для расчёта массы тела с известным объёмом и плотностью}

раскрывает цель программы. Следующий комментарий

{Описание переменной Mass для численного значения массы тела}

характеризует назначение переменной Mass и т. д.

Иногда символы, используемые для выделения комментариев, применяются с целью временного отключения части программы от выполнения.

2.12 Разделители лексем. Соседние лексемы в обязательном порядке отделяются друг от друга специальными символами, называемыми разделителями. К разделителям относятся:
  • пробел (код 32);
  • табуляция (код 09);
  • символ “возврат каретки” в начало текущей строки (код 13);
  • символ “перевод строки” в начало последующей строки (код 10);

- символы-разделители, к которым относятся любые символы из группы специальных символов.

В качестве разделителей могут использоваться управляющие символы с кодами от 0 до 31.

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

While I<5 Do Begin I:=I+1 WriteLn(I) End;

содержит 17 лексем и 6 разделителей в виде пробелов, причём 6 лексем < := + ( ) ; сами являются разделителями. Если в эту строку дополнительно включить любое количество пробелов или других разделителей, кроме символов-разделителей, то функционирование строки не изменится.

2.2 Синтаксические диаграммы

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

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

2.2.2 Синтаксическая диаграмма заголовка программы. В качестве примера рассмотрим синтаксическую диаграмму заголовка программы.

Заголовок

программы


Перемещаясь вдоль стрелки слева направо от сообщения «Заголовок программы», мы попадаем в овальный блок, содержащий слово Program. Овальность блока декларирует обязательное использование лексемы Program, которая должна стоять на первом месте при составлении заголовка. Далее, двигаясь от овального блока вправо, мы попадаем в соседний блок, где содержится слово «Идентификатор». Этот блок имеет прямоугольную форму, поэтому его информация требует дополнительного разъяснения с помощью отдельной синтаксической диаграммы. Перемещаясь далее, мы попадаем в круглый блок. Здесь содержится один символ точка с запятой, который в обязательном порядке должен быть проставлен после выбранного идентификатора.

Понятие идентификатора нам известно. Это любая последовательность букв латиницы, цифр и знака подчёркивания _, которая начинается с буквы или знака подчёркивания. Пользуясь приведённым определением, построим синтаксическую диаграмму идентификатора:


В данном случае диаграмма состоит только из прямоугольников, каждый из которых должен быть расшифрован в виде дополнительных диаграмм. Вот они:










2.2.3 Синтаксическая диаграмма строки. Строка, частный случай лексемы, представляет набор не более 255 символов, заключённых в кавычки. Её синтаксическая диаграмма имеет вид:




Первая стрелка, начинающаяся от сообщения «строка в кавычках», указывает на то, что строка начинается символом ‘. Этот символ расположен в круглом блоке, поэтому его присутствие обязательно. Далее следует любой набор символов клавиатуры, за исключением символа ‘. Строка заканчивается обязательным символом одинарной кавычки.

На основании приведённой диаграммы можно утверждать, что записи ‘Т. Г. Шевченко’, ‘1000$’, ‘@&’ являются строками. Запись ‘Фильм’Чапаев’’ не может быть строкой, т. к. она содержит в себе одинарные кавычки, присутствие которых запрещается правилами.

2.3 Инсталлирование интегрированной среды разработки и компиляция программы

2.3.1 Трансляция программы. Компьютер производит операции на машинном языке, а программы обычно составляются на алгоритмическом языке высокого уровня (ЯВУ). Трансляция, т. е. перевод такой программы на машинный язык осуществляют специальные программы, называемые трансляторами. Каждый ЯВУ имеет свой тип транслятора. По способу выполнения программы - трансляторы делятся на компиляторы и интерпретаторы. Интерпретатор осуществляет трансляцию с ЯВУ на машинный язык с одновременным исполнением программы, поэтому её выполнение происходит в интегрированной среде данного языка. Компилятор сначала полностью переводит программу на машинный язык, затем приступает к её исполнению. Работу транслятора уместно сравнить с работой переводчика с одного разговорного языка на другой. Синхронный устный перевод, когда последний выполняется отдельными фрагментами, является прообразом работы интерпретатора. Если же переводчик получил полный текст и сначала полностью его перевёл, а затем озвучил, то в этом случае можно говорить о переводе в режиме компиляции. Транслятор языка Турбо Паскаль относится к типу компиляторов. Исходная программа, составленная в ИСР, попадает на лексический анализатор, который проверяет правильность использования лексем. Далее программа проверяется синтаксическим анализатором, переводится на язык компилятора и только после этого осуществляется перевод на собственно машинный язык компьютера.

2.3.2 Лексический и синтаксический анализаторы. Текст программы на Турбо Паскале состоит из лексем, отделённых друг от друга разделителями. Задача лексического анализатора состоит в проверке правильности написания имён лексем. Пример. Строка программы

For I:=1 To 20 Do


содержит семь лексем, отделённых друг от друга разделителями. Это:

For, I, :=, 1, Tto, 20, Do


В этом случае разделителями являются пробелы и символ :=, называемый лексемой – разделителем. Допускается использование любого количества разделителей. Следовательно, данная строка может быть записана в ином виде, содержащем, например, дополнительные пробелы:

For I:= 1 To 20 Do


или в виде:

For

I:= 1

To 20

Do

Здесь помимо названных разделителей используется разделитель, осуществляющий перевод курсора на следующую строку. Он не выводится на экран.

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

For I:=:= 1 to 20 Do


с двумя рядом стоящими лексемами - разделителями :=:=, будет ошибочной. В этом случае результат работы лексического анализатора выведет на экран сообщение о лексической ошибке:

Error 42: Error in expression.

Первая часть сообщения даёт код ошибки, вторая - указывает на её содержание. В данном случае код ошибки 42.

Синтаксический анализатор проверяет корректность составленных предложений программы с точки зрения соответствия их нормам и правилам грамматики языка или, как говорят, синтаксиса языка. Какие это правила и как они используются при создании программы, является одним из важных вопросов, рассматриваемых при изучении интегрированной среды Турбо Паскаль. Информация о типе каждой ошибки выводится на экран дисплея. Программа “заработает” только в том случае, когда все лексические и синтаксические ошибки будут устранены. Если программа успешно прошла проверку на лексику и синтаксис, то она запускается на выполнение.


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

2.3.4. Инсталляция программного обеспечения языка. Программирование на алгоритмическом языке Турбо Паскаль обеспечивается удобным редактором, развитой помощью, компилятором и набором модулей, содержащих богатую библиотеки из стандартных процедур и функций. Компилятор имеет две версии, поддерживаемые различными файлами. Реальный режим работы обеспечивается файлом turbo.exe. Он предназначен для работы в интегрированной среде разработки (ИСР) Турбо Паскаль. Файл tpc.exe поддерживает пакетный режим работы. Функционирование обоих файлов рассчитано на операционную систему MS DOS. В целом, пакет программ, обеспечивающих программирование в ИСР, состоит из нескольких десятков файлов различного назначения. К основным файлам, без которых невозможно написать простейшую программу, относятся два: turbo.exe, обеспечивающий работу в ИСР, и turbo.tpl, содержащий основную библиотеку. К ним следует добавить файл turbo.hlp, отвечающий за работу справочной службы.

И


Рис.2.1 Основные файлы для иниции-рования работы языка Турбо Паскаль.
нсталляция или инсталлирование ИСР Турбо Паскаль, т. е. размещение файлов на диске, поддерживающих работу в этой среде, рекомендуется производить в один каталог. Например, в каталог с именем TPAS корневого каталога. В этом случае в команде PATH файла Autoexec.bat следует указать путь: C:\TPas

В качестве примера на рис. 2.1. представлено содержание такого каталога. Он состоит из 1 каталога и 4 файлов: turbo.exe, turbo.tph, turbo.tpl, tpc.exe. Каталог MODCHR предназначен для хранения файлов, поддерживающих работу с различными шрифтами. Каталог MODTPU является библиотекой модулей. Он содержит стандартные и нестандартные модули с функциями и процедурами. В каталоге PROGRAM хранятся создаваемые программы.

2.3.5 Компиляция программы. Программа, составленная на алгоритмическом языке Турбо Паскаль, может быть сохранена на диске в виде файла с расширением .pas. Так, текст программы на рис. 1.1 записан в файле с именем my_progr.pas. Этот же файл можно представить в компилированном виде с расширением .exe. Подобное представление позволяет запускать программу на выполнение без обращения к ИСР. Достаточно имя откомпилированной программы ввести в командную строку операционной системы MS DOS и нажать Enter.

Произведём эксперимент. Введём в командную строку MS DOS имя пакетного файла tpc.exe и имя файла my_progr.pas с текстом программы на рис. 1.1. Нажмём Enter. В текущем каталоге появится новый файл my_progr.exe, являющийся результатом компиляции данной программы. Теперь для её запуска на выполнение не нужно инициировать ИСР языка. Достаточно в командную строку MS DOS ввести новое имя my_progr.exe, нажать Enter и на экране дисплея получить результат работы данной программы. Он представлен на рис. 1.5.

Компилирование программы удобно производить в самой среде программирования. Для этого следует войти в главное меню нажатием клавиши F10 и выбрать опцию Compile. Далее нужно выбрать один из режимов компиляции Compile, Make или Build, различие между которыми будет обсуждаться позднее, и нажать Enter. Режим Compile можно инициировать нажатием клавиш Alt и F9, режим Make – клавишей F9. В случае обнаружения ошибки компилятор высветит на экране соответствующее сообщение. После её устранения потребуется повторить компиляцию. Для сохранения результата компиляции на диске в виде файла с тем же именем, но расширением .exe, необходимо в пункте меню Compile установить опцию Destination Disk.