GridLex: TStringGrid;
SheetSynt: TTabSheet;
TreeSynt: TTreeView;
SheetTriad: TTabSheet;
GroupTriadAll: TGroupBox;
Splitter1: TSplitter;
GroupTriadSame: TGroupBox;
Splitter2: TSplitter;
GroupTriadConst: TGroupBox;
ListTriadAll: TMemo;
ListTriadConst: TMemo;
ListTriadSame: TMemo;
CheckDel_C: TCheckBox;
CheckDelSame: TCheckBox;
SheetAsm: TTabSheet;
ListAsm: TMemo;
CheckAsm: TCheckBox;
procedure BtnLoadClick(Sender: TObject);
procedure BtnFileClick(Sender: TObject);
procedure EditFileChange(Sender: TObject);
procedure BtnExitClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject;
var Action: TCloseAction);
private
listLex: TLexList; { Список лексем }
symbStack: TSymbStack; { Синтаксический стек }
listTriad: TTriadList; { Список триад }
{ Имена файлов: входного, результата и ошибок }
sInpFile,sOutFile,sErrFile: string;
{ Функция записи стартовых данных в файл ошибок }
procedure StartInfo(const sErrF: string);
{ Функция обработки командной строки }
procedure ProcessParams(
var flOptC,flOptSame,flOptAsm: Boolean);
{ Инициализация таблицы отображения списка лексем }
procedure InitLexGrid;
{ Процедура отображения синтаксического дерева }
procedure MakeTree(nodeTree: TTreeNode;
symbSynt: TSymbol);
{ Процедура информации об ошибке }
procedure ErrInfo(const sErrF,sErr: string;
iPos,iLen: integer);
{ Функция запуска компилятора }
function CompRun(const sInF,sOutF,sErrF: string;
var symbRes: TSymbol; flTrd,flDelC,flDelSame,flOptC,
flOptSame,flOptAsm: Boolean): TErrType;
end;
var CursovForm: TCursovForm;
implementation
{$R *.DFM}
uses FncTree,LexType,LexAuto,TrdType,TrdMake,TrdAsm,TrdOpt;
procedure TCursovForm.InitLexGrid;
{Процедура инициализации таблицы отображения списка лексем}
begin
with GridLex do
begin
RowCount:= 2; Cells[0,0]:= № п/п';
Cells[1,0]:= 'Лексема'; Cells[2,0]:= 'Значение';
Cells[0,1]:= ; Cells[1,1]:= ; Cells[2,1]:= ;
end;
end;
procedure TCursovForm.StartInfo(
const sErrF: string{имя файла ошибок});
{ Функция записи стартовых данных в файл ошибок }
var i,iCnt: integer;{счетчик параметров и переменная цикла}
sT: string;{суммарная командная строка}
begin
sErrFile:= sErrF; { Запоминаем имя файла ошибок }
{ Записываем в файл ошибок дату запуска компилятора }
ErrInfo(sErrFile,
Format(– %s —,[DateTimeToStr(Now)]),0,0);
iCnt:= ParamCount; { Количество входных параметров }
sT:= ParamStr(0); { Обнуляем командную строку }
{Записываем в командную строку параметры последовательно}
for i:=1 to iCnt do sT:= sT + + ParamStr(i);
{ Записываем в файл ошибок суммарную командную строку }
ErrInfo(sErrFile,sT,0,0);
end;
procedure TCursovForm.ProcessParams(
var flOptC,flOptSame,flOptAsm: Boolean{флаги});
{ Функция обработки командной строки }
var i,iCnt,iLen: integer; { переменная счетчиков }
sTmp: string; { временная переменная }
{ Список для записи ошибок параметров }
listErr: TStringList;
begin { Устанавливаем все флаги по умолчанию }
flOptC:= True; flOptSame:= True;
flOptAsm:= True;
{ Создаем список для записи ошибок параметров }
listErr:= TStringList.Create;
try { Берем количество входных параметров }
iCnt:= ParamCount;
for i:=2 to iCnt do
begin { Обрабатываем параметры начиная со второго }
sTmp:= ParamStr(i); { Берем строку параметра }
iLen:= Length(sTmp); { Длина строки параметра }
{ Если параметр слишком короткий или не начинается
со знака «-» – это неправильный параметр }
if (iLen < 3) or (sTmp[1] <> – ) then
{ Запоминаем ошибку в список }
listErr.Add(Format('Неверный параметр %d: «%s»!
[i,sTmp]))
else { Иначе обрабатываем параметр в соответствии
с его типом (второй символ) }
case sTmp[2] of
{ Флаг оптимизации ассемблера }
'a','A': flOptAsm:= (sTmp[3] = 1 );
{ Флаг оптимизации методом свертки }
'c','C': flOptC:= (sTmp[3] = 1 );
{ Флаг оптимизации исключением лишних операций }
's','S': flOptSame:= (sTmp[3] = 1 );
{ Имя выходного файла }
'o','O': sOutFile:= System.Copy(sTmp,3,iLen-2);
{ Имя файла ошибок }
'e','E': StartInfo(System.Copy(sTmp,3,iLen-2));
else { Параметр неизвестного типа }
{ Запоминаем ошибку в список }
listErr.Add(Format('Неверный параметр %d: «%s»!
[i,sTmp]));
end{case};
end{for};
{ Ставим имена файлов по умолчанию,
если они не были указаны в параметрах }
if sOutFile = then
sOutFile:= ChangeFileExt(sInpFile, asm');
if sErrFile = then
StartInfo(ChangeFileExt(sInpFile, err'));
iCnt:= listErr.Count-1; { Количество ошибок }
{ Запоминаем информацию обо всех ошибках }
for i:=0 to iCnt do ErrInfo(sErrFile,listErr[i],0,0)
finally listErr.Free; { Уничтожаем список ошибок }
end{try};
end;
procedure TCursovForm.FormCreate(Sender: TObject);
var flOptC,flOptSame,flOptAsm: Boolean;
symbRes: TSymbol;
iErr: TErrType;
begin
symbRes:= nil; sOutFile:= ; sErrFile:= ;
{ В начале выполнения инициализируем список лексем, таблицу
Читать дальше
Конец ознакомительного отрывка
Купить книгу