概要
bisonを利用したオープンソースの中で、構文解析の部分で何が問題なのかわからない問題にぶち当たり、bisonのデバッグ機能を利用しようとした際につまったので、メモとして残します。
bisonのオプション
デバッグしようとbisonのオプションを確認したところそれっぽいものがありました。
-t, --debug instrument the parser for tracing
same as '-Dparse.trace'
--locations enable location support
とりあえずbisonのコンパイルオプションに-t
をつけて実施。
生成されたソースにYYDEBUG
が定義されたので、問題なさそうに見えた。
/* Debug traces. */
#ifndef YYDEBUG
# define YYDEBUG 1
#endif
#if YYDEBUG
extern int yydebug;
#endif
でも動かない
これで大丈夫かと思い、実行してみると詳細ログはまったくでてこなかった。
そのため生成されたコードを読んでみたところ、yydebug
の値でコントロールされてそうな部分があった。
do { \
if (yydebug) \
{ \
YYFPRINTF (stderr, "%s ", Title); \
yy_symbol_print (stderr, \
Type, Value); \
YYFPRINTF (stderr, "\n"); \
} \
} while (0)
しかし、肝心のyydebug
には生成されたparser.cで値を設定しているように見えない。
このため、とりあえず、yyparse
を呼び出しているメイン部分に暫定でyydebug = 1;
を設定したところ、無事に詳細ログが出てきた。
Starting parse
Entering state 0
Reducing stack by rule 1 (line 122):
-> $$ = nterm sqlstate_list ()
Stack now 0
...
バージョンによる違いなのか、この辺の設定に関するドキュメントを見つけられなかったため、メモ。
自分の環境のバージョンはbison (GNU Bison) 3.0.4
だった。
- 追伸
ちゃんとGnuのページにいったらマニュアルがおいてあって、サンプルコードが載ってました。
公式を確認するのが大事ですね。