2012-01-19 12 views
2

私はフレックスとバイソンと一緒に今日遊んでいました。何か不気味なものが私の注目を集めました。gccはソースがどこから来たのかをどのように知っていますか?

localhost:c math4tots$ lex c.l 
localhost:c math4tots$ yacc -d c.y 
localhost:c math4tots$ rm c.l c.y 
localhost:c math4tots$ gcc c.c lex.yy.c y.tab.c 
c.y: In function ‘opr’: 
c.y:120: error: ‘nodeType’ has no member named ‘oper’ 

私だけc.c lex.yy.cをを通過してきた、とy.tab.c(c.hとy.tab.hもヘッダーとして含まれている)、何とかgccがc.lとc.y.について知っています実際、c.lとc.yを削除した後でも、gccはc.yのどこにコードのエラーがあるのか​​を知っています。それはどうですか?

過去に使用したいくつかのツールでも同様のことが起こったような気がしますが、そのことを正確に覚えていません。

+0

GCCコンパイラに '-Wall'を渡して、警告がなくなるまでコードを改善してください。 –

答えて

3

あなたはの線に沿って、あなたのファイルにいくつかのマーカーを見つけることができます:まさにこの目的のために使用されている

#line 75 "c.y" 

、生産ファイルに対してエラーメッセージや警告を報告する機能あなたがコンパイルしている実際のファイル。

基本的にはc.cファイルに移動し、修正する必要があるc.yファイルの同等の行を見つけようとします。

この意味で、Cファイルはオブジェクトファイルと同じです。 ケアは自動的に生成されているので、その内容は含まれていません。それに問題がある場合は、c.yの右の行に直接戻って元に戻すことができます。

2

生成されたCファイルは

ようないくつかのline control preprocessor directives(また、生成された)を有し、その後、コンパイラは、この指示の後の次の行はそれに応じて位置を次のライン119及び計算にファイルc.yにあると考えています。