65 lines
1.3 KiB
Text
65 lines
1.3 KiB
Text
/*
|
|
* eof_rules.lex : An example of using multiple buffers
|
|
* EOF rules, and start states
|
|
*/
|
|
|
|
%{
|
|
|
|
#define MAX_NEST 10
|
|
|
|
YY_BUFFER_STATE include_stack[MAX_NEST];
|
|
int include_count = -1;
|
|
|
|
%}
|
|
|
|
|
|
%x INCLUDE
|
|
|
|
%%
|
|
|
|
^"#include"[ \t]*\" BEGIN(INCLUDE);
|
|
<INCLUDE>\" BEGIN(INITIAL);
|
|
<INCLUDE>[^\"]+ { /* get the include file name */
|
|
if ( include_count >= MAX_NEST){
|
|
fprintf( stderr, "Too many include files" );
|
|
exit( 1 );
|
|
}
|
|
|
|
include_stack[++include_count] = YY_CURRENT_BUFFER;
|
|
|
|
yyin = fopen( yytext, "r" );
|
|
if ( ! yyin ){
|
|
fprintf( stderr, "Unable to open \"%s\"\n",yytext);
|
|
exit( 1 );
|
|
}
|
|
|
|
yy_switch_to_buffer(yy_create_buffer(yyin,YY_BUF_SIZE));
|
|
|
|
BEGIN(INITIAL);
|
|
}
|
|
<INCLUDE><<EOF>>
|
|
{
|
|
fprintf( stderr, "EOF in include" );
|
|
yyterminate();
|
|
}
|
|
<<EOF>> {
|
|
if ( include_count <= 0 ){
|
|
yyterminate();
|
|
} else {
|
|
yy_delete_buffer(include_stack[include_count--] );
|
|
yy_switch_to_buffer(include_stack[include_count] );
|
|
BEGIN(INCLUDE);
|
|
}
|
|
}
|
|
[a-z]+ ECHO;
|
|
.|\n ECHO;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|