- •Лекция 2
- •Упрощенная модель компиляции
- •Лексический анализ программы
- •Категории лексем
- •Идентификаторы
- •Ключевые слова
- •Зарезервированные идентификаторы
- •Стандартные идетификаторы
- •Идентификатор пользователя
- •Константы
- •Литералы
- •Целые константы
- •Вещественные константы
- •Булевские (логические) константы
- •Символьные константы
- •Строковые константы
- •Именованные константы
- •Перечисляемые константы
- •Препроцессорные константы
- •Знаки операций
- •Знаки пунктуации
- •Разделители
- •Пробельные разделители
Лекция 2
Лексические основы языка C++
ASCII-Коды (символы с кодами 0-127) 16
Кодовая таблица 866 – MS-DOS 17
(символы с кодами 127-255) 17
Кодовая таблица 1251 – MS Windows 18
(символы с кодами 127-255, даны выборочно) 18
Упрощенная модель компиляции
Упрощенная модель компиляции представлена на рисунке 2.1.
Рис.1.2. Упрощенная модель компиляции
Компилятор, прежде всего, выполняет лексический анализ текста программы: выделяет в нем минимальные неделимые структурные единицы (лексические элементы, лексемы, token), а затем проводит синтаксический анализ: на основе грамматики языка распознает смысловые конструкции языка (выражения, определения, описания, операторы и т.д.), построенные из этих лексем, т.е. проверяет их соответствие синтаксису языка программирования (правилам, определяющим последовательности символов, которые можно использовать в программе).
Семантический анализ программы – моделирование процесса понимания ее текста человеком. Семантика языка программирования (правила интерпретации операторов) определяет последовательности действий, которые выполнит компьютер при реализации конструкций языка.
Лексический анализ программы
Программа на С++ формируется из некоторого набора символов алфавита языка, каждому из которых сопоставляется определенная группа двоичных знаков1. Программа записывается в свободном формате, лишние пробелы игнорируются.
Алфавит С++ составляют 96 символов:
-
строчные и прописные латинские буквы (a..z, A..Z)
-
цифры 0..9
-
29 специальных символов: “ { } , | [ ] ( ) + - / % \ ; ‘ : ? < = > _ ! & # ^ . *
-
неизображаемые символы: пробел и управляющие символы (горизонтальная табуляция, вертикальная табуляция, перевод страницы, начало новой строки).
Лексический анализ проводится в порядке расположения символов в программе. За очередную лексему принимается наибольший ряд символов, который может быть распознан как лексема. Например, запись a++-b трактуется как a++ -b, т.е. увеличить значение a на 1 и затем найти разность.
Метод выделения лексем: выбор лексемы максимальной длины (например, external, а не extern al). Строковая константа, даже содержащая пробельный символ, защищена от разбиения на лексемы и пробелы.
Примеры выделения лексем:
предложение языка |
результат лексического анализа |
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 ; |
Категории лексем
-
идентификаторы (identifier);
-
ключевые слова (keyword);
-
зарезервированные идентификаторы;
-
стандартные идентификаторы;
-
идентификаторы пользователя;
-
-
константы (literal);
-
знаки операций (operator);
-
знаки пунктуации (punctuator);