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