Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

3468

.pdf
Скачиваний:
4
Добавлен:
15.11.2022
Размер:
5.57 Mб
Скачать

Ход выполнения:

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]