66 lines
1.3 KiB
Text
66 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;
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|