2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Gnu Bisonのデバッグ/トレースの呼び出し方

Posted at

概要

bisonを利用したオープンソースの中で、構文解析の部分で何が問題なのかわからない問題にぶち当たり、bisonのデバッグ機能を利用しようとした際につまったので、メモとして残します。

bisonのオプション

デバッグしようとbisonのオプションを確認したところそれっぽいものがありました。

  -t, --debug                      instrument the parser for tracing
                                   same as '-Dparse.trace'
      --locations                  enable location support

とりあえずbisonのコンパイルオプションに-tをつけて実施。

生成されたソースにYYDEBUGが定義されたので、問題なさそうに見えた。

parser.c
/* 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のページにいったらマニュアルがおいてあって、サンプルコードが載ってました。
公式を確認するのが大事ですね。

参考文献

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?