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