[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
もし、Bison文法ファイルが正しくコンパイルされたのに、 生成された構文解析器が思いどおりに動かない場合には、 yydebug
構文解析器追跡機能が、調査の役に立つでしょう。
追跡機能のコンパイルを有効にするためには、 構文解析器をコンパイルするときに、マクロYYDEBUG
を定義する必要があります。 そのためには、コンパイラのオプションに`-DYYDEBUG=1'を指定するか、 あるいは、文法ファイルのC宣言部に`#define YYDEBUG 1'と書いておく 必要があります(see 節 The C Declarations Section)。 あるいは、Bisonを実行するときに(see 節 Invoking Bison)、 `-t'オプションを指定しておくと、 YYDEBUG
が定義され、追跡が可能になります。
追跡機能はstderr
を使うので、C宣言部に #include
と書いておく必要があります。
追跡機能付で構文解析器をコンパイルしたら、構文解析器の実行時に、 追跡機能を有効にするために、yydebug
変数を0でない値にしてください。 C言語のプログラム(おそらくmain
関数の中)でこの変数に代入するか、 あるいは、デバッガでこの変数の値を変えればいいでしょう。
yydebug
が0でない場合、構文解析器はそれぞれの段階で、 1行まはた2行の追跡情報を生成し、stderr
に出力します。 追跡情報には、次のような情報が含まれています。
yylex
を呼ぶたびに、 読み込まれたトークンの種類が記録されます。
この情報を理解するためには、Bisonに`-v'オプション (see 節 Invoking Bison)を付けて実行すると生成される 明細ファイルが参考になるでしょう。 このファイルには、さまざまな規則の中での位置による表現で 各状態の意味が示され、また、 各状態がそれぞれの可能な入力トークンによって どのように動作するかが示されています。 連続する追跡の意味を読むことによって、 明細ファイルで仕様が示されている構文解析器の機能について、理解できるでしょう。 何か望ましくないことが起きている部分を確認すれば、 文法ファイルのどこに問題があるかわかるでしょう。
構文解析器ファイルはC言語のプログラムなので、 Cのデバッガを使えますが、 何が起きているか調べることは困難です。 構文解析器関数は、有限状態機械インタープリタで、 アクションが実行されると、 プログラムの同じ部分が何度も何度も実行されます。 実用的なのは文法の中で変数の値を調べることだけでしょう。
デバッグ情報には、通常、それぞれのトークンのトークン型だけが含まれ、 トークンの意味値は含まれません。 マクロYYPRINT
を定義することで、 トークンの意味値を表示させられます。 YYPRINT
の定義には、3個の引数がともないます。 構文解析器は、YYPRINT
に、標準入出力ストリーム、 トークン型の数値番号、トークンの値(yylval
による)を渡します。
多機能電卓に適するYYPRINT
の例を示します (see 節 Declarations for mfcalc
)。
#define YYPRINT(file, type, value) yyprint (file, type, value) static void yyprint (file, type, value) FILE *file; int type; YYSTYPE value; { if (type == VAR) fprintf (file, " %s", value.tptr->name); else if (type == NUM) fprintf (file, " %d", value.val); } |
[ << ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |