- •0. Формулировка задания
- •1. Описание входного языка Формулы Бэкуса-Наура
- •2. Описание семантики входного языка Правила реализации конструкций языка
- •3. Описание этапа лексического анализа.
- •3. 1. Определение типов лексем.
- •3. 2. Определение синтаксиса лексем.
- •3. 3. Построение диаграммы лексического анализатора.
- •3. 4. Таблицы лексем.
- •3. 5. Тестирование лексического анализатора.
- •4. Описание этапа синтаксического анализа
- •4.1. Разбиение кс–грамматики входного языка на подграмматики
- •4.2. Описание промежуточного языка
- •4.3. Неформальное описание перевода
3. 3. Построение диаграммы лексического анализатора.
3. 3. 1. Построение графов конечных автоматов для распознавания лексем.
Здесь S– начальное состояние конечного автомата,F- конечное состояние, соответствующее концу разбора лексемы.
Граф конечного автомата для распознавания лексем «идентификатор» и «ключевое слово».
Буква, Цифра
Id Буква
S F 1
Граф конечного автомата для распознавания лексемы «целая константа без знака».
2 Цифра S F C Цифра
Граф конечного автомата для распознавания лексемы «вещественная константа без знака».
Цифра
Цифра
.,
e+, e-, e 2
2 Цифра
S Цифра C T D F
Графы конечных автоматов для распознавания лексем «однолитерный разделитель» и «двулитерный разделитель». Здесь “Знак1” – включает литеры класса «однолитерные разделители» и литеру «=».
3.3.2. Построение диаграммы лексического анализатора.
Здесь “Пробел” – класс, включающий пробелы, символы табуляции и перевода строки, “Не}” класс, включающий все литеры кроме литеры «}».
3. 3. 3. Спецификации функций лексического анализатора.
Процедура ReadLexem – считывает лексему из входного потока и распознает ее тип.
Вход: входной поток литер текста программы.
Выход: лексема и ее тип.
Процедура GetLexem – в зависимости от типа переданной лексемы вызывает одну из процедур:
GetId– для лексем «идентификатор» и «ключевое слово»;
GetNum– для лексем «целая константа без знака» и «вещественная константа без знака»;
GetLet– для лексем «однолитерный разделитель» и «двулитерный разделитель»;
Вход: лексема и ее тип.
Процедура GetId – если переданная лексема является ключевым словом, определяет ее адрес в таблице ключевых слов и вызывает процедуру WriteToken;
в противном случае ищет запись об этой лексеме в таблице идентификаторов, если находит, то вызывает процедуру WriteToken, иначе вызывает процедуру AddLexem;
Вход: лексема типа «идентификатор» или «ключевое слово».
Процедура GetNum – ищет запись о переданной лексеме (константе) в таблице констант, если находит, то вызывает процедуру WriteToken, иначе вызывает процедуру AddLexem;
Вход: лексема типа «целая константа без знака» или «вещественная константа без знака».
Процедура GetLet – определяет адрес лексемы в таблице разделителей и вызывает процедуру WriteToken;
Вход: лексема типа «однолитерный разделитель» или «двулитерный разделитель»;.
Процедура AddLexem – добавляет запись о лексеме в таблицу лексем заданного класса и вызывает процедуру WriteToken;
Вход: лексема и ее тип.
Процедура WriteToken – формирует токен и записывает его в выходной поток токенов.
Вход: адрес лексемы в соответствующей таблице лексем.
3. 4. Таблицы лексем.
Таблица ключевых слов.
Таблица ключевых слов |
имя ключевого слова |
Таблица идентификаторов.
Таблица идентификаторов | ||
имя |
тип |
значение |
Таблица констант.
Таблица констант | |
тип |
значение |
Таблица разделителей.
Таблица разделителей |
разделитель |
Таблицы ключевых слов и разделителей – статические, таблицы идентификаторов и констант заполняются в процессе лексического и синтаксического анализа.