次の行は何をしますか?
#line 25 "CSSGrammar.y"
そして、拡張機能はどうですか?
標準によると:
§16.4.3:
フォームの前処理ディレクティブ
# line digit-sequence new-line
次の一連のソース行が、(10 進整数として解釈される) 数字シーケンスで指定された行番号を持つソース行で始まるかのように、実装を動作させます。数字シーケンスがゼロまたは 2147483647 より大きい数値を指定する場合、動作は未定義です。
§16.4.4:
フォームの前処理ディレクティブ
# line digit-sequence " s-char-sequenceopt" new-line
同様に推定行番号を設定し、ソースファイルの推定名を文字列リテラルの内容に変更します。
§16.4.5:
フォームの前処理ディレクティブ
# line pp-tokens new-line
(前の 2 つの形式のいずれとも一致しない) は許可されます。ディレクティブの行の後の前処理トークンは、通常のテキストと同様に処理されます (マクロ名として現在定義されている各識別子は、前処理トークンの置換リストに置き換えられます)。すべての置換後のディレクティブが前の 2 つの形式のいずれとも一致しない場合、動作は未定義です。それ以外の場合、結果は適切に処理されます。
拡張子は、.y
おそらくそれが YACC ファイルであることを明らかにするために、作成者が使用することを選択したものです (「文法」という言葉もそれを指していますが、推測にすぎません)。
現在のコード行CSSGrammar.y
が、このコードが生成された YACC スタイルの文法ファイルである の 25 行目から供給されていることを単に示しています。
これは、生成されたコードとは対照的に、文法自体にステップインするためにデバッガーによって使用されます。
#line
ディレクティブは、コンパイラーのレポート位置を変更し、コード生成ソフトウェアによって使用され、プログラマーが元のソースの問題を特定するのに役立ちます。これは、エラー報告をより有益なものにリダイレクトするために誰でも使用できます。
たとえば、パーサーがCSSGrammar.cppファイルを生成します。これはc ++コンパイラーによってコンパイルされ、c ++スニペットが含まれています。#line 25 "CSSGrammar.y"
ディレクティブは、ファイル内の特定のポイントを25行目であるかのように扱うようにc++コンパイラーに指示します。 CSSGrammar.y
コンパイラは、そのディレクティブの初期条件の下で、後続の行を解析し続け、エラーを報告します。
したがって、3行後にエラーが発生した場合、CSSGrammar.yの28行目にエラーが発生したことが報告されます。
単一のソースファイルには、複数の部分からのソースを含めることができることに注意してください。また、このディレクティブは、エラー状態を示すために非常に効果的に使用できます。
#line
通常、途中で複数のディレクティブがあることがわかります。それらは、途中でさまざまな注入を説明するためだけにあります(必要に応じてレポートキャレットをリセットするため)。
#lineディレクティブは、独自のジェネレーターを含むすべてのジェネレーターで使用でき、パーサージェネレーターに限定されないことに注意してください。
「yacc」パーサー ジェネレーターは、.y で終わるファイルを消費し、c または c++ を含むファイルを出力します。これらの #line 行を追加して、デバッガーが古い元のソースに戻り、代替を受け入れないようにします。
これは ac プリプロセッサ オプションです。これは、c-parser に対して、ソース ファイルの行数を 25 行目であるふりをして削除するように指示します。
この情報を使用すると、ソース ファイルを簡単にデバッグできます。yacc ファイルは c-source に変換されます。ここで、これは仮のソース行です。
#line を使用すると、コンパイラは、コンパイルしているファイルとその行が何であるかについて記憶喪失に陥り、新しいデータが読み込まれます。
注: コンパイラは、それがあった行から引き続きコンパイルします。