Lemon Parser を使用してパーサー コードを生成しました。生成されたコードをデバッグできません。コントロールには、現在実行中のステートメント以外のソース コードが表示されます。ブレークポイントがずれています。gdb と Visual C++ を試してみました。どちらも同じ問題を抱えています。デバッグ方法を教えてください。
3 に答える
入力ファイルの名前が mylexer.y であるとしましょう。この場合、Lemon は myparser.c と myparser.h を生成します。
myparser.c の内部には、次のような行が表示されます。
#line 1 "myparser.y"
これらは行ディレクティブです。コードの生成に使用されたファイルまで構文エラーを追跡するのに適しています。デバッグには適していません。
それらを抑制するには、 Lemonを -l オプションで起動します。
lemon -l myparser.y
ドキュメントに記載されていない他のオプションを表示するには、-?
lemon -?
以下は、認定された WAG (Wild Ass Guess) です。
パーサー ジェネレーターで使用されているすべてのマクロを調べて、エスケープされた改行がないかどうかを確認することをお勧めします。存在する場合は、(行を結合して) それらをすべて削除してから、ファイルを再コンパイルしてください。次に、デバッガーでコードを調べました。突然、本来あるべき場所に戻っている可能性があります。
バックストーリー: 80 年代に、私は CDB と呼ばれるデバッガーを開発し、販売しました。名前に U*NX が含まれるものに移植するにつれて、さまざまなコンパイラの特異性と、特定の状況でそれらがどのようにデバッグ情報を出力するかについて深く理解するようになりました。
広まっている問題の 1 つは、改行をエスケープしたマクロに関係していました。例えば
#define foo(bar) bar + \
snort + something_else
x = foo(5);
y = 2;
の行番号を5 にするy = 2;
必要がある場合、多くのシンボル テーブルで 6 と表示され、それ以降のすべての行が 1 ずつずれて表示されます。そして、そのようなマクロを使用するたびに、行番号がどんどんずれていきます。
lib/dll としてビルドする場合は、最適化、デバッグ情報オプションを確認してください。