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