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