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