2011-06-30 1 views
-1

私はLemon Parserを使ってパーサーコードを生成しました。私は生成されたコードをデバッグすることができません。コントロールには、現在実行中のステートメント以外のソースコードがいくつか表示されます。ブレークポイントは移動されます。私はgdbとVisual C++を試しました。両方とも同じ問題があります。それをデバッグする方法を教えてください。パーサーが生成したコードをデバッグする

+0

gdbとは何ですか?.. – ascanio

+0

デバッグ情報でコンパイルしましたか? – crashmstr

+0

はい私はしました..私はメインプログラムを含むファイルを持っています。それはうまくデバッグです。ステップインとステッピングスルー、ブレークポイントはすべて機能しています。コードがパーサーが生成したコードに入ると、制御(カーソル)は別の場所を指し、実行はどこか他の場所で起こります。今私はprintfsでデバッグしています。その非常に退屈な仕事。時々私は関数のためにBPを入れて、私はコードの流れのための呼び出しスタックを参照してください。 – Bharadwaj

答えて

0

lib/dllとしてビルドする場合は、最適化、デバッグ情報のオプションを確認してください。

1

認定WAG(ワイルド尻が推測される)以下:

私はパーサジェネレータによって使用されているマクロの全てを見てお勧めしますし、任意のが彼らに改行にをエスケープがあるかどうかを確認します。存在する場合は、それらをすべて削除して(線をつなぎ合わせて)、ファイルを再コンパイルしてください。その後、デバッガのコードを調べました。突然、どこに戻ってしまうのでしょうか。

Backstory:私は80年代にCDBというデバッガを開発し、販売しました。私がU * NXを名前に持つものに移植したとき、私はさまざまなコンパイラの特質や、特定の状況でどのようにデバッグ情報を出したかをよく知っていました。

改行をエスケープしたマクロには、広範な問題がありました。例えば。

#define foo(bar) bar + \ 
    snort + something_else 

x = foo(5); 
y = 2; 

y = 2;の行番号が 5されている必要があります場合は、多くのシンボルテーブルが6としてそれを示す終わるだろうが、すべてのラインそれがオフ対1になります後。そして、そのようなマクロを使用するたびに、行番号は遠くに、さらに遠くにスローされます。

2

のは、あなたの入力ファイルがレモンを使用すると、この

#line 1 "myparser.y" 

として行が表示されますmyparser.cの内部

をmyparser.cを生成し、myparser.hれる場合にはmylexer.y命名されたとしましょうこれらはline directivesです。それらは、コードを生成するために使用されたファイルにシンタックスエラーをトレースするのに適しています。彼らはデバッグには向いていません。

これらを抑制するには、Lemonを-lオプションで呼び出します。

lemon -l myparser.y 

ドキュメントに記載されていないその他のオプションについては、 - ?を参照してください。

lemon -? 
関連する問題