3468
.pdfХод выполнения:
1. В Delphi создать форму, содержащую две кнопки (рис. 79). Сохранить проект на диске с уникальным именем.
Рис. 79. Экранная форма программы
2.Модуль должен содержать следующие библиотеки: uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ShlObj, ActiveX, ComObj, Buttons;
3.Листинг процедуры размещения ярлыка программы на рабочем столе имеет следующий вид:
procedure TFormIarlik.ButtonWorkTableClick(Sender: TObject);
var
WorkTable: String;
P:PItemIDList;
C: array [0..1000] of char;
Begin
191
{С помощью функции SHGetSpecialFolderLocation узна-
ем расположение папки для ярлыков и программ рабочего стола (второй параметр равен CSIDL_DESKTOP)}
if SHGetSpecialFolderLocation( Handle,CSIDL_DESKTOP,p) = NOERROR then
begin SHGetPathFromIDList (P,C); WorkTable := StrPas (C); end;
{Проверяем, существует ли ярлык для программы. Если да, то удаляем файл ярлыка, потому что в нем могут находиться устаревшие данные}
if FileExists(WorkTable+'\' +ExtractFileName(Application.ExeName)) then
DeleteFile(WorkTable+'\'
+ExtractFileName(Application.ExeName));
{Создание ярлыка происходит с помощью вызова проце-
дуры CreateShotCut}
CreateShotCut(Application.ExeName, WorkTable+'\' +ExtractFileName(Application.ExeName), '');
end;
4. В разделе private надо описать процедуру для создания ярлыков CreateShotCut. Процедура имеет три параметра:
файл, запускаемый ярлыком;
имя, которое будет отображаться на ярлыке;
параметры, которые должны быть переданы программе при запуске.
private
{ Private declarations }
procedure CreateShotCut(SourceFile, ShortCutName, SourceParams: String);
192
5. Листинг процедуры создания ярлыка CreateShotCut имеет следующий вид:
procedure TFormIarlik.CreateShotCut(SourceFile, ShortCutName,
SourceParams: String); var
IUnk: IUnknown; ShellLink: IShellLink; ShellFile: IPersistFile; tmpShortCutName: String; WideStr: WideString;
i: Integer; begin
IUnk := CreateComObject (CLSID_ShellLink); ShellLink := IUnk as IShellLink;
ShellFile := IUnk as IPersistFile;
ShellLink.SetPath (PChar(SourceFile)); ShellLink.SetArguments (PChar(SourceParams)); ShellLink.SetWorkingDirectory
(PChar(ExtractFilePath(SourceFile)));
ShortCutName := ChangeFileExt (ShortCutName,'.lnk'); if FileExists (ShortCutName) then
begin
ShortCutName := Copy (ShortCutName,1,Length(ShortCutName)-4);
i := 1; repeat
tmpShortCutName := ShortCutName +'(' + IntToStr( i )+
').lnk';
inc(i);
until not FileExists (tmpShortCutName);
193
WideStr := tmpShortCutName; end
else
WideStr := ShortCutName; ShellFile.Save (PWChar(WideStr),False); end;
Пояснение к листингу процедуры:
В самом начале инициализируем переменную IUnk как СОМ-объект c помощью API-функции CreateComObject.
Затем инициализируются переменные ShellLink (ссылка)
и ShellFile (файл).
После этого вызываются следующие методы объекта ссылки ShellLink:
SetPath — устанавливает полный путь к программе;
SetArguments — устанавливает параметры, которые надо передать программе;
SetWorkingDirectory — здесь указывается рабочая директория.
Помимо этого у объекта-ссылки есть еще методы:
GetDescription — указывает в ярлыке описание для программы;
SetShowCmd — указывает режим отображения окна. Здесь можно использовать режимы, которые есть в APIфункции ShowWindow, например SW_HIDE (запускать невидимо), SW_MAXIMIZE (запускать с окном развернутым на весь экран), SW_MINIMIZE (минимизировать окно после старта) и так далее.
После указания необходимых параметров в переменной ShortCutName сохраняется имя ярлыка плюс расширение lnk. Это имя будет использоваться при создании самого файла ссылки.
194
Далее проверяется, если такой ярлык уже существует, то запускается цикл, в котором к имени ссылки добавляется цифра. Таким образом, находится новое имя ярлыка с цифрой, которого еще не существует в указанном месте.
Всамой последней строке созданная ссылка сохраняется
вфайле ярлыка.
Вопросы по теме:
1.Каталоговые системы.
2.Древовидная структура каталоговых систем.
3.Сетевая структура каталоговых систем.
4.Монтирование файловой системы.
195
ЛАБОРАТОРНАЯ РАБОТА № 10. РАЗРАБОТКА КОМПИЛЯТОРОВ. ПОСТРОЕНИЕ ТАБЛИЦЫ ИДЕНТИФИКАТОРОВ НА ЭТАПЕ ЛЕКСИЧЕСКОГО АНАЛИЗА
Цель работы: получить представление о реализации компиляторов на этапе лексического анализа, выделение идентификаторов из текста программы.
Для выполнения лабораторной работы требуется написать программу, позволяющую считывать код программы и осуществлять разбор ее на лексемы и выделять идентификаторы.
Краткие теоретические сведения
Транслятор - это программа, которая переводит программу на исходном (входном) языке в эквивалентную ей программу на результирующем (выходном) языке (рис. 80).
Рис. 80. Работа транслятора
Компилятор - это транслятор, который осуществляет перевод исходной программы в эквивалентную ей результи-
рующую программу на языке машинных команд или на языке ассемблера (рис. 81).
196
Рис. 81. Работа компилятора
Интерпретатор - это программа, которая воспринимает исходную программу на входном (исходном) языке и выполняет ее (рис. 82).
Рис. 82. Работа интерпретатора
Общая схема работы транслятора представлена на рис.
83.
197
Рис. 83. Схема работы транслятора
Основные фазы компиляции
1. Лексический анализ (сканер) - это часть компилятора, которая читает литеры программы на исходном языке и строит из них слова (лексемы) исходного языка (рис. 84).
198
Рис. 84. Работа лексического анализатора
2. Синтаксический разбор - это основная часть компилятора на этапе анализа.
Предназначен для следующего:
выполняется выделение синтаксических конструкций
втексте исходной программы, обработанном лексическим анализатором;
проверяется синтаксическая правильность программы. 3. Семантический анализ - это часть компилятора,
проверяющая правильность текста исходной программы с точки зрения семантики входного языка,
выполняющая преобразования текста, требуемые семантикой входного языка (например, такие, как добавление функций неявного преобразования типов).
4. Подготовка к генерации кода - это фаза, на которой компилятором выполняются предварительные действия, непосредственно связанные с синтезом текста результирующей программы, но еще не ведущие к порождению текста на выходном языке.
Обычно в эту фазу входят действия, связанные с идентификацией элементов языка, распределением памяти, т. п.
5. Генерация кода - это фаза, непосредственно связанная с порождением команд, составляющих предложения выходного языка и в целом текст результирующей программы.
Кроме непосредственного порождения текста результирующей программы генерация обычно включает в себя также
199
оптимизацию - процесс, связанный с обработкой уже порожденного текста.
Таблицы идентификаторов
Лексема (лексическая единица языка) — это структурная единица языка, которая состоит из элементарных символов языка и не содержит в своем составе других структурных единиц языка.
Лексемами языков естественного общения являются слова. Лексемами языков программирования являются идентификаторы, константы, ключевые слова языка, знаки операций и т. п. Состав возможных лексем каждого конкретного языка программирования определяется синтаксисом этого языка.
Лексический анализатор (или сканер) — это часть ком-
пилятора, которая читает исходную программу и выделяет в ее тексте лексемы входного языка.
Лексические анализаторы выполняют исключение из текста исходной программы
комментариев,
незначащих пробелов,
символов табуляции и перевода строки,
атакже выделение лексем следующих типов:
идентификаторов,
строковых, символьных и числовых констант,
ключевых (служебных) слов входного языка,
знаков операций и разделителей.
Переменные, константы, функции и другие элементы в исходной программе, как правило, обозначаются идентифи-
каторами.
Главной характеристикой любого элемента исходной программы является его имя.
Имя каждого элемента должно быть уникальным.
200