Yacc Debugging |
Yacc has facilities that enable debugging. This feature may vary with different versions of
yacc so be sure to consult documentation for details. The code generated by yacc in file y.tab.c includes debugging statements that are enabled by defining YYDEBUG and setting it to a non-zero value. This may also be done by specifying
command-line option "-t". With YYDEBUG properly set, debug output may be
toggled on and off by setting yydebug. Output includes tokens scanned and shift/reduce
actions.
%{
#define YYDEBUG 1
%}
%%
...
%%
int main(void) {
#if YYDEBUG
yydebug = 1;
#endif
yylex();
}
In addition, you can dump the parse states by specifying command-line option "-v".
States are dumped to file y.output, and are often useful when debugging a grammar.
Alternatively you can write your own debug code by defining a TRACE macro as
illustrated below. When DEBUG is defined a trace of reductions, by line number, is
displayed.
%{
#ifdef DEBUG
#define TRACE printf("reduce at line %d\n", __LINE__);
#else
#define TRACE
#endif
%}
%%
statement_list:
statement
{ TRACE $$ = $1; }
| statement_list statement
{ TRACE $$ = newNode(';', 2, $1, $2); }
;