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