Was ist die Magie hinter Escape (\) Zeichen
-
11-07-2019 - |
Frage
Wie funktioniert das C / C ++ Compiler die Escape-Zeichen manipulieren [ "\"] im Quellcode? Wie wird Compiler Grammatik für die Verarbeitung dieses Zeichen geschrieben? Was ist der Compiler tun, nachdem das Zeichen zu begegnen?
Lösung
Die meisten Compiler werden in Teile aufgeteilt: der Compiler-Frontend einen Lexer genannt wird oder ein Scanner. Dieser Teil des Compiler liest die tatsächlichen Zeichen und schafft Token. Es hat eine Zustandsmaschine, die beim Anblick ein Escape-Zeichens entscheidet, ob es echt ist (zum Beispiel, wenn es in einem String erscheint) oder es modifiziert, um das nächste Zeichen. Das Token ausgegeben wird dementsprechend als Escape-Zeichen oder ein anderes Zeichen (wie ein Register oder eine neue Zeile), um zum nächsten Teil des Compilers ( der Parser ). Die Zustandsmaschine kann mehrere Zeichen in einem Token.
Andere Tipps
Eine interessante Anmerkung zu diesem Thema On Trusting Vertrauen [PDF-Link] .
Das Papier beschreibt eine Möglichkeit, ein Compiler dieses Problem genau umgehen konnte, zeigt, wie die c-geschrieben-in-C-Compiler keine explizite Übersetzung der Codes in ASCII-Wert haben; und wie ein neuen Escape-Code in die Compiler Bootstrap, so dass das Verständnis des ASCII-Wertes für den neuen Code ist auch implizit.
Es ist allgemein entkommt die folgenden Zeichen:
- In einem Stringliteral oder Zeichenliteral, bedeutet es das nächste Zeichen zu entkommen.
\a
bedeutet ‚Alarm‘ (blinkt das Terminal, Piepen oder was auch immer),\n
bedeutet ‚Zeilenvorschub‘,\xNUM
bedeutet eine Hexadezimalzahl zum Beispiel. - Wenn es scheint, als das letzte sichtbare Zeichen vor einem Newline, ob innerhalb eines Strings oder nicht, es wirkt als ein Zeilenfortsetzungs (und sogar innerhalb einer Zeile weiter Kommentars!): Das folgende Newline-Zeichen wird ignoriert, und die nächste Zeile mit der aktuellen Zeile zusammengefasst.
Escape-Zeichen mit einem folgenden Zeichen (wie \n
) ist ein einzelne Zeichen für C-Compiler - Scanner präsentiert es als Zeichen Token Parser, so gibt es keine Notwendigkeit, in speziellen Syntaxregeln in Parsern für Escape-Zeichen