Next: Reentrant Overview, Previous: Reentrant, Up: Reentrant [Contents][Index]
However, there are other uses for a reentrant scanner. For example, you
could scan two or more files simultaneously to implement a diff
at
the token level (i.e., instead of at the character level):
/* Example of maintaining more than one active scanner. */ do { int tok1, tok2; tok1 = yylex( scanner_1 ); tok2 = yylex( scanner_2 ); if( tok1 != tok2 ) printf("Files are different."); } while ( tok1 && tok2 );
Another use for a reentrant scanner is recursion. (Note that a recursive scanner can also be created using a non-reentrant scanner and buffer states. See Multiple Input Buffers.)
The following crude scanner supports the ‘eval’ command by invoking another instance of itself.
/* Example of recursive invocation. */ %option reentrant %% "eval(".+")" { yyscan_t scanner; YY_BUFFER_STATE buf; yylex_init( &scanner ); yytext[yyleng-1] = ' '; buf = yy_scan_string( yytext + 5, scanner ); yylex( scanner ); yy_delete_buffer(buf,scanner); yylex_destroy( scanner ); } ... %%