– за ключевым словом в списке строк записываются все имена временных переменных – таким образом временные переменные для хранения значений триад становятся локальными переменными функции Compi 1 eTest и размещаются в стеке;
• в список заносится заголовок ассемблерного кода (ключевые слова begin и asm и команда pushad для сохранения значений регистров процессора в стеке);
• вызывается функция MakeAsmCode (листинг П3.13, приложение 3), которая заполняет список текстом ассемблерных команд;
• в список заносится конец ассемблерного кода (команда popad для восстановления значений регистров процессора из стека и два ключевых слова end);
• в список помещаются строки тела главной программы в соответствии с заданием.
В отличие от лабораторных работ вся обработка данных в курсовой работе вынесена в отдельную функцию CompRun. Это сделано для того, чтобы для выполнения компиляции одна и та же функция вызывалась вне зависимости от того, как запущен компилятор – с командной строкой или без нее.
Как требуется по заданию, созданный компилятор должен уметь работать с командной строкой. Для созданного в данном примере компилятора командная строка должна иметь вид:
<компилятор> <входной_файл> [<ключи>]
где:
<компилятор> – имя исполняемого файла компилятора;
<входнойфайл> – имя входного файла и путь к нему (если путь не указан, то компилятор ищет файл в текущем каталоге), первый обязательный параметр командной строки;
<ключи> – необязательные параметры (ключи) запуска компилятора (второй и последующие параметры).
Если входной файл не указан (нет ни одного параметра в командной строке), то открывается окно графического интерфейса с пользователем, которое было описано выше. Иначе, если входной файл указан, компилятор читает исходную программу из этого файла, обрабатывает ее, и если программа не содержит ошибок – помещает результаты в выходной файл, а сообщения об ошибках – в специальный файл ошибок. После этого компилятор сразу же завершает свою работу (никакое окно на экране в этом случае не отображается). Имя выходного файла и имя файла для сообщений об ошибках компилятор определяет, исходя из указанных параметров (ключей запуска).
Если указанный в строке запуска входной файл не найден, то компилятор выдает сообщение об ошибке чтения файла и после этого открывает окно графического интерфейса с пользователем (как если бы имя файла не было указано).
Проверка наличия параметров в командной строке запуска компилятора выполняется сразу при старте компилятора (функция FormCreate, модуль FormLab4, листинг П3.14 в приложении 3). Для этого используется системная функция Param-Count из библиотеки языка Object Pascal, которая возвращает количество параметров в командной строке (0 – параметры отсутствуют). Для анализа параметров командной строки используется системная функция ParamStr из библиотеки языка Object Pascal, которая возвращает строковое значение параметра по его порядковому номеру в командной строке. При этом нулевым параметром считается имя исполняемого файла.
Второй и последующий параметры в командной строке считаются ключами – необязательными параметрами запуска компилятора. Ключей в командной строке может быть любое количество (в том числе может не быть ни одного ключа, в этом случае командная строка содержит только один параметр – имя входного файла). Ключи могут следовать в командной строке в любом порядке. Ключи определяют режим работы компилятора и некоторые условия компиляции. Каждый ключ является отдельным параметром. Ключи отделяются друг от друга пробелами (если ключ должен содержать пробелы внутри себя, его следует взять в двойные кавычки – "…", – как это принято для параметров командных строк в ОС).
Каждый ключ должен начинаться с символа «-» (минус), за которым следует символ ключа (строчная или прописная буква латинского алфавита), а за ним – параметр ключа, если требуется.
Символы ключей имеют следующее значение (строчные и прописные буквы имеют одинаковое значение, поэтому здесь рассматриваются только прописные буквы):
• А – флаг оптимизации команд ассемблера, определяет, выполняется или нет оптимизация результирующего кода; за символом должно идти указание значения флага:
1 оптимизация выполняется (флаг включен);
0 – оптимизация не выполняется (флаг выключен), любой другой символ, следующий за символом А, воспринимается как 0;
• С – флаг свертки объектного кода, определяет, выполняется или нет оптимизация списка триад методом свертки объектного кода; за символом должно идти указание значения флага:
1 оптимизация выполняется (флаг включен);
0 – оптимизация не выполняется (флаг выключен), любой другой символ, следующий за символом С, воспринимается как 0;
• S – флаг исключения лишних операций, определяет, выполняется или нет оптимизация списка триад методом исключения лишних операций; за символом должно идти указание значения флага:
1 оптимизация выполняется (флаг включен);