flex: Reentrant Uses

 
 19.1 Uses for Reentrant Scanners
 ================================
 
 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.  ⇒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 );
                       }
          ...
          %%