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 . %INSCANve %XINSCANdahil 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 %POPmevcut 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, CHARACTERmaksimum uzunluğu olmayan bir karakter dizisi veya FIXEDen 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. BITDeğişken yoktur , ancak BITkarşılaştırma yoluyla bir sonuç elde edilebilir. içindeki ifade şu şekilde %IFdeğerlendirilir BIT. Üstelleştirme dışında tüm PL/I operatörlerine izin verilir.

Önişlemci ifadeleri

  • %DECLARECHARACTERveya önişlemci değişkeni olarak bir tanımlayıcı oluşturur FIXED.
  • % 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.
  • %DODOifadeleri gruplamak ve muhtemelen yinelemeyi belirtmek için kullanılan bir önişlemci -grubuna başkanlık eder . Bir önişlemci DO-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.
  • %SELECTbir önişlemci SELECTgrubuna başkanlık eder .
  • %ENDbir önişlemci DO-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 DOgrubu olabilir.

  • %ITERATEkontrolü %ENDiçeren önişlemci DO-grubuna aktarır , mevcut yinelemeyi sona erdirir ve gerekirse bir sonrakine başlar.
  • %LEAVEiçeren önişlemci grubunun kalan yinelemelerini sona erdirir - grup DOkontrolü %END.
  • %NOTE kullanıcı tanımlı bir önişlemci tanılama mesajı oluşturur.
  • %nullyalnı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.
  • %REPLACEbir 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 %PROCEDUREve %ENDdeyimleri 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 CHARACTERveya FIXEDdeğ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" olan COUNTERve 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'bargümanı eğer paksi 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 MACROdilin 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 bir ELSEmadde 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 ... %ENDsö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 SUBSTReklendi.

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