Makroprosessori

Koska makroprosessoreita kutsutaan tietokoneohjelmiksi , korvaa tekstin merkkijonot muilla merkkijonoilla. Merkkijonoa korvaavalla tekstillä kutsutaan makroksi . Makrot voidaan yleensä parametroida . Suurin osa makroprosessoreista tietää muutaman komennon: Makrojen määrittelyyn käytetään yleensä esimerkiksi määritelmää . Muut komennot sallivat usein merkkijonojen käsittelyn, ehdollisen tekstin korvaamisen, aputiedostojen kirjoittamisen ja lukemisen jne. Joskus komentoja ja makroja voidaan käsitellä hyvin samalla tavalla.

Tunnettu makroprosessori on esim. B. osa TeX- lajitteluohjelmaa . C- kielen C- esiprosessori on myös makroprosessori.

M4-makroprosessori esimerkkinä

Unix- käyttöjärjestelmä sisältää makroprosessorin m4 vakiona . Tämän avulla voit määrittää omat makrosi määritysmakron avulla .

    define(`H',`Hans')define(`U',`und')define(`I',`Inge')dnl
    H U I, I U H. H liebt I.

tuloksia

  • Hans und Inge, Inge und Hans. Hans liebt Inge.

Merkit "(saksalaisella näppäimistöllä kysymysmerkin oikealla puolella) ja" (Ä: n oikealla puolella) varmistavat, että makroja ei korvata, jos ne ovat osassa, joka alkaa "ja päättyy".

Lausekkeet ja ehdot voidaan toteuttaa käyttämällä monia muita sisäänrakennettuja makroja, kuten eval , ifelse . Toistoja ja silmukoita voidaan saavuttaa rekursiolla .

Ennalta määritetyt makrot makroprosessorissa m4 (valinta)
makro kuvaus
määritä (`` nimi '', def) Määritelmä uutta makrotaloudellista nimen , korvaaminen def
eval Aritmeettisen lausekkeen arviointi
sis Lisää argumenttia yhdellä
ifdef Ehdollinen toteutus
ohjaa (-1) Lähdön vaimennus
dnl Linjan lopun tukahduttaminen (mukaan lukien linjanerottimet)
sisälly (`` tiedosto '') Lue tekstistä tiedostosta ja tulkitse se.
1 , 2 , ... Parametrit, joita voidaan käyttää makron määrittelyn def- sisällä ja jotka sitten korvataan nykyisen parametrin tekstillä, kun niitä kutsutaan.

Esimerkiksi makroprosessorilla voidaan toteuttaa automaattiset laskurit:

