Программно-методический комплекс для обучения процессу создания компиляторовРефераты >> Программирование и компьютеры >> Программно-методический комплекс для обучения процессу создания компиляторов
Рисунок 2 – Работа с таблицами
Очевидна зависимость структуры компилятора от структуры ЭВМ, точнее, от имеющейся производительности системы. Например, при малой памяти увеличивается количество проходов компиляции (т.н. многопроходные компиляторы), а при наличии памяти большого объема можно все этапы компиляции произвести за один проход (и тогда мы имеем дело с однопроходным компилятором).
Далее мы рассмотрим некоторые из этих составных частей процесса компиляции.
1.3 Лексический анализ. Сканер
Лексический анализатор представляет собой модуль разбора текста программы. Разбор происходит в зависимости от имеющихся у него в памяти терминальных символов и правилами определения типов данных. Каждый язык имеет свои ограничения по типам данных, допущения и особенности создания (строения) конструкций, применению операторов и т.п. При работе сканера используются три таблицы: таблица терминальных символов, таблица символических имен и таблица литералов – это заполняемые таблицы. Таблица терминальных символов хранит все ключевые слова и специальные символы используемые в языке, а также коды, соответствующие каждому символу. Таблица символических имен заполняется в процессе разбора текста программы и хранит в себе имена идентификаторов (символических имен). Таблица литералов также заполняется в процессе разбора программы и хранит в себе литералы: численные и строковые значения, с указанием типов данных и относительных адресов.
Распределение по таблицам происходит следующим образом.
Сканер в процессе анализа текста программы выделяет один из элементов текста и сравнивает с каждым терминальным символом. Если такой символ найден, то в выходной код передаются код таблицы и спецификатор (номер строки в таблице). В случае если этот элемент не является терминальным символом проверяется, является ли он идентификатором (первый символ обычно буква, остальные могут быть либо буквой, либо цифрой), если такой определен, то данный элемент заносится в таблицу символических имен, а к выходному коду добавляется пара численных значений: номер таблицы и спецификатор найденного элемента. В случае если такой элемент в таблице уже имеется, то в выходной код заносится номер таблицы и его спецификатор. В таблицу литералов заносят численные, строковые и иные определенные языком значения. При этом распознается тип значения и тут же заполняется относительная таблица адресов.
Выходной код, сформированный сканером, передается на следующую стадию обработки – синтаксический анализ.
Таким образом, алгоритм работы простейшего сканера можно описать так:
· просматривается входной поток символов программы на исходном языке до обнаружения очередного символа, ограничивающего лексему;
· для выбранной части входного потока выполняется функция распознавания лексемы;
· при успешном распознавании информация о выделенной лексеме заносится в таблицу лексем, и алгоритм возвращается к первому этапу;
· при неуспешном распознавании выдается сообщение об ошибке, а дальнейшие действия зависят от реализации сканера - либо его выполнение прекращается, либо делается попытка распознать следующую лексему (идет возврат к первому этапу алгоритма).
Работа программы-сканера продолжается до тех пор, пока не будут просмотрены все символы программы на исходном языке из входного потока.
Таблица терминальных символов в простейшем случае может иметь следующий вид как показано в таблице 1.
Таблица 1 – Таблица терминальных символов
№ п.п. |
Терминальный символ |
Комментарий (обозначение) |
1 |
PROGRAM |
Заголовок программы |
2 |
VAR |
Описание переменных |
3 |
BEGIN |
Начало тела программы |
4 |
END |
Конец тела программы |
5 |
INTEGER |
Целый тип данных |
6 |
FOR |
Счетный оператор цикла (для) |
7 |
TO |
Ключевое слово счетного оператора цикла (до) |
8 |
DO |
Ключевое слово (выполнить) |
Продолжение таблицы 1
№ п.п. |
Терминальный символ |
Комментарий (обозначение) |
9 |
WHILE |
Оператор цикла с предусловием (пока) |
10 |
DIV |
Деление целочисленное |
11 |
MOD |
Остаток от целочисленного деления |
12 |
AND |
Логическое И |
13 |
OR |
Логическое ИЛИ |
14 |
:= |
Присвоить значение |
Сначала заполняется таблица лексем (терминальных символов), затем начинается считывание и обработка входного текста программы пользователя. При работе сканера происходит заполнение таблиц символических имен и литералов.
Данные таблицы могут выглядеть следующим образом:
Таблица 2 – Таблица символических имен
№ п.п. |
Идентификатор |
Тип |
Размер, занимаемый в памяти, байт |
Относительный адрес в памяти |
1 |
I |
INTEGER | ||
2 |
Y |
REAL | ||
3 |
X1 |
REAL | ||
… |