iCnt:= listLex.Count-1;
for i:=0 to iCnt do
begin { Цикл по всем прочитанным лексемам }
{ Первая колонка – номер }
GridLex.Cells[0,i+1]:= IntToStr(i+1);
{ Вторая колонка – тип лексемы }
GridLex.Cells[1,i+1]:=
LexTypeName(listLex[i].LexType);
{ Третья колонка – значение лексемы }
GridLex.Cells[2,i+1]:= listLex[i].LexInfoStr;
end;
end;
if (iRes > ERR_SYNT) and (symbRes <> nil) then
{ Если не было синтаксической ошибки,}
begin { заполняем дерево синтаксического разбора }
{ Записываем данные в корень дерева }
nodeTree:= TreeSynt.Items.Add(nil,symbRes.SymbolStr);
MakeTree(nodeTree,symbRes); { Строим дерево от корня }
nodeTree.Expand(True); { Раскрываем все дерево }
{ Позиционируем указатель на корневой элемент }
TreeSynt.Selected:= nodeTree;
end;
if iRes > ERR_TRIAD then { Если не было семантической }
begin { ошибки, то компиляция успешно завершена }
MessageDlg('Компиляция успешно выполнена!
mtInformation,[mbOk],0);
PageControl1.ActivePageIndex:= 4;
end;
end;
procedure TCursovForm.MakeTree(
{ Процедура отображения синтаксического дерева }
nodeTree: TTreeNode; {ссылка на корневой элемент
отображаемой части дерева на экране}
symbSynt: TSymbol {ссылка на синтаксический символ,
связанный с корневым элементом этой части дерева});
var i,iCnt: integer; { переменные счетчиков }
nodeTmp: TTreeNode; { текущий узел дерева }
begin { Берем количество дочерних вершин для текущей }
iCnt:= symbSynt.Count-1;
for i:=0 to iCnt do
begin { Цикл по всем дочерним вершинам }
{ Добавляем к дереву на экране вершину
и запоминаем ссылку на нее }
nodeTmp:= TreeSynt.Items.AddChild(nodeTree,
symbSynt[i].SymbolStr);
{ Если эта вершина связана с нетерминальным символом,
рекурсивно вызываем процедуру построения дерева }
if symbSynt[i].SymbType = SYMB_SYNT then
MakeTree(nodeTmp,symbSynt[i]);
end;
end;
procedure TCursovForm.BtnExitClick(Sender: TObject);
{ Завершение работы с программой }
begin
Self.Close;
end;
end.
Описание ресурсов пользовательского интерфейса
Описание ресурсов пользовательского интерфейса можно найти в архиве, расположенном на веб-сайте издательства, в файле FormLab4.dfm в подкаталоге CURSOV.
Приложение 4
Примеры входных и результирующих файлов для курсовой работы
Пример 1. Вычисление факториала
Листинг П4.1. Входной файл
prog
if ((InpVar > 31) or InpVar<0) CompileTest:= 0
else
if (InpVar=0) CompileTest:= 1
else
begin
i:= InpVar;
Fact:= 1;
while (i<>-1) do
begin
j:= I-1;
Sum:= Fact;
while (not (j=0)) do
begin
Sum:= Sum + Fact;
j:= j-(-1);
end;
Fact:= Sum;
i:= i – 1;
end;
CompileTest:= Fact;
end;
end.
Листинг П4.2. Результирующий код
program MyCurs;
var
Fact,i,j,Sum: integer;
function CompileTest(InpVar: integer): integer; stdcall;
begin
asm
pushad {запоминаем регистры}
mov eax,InpVar
cmp eax,31 { 1: > (InpVar, 31) }
setg al
and eax,1
mov ebx,eax
mov eax,InpVar
cmp eax,0 { 2: < (InpVar, 0) }
setl al
and eax,1
or eax,ebx { 3: or (^1, ^2) }
jnz @F3 { 4: if (^3, ^7) }
jmp @M7
@F3:
xor eax,eax
mov Result,eax { 5::= (CompileTest, 0) }
jmp @M31 { 6: jmp (1, ^31) }
@M7:
mov eax,InpVar
cmp eax,0 { 7: = (InpVar, 0) }
sete al
and eax,1
jnz @F7 { 8: if (^7, ^11) }
jmp @M11
@F7:
xor eax,eax
inc eax
mov Result,eax { 9::= (CompileTest, 1) }
jmp @M31 { 10: jmp (1, ^31) }
@M11:
mov eax,InpVar
mov i,eax { 11::= (i, InpVar) }
xor eax,eax
inc eax
mov Fact,eax { 12::= (Fact, 1) }
@M13:
mov eax,i
cmp eax,1 { 13: <> (i, 1) }
setne al
and eax,1
jnz @F13 { 14: if (^13, ^30) }
jmp @M30
@F13:
mov eax,i
dec eax { 15: – (i, 1) }
mov j,eax { 16::= (j, ^15) }
mov eax,Fact
mov Sum,eax { 17::= (Sum, Fact) }
@M18:
mov eax,j
cmp eax,0 { 18: = (j, 0) }
sete al
and eax,1
not eax { 19: not (^18, 0) }
and eax,1
jnz @F19 { 20: if (^19, ^26) }
jmp @M26
@F19:
mov eax,Sum
add eax,Fact { 21: + (Sum, Fact) }
mov Sum,eax { 22::= (Sum, ^21) }
mov eax,j
dec eax { 23: – (j, 1) }
mov j,eax { 24::= (j, ^23) }
jmp @M18 { 25: jmp (1, ^18) }
@M26:
mov eax,Sum
mov Fact,eax { 26::= (Fact, Sum) }
mov eax,i
dec eax { 27: – (i, 1) }
mov i,eax { 28::= (i, ^27) }
jmp @M13 { 29: jmp (1, ^13) }
@M30:
mov eax,Fact
mov Result,eax { 30::= (CompileTest, Fact) }
@M31:
nop { 31: nop (0, 0) }
popad {восстанавливаем регистры}
end;
end;
var InpVar: integer;
begin
readln(InpVar);
writeln(CompileTest(InpVar));
readln;
end.
Пример 2. Иллюстрация работы функций оптимизации
Листинг П4.3. Входной файл
prog
Читать дальше
Конец ознакомительного отрывка
Купить книгу