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