Was macht die folgende Zeile?
%Vor%Und was ist mit der Erweiterung?
Gemäß dem Standard:
§ 16.4.3:
Eine Richtlinie für die Vorverarbeitung des Formulars
%Vor%bewirkt, dass sich die Implementierung so verhält, als ob die folgende Sequenz von Quellzeilen mit einer Quellzeile beginnt Diese hat eine Zeilennummer, die durch die Ziffernfolge angegeben wird (interpretiert als Dezimalzahl). Wenn die Ziffer Sequenz gibt null oder eine Zahl größer als 2147483647 an, das Verhalten ist nicht definiert.
§ 16.4.4:
Eine Richtlinie für die Vorverarbeitung des Formulars
%Vor%setzt die angenommene Zeilennummer ähnlich und ändert den angenommenen Namen der Quelldatei als Inhalt des Zeichenkettenliterals.
§ 16.4.5:
Eine Richtlinie für die Vorverarbeitung des Formulars
%Vor%(das nicht mit einem der beiden vorherigen Formulare übereinstimmt) ist zulässig. Die Vorverarbeitungstoken nach der Zeile auf der Direktive werden genauso wie im normalen Text verarbeitet (jeder Bezeichner ist derzeit als Makroname definiert) ersetzt durch seine Ersatzliste von Vorverarbeitungstoken). Wenn die Richtlinie nach allen Ersetzungen resultiert stimmt nicht mit einer der beiden vorherigen Formen überein, das Verhalten ist nicht definiert; Andernfalls wird das Ergebnis verarbeitet wie passend.
Die .y
-Erweiterung ist genau das, was der Autor gewählt hat, um vielleicht zu zeigen, dass es sich um eine YACC-Datei handelt (das Wort "Grammatik" weist ebenfalls darauf hin, obwohl es nur eine Vermutung ist).
Es gibt einfach an, dass die aktuelle Codezeile aus Zeile 25 von CSSGrammar.y
stammt, einer YACC-artigen Grammatikdatei, in der dieser Code generiert wurde.
Dies kann von Debuggern verwendet werden, um im Gegensatz zu dem generierten Code in die Grammatik selbst zu treten.
#line
ändert die Berichtsposition für den Compiler und wird von einer Codeerzeugungssoftware verwendet, um dem Programmierer zu helfen, das Problem in der ursprünglichen Quelle zu identifizieren. Es kann von jedem verwendet werden, um die Fehlerberichterstattung umzuleiten, um informativer zu sein.
Zum Beispiel erzeugt Ihr Parser eine CSSGrammar.cpp-Datei say, die vom C ++ - Compiler kompiliert wird und C ++ - Snippets enthält. Eine #line 25 "CSSGrammar.y"
-Direktive weist den C ++ - Compiler an, diesen bestimmten Punkt in der Datei so zu behandeln es ist die Zeilennummer 25 von CSSGrammar.y
Der Compiler wird fortfahren, nachfolgende Zeilen zu analysieren und Fehler unter den Anfangsbedingungen dieser Direktive zu melden.
Wenn also ein Fehler 3 Zeilen später auftritt, würde dies in Zeile 28 in CSSGrammar.y einen Fehler melden.
Beachten Sie, dass eine einzelne Quelldatei Quellen aus mehreren Teilen enthalten kann. und dass diese Direktive sehr effektiv verwendet werden kann, um Fehlerzustände anzuzeigen.
Normalerweise werden Sie sehen, dass es auf Ihrem Weg mehrere #line
-Direktiven gibt; Sie sind nur da, um verschiedene Injektionen auf dem Weg zu berücksichtigen (um die Berichterstattung Caret zurücksetzen, wenn Sie wollen).
Beachten Sie, dass die #line-Direktive von jedem beliebigen Generator verwendet werden kann, einschließlich Ihrer eigenen, und ist nicht auf irgendwelche Parser-Generatoren beschränkt.
Der 'yacc' Parser-Generator verwendet Dateien mit der Endung .y und gibt Dateien aus, die c oder c ++ enthalten. Es fügt diese #line-Zeilen hinzu, um es einem Debugger zu ermöglichen, zu der alten ursprünglichen Quelle zurückzukehren und keine Ersatzzeichen zu akzeptieren.
es ist eine c-Präprozessor-Option. Er teilt dem c-Parser mit, dass er die Zeilenanzahl der Quelldatei fallen lassen soll, und zwar so, als wäre dies Zeile # 25.
Mit diesen Informationen ist es einfacher für Sie, die Quelldatei zu debuggen. Die yacc-Datei wird in eine c-Quelle übersetzt, wobei dies die vorgestellte Quellzeile ist.
Es ist eine Anweisung für den Compiler zu glauben, dass die folgende Zeile die Zeilennummer 25 in der Datei CSSGrammar.y
ist. Wenn dann ein Fehler von dem Compiler in der zweiten nächsten Zeile erkannt wird, würde dies als aus der Zeile 26 von CSSGrammar.y
Programme, die C-Dateien erzeugen, wie bison
oder yacc
oder flex
oder < a href="http://www.antlr.org/"> ANTLR , oder sogar MELT nutze diese Möglichkeit a viel.
Wenn Debuginformationen generiert werden (z. B. mit gcc -g
), wird in Ihrem Beispiel auf die Datei CSSGrammar.y
verwiesen.
Tags und Links c++ c-preprocessor preprocessor-directive