Next: , Previous: , Up: Reentrant C Scanners   [Contents][Index]


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. 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;
                  yybuffer buf;

                  yylex_init( &scanner );
                  yytext[yyleng-1] = ' ';

                  buf = yy_scan_string( yytext + 5, scanner );
                  yylex( scanner );

                  yy_delete_buffer(buf,scanner);
                  yylex_destroy( scanner );
             }
...
%%