Системное программное обеспечение. Лабораторный практикум - [92]
begin{ Очищаем список лексем, синтаксический стек и список триад }
listLex.Clear; symbStack.Clear; listTriad.Clear;
try { Чтение файла в список строк }
ListIdents.Lines.LoadFromFile(sInF);
except { Если файловая ошибка – сообщаем об этом }
Result:= ERR_FILE;
MessageDlg('Ошибка чтения файла!mtError,[mbOk],0);
Exit; { Дальнейшая работа компилятора невозможна }
end; { Анализ списка строк и заполнение списка лексем }
iErr:= MakeLexList(ListIdents.Lines,listLex);
if iErr<>0 then {Анализ неуспешный – сообщаем об ошибке}
begin { Берем позицию ошибки из лексемы в начале списка }
ErrInfo(sErrF,
Format('Неверная лексема «%s» в строке %d!
[listLex[0].LexInfoStr,iErr]),
listLex[0].PosAll,listLex[0].PosNum);
Result:= ERR_LEX; { Результат – лексическая ошибка }
end
else { Добавляем в конец списка лексем }
begin { информационную лексему «конец строки» }
with ListIdents do
listLex.Add(TLexem.CreateInfo('Конец строки',
Length(Text), Lines.Count-1,0));
{ Выполняем синтаксический разбор
и получаем ссылку на корень дерева разбора }
symbRes:= BuildSyntList(listLex,symbStack);
{ Если эта ссылка содержит лексические данные,
значит, была ошибка в месте, указанном лексемой }
if symbRes.SymbType = SYMB_LEX then
begin { Берем позицию ошибки из лексемы по ссылке }
ErrInfo(sErrF,
Format('Синтаксическая ошибка в строке %d поз. %d!
[symbRes.Lexem.StrNum+1,symbRes.Lexem.PosNum]),
symbRes.Lexem.PosAll,0);
symbRes.Free; { Освобождаем ссылку на лексему }
symbRes:= nil;
Result:= ERR_SYNT; { Это синтаксическая ошибка }
end
else { Иначе – ссылка указывает на корень
синтаксического дерева }
begin { Строим список триад по синтаксическому дереву }
lexTmp:= MakeTriadList(symbRes,listTriad);
{ Если есть ссылка на лексему, значит, была
семантическая ошибка }
if lexTmp <> nil then
begin { Берем позицию ошибочной лексемы по ссылке }
ErrInfo(sErrF,
Format('Семантическая ошибка в строке %d поз. %d!
[lexTmp.StrNum+1,lexTmp.PosNum]),
lexTmp.PosAll,0);
Result:= ERR_TRIAD; { Это семантическая ошибка }
end
else { Если ссылка пуста, значит, триады построены }
begin
Result:= ERR_NO; { Результат – «ошибок нет» }
{ Если указан флаг, сохраняем общий список триад }
if flTrd then
listTriad.WriteToList(ListTriadAll.Lines);
if flOptC then { Если указан флаг, выполняем }
begin { оптимизацию путем свертки объектного кода }
OptimizeConst(listTriad);
{ Если указан флаг, удаляем триады типа «C» }
if flDelC then
DelTriadTypes(listTriad,TRD_CONST);
end; { Если указан флаг,}
if flTrd then {сохраняем триады после оптимизации}
listTriad.WriteToList(ListTriadConst.Lines);
if flOptSame then { Если указан флаг, выполняем
begin{оптимизацию путем исключения лишних операций}
OptimizeSame(listTriad);
{ Если указан флаг, удаляем триады типа «SAME» }
if flDelSame then
DelTriadTypes(listTriad,TRD_SAME);
end; { Если указан флаг,}
if flTrd then {сохраняем триады после оптимизации}
listTriad.WriteToList(ListTriadSame.Lines);
{ Распределяем регистры по списку триад }
iCnt:= MakeRegisters(listTriad);
{ Создаем и записываем список ассемблерных команд }
asmList:= TStringList.Create;
try
with asmList do
begin
Clear; { Очищаем список ассемблерных команд }
{ Пишем заголовок программы }
Add(Format('program %s;,[NAME_PROG]));
{ Запоминаем перечень всех идентификаторов }
sVars:= IdentList(, ,NAME_INPVAR,NAME_FUNCT);
if sVars <> then
begin{Если перечень идентификаторов не пустой,}
Add( ); { записываем его с указанием }
Add('var'); { типа данных }
Add(Format(%s: %s;,[sVars,NAME_TYPE]));
end;
Add( );
{ Пишем заголовок функции }
Add(Format('function %0:s(%1:s: %2:s): %2:s;
+ stdcall;,
[NAME_FUNCT,NAME_INPVAR,NAME_TYPE]));
if iCnt > 0 then {Если регистров для хранения}
begin {промежуточных результатов не хватило}
Add('var'); {и нужны временные переменные,}
sVars:= ; {то заполняем их список.}
for i:=0 to iCnt do
begin
sAdd:= Format(%s%d',[TEMP_VARNAME,i]);
if sVars = then sVars:= sAdd
else sVars:= sVars +, + sAdd;
end;
Add(Format(%s: %s;,[sVars,NAME_TYPE]));
end;
Add('begin'); { В тело функции записываем }
Add(asm'); { список команд ассемблера, }
Add(#9'pushad'#9#9 {запоминаем регистры,});
MakeAsmCode(listTriad,asmList,flOptAsm);
Add(#9'popad'#9#9 {восстанавливаем регистры,});
Add(end;);
Add('end;);
Add( ); { Описываем одну входную переменную }
Add(Format('var %s: %s;,
[NAME_INPVAR,NAME_TYPE]));
Add( );
Add('begin'); { Заполняем главную программу }
Add(Format(readln(%s);,[NAME_INPVAR]));
Add(Format(writeln(%s(%s));,
[NAME_FUNCT,NAME_INPVAR]));
Add(readln;);
Add('end.);
end{with}; {Если установлен флаг, записываем}
if flTrd then {команды для отображения на экране}
ListAsm.Lines.AddStrings(asmList);
if sOutF <> then { Если есть имя рез. файла,}
try { записываем туда список всех команд }
asmList.SaveToFile(sOutF);
except Result:= ERR_FILE;
end;
finally asmList.Free; {Уничтожаем список команд}
end{try}; {после его отображения и записи в файл}
end;
end;
end;
end;
procedure TCursovForm.BtnLoadClick(Sender: TObject);
{ Процедура чтения и анализа файла }
var i,iCnt: integer; { переменные счетчиков }
iRes: TErrType; { переменная для хранения результата }
symbRes: TSymbol; { временная переменная корня дерева}
nodeTree: TTreeNode; { переменная для узлов дерева }
Java Enterprise Edition (Java EE) остается одной из ведущих технологий и платформ на основе Java. Данная книга представляет собой логичное пошаговое руководство, в котором подробно описаны многие спецификации и эталонные реализации Java EE 7. Работа с ними продемонстрирована на практических примерах. В этом фундаментальном издании также используется новейшая версия инструмента GlassFish, предназначенного для развертывания и администрирования примеров кода. Книга написана ведущим специалистом по обработке запросов на спецификацию Java EE, членом наблюдательного совета организации Java Community Process (JCP)
Разработчику часто требуется много сторонних инструментов, чтобы создавать и поддерживать проект. Система Git — один из таких инструментов и используется для контроля промежуточных версий вашего приложения, позволяя вам исправлять ошибки, откатывать к старой версии, разрабатывать проект в команде и сливать его потом. В книге вы узнаете об основах работы с Git: установка, ключевые команды, gitHub и многое другое.В книге рассматриваются следующие темы:основы Git;ветвление в Git;Git на сервере;распределённый Git;GitHub;инструменты Git;настройка Git;Git и другие системы контроля версий.
Рассмотрено все необходимое для разработки, компиляции, отладки и запуска приложений Java. Изложены практические приемы использования как традиционных, так и новейших конструкций объектно-ориентированного языка Java, графической библиотеки классов Swing, расширенной библиотеки Java 2D, работа со звуком, печать, способы русификации программ. Приведено полное описание нововведений Java SE 7: двоичная запись чисел, строковые варианты разветвлений, "ромбовидный оператор", NIO2, новые средства многопоточности и др.
Книга "Фундаментальные алгоритмы и структуры данных в Delphi" представляет собой уникальное учебное и справочное пособие по наиболее распространенным алгоритмам манипулирования данными, которые зарекомендовали себя как надежные и проверенные многими поколениями программистов. По данным журнала "Delphi Informant" за 2002 год, эта книга была признана сообществом разработчиков прикладных приложений на Delphi как «самая лучшая книга по практическому применению всех версий Delphi».В книге подробно рассматриваются базовые понятия алгоритмов и основополагающие структуры данных, алгоритмы сортировки, поиска, хеширования, синтаксического разбора, сжатия данных, а также многие другие темы, тесно связанные с прикладным программированием.
Python - объектно-ориентированный язык сверхвысокого уровня. Python, в отличии от Java, не требует исключительно объектной ориентированности, но классы в Python так просто изучить и так удобно использовать, что даже новые и неискушенные пользователи быстро переходят на ОО-подход.
«Как пасти котов» – это книга о лидерстве и руководстве, о том, как первое совмещать со вторым. Это, если хотите, словарь трудных случаев управления IT-проектами. Программист подобен кошке, которая гуляет сама по себе. Так уж исторически сложилось. Именно поэтому так непросто быть руководителем команды разработчиков. Даже если вы еще месяц назад были блестящим и дисциплинированным программистом и вдруг оказались в роли менеджера, вряд ли вы знаете, с чего надо начать, какой выбрать стиль руководства, как нанимать и увольнять сотрудников, проводить совещания, добиваться своевременного выполнения задач.