Was bedeutet #line?

8

Was macht die folgende Zeile?

%Vor%

Und was ist mit der Erweiterung?

    
Luchian Grigore 05.02.2012, 20:46
quelle

6 Antworten

11

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).

    
Seth Carnegie 05.02.2012, 20:49
quelle
7

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.

    
user7116 05.02.2012 20:49
quelle
4
Die Anweisung

#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.

    
Ahmed Masud 05.02.2012 20:58
quelle
2

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.

    
bmargulies 05.02.2012 20:48
quelle
1

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.

    
Jörg Beyer 05.02.2012 20:49
quelle
1

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

kommend gemeldet werden

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.

    
Basile Starynkevitch 05.02.2012 20:51
quelle