Jump to content

PL/I препроцессор

Препроцессор 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/I INDEX.
  • LENGTH — то же, что и встроенный PL/I LENGTH.
  • PARMSETPARMSET(p) возвращает '1'b если аргумент p было установлено в текущем вызове этой процедуры препроцессора, в противном случае '0'b.
  • SUBSTR — то же, что и встроенный PL/I SUBSTR.

Следующий пример для 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 единственным предыдущим примером макропроцессора на языке высокого уровня.

См. также

[ редактировать ]
  1. ^ Корпорация IBM (2005 г.). Enterprise PL/I для z/OS PL/I для AIX WebSphere Developer для zSeries PL/I для Windows Справочник по языку (PDF) .
  2. ^ Корпорация IBM (1995). Справочник по языку IBM PL/I для MVS и VM .
  3. ^ Штурм, Эберхард. «Макросы UIO для встроенных функций fileread и filewrite» . Проверено 22 января 2012 г.
  4. ^ Корпорация IBM (1964). Технический отчет NPL (PDF) .
  5. ^ Корпорация IBM (1965). Операционная система IBM/360 PL/I: спецификации языка (C28-6571-1) (PDF) .
  6. ^ Корпорация IBM (1966). Операционная система IBM/360 PL/I: спецификации языка (C28-6571-3) (PDF) .
  7. ^ Корпорация IBM (1969). Справочное руководство IBM System/360 PL/I (C28-8201-3) (PDF) .
  8. ^ Розин, Роберт (август 1966 г.). «Макропроцессор PL/I — отчет о ходе работы» (PDF) . Бюллетень PL/I (2) . Проверено 22 января 2013 г.
  9. ^ Розин, Роберт (август 1966 г.). «Макросы в PL/I» (PDF) . Бюллетень PL/I (2) . Проверено 22 января 2013 г.
[ редактировать ]
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: ddc35527b5b70e0ceddf5b5d9d709f77__1647551520
URL1:https://arc.ask3.ru/arc/aa/dd/77/ddc35527b5b70e0ceddf5b5d9d709f77.html
Заголовок, (Title) документа по адресу, URL1:
PL/I preprocessor - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)