|
Ключевые слова, идентификаторы, лексемы отделяются друг от друга пробелами, от специальных символов разделение не обязательно.
Возможные для использования символы:
буквы: а..я, А..Я, a..z, A..Z;
символ, разрешенный при написании имен: _
элементы разделения: , ; : пробел
разделитель целой и дробной частей в вещественных числах: .
выделение текста: ′
знаки операторов: + - * /
комментарии: { }
расстановка приоритетов: ( )
знаки сравнения: > < = >= <= <>
признак окончания программы: .
2.3 Лексический анализатор LEXAN
Цель создания программы LEXAN состоит в том, чтобы научить студента производить разбор текста программы на составляющие ее лексемы в соответствии с заданной БНФ, при этом правильно заполнив таблицы выбранных терминальных символов, символических имен, литералов и выходных кодов лексем.
Данная среда позволяет сравнить данные, внесенные студентом с данными, полученными программой и сгенерировать сообщения об ошибках, на основе которых студент будет иметь возможность внести соответствующие исправления.
При выполнении дипломного проекта был проведен анализ способов построения лексического анализатора. За основу был принят прямой синтаксический анализатор, так как считывает лексему, находящуюся справа от указателя и лишь потом определяет тип лексемы [3]. Кроме того, отчасти используется непрямой анализ при отделении специальных символов от идентификаторов, ключевых слов и литералов, когда разделительный пробел не обязателен.
Лексический анализатор позволяет работать со следующими таблицами:
1) таблица выбранных терминальных символов (формируется из таблицы терминальных символов);
2) таблица символических имен (идентификаторов);
3) таблица литералов (констант);
4) таблица выходных кодов лексем.
Далее описываются структуры таблиц.
2.3.1 Таблица терминальных символов
Внутри программы хранится таблица терминальных символов. Она хранит в себе все терминальные символы, которые могут использоваться в учебном языке (ключевые слова и специальные символы). Они имеют свои названия, описание и каждому ключевому слову соответствует свой уникальный код, по которому происходит идентификация элемента на следующих стадиях компиляции. На данном этапе происходит работа с таблицей выбранных терминальных символов, пример которой показан в таблице 6.
Таблица 6 – Таблица выбранных терминальных символов
№ стр.
Терминальный символ
Комментарий
Код
1
PROGRAM
Объявление переменных
1
Таблица выбранных терминальных символов содержит следующие поля:
№ стр – номер строки в таблице выбранных терминальных символов;
Терминальный символ – название терминального символа;
Комментарий – описание терминального символа;
Код – код терминального символа, определенный в таблице терминальных символов.
Данная таблица формируется из таблицы терминальных символов, определенной внутри программы (описана в приложении А) путем выбора необходимых терминальных символов в соответствующем окне программы. Она служит (необходима) для проверки, является ли полученная лексема терминальным символом или идентификатором, т.е. производится сравнение со всеми терминальными символами таблицы. Если лексема найдена в таблице, то в таблицу выходных кодов лексем заносится номер таблицы (в программе №1) и код терминального символа.
Некоторые терминальные символы можно изменять – это ключевые слова. Изменение возможно в момент заполнения таблицы выбранных терминальных символов.
2.3.2 Таблица символических имен
Для хранения значений идентификаторов служит таблица символических имен, пример которой приведен в таблице 7.
Таблица 7 – Таблица символических имен
Специф
Идентификатор
Тип
Размер в памяти
Относительный адрес в памяти
1
а
Таблица символических имен содержит следующие поля:
Специф – спецификатор (номер строки) определяет положение идентификатора в таблице;
Идентификатор – имя идентификатора, найденного в тексте программы;
Тип – тип распознанного идентификатора (заполняется в программе LEXAN), поле остается не заполненным;
Размер в памяти – размер идентификатора, занимаемый в памяти, определяется в зависимости от типа (заполняется в программе LEXAN), поле остается не заполненным;
Относительный адрес в памяти – адрес относительно начала объявления переменных, формируется в зависимости от размера памяти предыдущих идентификаторов (заполняется в программе LEXAN), поле остается не заполненным.
Таблица служит для хранения идентификаторов, найденных в тексте программы. После внесения идентификатора или обнаружения уже имеющегося в таблице, в таблицу выходных кодов лексем заносится номер таблицы (№2) и спецификатор найденного элемента.
2.3.3 Таблица литералов
Для хранения значений констант используется таблица литералов, пример ее заполнения показан в таблице 8.
Страницы: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26
При использовании материалов активная ссылка на источник обязательна.