PL/I препроцессор
Эта статья включает список общих ссылок , но в ней отсутствуют достаточные соответствующие встроенные цитаты . ( февраль 2012 г. ) |
Препроцессор PL /I — это препроцессор языка PL/ I программирования . Препроцессор интерпретирует подмножество полного языка PL/I для включения исходного файла , условной компиляции и расширения макросов .
Язык препроцессора имеет синтаксис, подобный PL/I, с операторами препроцессора и процедурами препроцессора с префиксом символа процента ( %
). Операторы управления листингом, которые предоставляют команды форматирования для листинга компилятора , обычно считаются операторами препроцессора и также начинаются с %
. Операторы препроцессора встроены во входной текст и работают с ним. Входной текст обычно представляет собой программу PL/I, но он не зависит от грамматики PL/I, поэтому препроцессор также можно использовать независимо для обработки других типов текстовых файлов.
Препроцессор не указан как часть стандартного PL/I, но большинство реализаций PL/I принимают язык препроцессора IBM.
Включая файлы
[ редактировать ]The %INCLUDE
Оператор препроцессора используется для включения текста другого файла, который также может содержать директивы препроцессора. Новейшие компиляторы IBM также предоставляют %XINCLUDE
директива, которая включает указанный файл только в том случае, если он еще не был включен.
%INSCAN
и %XINSCAN
работают аналогично, за исключением того, что имя включаемого файла указывается выражением препроцессора.
Контроль листинга
[ редактировать ]Операторы управления листингом предоставляют инструкции по форматированию как листинга, созданного препроцессором, так и листинга, созданного компилятором.
%PRINT;
вызывает запуск или возобновление печати списков следующего текста.%NOPRINT;
приводит к подавлению печати списков следующего текста.%PAGE;
вызывает запуск новой страницы в списках.%SKIP [(n)];
приводит к пропуску n строк в списках. Если n опущено, по умолчанию используется одна строка.%PUSH
,%POP
сохранить и восстановить текущий статус%PRINT
/%NOPRINT
в раскрывающемся стеке и соответственно восстановить его.
Работа препроцессора
[ редактировать ]Препроцессор работает, сканируя входной текст и распознавая объявленные имена препроцессора , также называемые идентификаторами препроцессора . Текст копируется на выходные данные препроцессора, при этом имена препроцессоров заменяются их текущими значениями. Имя может представлять собой вызов процедуры препроцессора ( макроса ). Текст замены может быть повторно просканирован препроцессором для возможной дополнительной замены.
Типы данных препроцессора
[ редактировать ]Данные препроцессора могут быть объявлены как CHARACTER
, строка символов без максимальной длины или FIXED
целое число длиной до пяти десятичных цифр. — Встроенная функция препроцессора это предопределенная процедура, работающая с данными препроцессора. — Выражение препроцессора это выражение, состоящее только из имен препроцессора, ссылок на процедуры или встроенные функции препроцессора, а также десятичных или символьных констант. Нет BIT
переменные, но BIT
результат можно получить путем сравнения. Выражение в %IF
оценивается как BIT
. Разрешены все операторы PL/I, кроме возведения в степень.
Операторы препроцессора
[ редактировать ]%DECLARE
устанавливает идентификатор как переменную препроцессора, либоCHARACTER
илиFIXED
.- %assignment присваивает значение идентификатору препроцессора.
%ACTIVATE
делает идентификатор препроцессора активным, то есть допускающим замену при обнаружении во входном тексте.%DEACTIVATE
делает препроцессор непригодным для замены.%DO
возглавляет препроцессорDO
-group, который используется для группировки операторов и, возможно, для указания итерации. ПрепроцессорDO
-group может содержать любую комбинацию операторов препроцессора и входного текста.%PROCEDURE
возглавляет процедуру препроцессора — набор операторов препроцессора, который действует как макрос, возвращающий значение, когда его имя встречается во входном тексте.%SELECT
возглавляет препроцессорSELECT
-группа .%END
завершает работу препроцессораDO
-группа,SELECT
-группа или процедура препроцессора.%GOTO
(или%GO TO
) заставляет препроцессор продолжить сканирование с указанной метки препроцессора, либо оператора препроцессора, либо произвольной точки во входном тексте.%IF
управляет потоком сканирования препроцессора в соответствии со значением выражения препроцессора.
%IF preprocessor-expression %THEN preprocessor unit1 %ELSE preprocessor-unit2
Модулями препроцессора может быть любой отдельный оператор препроцессора или сам препроцессор. DO
-группа.
%ITERATE
передает управление в%END
содержащего препроцессораDO
-group, завершающая текущую итерацию и при необходимости начиная следующую.%LEAVE
завершает все оставшиеся итерации содержащего препроцессораDO
-группа передает управление%END
.%NOTE
генерирует заданное пользователем диагностическое сообщение препроцессора.%null
— это оператор препроцессора, состоящий только из необязательной метки оператора и точки с запятой (;
). Он ничего не делает, а служит заполнителем там, где требуемый оператор не требуется.%REPLACE
позволяет немедленную замену имени символом или фиксированным выражением. Имя не обязательно должно быть объявленным идентификатором препроцессора.
Процедуры препроцессора
[ редактировать ]Процедура препроцессора — это подпрограмма , выполняемая препроцессором. Процедура ограничена %PROCEDURE
и %END
операторы и могут содержать только операторы препроцессора без ведущих %
. Он вызывается как ссылка на функцию из открытого кода , вне какой-либо процедуры препроцессора или из другой процедуры препроцессора и возвращает CHARACTER
или FIXED
ценить. Когда процедура вызывается из открытого кода, аргументы передаются по имени , то есть они интерпретируются как строки символов, разделенные запятыми или правой круглой скобкой. Все начальные, конечные или встроенные пробелы являются значимыми и считаются частью аргумента. [1] : стр. 508–509.
Встроенные препроцессоры
[ редактировать ]Это встроенные модули IBM PL/I для компилятора MVS и VM . [2] : стр.404–406. Во встроенных модулях препроцессоров различных компиляторов PL/I могут быть значительные различия.
COMPILETIME
— возвращает дату и время компиляции в виде символьной строки, например «15 SEP 12 15:30:00» для 15 сентября 2012 г. 15:30 (по местному времени).COUNTER
— возвращает строку символов, содержащую число «00001» для первого вызоваCOUNTER
и увеличивается на единицу при каждом последующем вызове.INDEX
— то же, что и встроенный PL/IINDEX
.LENGTH
— то же, что и встроенный PL/ILENGTH
.PARMSET
—PARMSET(p)
возвращает'1'b
если аргументp
было установлено в текущем вызове этой процедуры препроцессора, в противном случае'0'b
.SUBSTR
— то же, что и встроенный PL/ISUBSTR
.
Пример
[ редактировать ]Следующий пример для IBM PL/I для OS/2 иллюстрирует использование процедуры препроцессора для реализации C-подобного оператора записи для PL/I. [3] Процедура будет вызываться путем кодирования оператора uwrite file(filename) from(varying_string) count(byte_count);
Byte_count является необязательным и по умолчанию равен длине варьирующаяся_строка, если она опущена.
%uwrite:
procedure keys (File, From, Count);
dcl (File, From, Count, Number, Size) char;
if parmset(File) & parmset(From) then; else do;
note ('FILE and FROM must be specified!', 12);
return;
end;
if parmset(Count)
then Size = 'min(length(' || From || '), ' || Count || ')';
else Size = 'length(' || From || ')';
Number = Counter();
ans ('do;');
ans ('dcl Count' || Number || ' fixed bin (15);' ) skip;
ans ('Count' || Number || ' = filewrite('
|| File
|| ', ptradd(addr(' || From || '), 2)'
|| ', ' || Size
|| ');') skip;
ans ('end;') skip;
%end;
%act uwrite;
Заявление uwrite file(file_name) from(var_str) count(64);
генерирует следующее:
do;
dcl Count00001 fixed bin (15);
Count00001 = filewrite(file_name, ptradd(addr(var_str), 2), min(length(var_str), 64));
end;
Эволюция
[ редактировать ]Отчет о «НПЛ» за 1964 год. [4] : стр. 109–114. как тогда назывался PL/I, при условии, что макропроцедуры, идентифицируемые ключевым словом MACRO
, мог использовать все возможности языка. В открытом коде были разрешены следующие операторы времени компиляции:
%DECLARE
– определены строки символов как фиксированной, так и переменной длины.%assignment
%null statement
%IF compile_time_comparison THEN unit [ELSE unit]
того или иного блока . – это приводит к включению в источник%GOTO
«NPL», как оно определено в этом руководстве, никогда не применялось.
В 1965 году обновление спецификации языка PL/I компании IBM определило еще менее амбициозный язык препроцессора. [5] : стр. 131–133. Все упоминания о процедурах препроцессора были опущены. Были указаны следующие операторы времени компиляции:
%DECLARE
%assignment
%null statement
%IF compile_time_comparison THEN GOTO label
- НетELSE
была определена оговорка.%GOTO
Эта спецификация языка снова так и не была реализована, однако в редакции этого руководства 1966 года процедуры препроцессора были восстановлены в нынешнем виде. %PROCEDURE ... %END
синтаксис и приблизил спецификацию к тому, что фактически было включено в PL/I(F). [6] : стр. 132–139. [7] : стр. 154–162. Символьные переменные фиксированной длины исчезли. Добавлены новые утверждения:
%ACTIVATE
%DEACTIVATE
%DO [preprocessor_variable = preprocessor_expression TO preprocessor_expression [BY preprocessor_expression]]
RETURN
только в процедуре времени компиляции.%INCLUDE
%IF
-%IF compile_time_comparison %THEN unit [%ELSE unit]
был восстановлен.
Одна встроенная функция времени компиляции, SUBSTR
, было добавлено.
Также в 1966 году Роберт Розин опубликовал пару статей. [8] [9] обсуждение разработки препроцессора. Эта разработка была основана на « Записке SHARE XXVI», опубликованной ранее в том же году, и на статье Марка Элсона. Розин считает MAD единственным предыдущим примером макропроцессора на языке высокого уровня.
См. также
[ редактировать ]Ссылки
[ редактировать ]- ^ Корпорация IBM (2005 г.). Enterprise PL/I для z/OS PL/I для AIX WebSphere Developer для zSeries PL/I для Windows Справочник по языку (PDF) .
- ^ Корпорация IBM (1995). Справочник по языку IBM PL/I для MVS и VM .
- ^ Штурм, Эберхард. «Макросы UIO для встроенных функций fileread и filewrite» . Проверено 22 января 2012 г.
- ^ Корпорация IBM (1964). Технический отчет NPL (PDF) .
- ^ Корпорация IBM (1965). Операционная система IBM/360 PL/I: спецификации языка (C28-6571-1) (PDF) .
- ^ Корпорация IBM (1966). Операционная система IBM/360 PL/I: спецификации языка (C28-6571-3) (PDF) .
- ^ Корпорация IBM (1969). Справочное руководство IBM System/360 PL/I (C28-8201-3) (PDF) .
- ^ Розин, Роберт (август 1966 г.). «Макропроцессор PL/I — отчет о ходе работы» (PDF) . Бюллетень PL/I (2) . Проверено 22 января 2013 г.
- ^ Розин, Роберт (август 1966 г.). «Макросы в PL/I» (PDF) . Бюллетень PL/I (2) . Проверено 22 января 2013 г.
Внешние ссылки
[ редактировать ]- Корпорация IBM (октябрь 2009 г.). «Справочник по языку Enterprise PL/I (SC27-1460-09): Глава 21. Средства препроцессора» (PDF) . Проверено 19 января 2012 г.
- Micro Focus International plc (2011 г.). «Документация Micro Focus: Открытый препроцессор макросов PL/I» . Проверено 14 февраля 2012 г.
- Кеднос Предприятия (2007). «Справочное руководство Kednos PL/I для систем OpenVMS: Глава 10 Препроцессор» . Проверено 14 февраля 2012 г.
- Питер Фласс (2010). «Вики-сайт препроцессора PL/I» . Проверено 6 декабря 2017 г. Сравнение возможностей препроцессора