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