Dies ist der Befehl gpp, der beim kostenlosen Hosting-Anbieter OnWorks mit einer unserer zahlreichen kostenlosen Online-Workstations wie Ubuntu Online, Fedora Online, dem Windows-Online-Emulator oder dem MAC OS-Online-Emulator ausgeführt werden kann
PROGRAMM:
NAME/FUNKTION
GPP – Allgemeiner Präprozessor
ZUSAMMENFASSUNG
gpp [-{o|O} Outfile] [-ICH/include/pfad] [-Dname=val ...]
[-z|+z] [-x] [-m] [-C|-T|-H|-X|-P|-U ... [-M ...]]
[-n|+n] [+c str1 str2] [+s str1 str2 c]
[-C str1] [--nostdinc] [--nocurinc]
[--curdirinclast] [--warninglevel n]
[--includemarker str] [--enthalten Datei]
[im Ordner]
gpp --help
gpp --version
BESCHREIBUNG
GPP ist ein Allzweck-Präprozessor mit anpassbarer Syntax, der für ein breites Spektrum geeignet ist
von Vorverarbeitungsaufgaben. Seine Unabhängigkeit von jeder Programmiersprache macht es noch viel mehr
vielseitiger als cpp, während seine Syntax leichter und flexibler als die von m4 ist.
GPP ist auf alle gängigen Vorverarbeitungsaufgaben ausgerichtet, bei denen CPP nicht geeignet ist und bei denen dies nicht der Fall ist
Es sind sehr anspruchsvolle Funktionen erforderlich. Um gleichermaßen effizient abarbeiten zu können
Textdateien oder Quellcode in verschiedenen Sprachen, die von GPP verwendete Syntax ist vollständig
anpassbar. Besonders ausgefeilt ist der Umgang mit Kommentaren und Strings.
Zunächst versteht GPP nur einen minimalen Satz integrierter Makros, genannt Metamakros.
Diese Metamakros ermöglichen die Definition von Benutzer Makros sowie einige grundlegende Operationen
Es bildet den Kern des Vorverarbeitungssystems, einschließlich bedingter Tests und Arithmetik
Auswertung, Wildcard-Matching (Globbing) und Syntaxspezifikation. Alle Benutzermakros
Definitionen sind global – dh, sie bleiben gültig, bis sie ausdrücklich entfernt werden; Metamakros
kann nicht neu definiert werden. Bei jeder Benutzermakrodefinition verfolgt GPP das entsprechende
Syntaxspezifikation, sodass ein Makro unabhängig von nachfolgenden Anweisungen sicher aufgerufen werden kann
Änderung der Betriebsart.
Neben Makros versteht GPP auch Kommentare und Strings, deren Syntax und Verhalten sich ändern kann
weitestgehend an jeden bestimmten Zweck angepasst werden können. Intern sind Kommentare und Zeichenfolgen
die gleiche Konstruktion, sodass alles, was für Kommentare gilt, auch für Zeichenfolgen gilt.
OPTIONAL
GPP erkennt die folgenden Befehlszeilenschalter und -optionen. Beachten Sie, dass -nostdinc
Optionen -nocurinc, -curdirinclast, -warninglevel und -includemarker ab Version 2.1 und
frühere Versionen sind veraltet und sollten nicht verwendet werden. Verwenden Sie stattdessen die „Long-Option“-Varianten
(--nostdinc, usw.).
-h --help
Drucken Sie eine kurze Hilfenachricht.
--Version
Versionsinformationen drucken.
-o Outfile
Geben Sie eine Datei an, an die alle Ausgaben gesendet werden sollen (standardmäßig wird alles gesendet).
zur Standardausgabe).
-O Outfile
Geben Sie eine Datei an, an die alle Ausgaben gesendet werden sollen. Die Ausgabe wird gleichzeitig an gesendet
stdout.
-I/include/pfad
Geben Sie einen Pfad an, in dem die #einschließen Meta-Makro sucht nach Include-Dateien, wenn dies der Fall ist
sind im aktuellen Verzeichnis nicht vorhanden. Die Standardeinstellung ist / usr / include wenn nein -ich
Option angegeben ist. Es können mehrere -I-Optionen angegeben werden, um in mehreren zu suchen
Verzeichnisse.
-Dname=val
Definieren Sie das Benutzermakro Name als gleich Welle. Dies ist strikt gleichbedeutend mit der Verwendung
#define Metamakro, ermöglicht aber die Definition von Makros aus dem Befehls-
Leitung. Wenn Welle Verweist auf Argumente oder andere Makros, denen es entsprechen sollte
die Syntax des in der Befehlszeile angegebenen Modus. Beginnend mit Version 2.1,
Die Benennung von Makroargumenten ist in der Befehlszeile zulässig. Die Syntax lautet wie folgt:
-DMakro(Arg1,...)=Definition. Die Argumente werden in C-Stil-Syntax angegeben,
ohne Leerzeichen, aber die Definition sollte dennoch der Syntax von entsprechen
Der in der Befehlszeile angegebene Modus.
+z Stellen Sie den Textmodus auf den Unix-Modus (LF-Terminator) ein. Jedes CR-Zeichen in der Eingabe ist
systematisch verworfen. Dies ist die Standardeinstellung unter Unix-Systemen.
-z Stellen Sie den Textmodus auf den DOS-Modus ein (CR-LF-Terminator). In diesem Modus sind alle CR-Zeichen
aus der Eingabe entfernt und alle ausgegebenen LF-Zeichen werden in CR-LF konvertiert. Das
ist die Standardeinstellung, wenn GPP mit der Option WIN_NT kompiliert wird.
-x Aktivieren Sie die Verwendung von #exec Meta-Makro. Seit #exec Enthält die Ausgabe einer
Eine beliebige Shell-Befehlszeile kann eine potenzielle Sicherheitsbedrohung darstellen und ist daher vorhanden
deaktiviert, sofern diese Option nicht angegeben ist.
-m Aktivieren Sie die automatische Modusumschaltung in den CPP-Kompatibilitätsmodus, wenn der Name eines
Die enthaltene Datei endet auf „.h“ oder „.c“. Dadurch ist es möglich, einen C-Header einzubinden
Dateien mit nur geringfügigen Änderungen.
-n Verhindern Sie, dass Zeilenumbrüche oder Leerzeichen aus der Eingabe entfernt werden, wenn
Sie treten am Ende eines Makroaufrufs oder eines Kommentars auf. Standardmäßig, wenn ein Zeilenumbruch erfolgt
oder Leerzeichen bilden das Ende eines Makros oder eines Kommentars, als dessen Teil es analysiert wird
des Makroaufrufs oder Kommentars entfernt und daher aus der Ausgabe entfernt. Verwenden Sie die Option -n
um das letzte Zeichen im Eingabestream beizubehalten, wenn es ein Leerzeichen oder eine neue Zeile war.
Dies ist im CPP- und Prolog-Modus aktiviert.
+n Das Gegenteil von -n. Dies ist die Standardeinstellung in allen Modi außer cpp und Prolog. Notiz
dass +n platziert werden muss nachdem -C oder -P, um eine Wirkung zu erzielen.
-U Arg1 ... Arg9
Benutzerdefinierter Modus. Es werden die folgenden neun Befehlszeilenargumente angenommen
bzw. die Makro-Startsequenz, die Makro-Endsequenz für einen Aufruf ohne
Argumente, die Argumentstartsequenz, das Argumenttrennzeichen, das Argumentende
Sequenz, die Liste der Zeichen, die für den Argumentausgleich gestapelt werden sollen, die Liste der
Zu entstapelnde Zeichen, die Zeichenfolge, die zum Verweisen auf ein Argument verwendet werden soll
Zahl und schließlich das Anführungszeichen (wenn es keines gibt, sollte es eine leere Zeichenfolge sein).
bereitgestellt). Diese Einstellungen gelten sowohl für Benutzermakros als auch für Metamakros, sofern dies nicht der Fall ist
Die Option -M wird verwendet, um andere Einstellungen für Metamakros zu definieren. Siehe den Abschnitt über
Weitere Einzelheiten finden Sie in der Syntaxspezifikation.
-M Arg1 ... Arg7
Benutzerdefinierte Modusspezifikationen für Metamakros. Diese Option kann nur verwendet werden
zusammen mit -M. Es werden die folgenden sieben Befehlszeilenargumente angenommen
bzw. die Makro-Startsequenz, die Makro-Endsequenz für einen Aufruf ohne
Argumente, die Argumentstartsequenz, das Argumenttrennzeichen, das Argumentende
Sequenz, die Liste der Zeichen, die für den Argumentausgleich gestapelt werden sollen, und die Liste der
Zeichen zum Entstapeln. Weitere Einzelheiten finden Sie weiter unten.
(Standard Modus)
Der Standardmodus ist ein vage CPP-ähnlicher Modus, verarbeitet jedoch keine Kommentare und
weist verschiedene Inkompatibilitäten mit cpp auf. Typische Metamakros und Benutzermakros
sieht aus wie das:
#xy definieren
Makro(arg,...)
Dieser Modus entspricht
-U "" "" "(" "," ")" "(" ")" "#" "\\"
-M "#" "\n" " " " "\n" "(" ")"
-C CPP-Kompatibilitätsmodus. Dies ist der Modus, dem das Verhalten von GPP am nächsten kommt
das von cpp. Anders als im Standardmodus erfolgt die Metamakro-Erweiterung nur am
Zeilenanfang, C-Kommentare und Strings werden verstanden. Dieser Modus ist
entspricht
-n -U "" "" "(" "," ")" "(" ")" "#" ""
-M "\n#\w" "\n" " " " "\n" "" ""
+c "/*" "*/" +c "//" "\n" +c "\\\n" ""
+s "\"" "\"" "\\" +s "'" "'" "\\"
-T TeX-ähnlicher Modus. In diesem Modus sehen typische Metamakros und Benutzermakros folgendermaßen aus:
\define{x}{y}
\macro{arg}{...}
Es werden keine Kommentare verstanden. Dieser Modus entspricht
-U "\\" "" "{" "}{" "}" "{" "}" "#" "@"
-H HTML-ähnlicher Modus. In diesem Modus sehen typische Metamakros und Benutzermakros folgendermaßen aus:
<#definiere x|y>
<#macro arg|...>
Es werden keine Kommentare verstanden. Dieser Modus entspricht
-U "<#" ">" "\B" "|" ">" "<" ">" "#" "\\"
-X XHTML-ähnlicher Modus. In diesem Modus sehen typische Metamakros und Benutzermakros folgendermaßen aus:
<#define x|y/>
<#macro arg|.../>
Es werden keine Kommentare verstanden. Dieser Modus entspricht
-U "<#" "/>" "\B" "|" "/>" "<" ">" "#" "\\"
-P Prolog-kompatibler CPP-ähnlicher Modus. Dieser Modus unterscheidet sich vom CPP-Kompatibilitätsmodus
durch seinen Umgang mit Kommentaren und entspricht
-n -U "" "" "(" "," ")" "(" ")" "#" ""
-M "\n#\w" "\n" " " " "\n" "" ""
+ccss "\!o/*" "*/" +ccss "%" "\n" +ccii "\\\n" ""
+s "\"" "\"" "" +s "\!#'" "'" ""
+c str1 str2
Geben Sie Kommentare an. Jedes nicht zitierte Vorkommen von str1 wird als interpretiert
Anfang eines Kommentars. Alle Eingaben bis zum ersten folgenden Vorkommen von str2 werden wir
verworfen werden. Diese Option kann mehrmals verwendet werden, um verschiedene Typen anzugeben
Kommentartrennzeichen. Der optionale Parameter kann angegeben werden, um die zu ändern
Verhalten des Kommentars und, z.B, wandeln Sie es in eine Zeichenfolge um oder ignorieren Sie es unter
unter bestimmten Umständen, siehe unten.
-c str1
Geben Sie Kommentare oder Zeichenfolgen nicht mehr an. Die Kommentar-/String-Spezifikation, deren Anfang
Reihenfolge ist str1 ist entfernt. Dies ist nützlich, um den integrierten Kommentar zu ändern
Spezifikationen eines Standardmodus -- z.B, der CPP-Kompatibilitätsmodus.
+s str1 str2 c
Geben Sie Zeichenfolgen an. Jedes nicht zitierte Vorkommen von str1 wird als interpretiert
Anfang einer Zeichenfolge. Alle Eingaben bis zum ersten folgenden Vorkommen von str2 werden wir
ohne Auswertung ausgegeben werden. Die Trennzeichen selbst werden ausgegeben. Wenn c
ist nicht leer, sein erstes Zeichen wird als verwendet String-Zitat Charakter -- dh herunter ,ein
Charakter, dessen Anwesenheit unmittelbar vor einem Ereignis von str2 verhindert es
Abschluss der Zeichenfolge. Der optionale Parameter kann angegeben werden, um die zu ändern
Verhalten der Saite und z.B, in einen Kommentar umwandeln, Makroauswertung aktivieren
innerhalb der Zeichenfolge oder lassen Sie die Zeichenfolgenspezifikation unter bestimmten Umständen ignorieren
Umstände. Siehe unten.
-s str1
Geben Sie Kommentare oder Zeichenfolgen nicht mehr an. Identisch mit -c.
--enthalten Datei
Prozess Datei bevor im Ordner
--nostdinc
Suchen Sie nicht nach Include-Dateien im Standardverzeichnis /usr/include.
--nocurinc
Suchen Sie nicht nach Include-Dateien im aktuellen Verzeichnis.
--curdirinclast
Suchen Sie nach Include-Dateien im aktuellen Verzeichnis nachdem die von angegebenen Verzeichnisse
-I statt vor ihnen.
--warninglevel n
Warnstufe auf setzen n (0, 1 oder 2). Der Standardwert ist 2 (am ausführlichsten).
--includemarker str
im Auge behalten #einschließen Anweisungen durch Einfügen einer Markierung in den Ausgabestream. Der
Das Format des Markers wird bestimmt durch str, die drei Vorkommen von enthalten muss
der Charakter % (oder äquivalent ?). Das erste Vorkommen wird durch die Zeile ersetzt
Nummer, die zweite mit dem Dateinamen und die dritte mit 1, 2 oder einem Leerzeichen. Wenn das
Wenn die Option im Standard-, CPP- oder Prolog-Modus angegeben wird, tut GPP sein Bestes, um dies sicherzustellen
Stellen Sie sicher, dass die Zeilennummern in der Ausgabe und in der Eingabe identisch sind, indem Sie ein Leerzeichen einfügen
Zeilen anstelle von Definitionen oder Kommentaren.
im Ordner Geben Sie eine Eingabedatei an, aus der GPP seine Eingabe liest. Wenn keine Eingabedatei vorhanden ist
angegeben, wird die Eingabe von der Standardeingabe gelesen.
SYNTAX SPEZIFIKATION
Die Syntax eines Makroaufrufs lautet wie folgt: Er muss mit einer Zeichenfolge beginnen
passend zum Makro Anfang Reihenfolge wie im aktuellen Modus angegeben, wird sofort gefolgt
durch den Namen des Makros, der gültig sein muss Kennzeichnung -- dh, eine Buchstabenfolge,
Ziffern oder Unterstriche („_“). Dem Makronamen muss ein folgen kurz Makro Ende
Reihenfolge wenn das Makro keine Argumente hat oder durch eine von einem initiierte Folge von Argumenten
Argument Anfang Reihenfolge. Die verschiedenen Argumente werden dann durch ein getrennt Argument
Separator, und das Makro endet mit a lange Makro Ende Reihenfolge.
In allen Fällen sind die Parameter des aktuellen Kontexts – dh, die an die übergebenen Argumente
Körper, der ausgewertet wird – kann mit an angesprochen werden Argument Referenz Reihenfolge
gefolgt von einer Ziffer zwischen 1 und 9. Alternativ können Makroparameter benannt werden (siehe
unter). Um außerdem Interferenzen zwischen der GPP-Syntax und dem Inhalt der zu vermeiden
Eingabedatei, a Angebot! Charakter wird gestellt. Das Anführungszeichen kann verwendet werden, um dies zu verhindern
Interpretation eines Makroaufrufs, Kommentars oder einer Zeichenfolge als etwas anderes als einfachen Text. Das Zitat
Das Zeichen „schützt“ das folgende Zeichen und wird bei der Auswertung immer entfernt.
Zwei aufeinanderfolgende Anführungszeichen werden als ein einzelnes Anführungszeichen ausgewertet.
Um schließlich die richtige Argumentabgrenzung zu erleichtern, können bestimmte Zeichen „gestapelt“ werden.
wenn sie in einem Makroargument vorkommen, so dass das Argumenttrennzeichen oder die Makro-Endsequenz ist
werden nicht analysiert, wenn der Argumenttext nicht ausgeglichen ist. Dies ermöglicht die Verschachtelung von Makroaufrufen
ohne Anführungszeichen zu verwenden. Wenn ein unausgewogenes Argument erforderlich ist, zitieren Sie die Zeichen
sollte vor einigen gestapelten Zeichen hinzugefügt werden, um das Gleichgewicht zu gewährleisten.
Die oben beschriebenen Makrokonstruktionssequenzen können für Metamakros und für unterschiedlich sein
Benutzermakros: Dies ist beispielsweise im CPP-Modus der Fall. Beachten Sie, dass Metamakros dies können
Da sie nur bis zu zwei Argumente haben, sind die Abgrenzungsregeln für das zweite Argument etwas unterschiedlich
Im zweiten Argument von sind schlampigere und nicht in Anführungszeichen gesetzte Argumenttrennungssequenzen zulässig
ein Metamakro.
Sofern nicht einer der Standardbetriebsmodi ausgewählt ist, können die oben genannten Syntaxsequenzen gelten
wird entweder in der Befehlszeile angegeben, wobei die Optionen -M bzw. -U für Metadaten verwendet werden.
Makros und Benutzermakros oder innerhalb einer Eingabedatei über #Modus Ziel und #Modus Benutzer meta
Makroaufrufe. In beiden Fällen besteht die Modusbeschreibung aus neun Parametern für den Benutzer
Makrospezifikationen, nämlich die Makro-Startsequenz, die kurze Makro-Endsequenz, die
Argumentstartsequenz, das Argumenttrennzeichen, die lange Makroendsequenz, die Zeichenfolge
Auflistung der zu stapelnden Zeichen, die Zeichenfolge, die die zu entstapelnden Zeichen auflistet, das Argument
Referenzsequenz und schließlich das Anführungszeichen. Wie unten erläutert, sind diese Sequenzen
sollte mit der Syntax von C-Strings bereitgestellt werden; Sie müssen mit einem nicht alphanumerischen Zeichen beginnen
Zeichen, und in den ersten fünf Zeichenfolgen können spezielle Matching-Sequenzen verwendet werden (siehe
unter). Wenn das dem Anführungszeichen entsprechende Argument die leere Zeichenfolge ist, dann
Die Funktionalität des Arguments ist deaktiviert. Für Metamakro-Spezifikationen gibt es nur sieben
Parameter, da die Argumentreferenzsequenz und das Anführungszeichen mit dem geteilt werden
Benutzermakrosyntax.
Die Struktur eines Kommentars/einer Zeichenfolge ist wie folgt: Er muss mit einer Folge von beginnen
Zeichen, die mit den angegebenen Zeichen übereinstimmen Kommentar/Zeichenfolge Anfang Reihenfolge, und endet immer beim ersten
Auftreten der Kommentar/Zeichenfolge Ende Reihenfolge, es sei denn, davor steht eine ungerade Anzahl von
Vorkommnisse der String-Zitat Charakter (sofern ein solches Zeichen angegeben wurde). In
In bestimmten Fällen können Kommentare/Zeichenfolgen angegeben werden, um die Makroauswertung innerhalb des zu ermöglichen
Kommentar/Zeichenfolge; In diesem Fall kann dies der Fall sein, wenn für Makros ein Anführungszeichen definiert wurde
Wird auch verwendet, um zu verhindern, dass der Kommentar/die Zeichenfolge endet, mit dem Unterschied, dass das Makro
Das Anführungszeichen wird immer aus der Ausgabe entfernt, das Anführungszeichen hingegen immer
Ausgang. Beachten Sie auch, dass unter Umständen eine Kommentar-/String-Angabe erfolgen kann
behindert, in diesem Fall wird die Kommentar-/String-Startsequenz einfach ignoriert. Endlich ist es soweit
Es ist möglich, a anzugeben Schnur Warnung Charakter deren Anwesenheit in einem Kommentar/einer Zeichenfolge
führt dazu, dass GPP eine Warnung ausgibt (dies ist nützlich, um nicht abgeschlossene Zeichenfolgen in CPP zu finden).
Modus). Beachten Sie, dass Eingabedateien keine nicht abgeschlossenen Kommentare/Zeichenfolgen enthalten dürfen.
Eine Kommentar-/String-Spezifikation kann aus der Eingabedatei heraus mit deklariert werden #Modus
Kommentar Meta-Makro-Aufruf (oder gleichwertig). #Modus Schnur), in diesem Fall die Anzahl von C
Zeichenfolgen, die als Argumente zur Beschreibung des Kommentars/der Zeichenfolge angegeben werden sollen, können irgendwo dazwischen liegen
zwei und vier: Die ersten beiden Argumente (obligatorisch) sind die Startsequenz und das Ende
Sequenz und kann die speziellen Matching-Sequenzen nutzen (siehe unten). Möglicherweise nicht
Beginnen Sie mit alphanumerischen Zeichen. Das erste Zeichen des dritten Arguments, falls vorhanden
Eins wird als Anführungszeichen für Zeichenfolgen verwendet (verwenden Sie eine leere Zeichenfolge, um das zu deaktivieren
Funktionalität) und das erste Zeichen des vierten Arguments, falls vorhanden, wird verwendet
als String-Warnzeichen. Eine Angabe kann auch über die Befehlszeile erfolgen,
In diesem Fall müssen zwei Argumente vorhanden sein, wenn die Option +c verwendet wird, und drei, wenn die Option +s verwendet wird
.
Das Verhalten eines Kommentars/einer Zeichenfolge wird durch eine dreistellige Modifikatorzeichenfolge angegeben, die
kann als optionales Argument entweder an die +c/+s-Befehlszeilenoptionen oder an die übergeben werden
#Modus Kommentar/#Modus Schnur Metamakros. Wenn keine Modifikatorzeichenfolge angegeben ist, ist dies die Standardeinstellung
Der Wert ist „ccc“ für Kommentare und „sss“ für Zeichenfolgen. Das erste Zeichen entspricht dem
Verhalten innerhalb von Metamakroaufrufen (einschließlich Benutzermakrodefinitionen, da diese darin enthalten sind).
a #define Meta-Makro-Aufruf), das zweite Zeichen entspricht dem Verhalten innerhalb des Benutzer-
Makroparameter, und das dritte Zeichen entspricht dem Verhalten außerhalb eines Makros
Forderung. Jedes dieser Zeichen kann die folgenden Werte annehmen:
i Deaktivieren Sie die Kommentar-/String-Spezifikation.
c Kommentar (weder ausgewertet noch ausgegeben).
s string (der String und seine Trennzeichensequenzen werden unverändert ausgegeben).
q Zeichenfolge in Anführungszeichen (die Zeichenfolge wird unverändert ausgegeben, ohne die Trennzeichensequenzen).
C ausgewerteter Kommentar (Makros werden ausgewertet, die Ausgabe wird jedoch verworfen).
S ausgewerteter String (Makros werden ausgewertet, Trennzeichen werden ausgegeben).
Q ausgewerteter String in Anführungszeichen (Makros werden ausgewertet, Trennzeichen werden nicht ausgegeben).
Wichtiger Hinweis: Jedes Vorkommen einer Kommentar-/String-Startsequenz innerhalb einer anderen
Kommentar/String wird immer ignoriert, auch wenn die Makroauswertung aktiviert ist. Mit anderen Worten,
Kommentare/Strings können nicht verschachtelt werden. Insbesondere der Modifikator „Q“ kann eine praktische Möglichkeit sein
eine Syntax zum vorübergehenden Deaktivieren aller Kommentar- und Zeichenfolgenspezifikationen zu definieren.
Syntaxspezifikationszeichenfolgen sollten immer als C-Zeichenfolgen bereitgestellt werden, unabhängig davon, ob dies der Fall ist
als Argumente für a angegeben #Modus Metamakroaufruf oder in der Befehlszeile einer Unix-Shell. Wenn
Befehlszeilenargumente werden über eine andere Methode als eine Standard-Unix-Shell angegeben
Shell-Verhalten muss emuliert werden -- dh, die umgebenden Anführungszeichen „“ sollten alle entfernt werden
Vorkommen von „\\“ sollten durch einen einzelnen Backslash ersetzt werden, und das Gleiche gilt für „\““.
durch „““ ersetzt. Sequenzen wie „\n“ werden von GPP erkannt und sollten unverändert belassen werden.
Es können spezielle Sequenzen verwendet werden, die zu bestimmten Teilmengen des Zeichensatzes passen. Sie sind von
die Form `\x', wo x ist einer von:
b entspricht einer beliebigen Folge von einem oder mehreren Leerzeichen oder Tabulatorzeichen („\b“ ist identisch mit
` ').
w entspricht einer beliebigen Folge von null oder mehr Leerzeichen oder Tabulatorzeichen.
B entspricht einer beliebigen Folge von einem oder mehreren Leerzeichen, Tabulatoren oder Zeilenumbrüchen.
W entspricht einer beliebigen Folge von null oder mehr Leerzeichen, Tabulatoren oder Zeilenumbrüchen.
a ein alphabetisches Zeichen („a“ bis „z“ und „A“ bis „Z“).
A ein alphabetisches Zeichen oder ein Leerzeichen, Tabulator oder Zeilenumbruch.
# eine Ziffer („0“ bis „9“).
i ein Identifikationszeichen. Der Satz übereinstimmender Zeichen kann mithilfe von angepasst werden
#Modus charset id Befehl. Die Standardeinstellung entspricht alphanumerischen Zeichen und
Unterstriche („a“ bis „z“, „A“ bis „Z“, „0“ bis „9“ und „_“).
t ein Tabulatorzeichen.
n ein Newline-Zeichen.
o ein Operatorzeichen. Der Satz übereinstimmender Zeichen kann mithilfe von angepasst werden
#Modus charset op Befehl. Die Standardeinstellung entspricht allen Zeichen in
„+-*/\^<>=`~:.?@#&!%|“, außer im Prolog-Modus, wo „!“, „%“ und „|“ sind nicht
abgestimmt.
O ein Operatorzeichen oder ein Klammerzeichen. Der Satz zusätzlicher Übereinstimmungen
Zeichen im Vergleich zu „\o“ können mithilfe von angepasst werden #Modus charset von
Befehl. Die Standardeinstellung besteht darin, die Zeichen in „()[]{}“ als Klammern zu verwenden.
Darüber hinaus können alle diese übereinstimmenden Teilmengen außer „\w“ und „\W“ durch Einfügen von a negiert werden
„!“ -- dh, indem Sie „\!“ schreiben.x' statt `\x'.
Beachten Sie ein wichtiges Unterscheidungsmerkmal von Anfang Sequenzen: wenn das erste Zeichen von a
Makro- oder Kommentar-/String-Startsequenz ist „ “ oder eine der oben genannten Spezialsequenzen
wird nicht als Teil der Sequenz selbst angesehen, sondern wird stattdessen als Kontextprüfung verwendet: für
Beispiel: Eine Startsequenz, die mit „\n“ beginnt, passt nur am Anfang einer Zeile, aber
Das passende Newline-Zeichen wird nicht als Teil der Sequenz betrachtet. Ebenso ein Anfang
Sequenz, die mit „“ beginnt, stimmt nur überein, wenn Leerzeichen vorhanden sind, aber die Übereinstimmung
Leerzeichen gelten nicht als Teil der Startsequenz und werden daher an gesendet
Ausgang. Wenn eine Kontextprüfung ganz am Anfang einer Datei (oder allgemeiner) durchgeführt wird
eines auszuwertenden Körpers) ist das Ergebnis dasselbe wie beim Abgleich mit einem Zeilenumbruchzeichen
(Dadurch ist es möglich, dass eine CPP-Modus-Datei mit einem Meta-Makro-Aufruf gestartet wird.)
In Version 2.1 wurden zwei spezielle Syntaxregeln hinzugefügt. Erstens, Argumentreferenzen (#n) sind nein
länger ausgewertet, wenn sie außerhalb von Makroaufrufen und -definitionen liegen. Allerdings sind sie es
darf nicht mehr in einem Aufruf von a erscheinen (sofern nicht durch Anführungszeichen geschützt).
definiertes Benutzermakro; Das aktuelle Verhalten (abwärtskompatibel) besteht darin, sie stillschweigend zu entfernen
aus der Eingabe, wenn das passiert.
Zweitens, wenn die Endsequenz (entweder für Makros oder Kommentare) aus einer einzelnen neuen Zeile besteht
Charakter, und wenn Abgrenzungsregeln zur Bewertung in einem Kontext führen, in dem die endgültige
Fehlt ein Zeilenumbruchzeichen, ignoriert GPP stillschweigend den fehlenden Zeilenumbruch, anstatt zu produzieren
ein Fehler. Die wichtigste Konsequenz ist, dass Meta-Makro-Aufrufe nun auf einfache Weise verschachtelt werden können
im Standard-, CPP- und Prolog-Modus.
BEWERTUNG REGELN
Die Eingaben werden sequentiell gelesen und gemäß den Regeln des aktuellen Modus interpretiert. Alle
Der Eingabetext wird zunächst mit den angegebenen Kommentar-/String-Startsequenzen des abgeglichen
aktuellen Modus (mit Ausnahme derjenigen, die durch den Modifikator „i“ deaktiviert werden), es sei denn, der Körper ist
Ausgewertet ist der Inhalt eines Kommentars/einer Zeichenfolge, dessen Modifikator die Makroauswertung ermöglicht.
Es werden zunächst die zuletzt definierten Kommentar-/String-Angaben geprüft. Wichtig
Hinweis: Kommentare dürfen nicht zwischen dem Namen eines Makros und seinen Argumenten stehen (dadurch
führt zu undefiniertem Verhalten).
Alles, was kein Kommentar/String ist, wird dann mit einem möglichen Meta-Makro-Aufruf abgeglichen.
und wenn auch das fehlschlägt, gegen einen möglichen Benutzermakroaufruf. Der gesamte verbleibende Text wird durchlaufen
Ersetzung von Argumentreferenzsequenzen durch den relevanten Argumenttext (leer, sofern nicht
(der ausgewertete Text ist die Definition eines Benutzermakros) und das Entfernen des Zitats
Zeichen, wenn es eines gibt.
Beachten Sie, dass Meta-Makro-Argumente vor jeder Auswertung an das Meta-Makro übergeben werden
(Das Meta-Makro kann sich jedoch dafür entscheiden, sie auszuwerten, siehe Meta-Makro-Beschreibungen unten).
Im Falle der #Modus Meta-Makro, GPP fügt vorübergehend eine Kommentar-/String-Spezifikation hinzu
um die Erkennung von C-Strings ("...") zu ermöglichen und jegliche Auswertung darin zu verhindern, also nein
Interferenz der Zeichen, die in die C-String-Argumente eingefügt werden #Modus an. Nach der Installation können Sie HEIC-Dateien mit der
Die aktuelle Syntax ist zu befürchten.
Andererseits werden die Argumente eines Benutzermakros systematisch ausgewertet und dann
werden als Kontextparameter an den Makrodefinitionskörper übergeben, der damit ausgewertet wird
Umfeld. Die einzige Ausnahme besteht, wenn die Makrodefinition leer ist
Argumente werden nicht ausgewertet. Beachten Sie, dass GPP vorübergehend in den Modus zurückschaltet, in dem
Das Makro wurde definiert, um es auszuwerten, daher ist es absolut sicher, es zu ändern
Betriebsmodus zwischen der Definition eines Makros und dem Zeitpunkt seines Aufrufs.
Umgekehrt, wenn ein Benutzermakro mit dem aktuellen Modus arbeiten möchte, anstatt mit dem aktuellen
zur Definition verwendet wurde, muss es mit a beginnen #Modus wiederherstellen anrufen und mit a enden #Modus
Speichern Anruf.
Ein Benutzermakro kann mit benannten Argumenten definiert werden (siehe #define Beschreibung unten). Darin
Wenn die Makrodefinition ausgewertet wird, verursacht jeder benannte Parameter a
temporäre virtuelle Benutzermakrodefinition, die erstellt werden soll; Ein solches Makro darf nur aufgerufen werden
ohne Argumente und gibt einfach den Text des entsprechenden Arguments zurück.
Beachten Sie, dass Makros nicht erst dann ausgewertet werden, wenn sie aufgerufen werden
definiert, führt jeder Versuch, ein rekursives Makro aufzurufen, zu undefiniertem Verhalten, außer im
Sehr spezieller Fall, wenn das Makro verwendet wird #undef um sich nach endlich vielen Schleifen selbst zu löschen
Iterationen.
Schließlich tritt ein Sonderfall auf, wenn ein Benutzermakro, dessen Definition keines beinhaltet
Argumente (weder benannte Argumente noch die Argumentreferenzsequenz) werden in a aufgerufen
Modus, in dem die kurze Endsequenz des Benutzermakros leer ist (z.B, cpp oder TeX-Modus). Darin
In diesem Fall wird davon ausgegangen, dass es sich um eine handelt alias Makro: Seine Argumente werden zuerst im aktuellen ausgewertet
Modus wie üblich, aber anstatt als Parameter an die Makrodefinition übergeben zu werden (welche
würde dazu führen, dass sie verworfen würden) werden sie tatsächlich an die Makrodefinition angehängt,
unter Verwendung der Syntaxregeln des Modus, in dem das Makro definiert wurde, und des resultierenden Textes
wird erneut ausgewertet. Es ist daher wichtig zu beachten, dass im Fall eines Makro-Alias
Die Argumente werden tatsächlich zweimal in zwei möglicherweise unterschiedlichen Modi ausgewertet.
META-MAKROS
Diese Makros sind immer vordefiniert. Ihre tatsächliche Aufrufreihenfolge hängt von der aktuellen ab
Modus; hier verwenden wir eine CPP-ähnliche Notation.
#define x y
Dies definiert das Benutzermakro x as y. y kann jede gültige GPP-Eingabe sein und kann z
Beispiele beziehen sich auf andere Makros. x muss ein Bezeichner sein (dh, eine Folge von
alphanumerische Zeichen und „_“), sofern keine benannten Argumente angegeben sind. Wenn x is
bereits definiert ist, wird die vorherige Definition überschrieben. Wenn kein zweites Argument vorhanden ist
gegeben, x wird als Makro definiert, das nichts ausgibt. Weder x noch y sind
bewertet; Die Makrodefinition wird nur ausgewertet, wenn sie aufgerufen wird, nicht wenn sie aufgerufen wird
erklärt.
Es ist auch möglich, die Argumente in einer Makrodefinition zu benennen: in diesem Fall die
Argument x sollte ein Benutzermakroaufruf sein, dessen Argumente alle Bezeichner sind. Diese
Bezeichner werden als Benutzermakros innerhalb der Makrodefinition verfügbar; diese
Virtuelle Makros müssen ohne Argumente aufgerufen und entsprechend ausgewertet werden
Makroparameter.
#defeval x y
Dies verhält sich ähnlich wie #define, aber das zweite Argument y wird ausgewertet
sofort. Da auch Benutzermakrodefinitionen jedes Mal ausgewertet werden
aufgerufen wird, bedeutet dies, dass das Makro y Wird unterziehen XNUMX aufeinanderfolgende Auswertungen. Der
Nützlichkeit von #defeval ist beträchtlich, da es die einzige Möglichkeit ist, etwas zu bewerten
mehr als einmal, was möglicherweise erforderlich ist, um die Bewertung der Argumente eines Meta-
Makro, das normalerweise keine Auswertung durchführt. Da jedoch alle Argumente
Zur Definitionszeit ausgewertete Referenzen werden als Argumente des Hauptteils in verstanden
welche das Makro definiert wird und nicht als Argumente des Makros selbst,
Normalerweise muss man das Anführungszeichen verwenden, um eine sofortige Auswertung zu verhindern
Argumentverweise.
#undef x
Dadurch werden alle vorhandenen Definitionen des Benutzermakros entfernt x.
#ifdef x
Damit beginnt ein bedingter Block. Alles, was folgt, wird nur ausgewertet, wenn die
Kennzeichnung x definiert ist und bis entweder a #else oder eine #endif Aussage erreicht ist.
Beachten Sie jedoch, dass der kommentierte Text weiterhin gründlich gescannt wird, also seine Syntax
muss gültig sein. Es ist insbesondere legal, das zu haben #else or #endif Aussage
Das Beenden des bedingten Blocks erscheint nur als Ergebnis einer Benutzermakroerweiterung
und nicht explizit in der Eingabe.
#ifndef x
Damit beginnt ein bedingter Block. Alles, was folgt, wird nur ausgewertet, wenn die
Kennzeichnung x ist nicht definiert.
#ifeq x y
Damit beginnt ein bedingter Block. Alles, was folgt, wird nur ausgewertet, wenn die
Ergebnisse der Auswertungen von x und y sind identisch mit Zeichenketten. Beliebig
Führende oder nachgestellte Leerzeichen werden beim Vergleich ignoriert. Beachten Sie, dass im CPP-Modus
Jedes nicht in Anführungszeichen stehende Leerzeichen wird als Ende des ersten Arguments verstanden.
Daher ist Vorsicht geboten.
#ifneq x y
Damit beginnt ein bedingter Block. Alles, was folgt, wird nur ausgewertet, wenn die
Ergebnisse der Auswertungen von x und y sind nicht identisch (auch nicht bis zum führenden bzw
nachgestelltes Leerzeichen).
#else Dadurch wird der logische Wert des aktuellen bedingten Blocks umgeschaltet. Was folgt ist
Wird nur dann ausgewertet, wenn die vorherige Eingabe auskommentiert wurde.
#endif Dies beendet einen bedingten Block, der von a gestartet wurde #Wenn... Meta-Makro.
#einschließen Datei
Dadurch öffnet GPP die angegebene Datei, wertet deren Inhalt aus und fügt die Datei ein
resultierenden Text in der aktuellen Ausgabe. Alle definierten Benutzermakros sind weiterhin verfügbar
in der eingebundenen Datei und umgekehrt alle in der eingebundenen Datei definierten Makros
in allem, was folgt, verfügbar sein. Die Include-Datei wird zuerst gesucht
im aktuellen Verzeichnis und dann, falls nicht gefunden, in einem der angegebenen Verzeichnisse
von dem -I Befehlszeilenoption (oder / usr / include wenn kein Verzeichnis angegeben wurde).
Beachten Sie, dass es aus Kompatibilitätsgründen möglich ist, den Dateinamen dazwischen zu setzen
„“ oder <>.
Die Reihenfolge, in der die verschiedenen Verzeichnisse nach Include-Dateien durchsucht werden, ist
betroffen von der -nostdinc, -nocurinc und -Curdirinclast Befehlszeilenoptionen.
Beim Einbinden einer Datei speichert GPP sofort eine Kopie des aktuellen Betriebsmodus
auf den Modusstapel und stellt am Ende des Einschlusses den Betriebsmodus wieder her
Datei. Die eingebundene Datei kann dieses Verhalten außer Kraft setzen, indem sie mit a beginnt #Modus wiederherstellen
anrufen und mit a enden #Modus drücken Forderung. Darüber hinaus, wenn die -m Befehlszeile
Wenn diese Option angegeben ist, wechselt GPP automatisch in den CPP-Kompatibilitätsmodus
beim Einbinden einer Datei, deren Name entweder mit „.c“ oder „.h“ endet.
#exec Befehl
Dies führt dazu, dass GPP die angegebene Befehlszeile ausführt und deren Standard einschließt
Ausgabe im aktuellen Ausgang. Beachten Sie, dass dieses Metamakro aus Sicherheitsgründen deaktiviert ist
deaktiviert, es sei denn, die -x Das Befehlszeilenflag wurde angegeben. Bei Verwendung von #exec ist nicht
zulässig ist, wird eine Warnmeldung ausgegeben und die Ausgabe bleibt leer. Notiere dass der
Die angegebene Befehlszeile wird vor der Ausführung ausgewertet und ermöglicht so die Verwendung von
Makros in der Befehlszeile. Die Ausgabe des Befehls ist jedoch wörtlich enthalten
und nicht ausgewertet. Wenn die Ausgabe ausgewertet werden soll, müssen Sie verwenden #defeval
(siehe oben), um eine Doppelbewertung zu verursachen.
#eval ausdr
Die #eval Meta-Makro versucht auszuwerten ausdr Zuerst durch Erweitern von Makros (normal
GPP-Auswertung) und dann durch Durchführung einer arithmetischen Auswertung und/oder eines Platzhalters
passend. Die Syntax und die Operatorpriorität für arithmetische Ausdrücke sind:
wie in C; Die einzigen fehlenden Operatoren sind <<, >>, ?: und die Zuweisung
Operatoren.
Der Platzhalterabgleich im POSIX-Stil („Globbing“) ist nur unter POSIX verfügbar
Implementierungen und kann mit dem Operator =~ aufgerufen werden. Kurz gesagt, ein „?“ Streichhölzer
jedes einzelne Zeichen, ein „*“ entspricht einer beliebigen Zeichenfolge (einschließlich der leeren Zeichenfolge) und
„[...]“ entspricht einem der in Klammern eingeschlossenen Zeichen. Eine '[...]'-Klasse ist
ergänzt, wenn das erste Zeichen in den Klammern „!“ ist. Die Charaktere in a
Die Klasse „[...]“ kann auch als Bereich mit dem Zeichen „-“ angegeben werden – z.B,
„[FN]“ entspricht „[FGHIJKLMN]“.
Wenn dem Ergebnis kein numerischer Wert zugeordnet werden kann, lautet der zurückgegebene Text einfach
das Ergebnis der Makroerweiterung ohne arithmetische Auswertung. Nur
Ausnahmen von dieser Regel sind die Vergleichsoperatoren ==, !=, <, >, <= und >=
Wenn eine der Seiten keine Zahl ergibt, wird ein Zeichenfolgenvergleich durchgeführt
stattdessen (ohne Berücksichtigung nachfolgender und führender Leerzeichen). Darüber hinaus ist die Länge(...)
Der arithmetische Operator gibt die Länge seines ausgewerteten Arguments in Zeichen zurück.
Innerhalb arithmetischer Ausdrücke, die definiert(...) Es gibt auch ein spezielles Benutzermakro
verfügbar: Es benötigt nur ein Argument, das nicht ausgewertet wird, und gibt 1 zurück, wenn dies der Fall ist
ist der Name eines Benutzermakros und andernfalls 0.
#wenn ausdr
Dieses Metamakro ruft den Arithmetik-/Globing-Evaluator auf die gleiche Weise auf wie
#eval und vergleicht das Ergebnis der Auswertung mit der Zeichenfolge „0“, um a zu beginnen
bedingter Block. Beachten Sie insbesondere, dass der logische Wert von ausdr ist immer wahr
wenn es nicht zu einer Zahl ausgewertet werden kann.
#elif ausdr
Dieses Metamakro kann verwendet werden, um Verschachtelungen zu vermeiden #wenn Gesundheitsproblemen. #wenn ... #elif ...
#endif entspricht #wenn ... #else #wenn ... #endif #endif.
#Modus Stichwort ...
Dieses Metamakro steuert den Betriebsmodus von GPP. Unten finden Sie eine Liste #Modus
Befehle.
#Leitung Dieses Metamakro ergibt die Zeilennummer der aktuellen Eingabedatei.
#Datei Dieses Metamakro ergibt beim Erscheinen den Dateinamen der aktuellen Eingabedatei
in der Befehlszeile oder im Argument to #einschließen. Wenn GPP seine Eingabe liest
also von stdin #Datei ergibt „stdin“.
#Datum fmt
Dieses Metamakro wertet das aktuelle Datum und die aktuelle Uhrzeit aus, wie sie von formatiert wurden
angegebene Formatzeichenfolge fmt. Siehe Abschnitt DATUM UND ZEIT- UMWANDLUNG SPEZIFIKATIONEN
unten mit.
#Error msg
Dieses Metamakro verursacht eine Fehlermeldung mit dem aktuellen Dateinamen und der Zeilennummer.
und mit dem Text msg, um auf dem Standardfehlergerät gedruckt zu werden. Anschließend
Die Bearbeitung wird dann abgebrochen.
#Warnung msg
Dieses Metamakro verursacht eine Warnmeldung mit dem aktuellen Dateinamen und der Zeilennummer.
und mit dem Text msg, um auf dem Standardfehlergerät gedruckt zu werden. Anschließend
Die Verarbeitung wird dann fortgesetzt.
Der Schlüssel zur Flexibilität von GPP ist die #Modus Meta-Makro. Sein erstes Argument ist immer eines von
eine Liste der verfügbaren Schlüsselwörter (siehe unten); sein zweites Argument ist immer eine Folge von
durch Leerzeichen getrennte Wörter. Außer möglicherweise dem ersten von ihnen, jedem dieser Wörter
ist immer ein Trennzeichen oder Syntaxspezifizierer und sollte als durch Trennzeichen getrennte C-Zeichenfolge bereitgestellt werden
durch doppelte Anführungszeichen (" "). Die verschiedenen speziellen Matching-Sequenzen, die im Abschnitt aufgeführt sind
Syntaxspezifikationen sind verfügbar. Beliebig #Modus Der Befehl wird in einem Modus analysiert, in dem „…“ steht
wird als Zeichenfolge im C-Stil verstanden, daher ist es sicher, jedes beliebige Zeichen darin einzufügen
Saiten. Beachten Sie auch, dass das erste Argument von #Modus (das Schlüsselwort) wird nie ausgewertet,
während das zweite Argument ausgewertet wird (außer natürlich für den Inhalt von C-Strings),
sodass die Syntaxspezifikation als Ergebnis einer Makroauswertung erhalten werden kann.
Die zur Verfügung #Modus Befehle sind:
#Modus Speichern / #Modus drücken
Schieben Sie die aktuelle Modusspezifikation auf den Modusstapel.
#Modus wiederherstellen / #Modus Pop
Pop-Modus-Spezifikation aus dem Modus-Stack.
#Modus Standard Name
Wählen Sie einen der Standardmodi. Das einzige Argument muss eines der folgenden sein: default
(Standardmodus); cpp, C (CPP-Modus); tex, TeX (Tex-Modus); html, HTML (HTML-Modus);
xhtml, XHTML (xhtml-Modus); prolog, Prolog (Prolog-Modus). Der Modusname muss sein
direkt angegeben, nicht als C-String.
#Modus Benutzer "s1" ... "s9"
Geben Sie die Syntax des Benutzermakros an. Die 9 Argumente, allesamt C-Strings, sind der Modus
Spezifikation für Benutzermakros (siehe die Befehlszeilenoption -U und den Abschnitt über
Syntaxspezifikation). Die Metamakro-Spezifikation ist nicht betroffen.
#Modus Ziel {Benutzer | "s1" ... "s7"}
Geben Sie die Metamakro-Syntax an. Entweder ist das einzige Argument Benutzer (nicht als String) und
Die Spezifikationen des Benutzermakromodus werden in den Metamakromodus kopiert
Spezifikationen, oder es müssen sieben String-Argumente vorhanden sein, deren Bedeutung die ist
dasselbe wie für die Befehlszeilenoption -M (siehe Abschnitt zur Syntaxspezifikation).
#Modus Angebot! ["C"]
Ohne Argument oder „“ als Argument wird die Angabe des Anführungszeichens entfernt und
deaktiviert die Angebotsfunktion. Mit einem String-Argument, dem ersten Zeichen
des Strings wird als neues Anführungszeichen verwendet. Das Anführungszeichen kann sein
weder alphanumerisch noch „_“, noch kann es sich um eine der speziellen passenden Sequenzen handeln.
#Modus Kommentar [xxx] "Anfang" "Ende" ["C" ["C"]]
Fügen Sie eine Kommentarspezifikation hinzu. Optional ein erstes Argument bestehend aus drei
Zeichen, die nicht in „“ eingeschlossen sind, können zur Angabe eines Kommentar-/String-Modifikators verwendet werden
(siehe Abschnitt zur Syntaxspezifikation). Der Standardmodifikator ist ccc. Die erste
Zwei String-Argumente werden jeweils als Kommentar-Start- und -Endsequenzen verwendet. Der
Das dritte String-Argument ist optional und kann zur Angabe eines String-Anführungszeichens verwendet werden
Charakter. (Wenn es „“ ist, ist die Funktionalität deaktiviert.) Die vierte Zeichenfolge
Das Argument ist optional und kann verwendet werden, um eine Warnung zur Zeichenfolgenbegrenzung anzugeben
Charakter. (Wenn es „“ ist, ist die Funktionalität deaktiviert.)
#Modus Schnur [xxx] "Anfang" "Ende" ["C" ["C"]]
Fügen Sie eine Zeichenfolgenspezifikation hinzu. Identisch mit #Modus Kommentar außer dass die Standardeinstellung
Modifikator ist sss.
#Modus kein Kommentar / #Modus nostring ["Start"]
Ohne Argument alle Kommentar-/String-Spezifikationen entfernen. Mit einer Saite
Argument, löschen Sie die Kommentar-/String-Spezifikation, deren Startsequenz die ist
Argument.
#Modus bewahren { on | WOW! | 1 | 0 }
Entspricht dem -n Befehlszeilenschalter. Wenn das Argument ist on or 1, jede neue Zeile
oder ein Leerzeichen, das einen Makroaufruf beendet, oder ein Kommentar/eine Zeichenfolge bleibt im
Eingabestrom zur weiteren Verarbeitung. Wenn das Argument ist WOW! or 0 Diese Funktion ist
behindert.
#Modus charset { id | op | von } "string"
Geben Sie die Zeichensätze an, die für den Abgleich der Sonderzeichen \o, \O und \i verwendet werden sollen
Sequenzen. Das erste Argument muss eines von sein id (die Menge, die mit \i übereinstimmt), op (Das
Satz, der mit \o übereinstimmt) oder von (die von \O gefundene Menge zusätzlich zu der von
\Ö). "string" ist ein C-String, der alle Zeichen auflistet, die in den Satz eingefügt werden sollen. Es kann
enthalten nur die speziellen passenden Sequenzen \a, \A, \b, \B und \# (die anderen
Sequenzen und die negierten Sequenzen sind nicht erlaubt). Wenn ein „-“ gefunden wird
zwischen zwei Nicht-Sonderzeichen fügt alle Zeichen dazwischen hinzu (z. B. „AZ“
entspricht allen Großbuchstaben). Entweder „-“ im übereinstimmenden Satz haben
Platzieren Sie es an der ersten oder letzten Position oder neben einer \x-Sequenz.
DATUM UND ZEIT- UMWANDLUNG SPEZIFIKATIONEN
In der Formatzeichenfolge platzierte normale Zeichen werden ohne Konvertierung kopiert.
Konvertierungsspezifizierer werden durch ein „%“-Zeichen eingeleitet und wie folgt ersetzt:
%a Der abgekürzte Wochentagsname entsprechend dem aktuellen Gebietsschema.
%A Der vollständige Wochentagsname gemäß dem aktuellen Gebietsschema.
%b Der abgekürzte Monatsname entsprechend dem aktuellen Gebietsschema.
%B Der vollständige Monatsname gemäß dem aktuellen Gebietsschema.
%c Die bevorzugte Datums- und Uhrzeitdarstellung für das aktuelle Gebietsschema.
%d Der Tag des Monats als Dezimalzahl (Bereich 01 bis 31).
%F Entspricht %Y-%m-%d (dem ISO 8601-Datumsformat).
%H Die Stunde als Dezimalzahl im 24-Stunden-Format (Bereich 00 bis 23).
%I Die Stunde als Dezimalzahl im 12-Stunden-Format (Bereich 01 bis 12).
%j Der Tag des Jahres als Dezimalzahl (Bereich 001 bis 366).
%m Der Monat als Dezimalzahl (Bereich 01 bis 12).
%M Die Minute als Dezimalzahl (Bereich 00 bis 59).
%p Entweder „AM“ oder „PM“ entsprechend dem angegebenen Zeitwert oder dem entsprechenden
Zeichenfolgen für das aktuelle Gebietsschema. Mittag wird als „pm“ und Mitternacht als „am“ behandelt.
%R Die Zeit im 24-Stunden-Format (%H:%M).
%S Die Sekunde als Dezimalzahl (Bereich 00 bis 61).
%U Die Wochennummer des aktuellen Jahres als Dezimalzahl, Bereich 00 bis 53,
beginnend mit dem ersten Sonntag als erstem Tag der Woche 01.
%w Der Wochentag als Dezimalzahl, Bereich 0 bis 6, Sonntag ist 0.
%W Die Wochennummer des aktuellen Jahres als Dezimalzahl, Bereich 00 bis 53,
beginnend mit dem ersten Montag als erstem Tag der Woche 01.
%x Die bevorzugte Datumsdarstellung für das aktuelle Gebietsschema ohne Uhrzeit.
%X Die bevorzugte Zeitdarstellung für das aktuelle Gebietsschema ohne Datum.
%y Das Jahr als Dezimalzahl ohne Jahrhundertangabe (Bereich 00 bis 99).
%Y Das Jahr als Dezimalzahl inklusive Jahrhundert.
%Z Die Zeitzone oder der Name oder die Abkürzung.
%% Ein wörtliches „%“-Zeichen.
Abhängig vom C-Compiler und der Bibliothek, die zum Kompilieren von GPP verwendet werden, kann es zu mehr Konvertierungen kommen
Spezifizierer verfügbar. Konsultieren Sie dazu die Dokumentation Ihres Compilers strftime () Funktion.
Beachten Sie jedoch, dass alle oben nicht aufgeführten Konvertierungsspezifizierer möglicherweise nicht übertragbar sind
Installationen von GPP.
Beispiele:
Hier ist ein einfaches selbsterklärendes Beispiel im Standard- oder CPP-Modus:
#define FOO Das ist
#define BAR eine Nachricht.
#concat #1 #2 definieren
concat(FOO,BAR)
#ifeq (concat(foo,bar)) (foo bar)
Dies wird ausgegeben.
#else
Dies wird nicht ausgegeben.
#endif
Mithilfe der Argumentbenennung kann die concat Makro könnte alternativ definiert werden als
#define concat(x,y) xy
Im TeX-Modus und unter Verwendung der Argumentbenennung wird das gleiche Beispiel zu:
\define{FOO}{Das ist}
\define{BAR}{eine Nachricht.}
\define{\concat{x}{y}}{\x \y}
\concat{\FOO}{\BAR}
\ifeq{\concat{foo}{bar}}{foo bar}
Dies wird ausgegeben.
\anders
Dies wird nicht ausgegeben.
\endif
Im HTML-Modus und ohne Argumentbenennung erhält man ähnlich:
<#define FOO|Das ist>
<#define BAR|eine Nachricht.>
<#define concat|#1 #2>
<#concat <#FOO>|<#BAR>>
<#ifeq <#concat foo|bar>|foo bar>
Dies wird ausgegeben.
<#else>
Dies wird nicht ausgegeben.
<#endif>
Das folgende Beispiel (im Standardmodus) veranschaulicht die Verwendung des Anführungszeichens:
#define FOO Das ist \
eine mehrzeilige Definition.
#define BLAH(x) Mein Argument ist x
BLAH(urf)
\BLAH(urf)
Beachten Sie, dass die mehrzeilige Definition auch im CPP- und Prolog-Modus gültig ist
Fehlen eines Anführungszeichens, da „\“ gefolgt von einem Zeilenumbruch dann als a interpretiert wird
kommentieren und verwerfen.
Im CPP-Modus werden C-Strings und Kommentare als solche verstanden, wie im Beispiel dargestellt
folgendes Beispiel:
#define BLAH foo
BLAH "BLAH" /* BLAH */
'Es ist ein /*string*/ !'
Der Hauptunterschied zwischen dem Prolog-Modus und dem CPP-Modus besteht in der Handhabung von Zeichenfolgen und
Kommentare: In Prolog darf ein „...“-String nicht unmittelbar nach einer Ziffer beginnen und ein /*...*/
Der Kommentar darf nicht unmittelbar nach einem Operatorzeichen beginnen. Darüber hinaus sind Kommentare
werden nicht aus der Ausgabe entfernt, es sei denn, sie treten in einem #Befehl auf.
Die Unterschiede zwischen dem CPP-Modus und dem Standardmodus sind tiefer: im Standardmodus #Befehle
können an einer beliebigen Stelle beginnen, während sie im CPP-Modus am Anfang einer Zeile stehen müssen; der Standard
Der Modus kennt keine Kommentare und Zeichenfolgen, verfügt jedoch über ein Anführungszeichen ('\'), während cpp
Der Modus verfügt über umfangreiche Kommentar-/String-Spezifikationen, aber kein Anführungszeichen. Darüber hinaus ist die
Argumente für Metamakros müssen im Standardmodus korrekt in Klammern gesetzt werden, während dies nicht der Fall ist
Die Prüfung erfolgt im CPP-Modus.
Dadurch ist es einfacher, Metamakroaufrufe im Standardmodus zu verschachteln als im CPP-Modus. Für
Betrachten Sie beispielsweise die folgende HTML-Modus-Eingabe, die die Verfügbarkeit testet
#exec Befehl:
<#ifeq <#exec echo blah>|blah
> #exec erlaubt <#else> #exec nicht erlaubt <#endif>
Es gibt kein Äquivalent zum CPP-Modus, während er im Standardmodus leicht übersetzt werden kann als
#ifeq (#exec echo blah
) (bla
)
\#exec erlaubt
#else
\#exec nicht erlaubt
#endif
Um Metamakroaufrufe im CPP-Modus zu verschachteln, muss der Modus geändert werden
Beschreibung, entweder durch Ändern der Meta-Makro-Aufrufsyntax oder eleganter durch Definieren
eine stille Zeichenfolge und unter Verwendung der Tatsache, dass der Kontext am Anfang einer ausgewertet wird
string ist ein Zeilenumbruchzeichen:
#mode string QQQ „$“ „$“
#ifeq $#exec echo bla
$ $bla
$
\#exec erlaubt
#else
\#exec nicht erlaubt
#endif
Beachten Sie jedoch, dass Kommentare/Zeichenfolgen nicht verschachtelt werden können („…“ innerhalb von $...$ würde gehen
unentdeckt), daher muss man vorsichtig sein, was in eine solche Stille aufgenommen werden soll
ausgewertete Zeichenfolge. In diesem Beispiel wird die in Version 2.1 eingeführte lose Meta-Makro-Verschachtelung verwendet
ermöglicht die Verwendung der folgenden einfacheren Version:
#ifeq blah #exec echo -n blah
\#exec erlaubt
#else
\#exec nicht erlaubt
#endif
Denken Sie daran, dass Makros ohne Argumente tatsächlich als Aliase verstanden werden, wenn sie es sind
wird mit Argumenten aufgerufen, wie das folgende Beispiel zeigt (Standard- oder CPP-Modus):
#define DUP(x) xx
#define FOO und ich sagte: DUP
FOO(bla)
Die Nützlichkeit der #defeval Meta-Makro wird durch das folgende Beispiel im HTML-Modus gezeigt:
<#define APPLY|<#defeval TEMP|<\##1 \#1>><#TEMP #2>>
<#define <#foo x>|<#x> und <#x>>
<#APPLY foo|BLAH>
Der Grund warum #defeval erforderlich ist, dass, da alles in einem einzigen Durchgang ausgewertet wird,
Die Eingabe, die zum gewünschten Makroaufruf führt, muss zunächst von einem generiert werden
Auswertung der an APPLY übergebenen Argumente vor der zweiten Auswertung.
Um dieses Beispiel im Standardmodus zu übersetzen, muss man auf Klammern der Reihe nach zurückgreifen
um den #defeval-Aufruf innerhalb der Definition von APPLY zu verschachteln, muss dies jedoch ohne tun
Ausgabe der Klammern. Die einfachste Lösung ist
#define BALANCE(x) x
#define APPLY(f,v) BALANCE(#defeval TEMP f
TEMP(v))
#define foo(x) x und x
ANWENDEN(\foo,BLAH)
Wie oben erläutert, basiert die einfachste Version im CPP-Modus auf der Definition einer stillen Auswertung
Zeichenfolge, die die Rolle des BALANCE-Makros übernimmt.
Das folgende Beispiel (Standard- oder CPP-Modus) demonstriert die arithmetische Auswertung:
#define x 4
Die Antwort ist:
#eval x*x + 2*(16-x) + 1998%x
#if definiert(x)&&!(3*x+5>17)
Dies sollte ausgegeben werden.
#endif
Zum Abschluss finden Sie hier einige Beispiele für die Modusumschaltung. Das folgende Beispiel ist
selbsterklärend (Start im Standardmodus):
#Modus-Push
#define f(x) xx
#mode Standardtext
\f{bla}
\mode{string}{"$" "$"}
\mode{comment}{"/*" "*/"}
$\f{urf}$ /* blah */
\define{FOO}{bar/* und einige mehr */}
\mode{pop}
f($FOO$)
Ein gutes Beispiel dafür, wo ein benutzerdefinierter Modus nützlich ist, ist die GPP-Quelle dieses Dokuments
(verfügbar mit der Quellcodeverteilung von GPP).
Eine weitere interessante Anwendung ist das selektive Erzwingen der Auswertung von Makros in C-Strings
im CPP-Modus. Betrachten Sie beispielsweise die folgende Eingabe:
#define blah(x) „und er sagte: x“
bla(foo)
Offensichtlich würde man den Parameter wollen x innerhalb der Zeichenfolge erweitert werden soll. Es gibt
Es gibt mehrere Möglichkeiten, dieses Problem zu umgehen:
#Modus-Push
#mode nostring „\““
#define blah(x) „und er sagte: x“
#mode pop
#mode Zitat „`“
#define blah(x) `"und er sagte: x`"
#mode string QQQ „$$“ „$$“
#define blah(x) $$"und er sagte: x"$$
Die erste Methode ist sehr natürlich, hat aber den Nachteil, dass sie langwierig und langwierig ist
Neutralisierung der String-Semantik, so dass eine nicht ausgewertete Instanz von 'x' in der
string oder ein Vorkommen von „/*“ wäre ohne weitere Rückgriffe unmöglich
Verrenkungen.
Die zweite Methode ist aufgrund der lokalen Präsenz eines Zitats etwas effizienter
Charakter macht es einfacher zu kontrollieren, was ausgewertet wird und was nicht, hat aber die
Nachteil, dass es manchmal unmöglich ist, ein vernünftiges Zitatzeichen ohne zu finden
Sie müssen entweder die Quelldatei erheblich ändern oder sie in eine einschließen #Modus Push Pop
bauen. Beispielsweise müsste jedes Vorkommen von „/*“ in der Zeichenfolge in Anführungszeichen gesetzt werden.
Die letzte Methode demonstriert die Effizienz ausgewerteter Zeichenfolgen im Kontext von
Selektive Auswertung: Da Kommentare/Strings nicht verschachtelt werden können, ist jedes Vorkommen von „““ oder
„/*“ innerhalb von „$$“ wird wie erwartet nur innerhalb einer Zeichenfolge als einfacher Text ausgegeben
Die Makroauswertung ist aktiviert. Beachten Sie auch, dass es viel mehr Freiheit bei der Wahl eines gibt
String-Trennzeichen als bei der Wahl eines Anführungszeichens.
Ab Version 2.1 können Metamakroaufrufe effizienter in der Standardeinstellung cpp verschachtelt werden
und Prolog-Modi. Dies macht es einfach, eine Benutzerversion eines Metamakros zu erstellen oder zu erstellen
Erhöhen Sie einen Zähler:
#define myeval #eval #1
#define x 1
#defeval x #eval x+1
Fortgeschritten Beispiele:
Hier sind einige Beispiele für fortgeschrittene Konstruktionen mit GPP. Sie neigen dazu, ziemlich umständlich zu sein
und sollte als Beweis für die Grenzen von GPP betrachtet werden.
Das erste Beispiel ist ein rekursives Makro. Das Hauptproblem besteht darin, dass (da GPP auswertet
alles) Ein rekursives Makro muss sehr sorgfältig auf die Art und Weise der Rekursion achten
beendet, um undefiniertes Verhalten zu vermeiden (meistens stürzt GPP einfach ab).
Insbesondere unter Berufung auf a #if/#else/#endif Ein Konstrukt zum Beenden der Rekursion ist nicht möglich
und führt zu einer Endlosschleife, da GPP Benutzermakroaufrufe auch in der scannt
nicht ausgewerteter Zweig des bedingten Blocks. Eine sichere Vorgehensweise ist zum Beispiel als
folgt (wir geben das Beispiel im TeX-Modus):
\define{Countdown}{
\if{#1}
#1...
\define{loop}{\countdown}
\anders
Fertig.
\define{Schleife}{}
\endif
\loop{\eval{#1-1}}
}
\countdown{10}
Ein weiteres Beispiel im CPP-Modus:
#mode string QQQ „$“ „$“
#Dreieck definieren(x,y) y \
$#if Länge(y)
$#define iter$ $#endif
$ iter(x,*y)
Dreieck(20)
Das Folgende ist ein (leider sehr schwacher) Versuch zur funktionalen Umsetzung
Abstraktion in GPP (im Standardmodus). Dieses Beispiel verstehen und warum es nicht gemacht werden kann
Viel einfacher ist eine Übung, die dem neugierigen Leser überlassen bleibt.
#mode string „`“ „`“ „\\“
#define ASIS(x) x
#define SILENT(x) ASIS()
#define EVAL(x,f,v) SILENT(
#mode string QQQ „`“ „`“ „\\“
#defeval TEMP0 x
#defeval TEMP1 (
\#define \TEMP2(TEMP0) f
)
TEMP1
)TEMP2(v)
#define LAMBDA(x,f,v) SILENT(
#ifneq (v) ()
#define TEMP3(a,b,c) EVAL(a,b,c)
#else
#define TEMP3(a,b,c) \LAMBDA(a,b)
#endif
)TEMP3(x,f,v)
#define EVALAMBDA(x,y) SILENT(
#defeval TEMP4 x
#defeval TEMP5 y
)
#define APPLY(f,v) SILENT(
#defeval TEMP6 ASIS(\EVA)f
TEMP6
)EVAL(TEMP4,TEMP5,v)
Dies führt zu folgenden Ergebnissen:
LAMBDA(z,z+z)
=> LAMBDA(z,z+z)
LAMBDA(z,z+z,2)
=> 2+2
#define f LAMBDA(y,y*y)
f
=> LAMBDA(y,y*y)
APPLY(f,bla)
=> bla*bla
ANWENDEN(LAMBDA(t,tt),(tt))
=> (tt) (tt)
LAMBDA(x,APPLY(f,(x+x)),urf)
=> (urf+urf)*(urf+urf)
APPLY(APPLY(LAMBDA(x,LAMBDA(y,x*y)),foo),bar)
=> foo*bar
#define test LAMBDA(y,`#ifeq y urf
y ist urf#else
y ist nicht urf#endif
`)
ANWENDEN(test,urf)
=> urf ist urf
ANWENDEN(test,foo)
=> foo ist nicht urf
Verwenden Sie GPP online über die Dienste von onworks.net