Lex Debugging |
Lex has facilities that enable debugging. This feature may vary with different versions of lex
so you should consult documentation for details. The code generated by lex in file lex.yy.c
includes debugging statements that are enabled by specifying command-line
option "-d
". Debug output in flex (a GNU version of lex) may be toggled on and off by
setting yy_flex_debug
. Output includes the rule applied and corresponding matched
text. If you’re running lex and yacc together then specify the following in your yacc input
file:
extern int yy_flex_debug; int main(void) { yy_flex_debug = 1; yyparse(); }
Alternatively, you may write your own debug code by defining functions that display information
for the token value and each variant of the yylval
union. This is illustrated in the
following example. When DEBUG
is defined the debug functions take effect and a trace
of tokens and associated values is displayed.
%union { int ivalue; ... }; %{ #ifdef DEBUG int dbgToken(int tok, char *s) { printf("token %s\n", s); return tok; } int dbgTokenIvalue(int tok, char *s) { printf("token %s (%d)\n", s, yylval.ivalue); return tok; } #define RETURN(x) return dbgToken(x, #x) #define RETURN_ivalue(x) return dbgTokenIvalue(x, #x) #else #define RETURN(x) return(x) #define RETURN_ivalue(x) return(x) #endif %} %% [0-9]+ { yylval.ivalue = atoi(yytext); RETURN_ivalue(INTEGER); } "if" RETURN(IF); "else" RETURN(ELSE);