define(`Zaehler',`define(`$1',incr($1))Kapitel $1.')dnl
define(`kapitelnr',0)dnl
Zaehler(`kapitelnr')
Zaehler(`kapitelnr')
Zaehler(`kapitelnr')
Zaehler(`kapitelnr')

Jos tätä esimerkkiä käsitellään m4: llä, saadaan seuraava tulos:

Kapitel 1.
Kapitel 2.
Kapitel 3.
Kapitel 4.

Tämä sallii z: n. B. Luku- ja jaksonumeroiden automaattinen lisääminen tekstissä:

divert(-1)dnl
  define(`Zaehler',`define(`$1',incr($1))$1')
  define(`kapitelnr',0)
  define(`abschnittnr',0)
  define(`Kapitel',`<h1>Zaehler(`kapitelnr'). $1</h1>define(`abschnittnr',0)')
  define(`Abschnitt',`<h2>kapitelnr.Zaehler(`abschnittnr') $1</h2>')
divert(0)dnl
Kapitel(Einführung)
Dieser Text handelt von …
Abschnitt(Geschichte)
Geschichtlich ist folgendes zu sagen …
Abschnitt(Neuere Entwicklungen)
Doch in neuerer Zeit ergeben sich …
Kapitel(Definitionen)
Abschnitt(Zahlenwerte)
…
Abschnitt(Konstanten)
…
Abschnitt(Variablen)
…

M4: n lähtö on sitten

  <h1>1. Einführung</h1>
  Dieser Text handelt von …
  <h2>1.1 Geschichte</h2>
  Geschichtlich ist folgendes zu sagen …
  <h2>1.2 Neuere Entwicklungen</h2>
  Doch in neuerer Zeit ergeben sich …
  <h1>2. Definitionen</h1>
  <h2>2.1 Zahlenwerte</h2>
  … …
  <h2>2.2 Konstanten</h2>
  … …
  <h2>2.3 Variablen</h2>
  … …

Makroprosessori esiprosessorina

Makro prosessori on muoto esiprosessorin ( esikäsittelijä ). Se muuttaa tulo teksti ennen käyttäjä siirtää sen varsinaista käsittelyä ohjelman.

Alle Unix , monet makro prosessorit voidaan kutsua komentorivin erillisinä prosesseina, Käsitelty teksti välitetään kautta putken :

  $ m4 diplomarbeit.txt | tbl | eqn | groff -mt -Tps | kprinter

Täällä diplarbeit.txt- tiedosto käsitellään ensin makroprosessorilla m4 , sitten pöytäprosessorilla tbl ja kaavasarjan prosessorilla eqn (molemmat makroprosessorit), jotta sitten se voidaan muuntaa PostScript- kieleksi tekstikokonaisuuden avulla (makro). prosessorin groff . kprinter voi sitten tulostaa Postscript-yhteensopivalla tulostimella.

C-esiprosessori

C-ohjelmointikieli sisältää yksinkertaisen makro prosessori, CPP . Tätä voidaan käyttää seuraaviin tehtäviin:

  • Määritelmä symbolisia vakioita
  • Ehdollinen käännös
  • Kielen laajentaminen yksinkertaisten kielirakenteiden avulla
  • Paperityön yksinkertaistaminen
C-esiprosessorin komennot (valinta)
makro kuvaus
#define nimen korvaava teksti Uuden makron nimen määrittely . Jos tekstissä esiintyy nimeä , se korvataan korvaavalla tekstillä .
#define name (p1, p2) txt Määritelmä uutta makrotaloudellista nimen kanssa parametrien P1 ja P2 . Sisällä txt , merkkijonojen p1 ja p2 on korvattu vastaavilla teksti nykyiset parametrit.
#ifdef nimi
#muutakin
#endif
Ehdollinen käännös. Makrojen väliset viivat käännetään vain, jos makron nimi on olemassa tai ei.
__FILE__
__LINE__
Ohjelmatekstin sisältävän tiedoston nimi ja rivinumero.
__unix__ Ennalta määritelty Unix-käyttöjärjestelmissä, määrittelemätön muissa järjestelmissä.
#include <tiedosto>
#include "tiedosto"
Lue tiedosto ja lisää teksti tulosteeseen.

C-esiprosessorin mahdollisuudet ovat suhteellisen rajalliset. Se antaa kuitenkin kielelle lisäjoustavuutta, jota muut kielet tuskin saavuttavat. Monimutkaisissa ohjelmajärjestelmissä tämä johtaa kuitenkin myös vaikeuksiin yhtenäisten määritelmien ylläpidossa ja hoidossa, minkä vuoksi seuraavassa kehitetyt ohjelmointikielet eivät tarkoituksella käyttäneet tätä käsitettä.

Seuraavassa esimerkissä ohjelmasta

  #define FIELDSIZE 100

  int Feld[FIELDSIZE];
  main() {
     int i;
     Feld[0] = 0; Feld[1] = 1;
     for (i = 2; i < FIELDSIZE; ++i)
        Feld[i] = Feld[i-1] + Feld[i-2];
  }

FIELDSIZE korvataan yksinkertaisesti luvulla 100:

  int Feld[100];
  main() {
     int i;
     Feld[0] = 0; Feld[1] = 1;
     for (i = 2; i < 100; ++i)
        Feld[i] = Feld[i-1] + Feld[i-2];
  }

Vasta sitten syntyy ohjelmateksti, jonka varsinainen C- kääntäjä voi kääntää ilman virheitä.

Seuraava ohjelma määrittää, onko se käännetty Unixissa. Muuten järjestelmä odottaa tuloa:

  #include <stdio.h>
  main() {
     printf("Das Programm läuft ");
  #ifdef __UNIX__
     printf("unter Unix.\n");
  #else
     printf("unter einem unbekannten Betriebssystem.\n");
     printf("Bitte drücken Sie eine Taste!");
     getchar();
  #endif
  }

Unix-kääntäjä kääntäisi seuraavan tekstin tähän:

  main() {
     printf("Das Programm läuft ");
     printf("unter Unix.\n");
  }

Tuntemattomasta käyttöjärjestelmästä tuleva kääntäjä puolestaan ​​kääntäisi seuraavan ohjelman:

  main() {
     printf("Das Programm läuft ");
     printf("unter einem unbekannten Betriebssystem.\n");
     printf("Bitte drücken Sie eine Taste!");
     getchar();
  }

C-makroprosessori on kuitenkin paljon yksinkertaisempi kuin m4- prosessori. Se ei salli rekursiivisia puheluita, silmukoita tai lausekkeiden arviointia.

TeX ja LaTeX

Lajitteluohjelman TeX makroprosessoria voidaan käyttää käyttäjän määrittämiin laajennuksiin. Makro Paketti LaTeX jonka Leslie Lamport on aiempaa suurempi. Sijasta määritellä uudet makrot määritellään mukaan newcommand .

Seuraava esimerkki näyttää osan CD-kannesta:

 \documentclass[landscape,dvips]{article}
 \usepackage{cd-cover}

 \newcommand{\lied}[4]{
 \small{\textsf{#1}} & \small{\textsf{#2}}
                     & \small{\textsf{#3}}
                     & \small{\textsf{#4}} \\}
 \begin{document}
 %[...]
 \begin{tabular}{l l l l}
 \lied{1} {Neneh Cherry}
          {Woman}
          {04:10}
 \lied{2} {Luz Casal}
          {Piensa en mi}
          {04:27}
 %[...]
 \lied{14}{Axelle Red}
          {Rester femme}
          {05:01}
 \end{tabular}

 \end{document}

MediaWiki

MediaWiki Wiki moottori sisältää makro-prosessori. Tätä varten luotiin sivupohjat ( englanninkielinen malli), jotka voidaan sitten sisällyttää sivun parametrit mukaan lukien.

Katso myös

Huomautukset

  1. Itse asiassa vuosikymmenien ajan käsittelyä ei ole tehty kahdessa peräkkäisessä vaiheessa (ellei käyttäjä nimenomaisesti halua nähdä esikäsittelyn tulosta tuotoksena), vaan yhdellä kertaa käännöksen aikana.