Читаем Системное программное обеспечение. Лабораторный практикум полностью

CheckDelSame.Checked {флаг удаления триад «SAME»},

True {флаг оптимизации «свертка объектного кода»},

True {флаг оптимизации исключения лишних операций},

CheckAsm.Checked {оптимизация команд ассемблера});

if iRes > ERR_LEX then {Если не было лексической ошибки,}

begin { заполняем список лексем }

GridLex.RowCount:= listLex.Count+1; { Количество строк }

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

D:= 0;

B:= 1;

C:= 1;

A:= C + InpVar;

D:= C+B+234;

C:= A + B + C;

D:= ((C) +(A+B)) – (InpVar + 1) + (A+B);

E:= (D – 22) – (A + B);

CompileTest:= 0;

Перейти на страницу:

Похожие книги

Встраиваемые системы. Проектирование приложений на микроконтроллерах семейства 68HC12/HCS12 с применением языка С
Встраиваемые системы. Проектирование приложений на микроконтроллерах семейства 68HC12/HCS12 с применением языка С

В книге последовательно рассматриваются все этапы создания встраиваемых систем на микроконтроллерах с применением современных технологий проектирования. Задумав эту книгу, авторы поставили перед собой задачу научить читателя искусству создания реальных устройств управления на однокристальных микроконтроллерах. Издание содержит материал, охватывающий все вопросы проектирования, включает множество заданий для самостоятельной работы, примеры программирования, примеры аппаратных решений и эксперименты по исследованию работы различных подсистем микроконтроллеров. Данная книга является прекрасным учебным пособием для студентов старших курсов технических университетов, которые предполагают связать свою профессиональную деятельность с проектированием и внедрением встраиваемых микропроцессорных систем. Книга также будет полезна разработчикам радиоэлектронной аппаратуры на микроконтроллерах.

Дэниэл Дж. Пак , Стивен Ф. Барретт

Программирование, программы, базы данных / Компьютерное «железо» / Программирование / Книги по IT
Секреты приложений Google
Секреты приложений Google

Даже продвинутые пользователи Интернета не подозревают о тех огромных возможностях, которые предоставляют сервисы Google. Автор рассказывает о таких «секретах» сервисов, которые просто немедленно хочется использовать! Создавать сайты и презентации, бродить по улочкам Парижа, изучать звездное небо – все это доступно каждому, кто сидит у экрана монитора и имеет доступ в Интернет. Книга научит вас работать с веб-приложениями и тысячекратно увеличить свои возможности с помощью новейших технологий. Она написана легким, доступным языком и не требует от читателя наличия каких-либо специальных знаний. Книга содержит множество примеров, иллюстраций и будет полезна всем, кто не стоит на месте и стремится сделать свою жизнь более насыщенной и интересной.

Денис Балуев , Денис Игоревич Балуев

Программирование, программы, базы данных / Интернет / Программное обеспечение / Книги по IT