3 Таблицы (метки, переменные, стоковые константы) создаются пустыми.
Таблицы типов после инициализации содержат стандартные типы, а потом дополняются пользовательскими типами.
Таблицы констант после инициализации содержат две стандартные константы: true, false.
Эти таблицы создаются во время заполняются во время анализа программы.
Типы |
|
Константы |
|
Метки |
|
Переменные |
|
Строковые константы |
|||||||||
Код |
Имя |
Код стандарт- ного типа |
Код |
Имя |
Тип |
Значение |
Код |
Имя |
Код |
Имя |
Тип |
Код |
Имя |
||||
1 |
integer |
1 |
1 |
true |
6 |
0 |
1 |
|
1 |
|
|
1 |
|
||||
2 |
byte |
2 |
2 |
false |
6 |
0 |
2 |
|
2 |
|
|
2 |
|
||||
3 |
word |
3 |
3 |
|
|
|
3 |
|
3 |
|
|
3 |
|
||||
4 |
shortint |
4 |
4 |
|
|
|
4 |
|
4 |
|
|
4 |
|
||||
5 |
longint |
5 |
5 |
|
|
|
5 |
|
5 |
|
|
5 |
|
||||
6 |
boolean |
6 |
|
6 |
|
|
|
|
|
|
|||||||
7 |
boolmatr |
7 |
7 |
|
|
|
|
|
|
||||||||
|
|
|
8 |
|
|
|
|||||||||||
|
|
|
9 |
|
|
||||||||||||
|
|
|
10 |
|
|
||||||||||||
|
|
|
11 |
|
|
||||||||||||
|
|
|
|
|
|||||||||||||
|
|
|
|
// Чтение лексемы-слова
function GetLexW(s:String; var begi:integer):string;
Входные параметры: s - анализируемая строка; begi – индекс, с которого начинается анализ строки.
Выходные параметры: begi – индекс, которым заканчивается анализ строки; результат функции - прочитанная лексема.
Алгоритм:
Читаем строку, пока не встречается разделитель или конец строки, и читаемые символы - это латинские буквы или цифры или _. В случае если встретился не допустимый символ, выдается ошибка.
// Чтение лексемы-знака
function GetLexS(s:String; var begi:integer):string;
Входные параметры: s - анализируемая строка, begi – индекс, с которого начинается анализ строки.
Выходные параметры: begi – индекс, которым заканчивается анализ строки; результат функции - прочитанная лексема.
Алгоритм:
Если читаемый символ – буква русского алфавита, то ошибка.
Если читаемый символ - не может быть началом двойного символа, то он является результатом.
иначе, проверяется следующий символ, и проверяются сочетания.
Анализ одной строки.
procedure AnalysStr(s:string; var outs:string);
Входным параметром является строка исходной программы. Выходным параметром outs – строка лексем.
В процедуре анализируется строка и в случае ошибки изменяется глобальная переменная ErrorStr.
Алгоритм, представлен на диаграмме работы лексического анализатора.
procedure TfmMain.tbGoClick(Sender: TObject);
На входе в эту процедуру в поле mmInput уже загружен файл с анализируемой программой. В теле процедуры запускается лексический анализатор для строки в поле mmInput и в поле mmOutput выводится соответствующая ей закодированная стока.
В процедуре выдаются сообщения о следующих ошибках:
ErrorStr:='Необъявленная метка';
ErrorStr:='Метка '+lex+' необъявлена';
ErrorStr:='Идентификатор объявлен повторно';
ErrorStr:='Неверный идентификатор метки';
Errorstr:='Неверный идентификатор';
ErrorStr:='Идентификатор объявлен повторно';
ErrorStr:='Переменная в константном выражении';
Вспомогательные процедуры и функции.
procedure ChangeSect(var Lex:string);
lex – последняя считанная лексема
Процедура изменяет состояние переменной CurSect, в зависимости от текущей секции и текущей лексемы.
function DefineTypeLex(var Lex: string): TLexType;
Входной параметр lex – последняя считанная лексема
Выходной параметр Результат функции – тип лексемы
Алгоритм:
Если лексема пуста, то возвращается тип ltNone
Если текущая секция не тело программы, то тип лексемы соответствует типу секции,
иначе проверяется наличие лексемы в списках, в зависимости от того в каком списке она присутствует, возвращается соответствующий тип лексемы, иначе, выдается ошибка «Неопределенный идентификатор».
Обработка зарезервированных слов. Смена текущей секции.
procedure ResWord(Lex: string; var outs: string);
Входной параметр Lex - лексема.
Выходной параметр outs – строка лексем.
Алгоритм:
Если встречается незарезервированное слово, то выдается ошибка
Далее в зависимости от встреченного слова, происходит переключение на соответствующую секцию.
В выходной поток выдается текущая лексема
procedure SetSym(Lex: string; var Outs: string);
В выходной поток outs выводится табличный код символа.
function VerifyLabel(var i: word): boolean;
Проверка правильности использования меток в программе.
Входной параметр mmOutPut поток лексем.
Выходной параметр i номер строки, в которой найдена ошибка
Используемые поля и методы класса TstringList
Поля:
Count – число элементов в списке
Value[n] – обращение к n элементу
Методы
Add(s:string) – Добавить элемент s в конец списка
IndexOf(s:string):integer – Поиск элемента s в списке (возвращается номер, -1 в случае если s не найден)
Create - Конструктор
Free – деструктор
Для синтаксического анализа используются модули