PL/I ön işlemcisi - PL/I preprocessor
PL / I önişlemci olduğunu önişlemci için PL / I bilgisayar programlama dili . Önişlemci , kaynak dosya ekleme, koşullu derleme ve makro genişletmeyi gerçekleştirmek için tam PL/I dilinin bir alt kümesini yorumlar .
Önişlemci dili, önişlemci ifadeleri ve yüzde sembolü ( %
) ile önişlemci prosedürleri içeren PL/I benzeri bir sözdizimine sahiptir . Derleyici listesi için biçimlendirme komutları sağlayan listeleme-kontrol ifadeleri genellikle önişlemci ifadeleri olarak kabul edilir ve ayrıca %
. Önişlemci ifadeleri gömülüdür ve giriş metninde çalışır. Giriş metni normalde bir PL/I programıdır, ancak PL/I'nin gramerinden bağımsızdır, bu nedenle önişlemci diğer türdeki metin dosyalarını işlemek için bağımsız olarak da kullanılabilir.
Önişlemci, standart PL/I'nin bir parçası olarak belirtilmemiştir, ancak çoğu PL/I uygulaması, IBM önişlemcisinin dilini kabul eder.
Dosyalar dahil
%INCLUDE
Önişlemci deyimi de önişlemci direktifleri içerebilir başka bir dosya, metnini eklemek kullanılır. En son IBM derleyicileri %XINCLUDE
, yalnızca önceden dahil edilmemişse, belirtilen dosyayı dahil etme etkisine sahip bir yönerge de sağlar .
%INSCAN
ve %XINSCAN
dahil edilecek dosyanın adının bir önişlemci ifadesi ile belirtilmesi dışında benzer şekilde çalışır.
Liste kontrolü
Listeleme kontrol ifadeleri, hem önişlemci tarafından oluşturulan listeyi hem de derleyici tarafından oluşturulan listeyi biçimlendirmek için talimatlar sağlar.
-
%PRINT;
aşağıdaki metinlerin listelerinin yazdırılmasının başlatılmasına veya devam ettirilmesine neden olur. -
%NOPRINT;
aşağıdaki metinlerin listelerinin yazdırılmasının bastırılmasına neden olur. -
%PAGE;
listelerde yeni bir sayfa açılmasına neden olur. -
%SKIP [(n)];
listelerde n satırın atlanmasına neden olur . Eğer n varsayılan atlanırsa bir çizgidir. -
%PUSH
, bir aşağı açılan yığında / öğesinin%POP
mevcut durumunu kaydedin ve geri yükleyin ve sırasıyla geri yükleyin.%PRINT
%NOPRINT
Önişlemci işlemi
Önişlemci, giriş metnini tarayarak ve önişlemci tanımlayıcıları olarak da adlandırılan, bildirilmiş önişlemci adlarını tanıyarak çalışır . Metin, önişlemci adları geçerli değerleriyle değiştirilerek önişlemci çıktısına kopyalanır. Ad, bir önişlemci prosedürüne ( makro ) yapılan bir çağrıyı temsil edebilir . Değiştirme metni, olası ek değiştirme için önişlemci tarafından yeniden taranabilir.
Önişlemci veri türleri
Önişlemci verileri, CHARACTER
maksimum uzunluğu olmayan bir karakter dizisi veya FIXED
en fazla beş ondalık basamaktan oluşan bir tam sayı olarak bildirilebilir. Bir önişlemci yerleşik önişlemci veriler üzerinde çalışan önceden tanımlanmış bir prosedürdür. Bir önişlemci ifadesi , yalnızca önişlemci adlarından, önişlemci yordamlarına veya yerleşiklerine yapılan başvurulardan ve ondalık sayı veya karakter sabitlerinden oluşan bir ifadedir. BIT
Değişken yoktur , ancak BIT
karşılaştırma yoluyla bir sonuç elde edilebilir. içindeki ifade şu şekilde %IF
değerlendirilir BIT
. Üstelleştirme dışında tüm PL/I operatörlerine izin verilir.
Önişlemci ifadeleri
-
%DECLARE
CHARACTER
veya önişlemci değişkeni olarak bir tanımlayıcı oluştururFIXED
. - % ataması, bir önişlemci tanımlayıcısına bir değer atar.
-
%ACTIVATE
bir önişlemci tanımlayıcısını etkin, yani giriş metninde karşılaşıldığında değiştirilmeye uygun hale getirir. -
%DEACTIVATE
bir önişlemciyi değiştirilemez hale getirir. -
%DO
DO
ifadeleri gruplamak ve muhtemelen yinelemeyi belirtmek için kullanılan bir önişlemci -grubuna başkanlık eder . Bir önişlemciDO
-grubu, önişlemci deyimlerinin ve giriş metninin herhangi bir birleşimini içerebilir. -
%PROCEDURE
bir önişlemci yordamına, giriş metninde adı ile karşılaşıldığında bir değer döndüren bir makro işlevi gören bir önişlemci deyimlerine başkanlık eder. -
%SELECT
bir önişlemciSELECT
grubuna başkanlık eder . -
%END
bir önişlemciDO
-grubu,SELECT
-grup veya önişlemci prosedürünü sonlandırır . -
%GOTO
(veya%GO TO
) önişlemcinin taramasını belirtilen önişlemci etiketinde, bir önişlemci deyiminde veya giriş metnindeki rastgele bir noktada sürdürmesine neden olur. -
%IF
bir önişlemci ifadesinin değerine göre önişlemci taramasının akışını kontrol eder.
%IF preprocessor-expression %THEN preprocessor unit1 %ELSE preprocessor-unit2
Önişlemci birimleri, herhangi bir tek önişlemci ifadesi veya bir önişlemci DO
grubu olabilir.
-
%ITERATE
kontrolü%END
içeren önişlemciDO
-grubuna aktarır , mevcut yinelemeyi sona erdirir ve gerekirse bir sonrakine başlar. -
%LEAVE
içeren önişlemci grubunun kalan yinelemelerini sona erdirir - grupDO
kontrolü%END
. -
%NOTE
kullanıcı tanımlı bir önişlemci tanılama mesajı oluşturur. -
%null
yalnızca isteğe bağlı bir ifade etiketi ve bir noktalı virgülden (;
) oluşan bir önişlemci ifadesidir . Hiçbir şey yapmaz, ancak gerekli bir ifadenin gerekli olmadığı bir yer tutucu olarak hizmet eder. -
%REPLACE
bir ismin bir karakter veya sabit bir ifade ile hemen değiştirilmesine izin verir. Adın, bildirilmiş bir önişlemci tanımlayıcısı olması gerekmez.
Önişlemci prosedürleri
Önişlemci prosedürü, önişlemci tarafından yürütülen bir alt yordamdır . Yordam %PROCEDURE
ve %END
deyimleri ile sınırlandırılmıştır ve başında olmadan yalnızca önişlemci deyimlerini içerebilir %
. Herhangi bir önişlemci yordamının dışında veya başka bir önişlemci yordamından açık koddan bir işlev başvurusu olarak çağrılır ve bir CHARACTER
veya FIXED
değeri döndürür . Prosedür açık koddan çağrıldığında, argümanlar isme göre iletilir , yani bunlar virgül veya sağ parantez ile sınırlandırılmış karakter dizileri olarak yorumlanır, tüm baştaki, sondaki veya gömülü boşluklar önemlidir ve argümanın bir parçası olarak kabul edilir.
Önişlemci yerleşikleri
Bunlar, IBM'in MVS için PL/I ve VM derleyicisinin yerleşikleridir . Çeşitli PL/I derleyicilerinin ön işlemcileri arasında sağlanan yerleşikler arasında önemli farklılıklar olabilir.
-
COMPILETIME
— derleme tarihini ve saatini, 15 Eylül 2012 15:30 (yerel saat) için "15 EYLÜL 15:30:00" gibi bir karakter dizisi olarak döndürür. -
COUNTER
— ilk arama için "00001" olanCOUNTER
ve sonraki her arama için bir artan bir sayı içeren bir karakter dizisi döndürür . -
INDEX
— PL/I yerleşik ile aynıINDEX
. -
LENGTH
— PL/I yerleşik ile aynıLENGTH
. -
PARMSET
-PARMSET(p)
döner'1'b
argümanı eğerp
aksi halde, bu önişlemci prosedüre geçerli çağrısında kuruldu'0'b
. -
SUBSTR
— PL/I yerleşik ile aynıSUBSTR
.
Misal
Aşağıdaki IBM PL/I for OS/2 örneği, PL/I için C benzeri bir yazma ifadesi uygulamak için bir önişlemci prosedürünün kullanımını gösterir. Prosedür, uwrite file(filename) from(varying_string) count(byte_count);
Byte_count isteğe bağlıdır ve atlanırsa , değişken_dizge uzunluğuna varsayılandır ifadesi kodlanarak çağrılır .
%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;
Açıklama uwrite file(file_name) from(var_str) count(64);
aşağıdakileri üretir:
do;
dcl Count00001 fixed bin (15);
Count00001 = filewrite(file_name, ptradd(addr(var_str), 2), min(length(var_str), 64));
end;
Evrim
Anahtar sözcüğüyle tanımlanan makro prosedürlerin MACRO
dilin tüm olanaklarını kullanabilmesi koşuluyla, o sırada PL/I olarak adlandırılan "NPL" hakkında 1964 tarihli bir rapor . Açık kodda aşağıdaki derleme zamanı ifadelerine izin verildi:
-
%DECLARE
– hem sabit uzunluklu hem de değişken karakter dizileri tanımlandı. %assignment
%null statement
-
%IF compile_time_comparison THEN unit [ELSE unit]
– bu, bir veya diğer birimin kaynağa dahil edilmesine neden olur . %GOTO
Bu kılavuzda tanımlanan "NPL" hiçbir zaman uygulanmadı.
1965'te IBM'in PL/I Dil belirtiminde yapılan bir güncelleme, daha az iddialı bir önişlemci dili tanımladı. Önişlemci prosedürlerinin tüm sözleri atlandı. Aşağıdaki derleme zamanı ifadeleri belirtildi:
%DECLARE
%assignment
%null statement
-
%IF compile_time_comparison THEN GOTO label
– Herhangi birELSE
madde tanımlanmadı. %GOTO
Bu dil belirtimi bir daha asla uygulanmadı, ancak bu kılavuzun 1966'daki bir revizyonu, önişlemci prosedürlerini şu anda geçerli %PROCEDURE ... %END
sözdizimi ile geri yükledi ve belirtimi PL/I(F)'de bulunana yaklaştırdı. Sabit uzunlukta karakter değişkenleri gitmişti. Eklenen yeni ifadeler şunlardı:
%ACTIVATE
%DEACTIVATE
%DO [preprocessor_variable = preprocessor_expression TO preprocessor_expression [BY preprocessor_expression]]
-
RETURN
yalnızca bir derleme zamanı prosedüründe. %INCLUDE
-
%IF
- restore edildi.IF compile_time_comparison THEN unit [ELSE unit]
Tek bir derleme zamanı yerleşiği SUBSTR
eklendi.
Ayrıca 1966'da Robert Rosin, önişlemcinin gelişimini tartışan bir çift makale yayınladı. Bu gelişme, aynı yılın başlarındaki bir " SHARE XXVI Memo" ve Mark Elson'ın bir makalesine dayanıyordu. Reçine kredi MAD üst düzey bir dilde bir makro işlemci sadece bir önceki örnekte olduğu gibi.
Ayrıca bakınız
Referanslar
Dış bağlantılar
- IBM Şirketi (Ekim 2009). "Enterprise PL/I Dil Referansı (SC27-1460-09): Bölüm 21. Ön İşlemci Olanakları" . 19 Ocak 2012'de alındı .
- Mikro Odak Uluslararası plc (2011). "Micro Focus Documentation: Open PL/I Macro Preprocessor" . 14 Şubat 2012'de alındı .
- Kednos İşletmeleri (2007). "OpenVMS Sistemleri Referans Kılavuzu için Kednos PL/I: Bölüm 10 Ön İşlemci" . 14 Şubat 2012'de alındı .
- Peter Flass (2010). "PL/I Ön İşlemci Wiki" . 2017-12-06 alındı . Önişlemci özelliklerinin karşılaştırılması