]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - usr.bin/lex/initparse.c
kdump: use VIS_NOLOCALE when printing output
[FreeBSD/FreeBSD.git] / usr.bin / lex / initparse.c
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 }