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 10YY_BUFFER_STATE include_stack[MAX_NEST]; 11int include_count = -1; 12 13%} 14 15 16%x INCLUDE 17 18%% 19 20^"#include"[ \t]*\" BEGIN(INCLUDE); 21<INCLUDE>\" BEGIN(INITIAL); 22<INCLUDE>[^\"]+ { /* get the include file name */ 23 if ( include_count >= MAX_NEST){ 24 fprintf( stderr, "Too many include files" ); 25 exit( 1 ); 26 } 27 28 include_stack[++include_count] = YY_CURRENT_BUFFER; 29 30 yyin = fopen( yytext, "r" ); 31 if ( ! yyin ){ 32 fprintf( stderr, "Unable to open \"%s\"\n",yytext); 33 exit( 1 ); 34 } 35 36 yy_switch_to_buffer(yy_create_buffer(yyin,YY_BUF_SIZE)); 37 38 BEGIN(INITIAL); 39 } 40<INCLUDE><<EOF>> 41 { 42 fprintf( stderr, "EOF in include" ); 43 yyterminate(); 44 } 45<<EOF>> { 46 if ( include_count <= 0 ){ 47 yyterminate(); 48 } else { 49 yy_delete_buffer(include_stack[include_count--] ); 50 yy_switch_to_buffer(include_stack[include_count] ); 51 BEGIN(INCLUDE); 52 } 53 } 54[a-z]+ ECHO; 55.|\n ECHO; 56 57 58 59 60 61 62 63 64 65 66