4.3 Приложение с: Спецификации программы.
Спецификация лексического анализатора и алгоритм работы.
Программа использует модули: 'uMain.pas', 'uTable.pas', 'uRules.pas'
Определение структур данных 'uMain.pas'
В модуле 'uMain.pas' формируется интерфейс программы лексического анализа и проводится сам лексический анализ компилируемой программы.
На вход поступает некая программа на языке Паскаль, на выходе получается текст исходной программы, закодированный с помощью таблиц.
В программе заданы типы:
TSect=(sBegin, sLabel, sType, sVar, sConst, sBody, sComment, sUnknown);
Элементы этого типа – это названия соответствующих секций программы на языке Паскаль
TLexType=(ltResWord, ltOper, ltArifm, ltRel, ltConst, ltVar, ltType, ltLabel, ltError, ltNone);
Элементы этого типа – это типы лексем
Глобальные переменные
CurDir:string; // Каталог запуска
PredCurSect: TSect; // Тип предыдущей секции
CurSect: TSect; // Тип текущей секции
ErrorStr: string; // Строка сообщения об ошибке
Error : boolean; // Признак ошибки
Comment: boolean; // Признак коментария
MarkLabel: boolean; // Признак проверки меток
LWGoto: boolean; // Последняя встреченная лексема - зарезервированное слово goto
В программе лексемы заносятся в списки, которые реализованы с помощью стандартного класса TstringList, в соответствии со своим типом.
ResWord, // Зарезервированные слова
Arifm, // Арифметические операции
Oper, // Операторы
Rel, // Операции отношения
_Const, // Константы
_var, // Переменные
_label, // Метки
_labelBody, // Метки в теле программы
_labelBodyG, // Метки после оператора goto
_type:TstringList; // Типы
separ:array[1..255] of char; // Разделители
Есть 9 таблиц: 4 статических и 5 динамических таблиц.
Статические таблицы создаются и заполняются во время создания формы.
//Добавление элемента в таблицу
procedure AddToGrid(var sg:TStringGrid; Val:string);
// Вывод из списка в таблицу
procedure FillGrid(var sg:TstringGrid; var sl:TstringList);
// загрузка из файла в список
procedure LoadToList(var sl:TStringList; FN:string);
// Инициализация программы, подготовка списков и таблиц к работе.
procedure TfmMain.FormCreate(Sender: TObject);
И после открытия формы таблицы (списки) имеют вид:
Зарезервированные слова |
|
Операторы |
|
Операции выражения |
|
Операции отношения |
||||
Код |
Имя |
Код |
Имя |
Код |
Имя |
Код |
Имя |
|||
1 |
then |
1 |
write |
1 |
and |
1 |
> |
|||
2 |
begin |
2 |
read |
2 |
mod |
2 |
< |
|||
3 |
goto |
3 |
writeln |
3 |
shr |
3 |
>= |
|||
4 |
label |
4 |
readln |
4 |
not |
4 |
<= |
|||
5 |
type |
5 |
:= |
5 |
or |
5 |
<> |
|||
6 |
const |
|
6 |
div |
6 |
= |
||||
7 |
if |
7 |
xor |
7 |
.. |
|||||
8 |
until |
8 |
shl |
|
||||||
9 |
program |
9 |
+ |
|||||||
10 |
var |
10 |
- |
|||||||
11 |
repeat |
11 |
* |
|||||||
12 |
else |
|
||||||||
13 |
end |
Динамические таблицы.