Системное программное обеспечение. Лабораторный практикум. Алексей Молчанов
качестве еще одной особенности реализации можно отметить, что переход с одной строки входного списка на другую должен восприниматься как граница текущей лексемы, так как одна лексема не может быть разбита на две строки – именно это и реализовано в конце цикла по символам текущей строки.
Текст программы распознавателя
Кроме перечисленных выше модулей необходим еще модуль, обеспечивающий интерфейс с пользователем. Как и в лабораторной работе № 1, этот модуль (FormLab2) реализует графическое окно TLab2Form на основе класса TForm библиотеки VCL и включает в себя две составляющие:
• файл программного кода (файл FormLab2.pas);
• файл описания ресурсов пользовательского интерфейса (файл FormLab2.dfm).
Кроме описания интерфейсной формы и ее органов управления модуль FormLab2 содержит переменную (listLex), в которую записывается ссылка на таблицу лексем.
Интерфейсная форма, описанная в модуле, содержит следующие основные органы управления:
• многостраничную вкладку (PageControll) с двумя закладками (SheetFile и SheetLexems) под названиями «Исходный файл» и «Таблица лексем» соответственно;
• на закладке SheetFilе:
– поле ввода имени файла (EditFile), кнопка выбора имени файла из каталогов файловой системы (BtnFile), кнопка чтения файла (BtnLoad);
– многострочное поле для отображения прочитанного файла (Listldents);
• на закладке SheetLexems:
– сетка (GridLex) с тремя колонками для отображения данных о прочитанных лексемах;
• кнопка завершения работы с программой (BtnExit).
Внешний вид двух закладок этой формы приведен на рис. 2.3 и 2.4.
Рис. 2.3. Внешний вид первой закладки интерфейсной формы для лабораторной работы № 2.
Рис. 2.4. Внешний вид второй закладки интерфейсной формы для лабораторной работы № 2.
Чтение содержимого входного файла организовано точно так же, как в лабораторной работе № 1.
После чтения файла создается таблица лексем (ссылка на нее запоминается в переменной listLex) и вызывается функция MakeLexList, результат работы которой помещается во временную переменную iErr.
Если обнаружена ошибка, пользователю выдается сообщение об этом и указатель в списке строк позиционируется на место, где обнаружена ошибка.
Если ошибок не обнаружено, то на основании считанной таблицы лексем listLex заполняется сетка GridLex, которая очень удобна для наглядного представления таблицы лексем:
• первая колонка – порядковый номер лексемы;
• вторая колонка – тип лексемы (ее внешний вид);
• третья колонка – информация о лексеме.
Полный текст программного кода модуля интерфейса с пользователем приведен в листинге П2.4 в приложении 2, а описание ресурсов пользовательского интерфейса – в листинге П2.5 в приложении 2.
Полный текст всех программных модулей, реализующих рассмотренный пример для лабораторной работы № 2, приведен в приложении 2.
Выводы по проделанной работе
В результате лабораторной работы № 2 построен лексический анализатор на основе конечного автомата.