Home | History | Annotate | Line # | Download | only in manual
      1 /*
      2  * eof_rules.lex : An example of using multiple buffers
      3  *                 EOF rules, and start states
      4  */
      5 
      6 %{
      7 
      8 #define MAX_NEST 10
      9 
     10 YY_BUFFER_STATE include_stack[MAX_NEST];
     11 int             include_count = -1;
     12 
     13 %}
     14 
     15 
     16 %x INCLUDE
     17 %x COMMENT
     18 
     19 
     20 %%
     21 
     22 "{"                          BEGIN(COMMENT);
     23 
     24 <COMMENT>"}"                 BEGIN(INITIAL);
     25 <COMMENT>"$include"[ \t]*"(" BEGIN(INCLUDE);
     26 <COMMENT>[ \t]*              /* skip whitespace */
     27 
     28 <INCLUDE>")"                 BEGIN(COMMENT);
     29 <INCLUDE>[ \t]*              /* skip whitespace */
     30 <INCLUDE>[^ \t\n() ]+ {      /* get the include file name */
     31           if ( include_count >= MAX_NEST){
     32              fprintf( stderr, "Too many include files" );
     33              exit( 1 );
     34           }
     35 
     36           include_stack[++include_count] = YY_CURRENT_BUFFER;
     37 
     38           yyin = fopen( yytext, "r" );
     39           if ( ! yyin ){
     40              fprintf( stderr, "Unable to open %s",yytext);
     41              exit( 1 );
     42           }
     43 
     44           yy_switch_to_buffer(yy_create_buffer(yyin,YY_BUF_SIZE));
     45 
     46           BEGIN(INITIAL);
     47         }
     48 <INCLUDE><<EOF>>
     49         {
     50             fprintf( stderr, "EOF in include" );
     51             yyterminate();
     52         }
     53 <COMMENT><<EOF>>
     54         {
     55             fprintf( stderr, "EOF in comment" );
     56             yyterminate();
     57         }
     58 <<EOF>> {
     59           if ( include_count <= 0 ){
     60             yyterminate();
     61           } else {
     62             yy_delete_buffer(include_stack[include_count--] );
     63             yy_switch_to_buffer(include_stack[include_count] );
     64             BEGIN(INCLUDE);
     65           }
     66         }
     67 [a-z]+               ECHO;
     68 .|\n                 ECHO;
     69 
     70 
     71 
     72 
     73 
     74 
     75 
     76 
     77 
     78 
     79