]> CyberLeo.Net >> Repos - FreeBSD/releng/10.0.git/blob - usr.bin/lex/initparse.c
- Copy stable/10 (r259064) to releng/10.0 as part of the
[FreeBSD/releng/10.0.git] / usr.bin / lex / initparse.c
1 /* $FreeBSD$ */
2 #ifndef lint
3 static const char yysccsid[] = "@(#)yaccpar     1.9 (Berkeley) 02/21/93";
4 #endif
5
6 #define YYBYACC 1
7 #define YYMAJOR 1
8 #define YYMINOR 9
9
10 #define YYEMPTY        (-1)
11 #define yyclearin      (yychar = YYEMPTY)
12 #define yyerrok        (yyerrflag = 0)
13 #define YYRECOVERING() (yyerrflag != 0)
14
15 #define YYPREFIX "yy"
16
17 #define YYPURE 0
18
19 #line 35 "parse.y"
20 /*  Copyright (c) 1990 The Regents of the University of California. */
21 /*  All rights reserved. */
22
23 /*  This code is derived from software contributed to Berkeley by */
24 /*  Vern Paxson. */
25
26 /*  The United States Government has rights in this work pursuant */
27 /*  to contract no. DE-AC03-76SF00098 between the United States */
28 /*  Department of Energy and the University of California. */
29
30 /*  This file is part of flex. */
31
32 /*  Redistribution and use in source and binary forms, with or without */
33 /*  modification, are permitted provided that the following conditions */
34 /*  are met: */
35
36 /*  1. Redistributions of source code must retain the above copyright */
37 /*     notice, this list of conditions and the following disclaimer. */
38 /*  2. Redistributions in binary form must reproduce the above copyright */
39 /*     notice, this list of conditions and the following disclaimer in the */
40 /*     documentation and/or other materials provided with the distribution. */
41
42 /*  Neither the name of the University nor the names of its contributors */
43 /*  may be used to endorse or promote products derived from this software */
44 /*  without specific prior written permission. */
45
46 /*  THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR */
47 /*  IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED */
48 /*  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR */
49 /*  PURPOSE. */
50
51 #include "flexdef.h"
52 #include "tables.h"
53
54 int pat, scnum, eps, headcnt, trailcnt, lastchar, i, rulelen;
55 int trlcontxt, xcluflg, currccl, cclsorted, varlength, variable_trail_rule;
56
57 int *scon_stk;
58 int scon_stk_ptr;
59
60 static int madeany = false;  /* whether we've made the '.' character class */
61 static int ccldot, cclany;
62 int previous_continued_action;  /* whether the previous rule's action was '|' */
63
64 #define format_warn3(fmt, a1, a2) \
65         do{ \
66         char fw3_msg[MAXLINE];\
67         snprintf( fw3_msg, MAXLINE,(fmt), (a1), (a2) );\
68         warn( fw3_msg );\
69         }while(0)
70
71 /* Expand a POSIX character class expression. */
72 #define CCL_EXPR(func) \
73         do{ \
74         int c; \
75         for ( c = 0; c < csize; ++c ) \
76                 if ( isascii(c) && func(c) ) \
77                         ccladd( currccl, c ); \
78         }while(0)
79
80 /* negated class */
81 #define CCL_NEG_EXPR(func) \
82         do{ \
83         int c; \
84         for ( c = 0; c < csize; ++c ) \
85                 if ( !func(c) ) \
86                         ccladd( currccl, c ); \
87         }while(0)
88
89 /* While POSIX defines isblank(), it's not ANSI C. */
90 #define IS_BLANK(c) ((c) == ' ' || (c) == '\t')
91
92 /* On some over-ambitious machines, such as DEC Alpha's, the default
93  * token type is "long" instead of "int"; this leads to problems with
94  * declaring yylval in flexdef.h.  But so far, all the yacc's I've seen
95  * wrap their definitions of YYSTYPE with "#ifndef YYSTYPE"'s, so the
96  * following should ensure that the default token type is "int".
97  */
98 #define YYSTYPE int
99
100 #line 99 "parse.c"
101
102 #ifndef YYSTYPE
103 typedef int YYSTYPE;
104 #endif
105
106 /* compatibility with bison */
107 #ifdef YYPARSE_PARAM
108 /* compatibility with FreeBSD */
109 # ifdef YYPARSE_PARAM_TYPE
110 #  define YYPARSE_DECL() yyparse(YYPARSE_PARAM_TYPE YYPARSE_PARAM)
111 # else
112 #  define YYPARSE_DECL() yyparse(void *YYPARSE_PARAM)
113 # endif
114 #else
115 # define YYPARSE_DECL() yyparse(void)
116 #endif
117
118 /* Parameters sent to lex. */
119 #ifdef YYLEX_PARAM
120 # define YYLEX_DECL() yylex(void *YYLEX_PARAM)
121 # define YYLEX yylex(YYLEX_PARAM)
122 #else
123 # define YYLEX_DECL() yylex(void)
124 # define YYLEX yylex()
125 #endif
126
127 /* Parameters sent to yyerror. */
128 #ifndef YYERROR_DECL
129 #define YYERROR_DECL() yyerror(const char *s)
130 #endif
131 #ifndef YYERROR_CALL
132 #define YYERROR_CALL(msg) yyerror(msg)
133 #endif
134
135 extern int YYPARSE_DECL();
136
137 #define CHAR 257
138 #define NUMBER 258
139 #define SECTEND 259
140 #define SCDECL 260
141 #define XSCDECL 261
142 #define NAME 262
143 #define PREVCCL 263
144 #define EOF_OP 264
145 #define OPTION_OP 265
146 #define OPT_OUTFILE 266
147 #define OPT_PREFIX 267
148 #define OPT_YYCLASS 268
149 #define OPT_HEADER 269
150 #define OPT_EXTRA_TYPE 270
151 #define OPT_TABLES 271
152 #define CCE_ALNUM 272
153 #define CCE_ALPHA 273
154 #define CCE_BLANK 274
155 #define CCE_CNTRL 275
156 #define CCE_DIGIT 276
157 #define CCE_GRAPH 277
158 #define CCE_LOWER 278
159 #define CCE_PRINT 279
160 #define CCE_PUNCT 280
161 #define CCE_SPACE 281
162 #define CCE_UPPER 282
163 #define CCE_XDIGIT 283
164 #define CCE_NEG_ALNUM 284
165 #define CCE_NEG_ALPHA 285
166 #define CCE_NEG_BLANK 286
167 #define CCE_NEG_CNTRL 287
168 #define CCE_NEG_DIGIT 288
169 #define CCE_NEG_GRAPH 289
170 #define CCE_NEG_LOWER 290
171 #define CCE_NEG_PRINT 291
172 #define CCE_NEG_PUNCT 292
173 #define CCE_NEG_SPACE 293
174 #define CCE_NEG_UPPER 294
175 #define CCE_NEG_XDIGIT 295
176 #define CCL_OP_DIFF 296
177 #define CCL_OP_UNION 297
178 #define BEGIN_REPEAT_POSIX 298
179 #define END_REPEAT_POSIX 299
180 #define BEGIN_REPEAT_FLEX 300
181 #define END_REPEAT_FLEX 301
182 #define YYERRCODE 256
183 static const short yylhs[] = {                           -1,
184     0,    1,    2,    2,    2,    2,    3,    6,    6,    7,
185     7,    7,    8,    9,    9,   10,   10,   10,   10,   10,
186    10,    4,    4,    4,    5,   12,   12,   12,   12,   14,
187    11,   11,   11,   15,   15,   15,   16,   13,   13,   13,
188    13,   18,   18,   17,   19,   19,   19,   19,   19,   20,
189    20,   20,   20,   20,   20,   20,   20,   20,   20,   20,
190    20,   21,   21,   21,   23,   23,   24,   24,   24,   24,
191    25,   25,   25,   25,   25,   25,   25,   25,   25,   25,
192    25,   25,   25,   25,   25,   25,   25,   25,   25,   25,
193    25,   25,   25,   25,   22,   22,
194 };
195 static const short yylen[] = {                            2,
196     5,    0,    3,    2,    0,    1,    1,    1,    1,    2,
197     1,    1,    2,    2,    0,    3,    3,    3,    3,    3,
198     3,    5,    5,    0,    0,    2,    1,    1,    1,    0,
199     4,    3,    0,    3,    1,    1,    1,    2,    3,    2,
200     1,    3,    1,    2,    2,    1,    6,    5,    4,    2,
201     2,    2,    6,    5,    4,    1,    1,    1,    3,    3,
202     1,    3,    3,    1,    3,    4,    4,    2,    2,    0,
203     1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
204     1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
205     1,    1,    1,    1,    2,    0,
206 };
207 static const short yydefred[] = {                         2,
208     0,    0,    6,    0,    7,    8,    9,   15,   24,    0,
209     4,    0,    0,   12,   11,    0,    0,    0,    0,    0,
210     0,    0,   14,    0,    1,    0,   10,    0,    0,    0,
211     0,    0,    0,    0,    0,   24,    0,   16,   18,   19,
212    20,   17,   21,   32,   36,   37,    0,   35,    0,   29,
213    61,   58,   28,    0,   56,   96,    0,    0,    0,   27,
214     0,    0,    0,    0,    0,   64,   31,    0,   23,   26,
215     0,    0,   70,    0,   22,    0,   40,    0,   44,    0,
216     0,    0,   50,   51,   52,    0,    0,   34,   95,   59,
217    60,    0,    0,   71,   72,   73,   74,   75,   76,   77,
218    78,   79,   80,   82,   81,   83,   84,   85,   86,   87,
219    88,   93,   89,   90,   91,   94,   92,   65,   69,   39,
220     0,    0,    0,   62,   63,   66,    0,   49,    0,   55,
221     0,   67,    0,   48,    0,   54,   47,   53,
222 };
223 static const short yydgoto[] = {                          1,
224     2,    4,    9,   13,   25,   10,   16,   11,   12,   23,
225    26,   59,   60,   35,   47,   48,   61,   62,   63,   64,
226    65,   71,   66,   74,  119,
227 };
228 static const short yysindex[] = {                         0,
229     0, -222,    0, -155,    0,    0,    0,    0,    0, -215,
230     0, -123,    6,    0,    0, -193,   10,   21,   26,   31,
231    35,   37,    0,   59,    0,  -44,    0, -147, -145, -140,
232  -133, -132, -129,   75, -214,    0,  -19,    0,    0,    0,
233     0,    0,    0,    0,    0,    0,   23,    0,  -48,    0,
234     0,    0,    0,  -17,    0,    0,  -17,   27,  128,    0,
235   -17,   -1,  -30,  -41, -189,    0,    0, -121,    0,    0,
236   -31,  -34,    0,  -87,    0,  -25,    0,  -17,    0, -109,
237   -41, -108,    0,    0,    0,   60,   60,    0,    0,    0,
238     0,   46,  107,    0,    0,    0,    0,    0,    0,    0,
239     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
240     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
241   -30,  -36,  -39,    0,    0,    0, -104,    0, -219,    0,
242  -238,    0, -144,    0, -143,    0,    0,    0,
243 };
244 static const short yyrindex[] = {                         0,
245     0, -141,    0,    0,    0,    0,    0,    0,    0,    0,
246     0, -134,    9,    0,    0, -125,    0,    0,    0,    0,
247     0,    0,    0, -178,    0,   22,    0,    0,    0,    0,
248     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
249     0,    0,    0,    0,    0,    0,    0,    0,  -21,    0,
250     0,    0,    0,    0,    0,    0,    0,   85,    0,    0,
251     0,  144,   47,    4,  -10,    0,    0,    0,    0,    0,
252     0,    0,    0,    0,    0,  146,    0,    0,    0,    0,
253    18,    0,    0,    0,    0,    0,    0,    0,    0,    0,
254     0,    0,  124,    0,    0,    0,    0,    0,    0,    0,
255     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
256     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
257    50,    0,    0,    0,    0,    0,    0,    0,    0,    0,
258     0,    0,    0,    0,    0,    0,    0,    0,
259 };
260 static const short yygindex[] = {                         0,
261     0,    0,    0,  121,  133,    0,    0,    0,    0,    0,
262     0,    0,  106,    0,    0,   93,    0,   32,   84,  -45,
263     0,    0,   25,   90,    0,
264 };
265 #define YYTABLESIZE 419
266 static const short yytable[] = {                         57,
267    83,   84,   90,   56,  131,  118,   91,  129,   25,   57,
268   120,   24,   33,   46,   56,   55,   56,   81,   33,  135,
269    57,   85,   57,   57,   33,   57,   55,   45,   55,   57,
270    57,   57,   57,    3,   77,   57,   57,   46,  133,   46,
271    14,   45,   33,   46,   46,   79,   15,   46,   33,   46,
272    46,   45,   57,   45,   33,   25,   43,   45,   45,   42,
273    58,   25,  136,   45,   45,   24,   68,   25,   27,   33,
274    28,   58,   33,   58,   54,   81,   69,   30,   36,  134,
275    57,   29,   43,   30,   67,   42,   30,   43,   72,   78,
276    42,   31,   76,   43,   46,   32,   42,   33,   78,   33,
277    34,   33,   33,    5,    6,    7,   86,   87,   45,    8,
278   124,  125,   25,   57,   38,   25,   39,    5,    5,    5,
279    73,   40,   78,    5,   13,   13,   13,   46,   41,   42,
280    13,   33,   43,    3,    3,    3,   44,   75,  126,    3,
281    46,   45,   17,   18,   19,   20,   21,   22,  122,  123,
282    58,  127,  132,   41,  137,   38,   49,  138,   37,   70,
283    88,  121,   92,    0,    0,    0,    0,    0,    0,   93,
284    43,    0,    0,   42,    0,    0,    0,   70,    0,    0,
285     0,    0,    0,    0,   94,   95,   96,   97,   98,   99,
286   100,  101,  102,  103,  104,  105,  106,  107,  108,  109,
287   110,  111,  112,  113,  114,  115,  116,  117,    0,    0,
288     0,    0,    0,    0,    0,    0,   68,    0,    0,    0,
289     0,    0,    0,    0,    0,   89,   51,    0,    0,    0,
290     0,    0,   52,    0,   33,   33,   50,   51,    0,   51,
291     0,   33,   33,   52,   53,   52,   57,    0,    0,    0,
292     0,    0,   57,    0,    0,    0,    0,    0,   82,    0,
293    46,  130,  128,    0,   33,   33,   46,   80,    0,    0,
294     0,   33,   33,    0,   45,    0,    0,   25,   25,    0,
295    45,    0,    0,    0,   25,   25,    0,   57,    0,   57,
296     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
297     0,   46,   93,    0,    0,    0,    0,    0,    0,    0,
298     0,    0,    0,    0,    0,   45,    0,   94,   95,   96,
299    97,   98,   99,  100,  101,  102,  103,  104,  105,  106,
300   107,  108,  109,  110,  111,  112,  113,  114,  115,  116,
301   117,   70,    0,    0,    0,    0,    0,    0,    0,    0,
302     0,    0,    0,    0,    0,    0,   70,   70,   70,   70,
303    70,   70,   70,   70,   70,   70,   70,   70,   70,   70,
304    70,   70,   70,   70,   70,   70,   70,   70,   70,   70,
305    68,    0,    0,    0,    0,    0,    0,    0,    0,    0,
306     0,    0,    0,    0,    0,   68,   68,   68,   68,   68,
307    68,   68,   68,   68,   68,   68,   68,   68,   68,   68,
308    68,   68,   68,   68,   68,   68,   68,   68,   68,
309 };
310 static const short yycheck[] = {                         10,
311    42,   43,   34,   34,   44,   93,   41,   44,    0,   40,
312    36,   60,   34,   10,   34,   46,   34,   63,   40,  258,
313    40,   63,   40,   34,   46,   36,   46,   10,   46,   40,
314    41,   42,   43,  256,   36,   46,   47,   34,  258,   36,
315   256,  256,   34,   40,   41,   47,  262,  262,   40,   46,
316    47,   34,   63,   36,   46,   34,   10,   40,   41,   10,
317    91,   40,  301,   46,   47,   60,   44,   46,  262,   91,
318    61,   91,   94,   91,   94,  121,  125,  256,  123,  299,
319    91,   61,   36,  262,   62,   36,   61,   41,   57,  124,
320    41,   61,   61,   47,   91,   61,   47,   61,  124,   91,
321    42,  123,   94,  259,  260,  261,  296,  297,   91,  265,
322    86,   87,   91,  124,  262,   94,  262,  259,  260,  261,
323    94,  262,  124,  265,  259,  260,  261,  124,  262,  262,
324   265,  123,  262,  259,  260,  261,   62,   10,   93,  265,
325   262,  124,  266,  267,  268,  269,  270,  271,  258,  258,
326    91,   45,  257,   10,  299,   10,   36,  301,   26,   54,
327    68,   78,   73,   -1,   -1,   -1,   -1,   -1,   -1,  257,
328   124,   -1,   -1,  124,   -1,   -1,   -1,   93,   -1,   -1,
329    -1,   -1,   -1,   -1,  272,  273,  274,  275,  276,  277,
330   278,  279,  280,  281,  282,  283,  284,  285,  286,  287,
331   288,  289,  290,  291,  292,  293,  294,  295,   -1,   -1,
332    -1,   -1,   -1,   -1,   -1,   -1,   93,   -1,   -1,   -1,
333    -1,   -1,   -1,   -1,   -1,  257,  257,   -1,   -1,   -1,
334    -1,   -1,  263,   -1,  256,  257,  256,  257,   -1,  257,
335    -1,  263,  264,  263,  264,  263,  257,   -1,   -1,   -1,
336    -1,   -1,  263,   -1,   -1,   -1,   -1,   -1,  300,   -1,
337   257,  301,  299,   -1,  256,  257,  263,  298,   -1,   -1,
338    -1,  263,  264,   -1,  257,   -1,   -1,  256,  257,   -1,
339   263,   -1,   -1,   -1,  263,  264,   -1,  298,   -1,  300,
340    -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
341    -1,  298,  257,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
342    -1,   -1,   -1,   -1,   -1,  298,   -1,  272,  273,  274,
343   275,  276,  277,  278,  279,  280,  281,  282,  283,  284,
344   285,  286,  287,  288,  289,  290,  291,  292,  293,  294,
345   295,  257,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
346    -1,   -1,   -1,   -1,   -1,   -1,  272,  273,  274,  275,
347   276,  277,  278,  279,  280,  281,  282,  283,  284,  285,
348   286,  287,  288,  289,  290,  291,  292,  293,  294,  295,
349   257,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
350    -1,   -1,   -1,   -1,   -1,  272,  273,  274,  275,  276,
351   277,  278,  279,  280,  281,  282,  283,  284,  285,  286,
352   287,  288,  289,  290,  291,  292,  293,  294,  295,
353 };
354 #define YYFINAL 1
355 #ifndef YYDEBUG
356 #define YYDEBUG 0
357 #endif
358 #define YYMAXTOKEN 301
359 #if YYDEBUG
360 static const char *yyname[] = {
361
362 "end-of-file",0,0,0,0,0,0,0,0,0,"'\\n'",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
363 0,0,0,"'\"'",0,"'$'",0,0,0,"'('","')'","'*'","'+'","','","'-'","'.'","'/'",0,0,
364 0,0,0,0,0,0,0,0,0,0,"'<'","'='","'>'","'?'",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
365 0,0,0,0,0,0,0,0,0,"'['",0,"']'","'^'",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
366 0,0,0,0,0,0,0,"'{'","'|'","'}'",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
367 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
368 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
369 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"CHAR","NUMBER","SECTEND",
370 "SCDECL","XSCDECL","NAME","PREVCCL","EOF_OP","OPTION_OP","OPT_OUTFILE",
371 "OPT_PREFIX","OPT_YYCLASS","OPT_HEADER","OPT_EXTRA_TYPE","OPT_TABLES",
372 "CCE_ALNUM","CCE_ALPHA","CCE_BLANK","CCE_CNTRL","CCE_DIGIT","CCE_GRAPH",
373 "CCE_LOWER","CCE_PRINT","CCE_PUNCT","CCE_SPACE","CCE_UPPER","CCE_XDIGIT",
374 "CCE_NEG_ALNUM","CCE_NEG_ALPHA","CCE_NEG_BLANK","CCE_NEG_CNTRL","CCE_NEG_DIGIT",
375 "CCE_NEG_GRAPH","CCE_NEG_LOWER","CCE_NEG_PRINT","CCE_NEG_PUNCT","CCE_NEG_SPACE",
376 "CCE_NEG_UPPER","CCE_NEG_XDIGIT","CCL_OP_DIFF","CCL_OP_UNION",
377 "BEGIN_REPEAT_POSIX","END_REPEAT_POSIX","BEGIN_REPEAT_FLEX","END_REPEAT_FLEX",
378 };
379 static const char *yyrule[] = {
380 "$accept : goal",
381 "goal : initlex sect1 sect1end sect2 initforrule",
382 "initlex :",
383 "sect1 : sect1 startconddecl namelist1",
384 "sect1 : sect1 options",
385 "sect1 :",
386 "sect1 : error",
387 "sect1end : SECTEND",
388 "startconddecl : SCDECL",
389 "startconddecl : XSCDECL",
390 "namelist1 : namelist1 NAME",
391 "namelist1 : NAME",
392 "namelist1 : error",
393 "options : OPTION_OP optionlist",
394 "optionlist : optionlist option",
395 "optionlist :",
396 "option : OPT_OUTFILE '=' NAME",
397 "option : OPT_EXTRA_TYPE '=' NAME",
398 "option : OPT_PREFIX '=' NAME",
399 "option : OPT_YYCLASS '=' NAME",
400 "option : OPT_HEADER '=' NAME",
401 "option : OPT_TABLES '=' NAME",
402 "sect2 : sect2 scon initforrule flexrule '\\n'",
403 "sect2 : sect2 scon '{' sect2 '}'",
404 "sect2 :",
405 "initforrule :",
406 "flexrule : '^' rule",
407 "flexrule : rule",
408 "flexrule : EOF_OP",
409 "flexrule : error",
410 "scon_stk_ptr :",
411 "scon : '<' scon_stk_ptr namelist2 '>'",
412 "scon : '<' '*' '>'",
413 "scon :",
414 "namelist2 : namelist2 ',' sconname",
415 "namelist2 : sconname",
416 "namelist2 : error",
417 "sconname : NAME",
418 "rule : re2 re",
419 "rule : re2 re '$'",
420 "rule : re '$'",
421 "rule : re",
422 "re : re '|' series",
423 "re : series",
424 "re2 : re '/'",
425 "series : series singleton",
426 "series : singleton",
427 "series : series BEGIN_REPEAT_POSIX NUMBER ',' NUMBER END_REPEAT_POSIX",
428 "series : series BEGIN_REPEAT_POSIX NUMBER ',' END_REPEAT_POSIX",
429 "series : series BEGIN_REPEAT_POSIX NUMBER END_REPEAT_POSIX",
430 "singleton : singleton '*'",
431 "singleton : singleton '+'",
432 "singleton : singleton '?'",
433 "singleton : singleton BEGIN_REPEAT_FLEX NUMBER ',' NUMBER END_REPEAT_FLEX",
434 "singleton : singleton BEGIN_REPEAT_FLEX NUMBER ',' END_REPEAT_FLEX",
435 "singleton : singleton BEGIN_REPEAT_FLEX NUMBER END_REPEAT_FLEX",
436 "singleton : '.'",
437 "singleton : fullccl",
438 "singleton : PREVCCL",
439 "singleton : '\"' string '\"'",
440 "singleton : '(' re ')'",
441 "singleton : CHAR",
442 "fullccl : fullccl CCL_OP_DIFF braceccl",
443 "fullccl : fullccl CCL_OP_UNION braceccl",
444 "fullccl : braceccl",
445 "braceccl : '[' ccl ']'",
446 "braceccl : '[' '^' ccl ']'",
447 "ccl : ccl CHAR '-' CHAR",
448 "ccl : ccl CHAR",
449 "ccl : ccl ccl_expr",
450 "ccl :",
451 "ccl_expr : CCE_ALNUM",
452 "ccl_expr : CCE_ALPHA",
453 "ccl_expr : CCE_BLANK",
454 "ccl_expr : CCE_CNTRL",
455 "ccl_expr : CCE_DIGIT",
456 "ccl_expr : CCE_GRAPH",
457 "ccl_expr : CCE_LOWER",
458 "ccl_expr : CCE_PRINT",
459 "ccl_expr : CCE_PUNCT",
460 "ccl_expr : CCE_SPACE",
461 "ccl_expr : CCE_XDIGIT",
462 "ccl_expr : CCE_UPPER",
463 "ccl_expr : CCE_NEG_ALNUM",
464 "ccl_expr : CCE_NEG_ALPHA",
465 "ccl_expr : CCE_NEG_BLANK",
466 "ccl_expr : CCE_NEG_CNTRL",
467 "ccl_expr : CCE_NEG_DIGIT",
468 "ccl_expr : CCE_NEG_GRAPH",
469 "ccl_expr : CCE_NEG_PRINT",
470 "ccl_expr : CCE_NEG_PUNCT",
471 "ccl_expr : CCE_NEG_SPACE",
472 "ccl_expr : CCE_NEG_XDIGIT",
473 "ccl_expr : CCE_NEG_LOWER",
474 "ccl_expr : CCE_NEG_UPPER",
475 "string : string CHAR",
476 "string :",
477
478 };
479 #endif
480
481 int      yydebug;
482 int      yynerrs;
483
484 int      yyerrflag;
485 int      yychar;
486 YYSTYPE  yyval;
487 YYSTYPE  yylval;
488
489 /* define the initial stack-sizes */
490 #ifdef YYSTACKSIZE
491 #undef YYMAXDEPTH
492 #define YYMAXDEPTH  YYSTACKSIZE
493 #else
494 #ifdef YYMAXDEPTH
495 #define YYSTACKSIZE YYMAXDEPTH
496 #else
497 #define YYSTACKSIZE 500
498 #define YYMAXDEPTH  500
499 #endif
500 #endif
501
502 #define YYINITSTACKSIZE 500
503
504 typedef struct {
505     unsigned stacksize;
506     short    *s_base;
507     short    *s_mark;
508     short    *s_last;
509     YYSTYPE  *l_base;
510     YYSTYPE  *l_mark;
511 } YYSTACKDATA;
512 /* variables for the parser stack */
513 static YYSTACKDATA yystack;
514 #line 948 "parse.y"
515
516
517 /* build_eof_action - build the "<<EOF>>" action for the active start
518  *                    conditions
519  */
520
521 void build_eof_action()
522         {
523         int i;
524         char action_text[MAXLINE];
525
526         for ( i = 1; i <= scon_stk_ptr; ++i )
527                 {
528                 if ( sceof[scon_stk[i]] )
529                         format_pinpoint_message(
530                                 "multiple <<EOF>> rules for start condition %s",
531                                 scname[scon_stk[i]] );
532
533                 else
534                         {
535                         sceof[scon_stk[i]] = true;
536
537                         if (previous_continued_action /* && previous action was regular */)
538                                 add_action("YY_RULE_SETUP\n");
539
540                         snprintf( action_text, sizeof(action_text), "case YY_STATE_EOF(%s):\n",
541                                 scname[scon_stk[i]] );
542                         add_action( action_text );
543                         }
544                 }
545
546         line_directive_out( (FILE *) 0, 1 );
547
548         /* This isn't a normal rule after all - don't count it as
549          * such, so we don't have any holes in the rule numbering
550          * (which make generating "rule can never match" warnings
551          * more difficult.
552          */
553         --num_rules;
554         ++num_eof_rules;
555         }
556
557
558 /* format_synerr - write out formatted syntax error */
559
560 void format_synerr( msg, arg )
561 const char *msg, arg[];
562         {
563         char errmsg[MAXLINE];
564
565         (void) snprintf( errmsg, sizeof(errmsg), msg, arg );
566         synerr( errmsg );
567         }
568
569
570 /* synerr - report a syntax error */
571
572 void synerr( str )
573 const char *str;
574         {
575         syntaxerror = true;
576         pinpoint_message( str );
577         }
578
579
580 /* format_warn - write out formatted warning */
581
582 void format_warn( msg, arg )
583 const char *msg, arg[];
584         {
585         char warn_msg[MAXLINE];
586
587         snprintf( warn_msg, sizeof(warn_msg), msg, arg );
588         warn( warn_msg );
589         }
590
591
592 /* warn - report a warning, unless -w was given */
593
594 void warn( str )
595 const char *str;
596         {
597         line_warning( str, linenum );
598         }
599
600 /* format_pinpoint_message - write out a message formatted with one string,
601  *                           pinpointing its location
602  */
603
604 void format_pinpoint_message( msg, arg )
605 const char *msg, arg[];
606         {
607         char errmsg[MAXLINE];
608
609         snprintf( errmsg, sizeof(errmsg), msg, arg );
610         pinpoint_message( errmsg );
611         }
612
613
614 /* pinpoint_message - write out a message, pinpointing its location */
615
616 void pinpoint_message( str )
617 const char *str;
618         {
619         line_pinpoint( str, linenum );
620         }
621
622
623 /* line_warning - report a warning at a given line, unless -w was given */
624
625 void line_warning( str, line )
626 const char *str;
627 int line;
628         {
629         char warning[MAXLINE];
630
631         if ( ! nowarn )
632                 {
633                 snprintf( warning, sizeof(warning), "warning, %s", str );
634                 line_pinpoint( warning, line );
635                 }
636         }
637
638
639 /* line_pinpoint - write out a message, pinpointing it at the given line */
640
641 void line_pinpoint( str, line )
642 const char *str;
643 int line;
644         {
645         fprintf( stderr, "%s:%d: %s\n", infilename, line, str );
646         }
647
648
649 /* yyerror - eat up an error message from the parser;
650  *           currently, messages are ignore
651  */
652
653 void yyerror( msg )
654 const char *msg;
655         {
656         }
657 #line 656 "parse.c"
658
659 #if YYDEBUG
660 #include <stdio.h>              /* needed for printf */
661 #endif
662
663 #include <stdlib.h>     /* needed for malloc, etc */
664 #include <string.h>     /* needed for memset */
665
666 /* allocate initial stack or double stack size, up to YYMAXDEPTH */
667 static int yygrowstack(YYSTACKDATA *data)
668 {
669     int i;
670     unsigned newsize;
671     short *newss;
672     YYSTYPE *newvs;
673
674     if ((newsize = data->stacksize) == 0)
675         newsize = YYINITSTACKSIZE;
676     else if (newsize >= YYMAXDEPTH)
677         return -1;
678     else if ((newsize *= 2) > YYMAXDEPTH)
679         newsize = YYMAXDEPTH;
680
681     i = data->s_mark - data->s_base;
682     newss = (short *)realloc(data->s_base, newsize * sizeof(*newss));
683     if (newss == 0)
684         return -1;
685
686     data->s_base = newss;
687     data->s_mark = newss + i;
688
689     newvs = (YYSTYPE *)realloc(data->l_base, newsize * sizeof(*newvs));
690     if (newvs == 0)
691         return -1;
692
693     data->l_base = newvs;
694     data->l_mark = newvs + i;
695
696     data->stacksize = newsize;
697     data->s_last = data->s_base + newsize - 1;
698     return 0;
699 }
700
701 #if YYPURE || defined(YY_NO_LEAKS)
702 static void yyfreestack(YYSTACKDATA *data)
703 {
704     free(data->s_base);
705     free(data->l_base);
706     memset(data, 0, sizeof(*data));
707 }
708 #else
709 #define yyfreestack(data) /* nothing */
710 #endif
711
712 #define YYABORT  goto yyabort
713 #define YYREJECT goto yyabort
714 #define YYACCEPT goto yyaccept
715 #define YYERROR  goto yyerrlab
716
717 int
718 YYPARSE_DECL()
719 {
720     int yym, yyn, yystate;
721 #if YYDEBUG
722     const char *yys;
723
724     if ((yys = getenv("YYDEBUG")) != 0)
725     {
726         yyn = *yys;
727         if (yyn >= '0' && yyn <= '9')
728             yydebug = yyn - '0';
729     }
730 #endif
731
732     yynerrs = 0;
733     yyerrflag = 0;
734     yychar = YYEMPTY;
735     yystate = 0;
736
737 #if YYPURE
738     memset(&yystack, 0, sizeof(yystack));
739 #endif
740
741     if (yystack.s_base == NULL && yygrowstack(&yystack)) goto yyoverflow;
742     yystack.s_mark = yystack.s_base;
743     yystack.l_mark = yystack.l_base;
744     yystate = 0;
745     *yystack.s_mark = 0;
746
747 yyloop:
748     if ((yyn = yydefred[yystate]) != 0) goto yyreduce;
749     if (yychar < 0)
750     {
751         if ((yychar = YYLEX) < 0) yychar = 0;
752 #if YYDEBUG
753         if (yydebug)
754         {
755             yys = 0;
756             if (yychar <= YYMAXTOKEN) yys = yyname[yychar];
757             if (!yys) yys = "illegal-symbol";
758             printf("%sdebug: state %d, reading %d (%s)\n",
759                     YYPREFIX, yystate, yychar, yys);
760         }
761 #endif
762     }
763     if ((yyn = yysindex[yystate]) && (yyn += yychar) >= 0 &&
764             yyn <= YYTABLESIZE && yycheck[yyn] == yychar)
765     {
766 #if YYDEBUG
767         if (yydebug)
768             printf("%sdebug: state %d, shifting to state %d\n",
769                     YYPREFIX, yystate, yytable[yyn]);
770 #endif
771         if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack))
772         {
773             goto yyoverflow;
774         }
775         yystate = yytable[yyn];
776         *++yystack.s_mark = yytable[yyn];
777         *++yystack.l_mark = yylval;
778         yychar = YYEMPTY;
779         if (yyerrflag > 0)  --yyerrflag;
780         goto yyloop;
781     }
782     if ((yyn = yyrindex[yystate]) && (yyn += yychar) >= 0 &&
783             yyn <= YYTABLESIZE && yycheck[yyn] == yychar)
784     {
785         yyn = yytable[yyn];
786         goto yyreduce;
787     }
788     if (yyerrflag) goto yyinrecovery;
789
790     yyerror("syntax error");
791
792     goto yyerrlab;
793
794 yyerrlab:
795     ++yynerrs;
796
797 yyinrecovery:
798     if (yyerrflag < 3)
799     {
800         yyerrflag = 3;
801         for (;;)
802         {
803             if ((yyn = yysindex[*yystack.s_mark]) && (yyn += YYERRCODE) >= 0 &&
804                     yyn <= YYTABLESIZE && yycheck[yyn] == YYERRCODE)
805             {
806 #if YYDEBUG
807                 if (yydebug)
808                     printf("%sdebug: state %d, error recovery shifting\
809  to state %d\n", YYPREFIX, *yystack.s_mark, yytable[yyn]);
810 #endif
811                 if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack))
812                 {
813                     goto yyoverflow;
814                 }
815                 yystate = yytable[yyn];
816                 *++yystack.s_mark = yytable[yyn];
817                 *++yystack.l_mark = yylval;
818                 goto yyloop;
819             }
820             else
821             {
822 #if YYDEBUG
823                 if (yydebug)
824                     printf("%sdebug: error recovery discarding state %d\n",
825                             YYPREFIX, *yystack.s_mark);
826 #endif
827                 if (yystack.s_mark <= yystack.s_base) goto yyabort;
828                 --yystack.s_mark;
829                 --yystack.l_mark;
830             }
831         }
832     }
833     else
834     {
835         if (yychar == 0) goto yyabort;
836 #if YYDEBUG
837         if (yydebug)
838         {
839             yys = 0;
840             if (yychar <= YYMAXTOKEN) yys = yyname[yychar];
841             if (!yys) yys = "illegal-symbol";
842             printf("%sdebug: state %d, error recovery discards token %d (%s)\n",
843                     YYPREFIX, yystate, yychar, yys);
844         }
845 #endif
846         yychar = YYEMPTY;
847         goto yyloop;
848     }
849
850 yyreduce:
851 #if YYDEBUG
852     if (yydebug)
853         printf("%sdebug: state %d, reducing by rule %d (%s)\n",
854                 YYPREFIX, yystate, yyn, yyrule[yyn]);
855 #endif
856     yym = yylen[yyn];
857     if (yym)
858         yyval = yystack.l_mark[1-yym];
859     else
860         memset(&yyval, 0, sizeof yyval);
861     switch (yyn)
862     {
863 case 1:
864 #line 119 "parse.y"
865         { /* add default rule */
866                         int def_rule;
867
868                         pat = cclinit();
869                         cclnegate( pat );
870
871                         def_rule = mkstate( -pat );
872
873                         /* Remember the number of the default rule so we
874                          * don't generate "can't match" warnings for it.
875                          */
876                         default_rule = num_rules;
877
878                         finish_rule( def_rule, false, 0, 0, 0);
879
880                         for ( i = 1; i <= lastsc; ++i )
881                                 scset[i] = mkbranch( scset[i], def_rule );
882
883                         if ( spprdflt )
884                                 add_action(
885                                 "YY_FATAL_ERROR( \"flex scanner jammed\" )" );
886                         else
887                                 add_action( "ECHO" );
888
889                         add_action( ";\n\tYY_BREAK\n" );
890                         }
891 break;
892 case 2:
893 #line 148 "parse.y"
894         { /* initialize for processing rules */
895
896                         /* Create default DFA start condition. */
897                         scinstal( "INITIAL", false );
898                         }
899 break;
900 case 6:
901 #line 159 "parse.y"
902         { synerr( _("unknown error processing section 1") ); }
903 break;
904 case 7:
905 #line 163 "parse.y"
906         {
907                         check_options();
908                         scon_stk = allocate_integer_array( lastsc + 1 );
909                         scon_stk_ptr = 0;
910                         }
911 break;
912 case 8:
913 #line 171 "parse.y"
914         { xcluflg = false; }
915 break;
916 case 9:
917 #line 174 "parse.y"
918         { xcluflg = true; }
919 break;
920 case 10:
921 #line 178 "parse.y"
922         { scinstal( nmstr, xcluflg ); }
923 break;
924 case 11:
925 #line 181 "parse.y"
926         { scinstal( nmstr, xcluflg ); }
927 break;
928 case 12:
929 #line 184 "parse.y"
930         { synerr( _("bad start condition list") ); }
931 break;
932 case 16:
933 #line 195 "parse.y"
934         {
935                         outfilename = copy_string( nmstr );
936                         did_outfilename = 1;
937                         }
938 break;
939 case 17:
940 #line 200 "parse.y"
941         { extra_type = copy_string( nmstr ); }
942 break;
943 case 18:
944 #line 202 "parse.y"
945         { prefix = copy_string( nmstr ); }
946 break;
947 case 19:
948 #line 204 "parse.y"
949         { yyclass = copy_string( nmstr ); }
950 break;
951 case 20:
952 #line 206 "parse.y"
953         { headerfilename = copy_string( nmstr ); }
954 break;
955 case 21:
956 #line 208 "parse.y"
957         { tablesext = true; tablesfilename = copy_string( nmstr ); }
958 break;
959 case 22:
960 #line 212 "parse.y"
961         { scon_stk_ptr = yystack.l_mark[-3]; }
962 break;
963 case 23:
964 #line 214 "parse.y"
965         { scon_stk_ptr = yystack.l_mark[-3]; }
966 break;
967 case 25:
968 #line 219 "parse.y"
969         {
970                         /* Initialize for a parse of one rule. */
971                         trlcontxt = variable_trail_rule = varlength = false;
972                         trailcnt = headcnt = rulelen = 0;
973                         current_state_type = STATE_NORMAL;
974                         previous_continued_action = continued_action;
975                         in_rule = true;
976
977                         new_rule();
978                         }
979 break;
980 case 26:
981 #line 232 "parse.y"
982         {
983                         pat = yystack.l_mark[0];
984                         finish_rule( pat, variable_trail_rule,
985                                 headcnt, trailcnt , previous_continued_action);
986
987                         if ( scon_stk_ptr > 0 )
988                                 {
989                                 for ( i = 1; i <= scon_stk_ptr; ++i )
990                                         scbol[scon_stk[i]] =
991                                                 mkbranch( scbol[scon_stk[i]],
992                                                                 pat );
993                                 }
994
995                         else
996                                 {
997                                 /* Add to all non-exclusive start conditions,
998                                  * including the default (0) start condition.
999                                  */
1000
1001                                 for ( i = 1; i <= lastsc; ++i )
1002                                         if ( ! scxclu[i] )
1003                                                 scbol[i] = mkbranch( scbol[i],
1004                                                                         pat );
1005                                 }
1006
1007                         if ( ! bol_needed )
1008                                 {
1009                                 bol_needed = true;
1010
1011                                 if ( performance_report > 1 )
1012                                         pinpoint_message(
1013                         "'^' operator results in sub-optimal performance" );
1014                                 }
1015                         }
1016 break;
1017 case 27:
1018 #line 268 "parse.y"
1019         {
1020                         pat = yystack.l_mark[0];
1021                         finish_rule( pat, variable_trail_rule,
1022                                 headcnt, trailcnt , previous_continued_action);
1023
1024                         if ( scon_stk_ptr > 0 )
1025                                 {
1026                                 for ( i = 1; i <= scon_stk_ptr; ++i )
1027                                         scset[scon_stk[i]] =
1028                                                 mkbranch( scset[scon_stk[i]],
1029                                                                 pat );
1030                                 }
1031
1032                         else
1033                                 {
1034                                 for ( i = 1; i <= lastsc; ++i )
1035                                         if ( ! scxclu[i] )
1036                                                 scset[i] =
1037                                                         mkbranch( scset[i],
1038                                                                 pat );
1039                                 }
1040                         }
1041 break;
1042 case 28:
1043 #line 292 "parse.y"
1044         {
1045                         if ( scon_stk_ptr > 0 )
1046                                 build_eof_action();
1047         
1048                         else
1049                                 {
1050                                 /* This EOF applies to all start conditions
1051                                  * which don't already have EOF actions.
1052                                  */
1053                                 for ( i = 1; i <= lastsc; ++i )
1054                                         if ( ! sceof[i] )
1055                                                 scon_stk[++scon_stk_ptr] = i;
1056
1057                                 if ( scon_stk_ptr == 0 )
1058                                         warn(
1059                         "all start conditions already have <<EOF>> rules" );
1060
1061                                 else
1062                                         build_eof_action();
1063                                 }
1064                         }
1065 break;
1066 case 29:
1067 #line 315 "parse.y"
1068         { synerr( _("unrecognized rule") ); }
1069 break;
1070 case 30:
1071 #line 319 "parse.y"
1072         { yyval = scon_stk_ptr; }
1073 break;
1074 case 31:
1075 #line 323 "parse.y"
1076         { yyval = yystack.l_mark[-2]; }
1077 break;
1078 case 32:
1079 #line 326 "parse.y"
1080         {
1081                         yyval = scon_stk_ptr;
1082
1083                         for ( i = 1; i <= lastsc; ++i )
1084                                 {
1085                                 int j;
1086
1087                                 for ( j = 1; j <= scon_stk_ptr; ++j )
1088                                         if ( scon_stk[j] == i )
1089                                                 break;
1090
1091                                 if ( j > scon_stk_ptr )
1092                                         scon_stk[++scon_stk_ptr] = i;
1093                                 }
1094                         }
1095 break;
1096 case 33:
1097 #line 343 "parse.y"
1098         { yyval = scon_stk_ptr; }
1099 break;
1100 case 36:
1101 #line 351 "parse.y"
1102         { synerr( _("bad start condition list") ); }
1103 break;
1104 case 37:
1105 #line 355 "parse.y"
1106         {
1107                         if ( (scnum = sclookup( nmstr )) == 0 )
1108                                 format_pinpoint_message(
1109                                         "undeclared start condition %s",
1110                                         nmstr );
1111                         else
1112                                 {
1113                                 for ( i = 1; i <= scon_stk_ptr; ++i )
1114                                         if ( scon_stk[i] == scnum )
1115                                                 {
1116                                                 format_warn(
1117                                                         "<%s> specified twice",
1118                                                         scname[scnum] );
1119                                                 break;
1120                                                 }
1121
1122                                 if ( i > scon_stk_ptr )
1123                                         scon_stk[++scon_stk_ptr] = scnum;
1124                                 }
1125                         }
1126 break;
1127 case 38:
1128 #line 378 "parse.y"
1129         {
1130                         if ( transchar[lastst[yystack.l_mark[0]]] != SYM_EPSILON )
1131                                 /* Provide final transition \now/ so it
1132                                  * will be marked as a trailing context
1133                                  * state.
1134                                  */
1135                                 yystack.l_mark[0] = link_machines( yystack.l_mark[0],
1136                                                 mkstate( SYM_EPSILON ) );
1137
1138                         mark_beginning_as_normal( yystack.l_mark[0] );
1139                         current_state_type = STATE_NORMAL;
1140
1141                         if ( previous_continued_action )
1142                                 {
1143                                 /* We need to treat this as variable trailing
1144                                  * context so that the backup does not happen
1145                                  * in the action but before the action switch
1146                                  * statement.  If the backup happens in the
1147                                  * action, then the rules "falling into" this
1148                                  * one's action will *also* do the backup,
1149                                  * erroneously.
1150                                  */
1151                                 if ( ! varlength || headcnt != 0 )
1152                                         warn(
1153                 "trailing context made variable due to preceding '|' action" );
1154
1155                                 /* Mark as variable. */
1156                                 varlength = true;
1157                                 headcnt = 0;
1158
1159                                 }
1160
1161                         if ( lex_compat || (varlength && headcnt == 0) )
1162                                 { /* variable trailing context rule */
1163                                 /* Mark the first part of the rule as the
1164                                  * accepting "head" part of a trailing
1165                                  * context rule.
1166                                  *
1167                                  * By the way, we didn't do this at the
1168                                  * beginning of this production because back
1169                                  * then current_state_type was set up for a
1170                                  * trail rule, and add_accept() can create
1171                                  * a new state ...
1172                                  */
1173                                 add_accept( yystack.l_mark[-1],
1174                                         num_rules | YY_TRAILING_HEAD_MASK );
1175                                 variable_trail_rule = true;
1176                                 }
1177                         
1178                         else
1179                                 trailcnt = rulelen;
1180
1181                         yyval = link_machines( yystack.l_mark[-1], yystack.l_mark[0] );
1182                         }
1183 break;
1184 case 39:
1185 #line 434 "parse.y"
1186         { synerr( _("trailing context used twice") ); }
1187 break;
1188 case 40:
1189 #line 437 "parse.y"
1190         {
1191                         headcnt = 0;
1192                         trailcnt = 1;
1193                         rulelen = 1;
1194                         varlength = false;
1195
1196                         current_state_type = STATE_TRAILING_CONTEXT;
1197
1198                         if ( trlcontxt )
1199                                 {
1200                                 synerr( _("trailing context used twice") );
1201                                 yyval = mkstate( SYM_EPSILON );
1202                                 }
1203
1204                         else if ( previous_continued_action )
1205                                 {
1206                                 /* See the comment in the rule for "re2 re"
1207                                  * above.
1208                                  */
1209                                 warn(
1210                 "trailing context made variable due to preceding '|' action" );
1211
1212                                 varlength = true;
1213                                 }
1214
1215                         if ( lex_compat || varlength )
1216                                 {
1217                                 /* Again, see the comment in the rule for
1218                                  * "re2 re" above.
1219                                  */
1220                                 add_accept( yystack.l_mark[-1],
1221                                         num_rules | YY_TRAILING_HEAD_MASK );
1222                                 variable_trail_rule = true;
1223                                 }
1224
1225                         trlcontxt = true;
1226
1227                         eps = mkstate( SYM_EPSILON );
1228                         yyval = link_machines( yystack.l_mark[-1],
1229                                 link_machines( eps, mkstate( '\n' ) ) );
1230                         }
1231 break;
1232 case 41:
1233 #line 480 "parse.y"
1234         {
1235                         yyval = yystack.l_mark[0];
1236
1237                         if ( trlcontxt )
1238                                 {
1239                                 if ( lex_compat || (varlength && headcnt == 0) )
1240                                         /* Both head and trail are
1241                                          * variable-length.
1242                                          */
1243                                         variable_trail_rule = true;
1244                                 else
1245                                         trailcnt = rulelen;
1246                                 }
1247                         }
1248 break;
1249 case 42:
1250 #line 498 "parse.y"
1251         {
1252                         varlength = true;
1253                         yyval = mkor( yystack.l_mark[-2], yystack.l_mark[0] );
1254                         }
1255 break;
1256 case 43:
1257 #line 504 "parse.y"
1258         { yyval = yystack.l_mark[0]; }
1259 break;
1260 case 44:
1261 #line 509 "parse.y"
1262         {
1263                         /* This rule is written separately so the
1264                          * reduction will occur before the trailing
1265                          * series is parsed.
1266                          */
1267
1268                         if ( trlcontxt )
1269                                 synerr( _("trailing context used twice") );
1270                         else
1271                                 trlcontxt = true;
1272
1273                         if ( varlength )
1274                                 /* We hope the trailing context is
1275                                  * fixed-length.
1276                                  */
1277                                 varlength = false;
1278                         else
1279                                 headcnt = rulelen;
1280
1281                         rulelen = 0;
1282
1283                         current_state_type = STATE_TRAILING_CONTEXT;
1284                         yyval = yystack.l_mark[-1];
1285                         }
1286 break;
1287 case 45:
1288 #line 536 "parse.y"
1289         {
1290                         /* This is where concatenation of adjacent patterns
1291                          * gets done.
1292                          */
1293                         yyval = link_machines( yystack.l_mark[-1], yystack.l_mark[0] );
1294                         }
1295 break;
1296 case 46:
1297 #line 544 "parse.y"
1298         { yyval = yystack.l_mark[0]; }
1299 break;
1300 case 47:
1301 #line 547 "parse.y"
1302         {
1303                         varlength = true;
1304
1305                         if ( yystack.l_mark[-3] > yystack.l_mark[-1] || yystack.l_mark[-3] < 0 )
1306                                 {
1307                                 synerr( _("bad iteration values") );
1308                                 yyval = yystack.l_mark[-5];
1309                                 }
1310                         else
1311                                 {
1312                                 if ( yystack.l_mark[-3] == 0 )
1313                                         {
1314                                         if ( yystack.l_mark[-1] <= 0 )
1315                                                 {
1316                                                 synerr(
1317                                                 _("bad iteration values") );
1318                                                 yyval = yystack.l_mark[-5];
1319                                                 }
1320                                         else
1321                                                 yyval = mkopt(
1322                                                         mkrep( yystack.l_mark[-5], 1, yystack.l_mark[-1] ) );
1323                                         }
1324                                 else
1325                                         yyval = mkrep( yystack.l_mark[-5], yystack.l_mark[-3], yystack.l_mark[-1] );
1326                                 }
1327                         }
1328 break;
1329 case 48:
1330 #line 575 "parse.y"
1331         {
1332                         varlength = true;
1333
1334                         if ( yystack.l_mark[-2] <= 0 )
1335                                 {
1336                                 synerr( _("iteration value must be positive") );
1337                                 yyval = yystack.l_mark[-4];
1338                                 }
1339
1340                         else
1341                                 yyval = mkrep( yystack.l_mark[-4], yystack.l_mark[-2], INFINITE_REPEAT );
1342                         }
1343 break;
1344 case 49:
1345 #line 589 "parse.y"
1346         {
1347                         /* The series could be something like "(foo)",
1348                          * in which case we have no idea what its length
1349                          * is, so we punt here.
1350                          */
1351                         varlength = true;
1352
1353                         if ( yystack.l_mark[-1] <= 0 )
1354                                 {
1355                                   synerr( _("iteration value must be positive")
1356                                           );
1357                                 yyval = yystack.l_mark[-3];
1358                                 }
1359
1360                         else
1361                                 yyval = link_machines( yystack.l_mark[-3],
1362                                                 copysingl( yystack.l_mark[-3], yystack.l_mark[-1] - 1 ) );
1363                         }
1364 break;
1365 case 50:
1366 #line 611 "parse.y"
1367         {
1368                         varlength = true;
1369
1370                         yyval = mkclos( yystack.l_mark[-1] );
1371                         }
1372 break;
1373 case 51:
1374 #line 618 "parse.y"
1375         {
1376                         varlength = true;
1377                         yyval = mkposcl( yystack.l_mark[-1] );
1378                         }
1379 break;
1380 case 52:
1381 #line 624 "parse.y"
1382         {
1383                         varlength = true;
1384                         yyval = mkopt( yystack.l_mark[-1] );
1385                         }
1386 break;
1387 case 53:
1388 #line 630 "parse.y"
1389         {
1390                         varlength = true;
1391
1392                         if ( yystack.l_mark[-3] > yystack.l_mark[-1] || yystack.l_mark[-3] < 0 )
1393                                 {
1394                                 synerr( _("bad iteration values") );
1395                                 yyval = yystack.l_mark[-5];
1396                                 }
1397                         else
1398                                 {
1399                                 if ( yystack.l_mark[-3] == 0 )
1400                                         {
1401                                         if ( yystack.l_mark[-1] <= 0 )
1402                                                 {
1403                                                 synerr(
1404                                                 _("bad iteration values") );
1405                                                 yyval = yystack.l_mark[-5];
1406                                                 }
1407                                         else
1408                                                 yyval = mkopt(
1409                                                         mkrep( yystack.l_mark[-5], 1, yystack.l_mark[-1] ) );
1410                                         }
1411                                 else
1412                                         yyval = mkrep( yystack.l_mark[-5], yystack.l_mark[-3], yystack.l_mark[-1] );
1413                                 }
1414                         }
1415 break;
1416 case 54:
1417 #line 658 "parse.y"
1418         {
1419                         varlength = true;
1420
1421                         if ( yystack.l_mark[-2] <= 0 )
1422                                 {
1423                                 synerr( _("iteration value must be positive") );
1424                                 yyval = yystack.l_mark[-4];
1425                                 }
1426
1427                         else
1428                                 yyval = mkrep( yystack.l_mark[-4], yystack.l_mark[-2], INFINITE_REPEAT );
1429                         }
1430 break;
1431 case 55:
1432 #line 672 "parse.y"
1433         {
1434                         /* The singleton could be something like "(foo)",
1435                          * in which case we have no idea what its length
1436                          * is, so we punt here.
1437                          */
1438                         varlength = true;
1439
1440                         if ( yystack.l_mark[-1] <= 0 )
1441                                 {
1442                                 synerr( _("iteration value must be positive") );
1443                                 yyval = yystack.l_mark[-3];
1444                                 }
1445
1446                         else
1447                                 yyval = link_machines( yystack.l_mark[-3],
1448                                                 copysingl( yystack.l_mark[-3], yystack.l_mark[-1] - 1 ) );
1449                         }
1450 break;
1451 case 56:
1452 #line 691 "parse.y"
1453         {
1454                         if ( ! madeany )
1455                                 {
1456                                 /* Create the '.' character class. */
1457                     ccldot = cclinit();
1458                     ccladd( ccldot, '\n' );
1459                     cclnegate( ccldot );
1460
1461                     if ( useecs )
1462                         mkeccl( ccltbl + cclmap[ccldot],
1463                             ccllen[ccldot], nextecm,
1464                             ecgroup, csize, csize );
1465
1466                                 /* Create the (?s:'.') character class. */
1467                     cclany = cclinit();
1468                     cclnegate( cclany );
1469
1470                     if ( useecs )
1471                         mkeccl( ccltbl + cclmap[cclany],
1472                             ccllen[cclany], nextecm,
1473                             ecgroup, csize, csize );
1474
1475                                 madeany = true;
1476                                 }
1477
1478                         ++rulelen;
1479
1480             if (sf_dot_all())
1481                 yyval = mkstate( -cclany );
1482             else
1483                 yyval = mkstate( -ccldot );
1484                         }
1485 break;
1486 case 57:
1487 #line 725 "parse.y"
1488         {
1489                                 /* Sort characters for fast searching.
1490                                  */
1491                                 qsort( ccltbl + cclmap[yystack.l_mark[0]], ccllen[yystack.l_mark[0]], sizeof (*ccltbl), cclcmp );
1492
1493                         if ( useecs )
1494                                 mkeccl( ccltbl + cclmap[yystack.l_mark[0]], ccllen[yystack.l_mark[0]],
1495                                         nextecm, ecgroup, csize, csize );
1496
1497                         ++rulelen;
1498
1499                         if (ccl_has_nl[yystack.l_mark[0]])
1500                                 rule_has_nl[num_rules] = true;
1501
1502                         yyval = mkstate( -yystack.l_mark[0] );
1503                         }
1504 break;
1505 case 58:
1506 #line 743 "parse.y"
1507         {
1508                         ++rulelen;
1509
1510                         if (ccl_has_nl[yystack.l_mark[0]])
1511                                 rule_has_nl[num_rules] = true;
1512
1513                         yyval = mkstate( -yystack.l_mark[0] );
1514                         }
1515 break;
1516 case 59:
1517 #line 753 "parse.y"
1518         { yyval = yystack.l_mark[-1]; }
1519 break;
1520 case 60:
1521 #line 756 "parse.y"
1522         { yyval = yystack.l_mark[-1]; }
1523 break;
1524 case 61:
1525 #line 759 "parse.y"
1526         {
1527                         ++rulelen;
1528
1529                         if (yystack.l_mark[0] == nlch)
1530                                 rule_has_nl[num_rules] = true;
1531
1532             if (sf_case_ins() && has_case(yystack.l_mark[0]))
1533                 /* create an alternation, as in (a|A) */
1534                 yyval = mkor (mkstate(yystack.l_mark[0]), mkstate(reverse_case(yystack.l_mark[0])));
1535             else
1536                 yyval = mkstate( yystack.l_mark[0] );
1537                         }
1538 break;
1539 case 62:
1540 #line 773 "parse.y"
1541         { yyval = ccl_set_diff  (yystack.l_mark[-2], yystack.l_mark[0]); }
1542 break;
1543 case 63:
1544 #line 774 "parse.y"
1545         { yyval = ccl_set_union (yystack.l_mark[-2], yystack.l_mark[0]); }
1546 break;
1547 case 65:
1548 #line 780 "parse.y"
1549         { yyval = yystack.l_mark[-1]; }
1550 break;
1551 case 66:
1552 #line 783 "parse.y"
1553         {
1554                         cclnegate( yystack.l_mark[-1] );
1555                         yyval = yystack.l_mark[-1];
1556                         }
1557 break;
1558 case 67:
1559 #line 790 "parse.y"
1560         {
1561
1562                         if (sf_case_ins())
1563                           {
1564
1565                             /* If one end of the range has case and the other
1566                              * does not, or the cases are different, then we're not
1567                              * sure what range the user is trying to express.
1568                              * Examples: [@-z] or [S-t]
1569                              */
1570                             if (has_case (yystack.l_mark[-2]) != has_case (yystack.l_mark[0])
1571                                      || (has_case (yystack.l_mark[-2]) && (b_islower (yystack.l_mark[-2]) != b_islower (yystack.l_mark[0])))
1572                                      || (has_case (yystack.l_mark[-2]) && (b_isupper (yystack.l_mark[-2]) != b_isupper (yystack.l_mark[0]))))
1573                               format_warn3 (
1574                               _("the character range [%c-%c] is ambiguous in a case-insensitive scanner"),
1575                                             yystack.l_mark[-2], yystack.l_mark[0]);
1576
1577                             /* If the range spans uppercase characters but not
1578                              * lowercase (or vice-versa), then should we automatically
1579                              * include lowercase characters in the range?
1580                              * Example: [@-_] spans [a-z] but not [A-Z]
1581                              */
1582                             else if (!has_case (yystack.l_mark[-2]) && !has_case (yystack.l_mark[0]) && !range_covers_case (yystack.l_mark[-2], yystack.l_mark[0]))
1583                               format_warn3 (
1584                               _("the character range [%c-%c] is ambiguous in a case-insensitive scanner"),
1585                                             yystack.l_mark[-2], yystack.l_mark[0]);
1586                           }
1587
1588                         if ( yystack.l_mark[-2] > yystack.l_mark[0] )
1589                                 synerr( _("negative range in character class") );
1590
1591                         else
1592                                 {
1593                                 for ( i = yystack.l_mark[-2]; i <= yystack.l_mark[0]; ++i )
1594                                         ccladd( yystack.l_mark[-3], i );
1595
1596                                 /* Keep track if this ccl is staying in
1597                                  * alphabetical order.
1598                                  */
1599                                 cclsorted = cclsorted && (yystack.l_mark[-2] > lastchar);
1600                                 lastchar = yystack.l_mark[0];
1601
1602                 /* Do it again for upper/lowercase */
1603                 if (sf_case_ins() && has_case(yystack.l_mark[-2]) && has_case(yystack.l_mark[0])){
1604                     yystack.l_mark[-2] = reverse_case (yystack.l_mark[-2]);
1605                     yystack.l_mark[0] = reverse_case (yystack.l_mark[0]);
1606                     
1607                     for ( i = yystack.l_mark[-2]; i <= yystack.l_mark[0]; ++i )
1608                         ccladd( yystack.l_mark[-3], i );
1609
1610                     cclsorted = cclsorted && (yystack.l_mark[-2] > lastchar);
1611                     lastchar = yystack.l_mark[0];
1612                 }
1613
1614                                 }
1615
1616                         yyval = yystack.l_mark[-3];
1617                         }
1618 break;
1619 case 68:
1620 #line 850 "parse.y"
1621         {
1622                         ccladd( yystack.l_mark[-1], yystack.l_mark[0] );
1623                         cclsorted = cclsorted && (yystack.l_mark[0] > lastchar);
1624                         lastchar = yystack.l_mark[0];
1625
1626             /* Do it again for upper/lowercase */
1627             if (sf_case_ins() && has_case(yystack.l_mark[0])){
1628                 yystack.l_mark[0] = reverse_case (yystack.l_mark[0]);
1629                 ccladd (yystack.l_mark[-1], yystack.l_mark[0]);
1630
1631                 cclsorted = cclsorted && (yystack.l_mark[0] > lastchar);
1632                 lastchar = yystack.l_mark[0];
1633             }
1634
1635                         yyval = yystack.l_mark[-1];
1636                         }
1637 break;
1638 case 69:
1639 #line 868 "parse.y"
1640         {
1641                         /* Too hard to properly maintain cclsorted. */
1642                         cclsorted = false;
1643                         yyval = yystack.l_mark[-1];
1644                         }
1645 break;
1646 case 70:
1647 #line 875 "parse.y"
1648         {
1649                         cclsorted = true;
1650                         lastchar = 0;
1651                         currccl = yyval = cclinit();
1652                         }
1653 break;
1654 case 71:
1655 #line 883 "parse.y"
1656         { CCL_EXPR(isalnum); }
1657 break;
1658 case 72:
1659 #line 884 "parse.y"
1660         { CCL_EXPR(isalpha); }
1661 break;
1662 case 73:
1663 #line 885 "parse.y"
1664         { CCL_EXPR(IS_BLANK); }
1665 break;
1666 case 74:
1667 #line 886 "parse.y"
1668         { CCL_EXPR(iscntrl); }
1669 break;
1670 case 75:
1671 #line 887 "parse.y"
1672         { CCL_EXPR(isdigit); }
1673 break;
1674 case 76:
1675 #line 888 "parse.y"
1676         { CCL_EXPR(isgraph); }
1677 break;
1678 case 77:
1679 #line 889 "parse.y"
1680         { 
1681                           CCL_EXPR(islower);
1682                           if (sf_case_ins())
1683                               CCL_EXPR(isupper);
1684                         }
1685 break;
1686 case 78:
1687 #line 894 "parse.y"
1688         { CCL_EXPR(isprint); }
1689 break;
1690 case 79:
1691 #line 895 "parse.y"
1692         { CCL_EXPR(ispunct); }
1693 break;
1694 case 80:
1695 #line 896 "parse.y"
1696         { CCL_EXPR(isspace); }
1697 break;
1698 case 81:
1699 #line 897 "parse.y"
1700         { CCL_EXPR(isxdigit); }
1701 break;
1702 case 82:
1703 #line 898 "parse.y"
1704         {
1705                     CCL_EXPR(isupper);
1706                     if (sf_case_ins())
1707                         CCL_EXPR(islower);
1708                                 }
1709 break;
1710 case 83:
1711 #line 904 "parse.y"
1712         { CCL_NEG_EXPR(isalnum); }
1713 break;
1714 case 84:
1715 #line 905 "parse.y"
1716         { CCL_NEG_EXPR(isalpha); }
1717 break;
1718 case 85:
1719 #line 906 "parse.y"
1720         { CCL_NEG_EXPR(IS_BLANK); }
1721 break;
1722 case 86:
1723 #line 907 "parse.y"
1724         { CCL_NEG_EXPR(iscntrl); }
1725 break;
1726 case 87:
1727 #line 908 "parse.y"
1728         { CCL_NEG_EXPR(isdigit); }
1729 break;
1730 case 88:
1731 #line 909 "parse.y"
1732         { CCL_NEG_EXPR(isgraph); }
1733 break;
1734 case 89:
1735 #line 910 "parse.y"
1736         { CCL_NEG_EXPR(isprint); }
1737 break;
1738 case 90:
1739 #line 911 "parse.y"
1740         { CCL_NEG_EXPR(ispunct); }
1741 break;
1742 case 91:
1743 #line 912 "parse.y"
1744         { CCL_NEG_EXPR(isspace); }
1745 break;
1746 case 92:
1747 #line 913 "parse.y"
1748         { CCL_NEG_EXPR(isxdigit); }
1749 break;
1750 case 93:
1751 #line 914 "parse.y"
1752         { 
1753                                 if ( sf_case_ins() )
1754                                         warn(_("[:^lower:] is ambiguous in case insensitive scanner"));
1755                                 else
1756                                         CCL_NEG_EXPR(islower);
1757                                 }
1758 break;
1759 case 94:
1760 #line 920 "parse.y"
1761         {
1762                                 if ( sf_case_ins() )
1763                                         warn(_("[:^upper:] ambiguous in case insensitive scanner"));
1764                                 else
1765                                         CCL_NEG_EXPR(isupper);
1766                                 }
1767 break;
1768 case 95:
1769 #line 929 "parse.y"
1770         {
1771                         if ( yystack.l_mark[0] == nlch )
1772                                 rule_has_nl[num_rules] = true;
1773
1774                         ++rulelen;
1775
1776             if (sf_case_ins() && has_case(yystack.l_mark[0]))
1777                 yyval = mkor (mkstate(yystack.l_mark[0]), mkstate(reverse_case(yystack.l_mark[0])));
1778             else
1779                 yyval = mkstate (yystack.l_mark[0]);
1780
1781                         yyval = link_machines( yystack.l_mark[-1], yyval);
1782                         }
1783 break;
1784 case 96:
1785 #line 944 "parse.y"
1786         { yyval = mkstate( SYM_EPSILON ); }
1787 break;
1788 #line 1787 "parse.c"
1789     }
1790     yystack.s_mark -= yym;
1791     yystate = *yystack.s_mark;
1792     yystack.l_mark -= yym;
1793     yym = yylhs[yyn];
1794     if (yystate == 0 && yym == 0)
1795     {
1796 #if YYDEBUG
1797         if (yydebug)
1798             printf("%sdebug: after reduction, shifting from state 0 to\
1799  state %d\n", YYPREFIX, YYFINAL);
1800 #endif
1801         yystate = YYFINAL;
1802         *++yystack.s_mark = YYFINAL;
1803         *++yystack.l_mark = yyval;
1804         if (yychar < 0)
1805         {
1806             if ((yychar = YYLEX) < 0) yychar = 0;
1807 #if YYDEBUG
1808             if (yydebug)
1809             {
1810                 yys = 0;
1811                 if (yychar <= YYMAXTOKEN) yys = yyname[yychar];
1812                 if (!yys) yys = "illegal-symbol";
1813                 printf("%sdebug: state %d, reading %d (%s)\n",
1814                         YYPREFIX, YYFINAL, yychar, yys);
1815             }
1816 #endif
1817         }
1818         if (yychar == 0) goto yyaccept;
1819         goto yyloop;
1820     }
1821     if ((yyn = yygindex[yym]) && (yyn += yystate) >= 0 &&
1822             yyn <= YYTABLESIZE && yycheck[yyn] == yystate)
1823         yystate = yytable[yyn];
1824     else
1825         yystate = yydgoto[yym];
1826 #if YYDEBUG
1827     if (yydebug)
1828         printf("%sdebug: after reduction, shifting from state %d \
1829 to state %d\n", YYPREFIX, *yystack.s_mark, yystate);
1830 #endif
1831     if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack))
1832     {
1833         goto yyoverflow;
1834     }
1835     *++yystack.s_mark = (short) yystate;
1836     *++yystack.l_mark = yyval;
1837     goto yyloop;
1838
1839 yyoverflow:
1840     yyerror("yacc stack overflow");
1841
1842 yyabort:
1843     yyfreestack(&yystack);
1844     return (1);
1845
1846 yyaccept:
1847     yyfreestack(&yystack);
1848     return (0);
1849 }