Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
л_1_введение_в_С++.doc
Скачиваний:
18
Добавлен:
02.11.2018
Размер:
292 Кб
Скачать

Упрощенная модель компиляции

Упрощенная модель компиляции представлена на рисунке 4.2.

Рис.4.2. Упрощенная модель компиляции

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

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

Категории лексем в С++:

  • ключевые слова (служебные слова, зарезервированные в языке для специальных целей и не использующиеся в качестве имен), ключевые слова пишутся в программе на С++ строчными (малыми) буквами (Таблица 4.1);

  • идентификаторы;

  • литералы;

  • знаки операций;

  • знаки пунктуации.

Таблица 4.1.Ключевые слова С/С++

asm

auto

bool

break case catch char class const const_cast continue default delete do double dynamic_cast

else enum

explicit

export extern false float for friend goto if inline int long

main mutable naked namespace new noreturn

operator private protected public register reinterpret_cast return short signed sizeof stаtic stаtic_cast struct switch template this thread throw

true try typedef typeid typename union unsigned using uuid virtual void volatile wchar_t

while wmain

Идентификатором называется последовательность символов, закрепляемая за информационным объектом программы (имя программного объекта).

Стандартные идентификаторы – предопределенные имена стандартных объектов языка, используемые в программе (например, для обозначения встроенных в язык процедур и функций), могут использоваться и в качестве идентификаторов пользователя (sin, cos, printf, …).

Идентификаторы пользователя – последовательность прописных или строчных букв латинского алфавита, цифр и символов подчеркивания, начинающаяся с буквы или символа подчеркивания, безразличная к регистру клавиатуры, имеющая произвольную длину, представляющая собой мнемоническое имя, используемое программистом для обозначения объектов программы. В многословных идентификаторах для наглядности отдельные слова отделяют друг от друга символом подчеркивания (например, my_var). Не рекомендуется начинать идентификаторы с символа подчеркивания или двойного подчеркивания, так как они используются средой в системных программах и библиотеках. В качестве идентификаторов, вводимых пользователем, нельзя использовать ключевые слова. Компилятор С++ различает прописные и строчные буквы, поэтому имена Summa и summa обозначают разные переменные.

Для обозначения информационных объектов программы (или как первые символы их идентификаторов) желательно использовать:

  • буквы i, j, k, l, m, n для обозначения целых значений;

  • буквы f, d - для обозначения вещественных значений;

  • букву s – для строк;

  • букву р – для указателей.

Лексический анализ – это фаза компиляции, состоящая в выделении в исходном коде программы некоторых языковых единиц, распознаваемых компилятором. Лексический анализ проводится в порядке расположения символов в программе. За очередную лексему принимается наибольший ряд символов, который может быть распознан как лексема. Например, запись a---b трактуется как a-- -b, т.е. уменьшить значение a на 1 и затем найти разность.

Метод выделения лексем: выбор лексемы максимальной длины (например, external, а не extern al). Строковая константа, даже содержащая пробельный символ, защищена от разбиения на лексемы и пробелы. Для распознания начала (конца) лексем компилятор использует пробельные разделители. Функции пробельных разделителей:

 обозначение места начала и конца лексем;

 исключение из компиляции всех избыточных символов, не входящих в состав лексем.

Разделители лексем:

    • Пробельные разделители (в С++ это: пробел, горизонтальная и вертикальная табуляции, возврат каретки, переход на новую строку, комментарии) не обрабатываются компилятором и игнорируются. Функции пробельных разделителей: обозначение места начала и конца лексем; исключение из компиляции всех избыточных символов, не входящих в состав лексем. Хороший стиль предполагает наличие хотя бы одного такого символа после каждой лексемы.

    • Знаки пунктуации ([ ] () , ; и др., они сами есть лексемы)

    • Знаки операций (+ - * / и др., они сами есть лексемы)

Комментарий в программе на С++ не является лексемой и трактуется компилятором как пробел. Многострочный комментарий выделяется символами “/*” в начале и “*/” в конце. Признаком однострочного комментария являются символы ”//” перед текстом строки с комментарием. Комментарии не могут быть вложенными. Однострочный комментарий удобно использовать как пояснение к тексту оператора. Например:

int a; // текст, поясняющий назначение переменной

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

Например, запись:

int i = j //*деление на k*/k +m; будет распознана как int i = j + m; (как имеющая однострочный комментарий), а не как предполагалось при использовании многострочного комментария: int i = j / k+m;

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

int i = j / /*деление на k*/ k +m;

Пример разбиения на лексемы:

предложение языка

результат лексического анализа

for (int i=1; i <=10; i++) ;

for, (, int, i, =, 1, ; , i, <=, 10, ; , i, ++, ), ;

char name[] = ”кафедра информатики”;

char, name, [, ], =, ”кафедра информатики”, ;

int i; float f;

int, i, ;, float, f, ;

int /*описание*/ i /* счетчика*/ ;

int i ;