GCC Code Coverage Report
Directory: ./ Exec Total Coverage
File: usr.bin/lex/parse.c Lines: 219 428 51.2 %
Date: 2017-11-13 Branches: 143 485 29.5 %

Line Branch Exec Source
1
#include <stdlib.h>
2
#include <string.h>
3
#define YYBYACC 1
4
#define YYMAJOR 1
5
#define YYMINOR 9
6
#define YYLEX yylex()
7
#define YYEMPTY -1
8
#define yyclearin (yychar=(YYEMPTY))
9
#define yyerrok (yyerrflag=0)
10
#define YYRECOVERING() (yyerrflag!=0)
11
#define YYPREFIX "yy"
12
#line 37 "/usr/src/usr.bin/lex/parse.y"
13
/*  Copyright (c) 1990 The Regents of the University of California. */
14
/*  All rights reserved. */
15
16
/*  This code is derived from software contributed to Berkeley by */
17
/*  Vern Paxson. */
18
19
/*  The United States Government has rights in this work pursuant */
20
/*  to contract no. DE-AC03-76SF00098 between the United States */
21
/*  Department of Energy and the University of California. */
22
23
/*  This file is part of flex. */
24
25
/*  Redistribution and use in source and binary forms, with or without */
26
/*  modification, are permitted provided that the following conditions */
27
/*  are met: */
28
29
/*  1. Redistributions of source code must retain the above copyright */
30
/*     notice, this list of conditions and the following disclaimer. */
31
/*  2. Redistributions in binary form must reproduce the above copyright */
32
/*     notice, this list of conditions and the following disclaimer in the */
33
/*     documentation and/or other materials provided with the distribution. */
34
35
/*  Neither the name of the University nor the names of its contributors */
36
/*  may be used to endorse or promote products derived from this software */
37
/*  without specific prior written permission. */
38
39
/*  THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR */
40
/*  IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED */
41
/*  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR */
42
/*  PURPOSE. */
43
44
#include "flexdef.h"
45
#include "tables.h"
46
47
int pat, scnum, eps, headcnt, trailcnt, lastchar, i, rulelen;
48
int trlcontxt, xcluflg, currccl, cclsorted, varlength, variable_trail_rule;
49
50
int *scon_stk;
51
int scon_stk_ptr;
52
53
static int madeany = false;  /* whether we've made the '.' character class */
54
static int ccldot, cclany;
55
int previous_continued_action;	/* whether the previous rule's action was '|' */
56
57
#define format_warn3(fmt, a1, a2) \
58
	do{ \
59
        char fw3_msg[MAXLINE];\
60
        snprintf( fw3_msg, MAXLINE,(fmt), (a1), (a2) );\
61
        warn( fw3_msg );\
62
	}while(0)
63
64
/* Expand a POSIX character class expression. */
65
#define CCL_EXPR(func) \
66
	do{ \
67
	int c; \
68
	for ( c = 0; c < csize; ++c ) \
69
		if ( isascii(c) && func(c) ) \
70
			ccladd( currccl, c ); \
71
	}while(0)
72
73
/* negated class */
74
#define CCL_NEG_EXPR(func) \
75
	do{ \
76
	int c; \
77
	for ( c = 0; c < csize; ++c ) \
78
		if ( !func(c) ) \
79
			ccladd( currccl, c ); \
80
	}while(0)
81
82
/* On some over-ambitious machines, such as DEC Alpha's, the default
83
 * token type is "long" instead of "int"; this leads to problems with
84
 * declaring yylval in flexdef.h.  But so far, all the yacc's I've seen
85
 * wrap their definitions of YYSTYPE with "#ifndef YYSTYPE"'s, so the
86
 * following should ensure that the default token type is "int".
87
 */
88
#define YYSTYPE int
89
90
#line 91 "parse.c"
91
#define CHAR 257
92
#define NUMBER 258
93
#define SECTEND 259
94
#define SCDECL 260
95
#define XSCDECL 261
96
#define NAME 262
97
#define PREVCCL 263
98
#define EOF_OP 264
99
#define OPTION_OP 265
100
#define OPT_OUTFILE 266
101
#define OPT_PREFIX 267
102
#define OPT_YYCLASS 268
103
#define OPT_HEADER 269
104
#define OPT_EXTRA_TYPE 270
105
#define OPT_TABLES 271
106
#define CCE_ALNUM 272
107
#define CCE_ALPHA 273
108
#define CCE_BLANK 274
109
#define CCE_CNTRL 275
110
#define CCE_DIGIT 276
111
#define CCE_GRAPH 277
112
#define CCE_LOWER 278
113
#define CCE_PRINT 279
114
#define CCE_PUNCT 280
115
#define CCE_SPACE 281
116
#define CCE_UPPER 282
117
#define CCE_XDIGIT 283
118
#define CCE_NEG_ALNUM 284
119
#define CCE_NEG_ALPHA 285
120
#define CCE_NEG_BLANK 286
121
4
#define CCE_NEG_CNTRL 287
122
4
#define CCE_NEG_DIGIT 288
123
#define CCE_NEG_GRAPH 289
124
4
#define CCE_NEG_LOWER 290
125
#define CCE_NEG_PRINT 291
126
#define CCE_NEG_PUNCT 292
127
#define CCE_NEG_SPACE 293
128
#define CCE_NEG_UPPER 294
129
4
#define CCE_NEG_XDIGIT 295
130
#define CCL_OP_DIFF 296
131
4
#define CCL_OP_UNION 297
132
#define BEGIN_REPEAT_POSIX 298
133
36
#define END_REPEAT_POSIX 299
134
14
#define BEGIN_REPEAT_FLEX 300
135
#define END_REPEAT_FLEX 301
136
4
#define YYERRCODE 256
137
2
const short yylhs[] =
138
	{                                        -1,
139
    0,    1,    2,    2,    2,    2,    3,    6,    6,    7,
140
2
    7,    7,    8,    9,    9,   10,   10,   10,   10,   10,
141
   10,    4,    4,    4,    5,   12,   12,   12,   12,   14,
142
4
   11,   11,   11,   15,   15,   15,   16,   13,   13,   13,
143
   13,   18,   18,   17,   19,   19,   19,   19,   19,   20,
144
4
   20,   20,   20,   20,   20,   20,   20,   20,   20,   20,
145
   20,   21,   21,   21,   23,   23,   24,   24,   24,   24,
146
   25,   25,   25,   25,   25,   25,   25,   25,   25,   25,
147
   25,   25,   25,   25,   25,   25,   25,   25,   25,   25,
148
   25,   25,   25,   25,   22,   22,
149
};
150
12
const short yylen[] =
151
	{                                         2,
152
12
    5,    0,    3,    2,    0,    1,    1,    1,    1,    2,
153
    1,    1,    2,    2,    0,    3,    3,    3,    3,    3,
154
    3,    5,    5,    0,    0,    2,    1,    1,    1,    0,
155
    4,    3,    0,    3,    1,    1,    1,    2,    3,    2,
156
    1,    3,    1,    2,    2,    1,    6,    5,    4,    2,
157
    2,    2,    6,    5,    4,    1,    1,    1,    3,    3,
158
    1,    3,    3,    1,    3,    4,    4,    2,    2,    0,
159
    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
160
    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
161
    1,    1,    1,    1,    2,    0,
162
};
163
12
const short yydefred[] =
164
12
	{                                      2,
165
12
    0,    0,    6,    0,    7,    8,    9,   15,   24,    0,
166
    4,    0,    0,   12,   11,    0,    0,    0,    0,    0,
167
12
    0,    0,   14,    0,    1,    0,   10,    0,    0,    0,
168
    0,    0,    0,    0,    0,   24,    0,   16,   18,   19,
169
   20,   17,   21,   32,   36,   37,    0,   35,    0,   29,
170
6
   61,   58,   28,    0,   56,   96,    0,    0,    0,   27,
171
6
    0,    0,    0,    0,    0,   64,   31,    0,   23,   26,
172
    0,    0,   70,    0,   22,    0,   40,    0,   44,    0,
173
    0,    0,   50,   51,   52,    0,    0,   34,   95,   59,
174
   60,    0,    0,   71,   72,   73,   74,   75,   76,   77,
175
   78,   79,   80,   82,   81,   83,   84,   85,   86,   87,
176
   88,   93,   89,   90,   91,   94,   92,   65,   69,   39,
177
24
    0,    0,    0,   62,   63,   66,    0,   49,    0,   55,
178
24
    0,   67,    0,   48,    0,   54,   47,   53,
179
};
180
6
const short yydgoto[] =
181
6
	{                                       1,
182
    2,    4,    9,   13,   25,   10,   16,   11,   12,   23,
183
   26,   59,   60,   35,   47,   48,   61,   62,   63,   64,
184
   65,   71,   66,   74,  119,
185
};
186
const short yysindex[] =
187
	{                                      0,
188
    0, -222,    0, -155,    0,    0,    0,    0,    0, -215,
189
    0, -123,    6,    0,    0, -193,   10,   21,   26,   31,
190
   35,   37,    0,   59,    0,  -44,    0, -147, -145, -140,
191
 -133, -132, -129,   75, -214,    0,  -19,    0,    0,    0,
192
    0,    0,    0,    0,    0,    0,   23,    0,  -48,    0,
193
    0,    0,    0,  -17,    0,    0,  -17,   27,  128,    0,
194
  -17,   -1,  -30,  -41, -189,    0,    0, -121,    0,    0,
195
  -31,  -34,    0,  -87,    0,  -25,    0,  -17,    0, -109,
196
  -41, -108,    0,    0,    0,   60,   60,    0,    0,    0,
197
    0,   46,  107,    0,    0,    0,    0,    0,    0,    0,
198
    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
199
    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
200
  -30,  -36,  -39,    0,    0,    0, -104,    0, -219,    0,
201
 -238,    0, -144,    0, -143,    0,    0,    0,};
202
const short yyrindex[] =
203
	{                                      0,
204
    0, -141,    0,    0,    0,    0,    0,    0,    0,    0,
205
    0, -134,    9,    0,    0, -125,    0,    0,    0,    0,
206
    0,    0,    0, -178,    0,   22,    0,    0,    0,    0,
207
    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
208
    0,    0,    0,    0,    0,    0,    0,    0,  -21,    0,
209
    0,    0,    0,    0,    0,    0,    0,   85,    0,    0,
210
    0,  144,   47,    4,  -10,    0,    0,    0,    0,    0,
211
276
    0,    0,    0,    0,    0,  146,    0,    0,    0,    0,
212
276
   18,    0,    0,    0,    0,    0,    0,    0,    0,    0,
213
    0,    0,  124,    0,    0,    0,    0,    0,    0,    0,
214
    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
215
    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
216
   50,    0,    0,    0,    0,    0,    0,    0,    0,    0,
217
    0,    0,    0,    0,    0,    0,    0,    0,};
218
const short yygindex[] =
219
	{                                      0,
220
280
    0,    0,    0,  121,  133,    0,    0,    0,    0,    0,
221
280
    0,    0,  106,    0,    0,   93,    0,   32,   84,  -45,
222
280
    0,    0,   25,   90,    0,
223
280
};
224
280
#define YYTABLESIZE 419
225
const short yytable[] =
226
280
	{                                      57,
227
   83,   84,   90,   56,  131,  118,   91,  129,   25,   57,
228
280
  120,   24,   33,   46,   56,   55,   56,   81,   33,  135,
229
   57,   85,   57,   57,   33,   57,   55,   45,   55,   57,
230
   57,   57,   57,    3,   77,   57,   57,   46,  133,   46,
231
   14,   45,   33,   46,   46,   79,   15,   46,   33,   46,
232
   46,   45,   57,   45,   33,   25,   43,   45,   45,   42,
233
   58,   25,  136,   45,   45,   24,   68,   25,   27,   33,
234
   28,   58,   33,   58,   54,   81,   69,   30,   36,  134,
235
   57,   29,   43,   30,   67,   42,   30,   43,   72,   78,
236
   42,   31,   76,   43,   46,   32,   42,   33,   78,   33,
237
   34,   33,   33,    5,    6,    7,   86,   87,   45,    8,
238
  124,  125,   25,   57,   38,   25,   39,    5,    5,    5,
239
   73,   40,   78,    5,   13,   13,   13,   46,   41,   42,
240
   13,   33,   43,    3,    3,    3,   44,   75,  126,    3,
241
   46,   45,   17,   18,   19,   20,   21,   22,  122,  123,
242
   58,  127,  132,   41,  137,   38,   49,  138,   37,   70,
243
   88,  121,   92,    0,    0,    0,    0,    0,    0,   93,
244
   43,    0,    0,   42,    0,    0,    0,   70,    0,    0,
245
    0,    0,    0,    0,   94,   95,   96,   97,   98,   99,
246
  100,  101,  102,  103,  104,  105,  106,  107,  108,  109,
247
  110,  111,  112,  113,  114,  115,  116,  117,    0,    0,
248
    0,    0,    0,    0,    0,    0,   68,    0,    0,    0,
249
    0,    0,    0,    0,    0,   89,   51,    0,    0,    0,
250
    0,    0,   52,    0,   33,   33,   50,   51,    0,   51,
251
    0,   33,   33,   52,   53,   52,   57,    0,    0,    0,
252
    0,    0,   57,    0,    0,    0,    0,    0,   82,    0,
253
   46,  130,  128,    0,   33,   33,   46,   80,    0,    0,
254
    0,   33,   33,    0,   45,    0,    0,   25,   25,    0,
255
   45,    0,    0,    0,   25,   25,    0,   57,    0,   57,
256
    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
257
    0,   46,   93,    0,    0,    0,    0,    0,    0,    0,
258
    0,    0,    0,    0,    0,   45,    0,   94,   95,   96,
259
   97,   98,   99,  100,  101,  102,  103,  104,  105,  106,
260
  107,  108,  109,  110,  111,  112,  113,  114,  115,  116,
261
  117,   70,    0,    0,    0,    0,    0,    0,    0,    0,
262
    0,    0,    0,    0,    0,    0,   70,   70,   70,   70,
263
   70,   70,   70,   70,   70,   70,   70,   70,   70,   70,
264
   70,   70,   70,   70,   70,   70,   70,   70,   70,   70,
265
   68,    0,    0,    0,    0,    0,    0,    0,    0,    0,
266
    0,    0,    0,    0,    0,   68,   68,   68,   68,   68,
267
   68,   68,   68,   68,   68,   68,   68,   68,   68,   68,
268
276
   68,   68,   68,   68,   68,   68,   68,   68,   68,
269
552
};
270
276
const short yycheck[] =
271
	{                                      10,
272
276
   42,   43,   34,   34,   44,   93,   41,   44,    0,   40,
273
   36,   60,   34,   10,   34,   46,   34,   63,   40,  258,
274
292
   40,   63,   40,   34,   46,   36,   46,   10,   46,   40,
275
80
   41,   42,   43,  256,   36,   46,   47,   34,  258,   36,
276
160
  256,  256,   34,   40,   41,   47,  262,  262,   40,   46,
277
80
   47,   34,   63,   36,   46,   34,   10,   40,   41,   10,
278
   91,   40,  301,   46,   47,   60,   44,   46,  262,   91,
279
   61,   91,   94,   91,   94,  121,  125,  256,  123,  299,
280
   91,   61,   36,  262,   62,   36,   61,   41,   57,  124,
281
   41,   61,   61,   47,   91,   61,   47,   61,  124,   91,
282
960
   42,  123,   94,  259,  260,  261,  296,  297,   91,  265,
283
270
   86,   87,   91,  124,  262,   94,  262,  259,  260,  261,
284
270
   94,  262,  124,  265,  259,  260,  261,  124,  262,  262,
285
540
  265,  123,  262,  259,  260,  261,   62,   10,   93,  265,
286
270
  262,  124,  266,  267,  268,  269,  270,  271,  258,  258,
287
   91,   45,  257,   10,  299,   10,   36,  301,   26,   54,
288
   68,   78,   73,   -1,   -1,   -1,   -1,   -1,   -1,  257,
289
  124,   -1,   -1,  124,   -1,   -1,   -1,   93,   -1,   -1,
290
   -1,   -1,   -1,   -1,  272,  273,  274,  275,  276,  277,
291
  278,  279,  280,  281,  282,  283,  284,  285,  286,  287,
292
  288,  289,  290,  291,  292,  293,  294,  295,   -1,   -1,
293
   -1,   -1,   -1,   -1,   -1,   -1,   93,   -1,   -1,   -1,
294
   -1,   -1,   -1,   -1,   -1,  257,  257,   -1,   -1,   -1,
295
   -1,   -1,  263,   -1,  256,  257,  256,  257,   -1,  257,
296
   -1,  263,  264,  263,  264,  263,  257,   -1,   -1,   -1,
297
   -1,   -1,  263,   -1,   -1,   -1,   -1,   -1,  300,   -1,
298
  257,  301,  299,   -1,  256,  257,  263,  298,   -1,   -1,
299
   -1,  263,  264,   -1,  257,   -1,   -1,  256,  257,   -1,
300
  263,   -1,   -1,   -1,  263,  264,   -1,  298,   -1,  300,
301
   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
302
   -1,  298,  257,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
303
   -1,   -1,   -1,   -1,   -1,  298,   -1,  272,  273,  274,
304
  275,  276,  277,  278,  279,  280,  281,  282,  283,  284,
305
  285,  286,  287,  288,  289,  290,  291,  292,  293,  294,
306
  295,  257,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
307
   -1,   -1,   -1,   -1,   -1,   -1,  272,  273,  274,  275,
308
  276,  277,  278,  279,  280,  281,  282,  283,  284,  285,
309
  286,  287,  288,  289,  290,  291,  292,  293,  294,  295,
310
  257,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
311
   -1,   -1,   -1,   -1,   -1,  272,  273,  274,  275,  276,
312
  277,  278,  279,  280,  281,  282,  283,  284,  285,  286,
313
  287,  288,  289,  290,  291,  292,  293,  294,  295,
314
};
315
#define YYFINAL 1
316
#ifndef YYDEBUG
317
#define YYDEBUG 0
318
66
#endif
319
66
#define YYMAXTOKEN 301
320
#if YYDEBUG
321
const char * const yyname[] =
322
66
	{
323
66
"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,
324
0,0,0,"'\"'",0,"'$'",0,0,0,"'('","')'","'*'","'+'","','","'-'","'.'","'/'",0,0,
325
0,0,0,0,0,0,0,0,0,0,"'<'","'='","'>'","'?'",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
326
0,0,0,0,0,0,0,0,0,"'['",0,"']'","'^'",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
327
0,0,0,0,0,0,0,"'{'","'|'","'}'",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
328
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
329
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
330
0,0,0,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",
331
"SCDECL","XSCDECL","NAME","PREVCCL","EOF_OP","OPTION_OP","OPT_OUTFILE",
332
"OPT_PREFIX","OPT_YYCLASS","OPT_HEADER","OPT_EXTRA_TYPE","OPT_TABLES",
333
"CCE_ALNUM","CCE_ALPHA","CCE_BLANK","CCE_CNTRL","CCE_DIGIT","CCE_GRAPH",
334
"CCE_LOWER","CCE_PRINT","CCE_PUNCT","CCE_SPACE","CCE_UPPER","CCE_XDIGIT",
335
"CCE_NEG_ALNUM","CCE_NEG_ALPHA","CCE_NEG_BLANK","CCE_NEG_CNTRL","CCE_NEG_DIGIT",
336
"CCE_NEG_GRAPH","CCE_NEG_LOWER","CCE_NEG_PRINT","CCE_NEG_PUNCT","CCE_NEG_SPACE",
337
"CCE_NEG_UPPER","CCE_NEG_XDIGIT","CCL_OP_DIFF","CCL_OP_UNION",
338
"BEGIN_REPEAT_POSIX","END_REPEAT_POSIX","BEGIN_REPEAT_FLEX","END_REPEAT_FLEX",
339
};
340
const char * const yyrule[] =
341
	{"$accept : goal",
342
210
"goal : initlex sect1 sect1end sect2 initforrule",
343
210
"initlex :",
344
"sect1 : sect1 startconddecl namelist1",
345
"sect1 : sect1 options",
346
"sect1 :",
347
"sect1 : error",
348
"sect1end : SECTEND",
349
"startconddecl : SCDECL",
350
"startconddecl : XSCDECL",
351
"namelist1 : namelist1 NAME",
352
"namelist1 : NAME",
353
"namelist1 : error",
354
"options : OPTION_OP optionlist",
355
80
"optionlist : optionlist option",
356
"optionlist :",
357
"option : OPT_OUTFILE '=' NAME",
358
"option : OPT_EXTRA_TYPE '=' NAME",
359
"option : OPT_PREFIX '=' NAME",
360
"option : OPT_YYCLASS '=' NAME",
361
200
"option : OPT_HEADER '=' NAME",
362
20
"option : OPT_TABLES '=' NAME",
363
"sect2 : sect2 scon initforrule flexrule '\\n'",
364
"sect2 : sect2 scon '{' sect2 '}'",
365
"sect2 :",
366
"initforrule :",
367
"flexrule : '^' rule",
368
"flexrule : rule",
369
"flexrule : EOF_OP",
370
80
"flexrule : error",
371
80
"scon_stk_ptr :",
372
"scon : '<' scon_stk_ptr namelist2 '>'",
373
"scon : '<' '*' '>'",
374
"scon :",
375
"namelist2 : namelist2 ',' sconname",
376
"namelist2 : sconname",
377
"namelist2 : error",
378
"sconname : NAME",
379
"rule : re2 re",
380
"rule : re2 re '$'",
381
"rule : re '$'",
382
"rule : re",
383
"re : re '|' series",
384
"re : series",
385
"re2 : re '/'",
386
"series : series singleton",
387
"series : singleton",
388
"series : series BEGIN_REPEAT_POSIX NUMBER ',' NUMBER END_REPEAT_POSIX",
389
"series : series BEGIN_REPEAT_POSIX NUMBER ',' END_REPEAT_POSIX",
390
"series : series BEGIN_REPEAT_POSIX NUMBER END_REPEAT_POSIX",
391
"singleton : singleton '*'",
392
"singleton : singleton '+'",
393
"singleton : singleton '?'",
394
"singleton : singleton BEGIN_REPEAT_FLEX NUMBER ',' NUMBER END_REPEAT_FLEX",
395
"singleton : singleton BEGIN_REPEAT_FLEX NUMBER ',' END_REPEAT_FLEX",
396
"singleton : singleton BEGIN_REPEAT_FLEX NUMBER END_REPEAT_FLEX",
397
"singleton : '.'",
398
"singleton : fullccl",
399
"singleton : PREVCCL",
400
"singleton : '\"' string '\"'",
401
"singleton : '(' re ')'",
402
"singleton : CHAR",
403
"fullccl : fullccl CCL_OP_DIFF braceccl",
404
"fullccl : fullccl CCL_OP_UNION braceccl",
405
"fullccl : braceccl",
406
"braceccl : '[' ccl ']'",
407
"braceccl : '[' '^' ccl ']'",
408
"ccl : ccl CHAR '-' CHAR",
409
"ccl : ccl CHAR",
410
"ccl : ccl ccl_expr",
411
"ccl :",
412
"ccl_expr : CCE_ALNUM",
413
"ccl_expr : CCE_ALPHA",
414
"ccl_expr : CCE_BLANK",
415
"ccl_expr : CCE_CNTRL",
416
"ccl_expr : CCE_DIGIT",
417
"ccl_expr : CCE_GRAPH",
418
"ccl_expr : CCE_LOWER",
419
"ccl_expr : CCE_PRINT",
420
"ccl_expr : CCE_PUNCT",
421
"ccl_expr : CCE_SPACE",
422
"ccl_expr : CCE_XDIGIT",
423
"ccl_expr : CCE_UPPER",
424
"ccl_expr : CCE_NEG_ALNUM",
425
"ccl_expr : CCE_NEG_ALPHA",
426
"ccl_expr : CCE_NEG_BLANK",
427
"ccl_expr : CCE_NEG_CNTRL",
428
"ccl_expr : CCE_NEG_DIGIT",
429
"ccl_expr : CCE_NEG_GRAPH",
430
"ccl_expr : CCE_NEG_PRINT",
431
"ccl_expr : CCE_NEG_PUNCT",
432
"ccl_expr : CCE_NEG_SPACE",
433
"ccl_expr : CCE_NEG_XDIGIT",
434
"ccl_expr : CCE_NEG_LOWER",
435
"ccl_expr : CCE_NEG_UPPER",
436
"string : string CHAR",
437
"string :",
438
};
439
#endif
440
#ifndef YYSTYPE
441
typedef int YYSTYPE;
442
#endif
443
#ifdef YYSTACKSIZE
444
#undef YYMAXDEPTH
445
#define YYMAXDEPTH YYSTACKSIZE
446
#else
447
#ifdef YYMAXDEPTH
448
#define YYSTACKSIZE YYMAXDEPTH
449
#else
450
#define YYSTACKSIZE 10000
451
#define YYMAXDEPTH 10000
452
#endif
453
#endif
454
#define YYINITSTACKSIZE 200
455
/* LINTUSED */
456
int yydebug;
457
int yynerrs;
458
int yyerrflag;
459
int yychar;
460
short *yyssp;
461
YYSTYPE *yyvsp;
462
YYSTYPE yyval;
463
YYSTYPE yylval;
464
short *yyss;
465
short *yysslim;
466
YYSTYPE *yyvs;
467
unsigned int yystacksize;
468
int yyparse(void);
469
#line 947 "/usr/src/usr.bin/lex/parse.y"
470
471
472
/* build_eof_action - build the "<<EOF>>" action for the active start
473
 *                    conditions
474
 */
475
476
void build_eof_action()
477
	{
478
	int i;
479
	char action_text[MAXLINE];
480
276
481
	for ( i = 1; i <= scon_stk_ptr; ++i )
482
276
		{
483
		if ( sceof[scon_stk[i]] )
484
			format_pinpoint_message(
485
				"multiple <<EOF>> rules for start condition %s",
486
				scname[scon_stk[i]] );
487
488
		else
489
			{
490
			sceof[scon_stk[i]] = true;
491
492
			if (previous_continued_action /* && previous action was regular */)
493
				add_action("YY_RULE_SETUP\n");
494
495
			snprintf( action_text, sizeof(action_text), "case YY_STATE_EOF(%s):\n",
496
				scname[scon_stk[i]] );
497
			add_action( action_text );
498
546
			}
499
546
		}
500
501
546
	line_directive_out( (FILE *) 0, 1 );
502
503
2068
	/* This isn't a normal rule after all - don't count it as
504
2068
	 * such, so we don't have any holes in the rule numbering
505
	 * (which make generating "rule can never match" warnings
506
	 * more difficult.
507
	 */
508
	--num_rules;
509
	++num_eof_rules;
510
	}
511
512
513
/* format_synerr - write out formatted syntax error */
514
515
void format_synerr( msg, arg )
516
const char *msg, arg[];
517
	{
518
	char errmsg[MAXLINE];
519
520
	(void) snprintf( errmsg, sizeof(errmsg), msg, arg );
521
	synerr( errmsg );
522
	}
523
524
525
/* synerr - report a syntax error */
526
527
void synerr( str )
528
const char *str;
529
	{
530
	syntaxerror = true;
531
	pinpoint_message( str );
532
	}
533
534
535
/* format_warn - write out formatted warning */
536
537
void format_warn( msg, arg )
538
const char *msg, arg[];
539
4504
	{
540
	char warn_msg[MAXLINE];
541
4504
542
	snprintf( warn_msg, sizeof(warn_msg), msg, arg );
543
2614
	warn( warn_msg );
544
2614
	}
545
546
547
/* warn - report a warning, unless -w was given */
548
549
void warn( str )
550
const char *str;
551
	{
552
	line_warning( str, linenum );
553
	}
554
555
/* format_pinpoint_message - write out a message formatted with one string,
556
 *			     pinpointing its location
557
 */
558
559
void format_pinpoint_message( msg, arg )
560
const char *msg, arg[];
561
	{
562
	char errmsg[MAXLINE];
563
564
	snprintf( errmsg, sizeof(errmsg), msg, arg );
565
	pinpoint_message( errmsg );
566
	}
567
568
569
/* pinpoint_message - write out a message, pinpointing its location */
570
571
void pinpoint_message( str )
572
const char *str;
573
	{
574
	line_pinpoint( str, linenum );
575
	}
576
577
578
/* line_warning - report a warning at a given line, unless -w was given */
579
580
void line_warning( str, line )
581
const char *str;
582
int line;
583
	{
584
	char warning[MAXLINE];
585
586
	if ( ! nowarn )
587
		{
588
		snprintf( warning, sizeof(warning), "warning, %s", str );
589
		line_pinpoint( warning, line );
590
		}
591
	}
592
593
594
/* line_pinpoint - write out a message, pinpointing it at the given line */
595
596
void line_pinpoint( str, line )
597
const char *str;
598
int line;
599
	{
600
	fprintf( stderr, "%s:%d: %s\n", infilename, line, str );
601
	}
602
603
604
/* yyerror - eat up an error message from the parser;
605
 *	     currently, messages are ignore
606
 */
607
608
void yyerror( msg )
609
const char *msg;
610
	{
611
10
	}
612
#line 605 "parse.c"
613
34
/* allocate initial stack or double stack size, up to YYMAXDEPTH */
614
12
static int yygrowstack(void)
615
10
{
616
    unsigned int newsize;
617
    long sslen;
618
410
    short *newss;
619
422
    YYSTYPE *newvs;
620
621
410
    if ((newsize = yystacksize) == 0)
622
        newsize = YYINITSTACKSIZE;
623
    else if (newsize >= YYMAXDEPTH)
624
1528
        return -1;
625

1552
    else if ((newsize *= 2) > YYMAXDEPTH)
626
        newsize = YYMAXDEPTH;
627
1552
    sslen = yyssp - yyss;
628
12
#ifdef SIZE_MAX
629
12
#define YY_SIZE_MAX SIZE_MAX
630
#else
631
12
#define YY_SIZE_MAX 0xffffffffU
632

12
#endif
633

24
    if (newsize && YY_SIZE_MAX / newsize < sizeof *newss)
634
        goto bail;
635
24
    newss = yyss ? (short *)realloc(yyss, newsize * sizeof *newss) :
636
12
      (short *)malloc(newsize * sizeof *newss); /* overflow check above */
637
12
    if (newss == NULL)
638
        goto bail;
639
12
    yyss = newss;
640
12
    yyssp = newss + sslen;
641
12
    if (newsize && YY_SIZE_MAX / newsize < sizeof *newvs)
642
12
        goto bail;
643
12
    newvs = yyvs ? (YYSTYPE *)realloc(yyvs, newsize * sizeof *newvs) :
644
      (YYSTYPE *)malloc(newsize * sizeof *newvs); /* overflow check above */
645
    if (newvs == NULL)
646
        goto bail;
647
    yyvs = newvs;
648
    yyvsp = newvs + sslen;
649
    yystacksize = newsize;
650
    yysslim = yyss + newsize - 1;
651
    return 0;
652
bail:
653
12
    if (yyss)
654
            free(yyss);
655
    if (yyvs)
656
            free(yyvs);
657
    yyss = yyssp = NULL;
658
    yyvs = yyvsp = NULL;
659
    yystacksize = 0;
660
    return -1;
661
}
662
663
#define YYABORT goto yyabort
664
#define YYREJECT goto yyabort
665
#define YYACCEPT goto yyaccept
666
#define YYERROR goto yyerrlab
667
int
668
yyparse(void)
669
{
670
    int yym, yyn, yystate;
671
#if YYDEBUG
672
    const char *yys;
673
674
24
    if ((yys = getenv("YYDEBUG")))
675
12
    {
676
12
        yyn = *yys;
677
        if (yyn >= '0' && yyn <= '9')
678

24
            yydebug = yyn - '0';
679
12
    }
680
12
#endif /* YYDEBUG */
681
12
682
    yynerrs = 0;
683
    yyerrflag = 0;
684
70952
    yychar = (-1);
685
51346
686
    if (yyss == NULL && yygrowstack()) goto yyoverflow;
687
35708
    yyssp = yyss;
688
    yyvsp = yyvs;
689
    *yyssp = yystate = 0;
690
691
6
yyloop:
692
    if ((yyn = yydefred[yystate]) != 0) goto yyreduce;
693
    if (yychar < 0)
694
4
    {
695
4
        if ((yychar = yylex()) < 0) yychar = 0;
696
4
#if YYDEBUG
697
        if (yydebug)
698
35712
        {
699

201638
            yys = 0;
700
98944
            if (yychar <= YYMAXTOKEN) yys = yyname[yychar];
701
2
            if (!yys) yys = "illegal-symbol";
702
            printf("%sdebug: state %d, reading %d (%s)\n",
703
                    YYPREFIX, yystate, yychar, yys);
704
4
        }
705
4
#endif
706
    }
707

35708
    if ((yyn = yysindex[yystate]) && (yyn += yychar) >= 0 &&
708
4
            yyn <= YYTABLESIZE && yycheck[yyn] == yychar)
709
2
    {
710
2
#if YYDEBUG
711
35704
        if (yydebug)
712
35708
            printf("%sdebug: state %d, shifting to state %d\n",
713
35708
                    YYPREFIX, yystate, yytable[yyn]);
714
35704
#endif
715
35710
        if (yyssp >= yysslim && yygrowstack())
716
        {
717

62574
            goto yyoverflow;
718
31284
        }
719
        *++yyssp = yystate = yytable[yyn];
720
15648
        *++yyvsp = yylval;
721
15642
        yychar = (-1);
722
6
        if (yyerrflag > 0)  --yyerrflag;
723
        goto yyloop;
724
    }
725
    if ((yyn = yyrindex[yystate]) && (yyn += yychar) >= 0 &&
726
            yyn <= YYTABLESIZE && yycheck[yyn] == yychar)
727
2478
    {
728
        yyn = yytable[yyn];
729
2478
        goto yyreduce;
730
4912
    }
731
2456
    if (yyerrflag) goto yyinrecovery;
732
#if defined(__GNUC__)
733
2478
    goto yynewerror;
734
#endif
735

2478
yynewerror:
736
4
    yyerror("syntax error");
737
#if defined(__GNUC__)
738
2478
    goto yyerrlab;
739
#endif
740

2478
yyerrlab:
741
    ++yynerrs;
742
yyinrecovery:
743
    if (yyerrflag < 3)
744
    {
745
        yyerrflag = 3;
746
        for (;;)
747
        {
748
            if ((yyn = yysindex[*yyssp]) && (yyn += YYERRCODE) >= 0 &&
749
                    yyn <= YYTABLESIZE && yycheck[yyn] == YYERRCODE)
750
            {
751
#if YYDEBUG
752
84
                if (yydebug)
753
84
                    printf("%sdebug: state %d, error recovery shifting\
754
 to state %d\n", YYPREFIX, *yyssp, yytable[yyn]);
755
1792
#endif
756
1792
                if (yyssp >= yysslim && yygrowstack())
757
                {
758
                    goto yyoverflow;
759
2758
                }
760
                *++yyssp = yystate = yytable[yyn];
761
2758
                *++yyvsp = yylval;
762
2
                goto yyloop;
763
            }
764

2768
            else
765
            {
766
#if YYDEBUG
767
                if (yydebug)
768
2758
                    printf("%sdebug: error recovery discarding state %d\n",
769
                            YYPREFIX, *yyssp);
770
2758
#endif
771
                if (yyssp <= yyss) goto yyabort;
772
                --yyssp;
773
                --yyvsp;
774
            }
775
        }
776
    }
777
    else
778
    {
779
2470
        if (yychar == 0) goto yyabort;
780
2470
#if YYDEBUG
781
        if (yydebug)
782
        {
783
8
            yys = 0;
784
8
            if (yychar <= YYMAXTOKEN) yys = yyname[yychar];
785
            if (!yys) yys = "illegal-symbol";
786
8
            printf("%sdebug: state %d, error recovery discards token %d (%s)\n",
787
                    YYPREFIX, yystate, yychar, yys);
788
        }
789
#endif
790
        yychar = (-1);
791
42226
        goto yyloop;
792
35248
    }
793
32096
yyreduce:
794
#if YYDEBUG
795
3152
    if (yydebug)
796





















67890
        printf("%sdebug: state %d, reducing by rule %d (%s)\n",
797
                YYPREFIX, yystate, yyn, yyrule[yyn]);
798
#endif
799
30
    yym = yylen[yyn];
800

52
    if (yym)
801

38
        yyval = yyvsp[1-yym];
802
    else
803
        memset(&yyval, 0, sizeof yyval);
804
    switch (yyn)
805
    {
806
case 1:
807
#line 118 "/usr/src/usr.bin/lex/parse.y"
808
{ /* add default rule */
809
			int def_rule;
810
811

50
			pat = cclinit();
812
			cclnegate( pat );
813
814
			def_rule = mkstate( -pat );
815
816
			/* Remember the number of the default rule so we
817
6978
			 * don't generate "can't match" warnings for it.
818
			 */
819
			default_rule = num_rules;
820
821
			finish_rule( def_rule, false, 0, 0, 0);
822
118504
823
52274
			for ( i = 1; i <= lastsc; ++i )
824
				scset[i] = mkbranch( scset[i], def_rule );
825
826
			if ( spprdflt )
827
				add_action(
828
20916
				"YY_FATAL_ERROR( \"flex scanner jammed\" )" );
829
6978
			else
830
				add_action( "ECHO" );
831
832

7008
			add_action( ";\n\tYY_BREAK\n" );
833
8
			}
834
8
break;
835
case 2:
836
432
#line 147 "/usr/src/usr.bin/lex/parse.y"
837
208
{ /* initialize for processing rules */
838
839
20
			/* Create default DFA start condition. */
840
8
			scinstal( "INITIAL", false );
841
8
			}
842
break;
843
case 6:
844
#line 158 "/usr/src/usr.bin/lex/parse.y"
845
6978
{ synerr( _("unknown error processing section 1") ); }
846
break;
847
6978
case 7:
848
#line 162 "/usr/src/usr.bin/lex/parse.y"
849
{
850
106
			check_options();
851
258
			scon_stk = allocate_integer_array( lastsc + 1 );
852
106
			scon_stk_ptr = 0;
853
			}
854
break;
855

124
case 8:
856
#line 170 "/usr/src/usr.bin/lex/parse.y"
857
{ xcluflg = false; }
858
break;
859
case 9:
860
#line 173 "/usr/src/usr.bin/lex/parse.y"
861
{ xcluflg = true; }
862
break;
863
106
case 10:
864
#line 177 "/usr/src/usr.bin/lex/parse.y"
865
106
{ scinstal( nmstr, xcluflg ); }
866
break;
867
case 11:
868
#line 180 "/usr/src/usr.bin/lex/parse.y"
869
{ scinstal( nmstr, xcluflg ); }
870
break;
871
case 12:
872
#line 183 "/usr/src/usr.bin/lex/parse.y"
873
{ synerr( _("bad start condition list") ); }
874
break;
875
2478
case 16:
876
2478
#line 194 "/usr/src/usr.bin/lex/parse.y"
877
2478
{
878
			outfilename = copy_string( nmstr );
879
2478
			did_outfilename = 1;
880
			}
881
break;
882
case 17:
883
#line 199 "/usr/src/usr.bin/lex/parse.y"
884
{ extra_type = copy_string( nmstr ); }
885
break;
886
case 18:
887
#line 201 "/usr/src/usr.bin/lex/parse.y"
888
{ prefix = copy_string( nmstr ); }
889
break;
890
case 19:
891
#line 203 "/usr/src/usr.bin/lex/parse.y"
892
{ yyclass = copy_string( nmstr ); }
893
break;
894
case 20:
895
#line 205 "/usr/src/usr.bin/lex/parse.y"
896
{ headerfilename = copy_string( nmstr ); }
897
break;
898
case 21:
899
#line 207 "/usr/src/usr.bin/lex/parse.y"
900
{ tablesext = true; tablesfilename = copy_string( nmstr ); }
901
break;
902
case 22:
903
#line 211 "/usr/src/usr.bin/lex/parse.y"
904
{ scon_stk_ptr = yyvsp[-3]; }
905
break;
906
case 23:
907
#line 213 "/usr/src/usr.bin/lex/parse.y"
908
{ scon_stk_ptr = yyvsp[-3]; }
909
break;
910
case 25:
911
#line 218 "/usr/src/usr.bin/lex/parse.y"
912
{
913
			/* Initialize for a parse of one rule. */
914
			trlcontxt = variable_trail_rule = varlength = false;
915
			trailcnt = headcnt = rulelen = 0;
916
			current_state_type = STATE_NORMAL;
917
			previous_continued_action = continued_action;
918
			in_rule = true;
919
920
			new_rule();
921
			}
922
break;
923
case 26:
924
#line 231 "/usr/src/usr.bin/lex/parse.y"
925
{
926
			pat = yyvsp[0];
927
			finish_rule( pat, variable_trail_rule,
928
				headcnt, trailcnt , previous_continued_action);
929
134
930
			if ( scon_stk_ptr > 0 )
931
				{
932
134
				for ( i = 1; i <= scon_stk_ptr; ++i )
933
					scbol[scon_stk[i]] =
934

234
						mkbranch( scbol[scon_stk[i]],
935
22
								pat );
936
				}
937
112
938
			else
939
134
				{
940
				/* Add to all non-exclusive start conditions,
941
134
				 * including the default (0) start condition.
942
				 */
943
84
944
84
				for ( i = 1; i <= lastsc; ++i )
945
					if ( ! scxclu[i] )
946
						scbol[i] = mkbranch( scbol[i],
947
									pat );
948
				}
949
950
			if ( ! bol_needed )
951
				{
952
				bol_needed = true;
953
954
				if ( performance_report > 1 )
955
					pinpoint_message(
956
			"'^' operator results in sub-optimal performance" );
957
				}
958
			}
959
break;
960
case 27:
961
#line 267 "/usr/src/usr.bin/lex/parse.y"
962
{
963
			pat = yyvsp[0];
964
			finish_rule( pat, variable_trail_rule,
965
				headcnt, trailcnt , previous_continued_action);
966
967
			if ( scon_stk_ptr > 0 )
968
				{
969
				for ( i = 1; i <= scon_stk_ptr; ++i )
970
					scset[scon_stk[i]] =
971
						mkbranch( scset[scon_stk[i]],
972
								pat );
973
				}
974
975
			else
976
				{
977
				for ( i = 1; i <= lastsc; ++i )
978
					if ( ! scxclu[i] )
979
						scset[i] =
980
							mkbranch( scset[i],
981
								pat );
982
				}
983
			}
984
break;
985
case 28:
986
#line 291 "/usr/src/usr.bin/lex/parse.y"
987
{
988
			if ( scon_stk_ptr > 0 )
989
				build_eof_action();
990
991
			else
992
				{
993
				/* This EOF applies to all start conditions
994
				 * which don't already have EOF actions.
995
				 */
996
				for ( i = 1; i <= lastsc; ++i )
997
					if ( ! sceof[i] )
998
						scon_stk[++scon_stk_ptr] = i;
999
1000
				if ( scon_stk_ptr == 0 )
1001
					warn(
1002
			"all start conditions already have <<EOF>> rules" );
1003
1004
				else
1005
					build_eof_action();
1006
				}
1007
			}
1008
break;
1009
case 29:
1010
#line 314 "/usr/src/usr.bin/lex/parse.y"
1011
{ synerr( _("unrecognized rule") ); }
1012
break;
1013
case 30:
1014
#line 318 "/usr/src/usr.bin/lex/parse.y"
1015
{ yyval = scon_stk_ptr; }
1016
break;
1017
case 31:
1018
#line 322 "/usr/src/usr.bin/lex/parse.y"
1019
{ yyval = yyvsp[-2]; }
1020
break;
1021
case 32:
1022
#line 325 "/usr/src/usr.bin/lex/parse.y"
1023
{
1024
			yyval = scon_stk_ptr;
1025
1026
			for ( i = 1; i <= lastsc; ++i )
1027
				{
1028
				int j;
1029
1030
				for ( j = 1; j <= scon_stk_ptr; ++j )
1031
					if ( scon_stk[j] == i )
1032
						break;
1033
1034
				if ( j > scon_stk_ptr )
1035
					scon_stk[++scon_stk_ptr] = i;
1036
				}
1037
			}
1038
break;
1039
case 33:
1040
#line 342 "/usr/src/usr.bin/lex/parse.y"
1041
{ yyval = scon_stk_ptr; }
1042
break;
1043
case 36:
1044
#line 350 "/usr/src/usr.bin/lex/parse.y"
1045
{ synerr( _("bad start condition list") ); }
1046
break;
1047
case 37:
1048
#line 354 "/usr/src/usr.bin/lex/parse.y"
1049
{
1050
			if ( (scnum = sclookup( nmstr )) == 0 )
1051
				format_pinpoint_message(
1052
					"undeclared start condition %s",
1053
					nmstr );
1054
			else
1055
				{
1056
				for ( i = 1; i <= scon_stk_ptr; ++i )
1057
					if ( scon_stk[i] == scnum )
1058
						{
1059
						format_warn(
1060
							"<%s> specified twice",
1061
							scname[scnum] );
1062
						break;
1063
						}
1064
1065
				if ( i > scon_stk_ptr )
1066
					scon_stk[++scon_stk_ptr] = scnum;
1067
				}
1068
			}
1069
break;
1070
case 38:
1071
#line 377 "/usr/src/usr.bin/lex/parse.y"
1072
{
1073
			if ( transchar[lastst[yyvsp[0]]] != SYM_EPSILON )
1074
				/* Provide final transition \now/ so it
1075
				 * will be marked as a trailing context
1076
				 * state.
1077
				 */
1078
				yyvsp[0] = link_machines( yyvsp[0],
1079
						mkstate( SYM_EPSILON ) );
1080
1081
			mark_beginning_as_normal( yyvsp[0] );
1082
			current_state_type = STATE_NORMAL;
1083
1084
			if ( previous_continued_action )
1085
				{
1086
				/* We need to treat this as variable trailing
1087
				 * context so that the backup does not happen
1088
				 * in the action but before the action switch
1089
				 * statement.  If the backup happens in the
1090
				 * action, then the rules "falling into" this
1091
				 * one's action will *also* do the backup,
1092
				 * erroneously.
1093
				 */
1094
				if ( ! varlength || headcnt != 0 )
1095
					warn(
1096
		"trailing context made variable due to preceding '|' action" );
1097
1098
				/* Mark as variable. */
1099
				varlength = true;
1100
				headcnt = 0;
1101
1102
				}
1103
1104
			if ( lex_compat || (varlength && headcnt == 0) )
1105
				{ /* variable trailing context rule */
1106
				/* Mark the first part of the rule as the
1107
				 * accepting "head" part of a trailing
1108
				 * context rule.
1109
				 *
1110
				 * By the way, we didn't do this at the
1111
				 * beginning of this production because back
1112
				 * then current_state_type was set up for a
1113
				 * trail rule, and add_accept() can create
1114
				 * a new state ...
1115
				 */
1116
				add_accept( yyvsp[-1],
1117
					num_rules | YY_TRAILING_HEAD_MASK );
1118
				variable_trail_rule = true;
1119
				}
1120
1121
			else
1122
				trailcnt = rulelen;
1123
1124
			yyval = link_machines( yyvsp[-1], yyvsp[0] );
1125
			}
1126
break;
1127
case 39:
1128
#line 433 "/usr/src/usr.bin/lex/parse.y"
1129
{ synerr( _("trailing context used twice") ); }
1130
break;
1131
case 40:
1132
#line 436 "/usr/src/usr.bin/lex/parse.y"
1133
{
1134
			headcnt = 0;
1135
			trailcnt = 1;
1136
			rulelen = 1;
1137
			varlength = false;
1138
1139
			current_state_type = STATE_TRAILING_CONTEXT;
1140
1141
			if ( trlcontxt )
1142
				{
1143
				synerr( _("trailing context used twice") );
1144
				yyval = mkstate( SYM_EPSILON );
1145
				}
1146
1147
			else if ( previous_continued_action )
1148
				{
1149
				/* See the comment in the rule for "re2 re"
1150
				 * above.
1151
				 */
1152
				warn(
1153
		"trailing context made variable due to preceding '|' action" );
1154
1155
				varlength = true;
1156
				}
1157
1158
			if ( lex_compat || varlength )
1159
				{
1160
				/* Again, see the comment in the rule for
1161
				 * "re2 re" above.
1162
				 */
1163
				add_accept( yyvsp[-1],
1164
					num_rules | YY_TRAILING_HEAD_MASK );
1165
				variable_trail_rule = true;
1166
				}
1167
1168
			trlcontxt = true;
1169
1170
			eps = mkstate( SYM_EPSILON );
1171
			yyval = link_machines( yyvsp[-1],
1172
				link_machines( eps, mkstate( '\n' ) ) );
1173
			}
1174
break;
1175
case 41:
1176
#line 479 "/usr/src/usr.bin/lex/parse.y"
1177
{
1178
			yyval = yyvsp[0];
1179
1180
			if ( trlcontxt )
1181
				{
1182
				if ( lex_compat || (varlength && headcnt == 0) )
1183
					/* Both head and trail are
1184
					 * variable-length.
1185
					 */
1186
					variable_trail_rule = true;
1187
				else
1188
					trailcnt = rulelen;
1189
				}
1190
			}
1191
break;
1192
case 42:
1193
#line 497 "/usr/src/usr.bin/lex/parse.y"
1194
{
1195
			varlength = true;
1196
			yyval = mkor( yyvsp[-2], yyvsp[0] );
1197
			}
1198
break;
1199
case 43:
1200
#line 503 "/usr/src/usr.bin/lex/parse.y"
1201
{ yyval = yyvsp[0]; }
1202
break;
1203
case 44:
1204
#line 508 "/usr/src/usr.bin/lex/parse.y"
1205
{
1206
			/* This rule is written separately so the
1207
			 * reduction will occur before the trailing
1208
			 * series is parsed.
1209
			 */
1210
1211
			if ( trlcontxt )
1212
				synerr( _("trailing context used twice") );
1213
			else
1214
				trlcontxt = true;
1215
1216
			if ( varlength )
1217
				/* We hope the trailing context is
1218
				 * fixed-length.
1219
				 */
1220
				varlength = false;
1221
			else
1222
				headcnt = rulelen;
1223
1224
			rulelen = 0;
1225
1226
			current_state_type = STATE_TRAILING_CONTEXT;
1227
			yyval = yyvsp[-1];
1228
			}
1229
break;
1230
case 45:
1231
#line 535 "/usr/src/usr.bin/lex/parse.y"
1232
{
1233
			/* This is where concatenation of adjacent patterns
1234
			 * gets done.
1235
			 */
1236
			yyval = link_machines( yyvsp[-1], yyvsp[0] );
1237
			}
1238
break;
1239
case 46:
1240
#line 543 "/usr/src/usr.bin/lex/parse.y"
1241
{ yyval = yyvsp[0]; }
1242
break;
1243
case 47:
1244
#line 546 "/usr/src/usr.bin/lex/parse.y"
1245
{
1246
			varlength = true;
1247
1248
			if ( yyvsp[-3] > yyvsp[-1] || yyvsp[-3] < 0 )
1249
				{
1250
				synerr( _("bad iteration values") );
1251
				yyval = yyvsp[-5];
1252
				}
1253
			else
1254
				{
1255
				if ( yyvsp[-3] == 0 )
1256
					{
1257
					if ( yyvsp[-1] <= 0 )
1258
						{
1259
						synerr(
1260
						_("bad iteration values") );
1261
						yyval = yyvsp[-5];
1262
						}
1263
					else
1264
						yyval = mkopt(
1265
							mkrep( yyvsp[-5], 1, yyvsp[-1] ) );
1266
					}
1267
				else
1268
					yyval = mkrep( yyvsp[-5], yyvsp[-3], yyvsp[-1] );
1269
				}
1270
			}
1271
break;
1272
case 48:
1273
#line 574 "/usr/src/usr.bin/lex/parse.y"
1274
{
1275
			varlength = true;
1276
1277
			if ( yyvsp[-2] <= 0 )
1278
				{
1279
				synerr( _("iteration value must be positive") );
1280
				yyval = yyvsp[-4];
1281
				}
1282
1283
			else
1284
				yyval = mkrep( yyvsp[-4], yyvsp[-2], INFINITE_REPEAT );
1285
			}
1286
break;
1287
case 49:
1288
#line 588 "/usr/src/usr.bin/lex/parse.y"
1289
{
1290
			/* The series could be something like "(foo)",
1291
			 * in which case we have no idea what its length
1292
			 * is, so we punt here.
1293
			 */
1294
			varlength = true;
1295
1296
			if ( yyvsp[-1] <= 0 )
1297
				{
1298
				  synerr( _("iteration value must be positive")
1299
					  );
1300
				yyval = yyvsp[-3];
1301
				}
1302
1303
			else
1304
				yyval = link_machines( yyvsp[-3],
1305
						copysingl( yyvsp[-3], yyvsp[-1] - 1 ) );
1306
			}
1307
break;
1308
case 50:
1309
#line 610 "/usr/src/usr.bin/lex/parse.y"
1310
{
1311
			varlength = true;
1312
1313
			yyval = mkclos( yyvsp[-1] );
1314
			}
1315
break;
1316
case 51:
1317
#line 617 "/usr/src/usr.bin/lex/parse.y"
1318
{
1319
			varlength = true;
1320
			yyval = mkposcl( yyvsp[-1] );
1321
			}
1322
break;
1323
case 52:
1324
#line 623 "/usr/src/usr.bin/lex/parse.y"
1325
{
1326
			varlength = true;
1327
			yyval = mkopt( yyvsp[-1] );
1328
			}
1329
break;
1330
case 53:
1331
#line 629 "/usr/src/usr.bin/lex/parse.y"
1332
{
1333
			varlength = true;
1334
1335
			if ( yyvsp[-3] > yyvsp[-1] || yyvsp[-3] < 0 )
1336
				{
1337
				synerr( _("bad iteration values") );
1338
				yyval = yyvsp[-5];
1339
				}
1340
			else
1341
				{
1342
				if ( yyvsp[-3] == 0 )
1343
					{
1344
					if ( yyvsp[-1] <= 0 )
1345
						{
1346
						synerr(
1347
						_("bad iteration values") );
1348
						yyval = yyvsp[-5];
1349
						}
1350
					else
1351
						yyval = mkopt(
1352
							mkrep( yyvsp[-5], 1, yyvsp[-1] ) );
1353
					}
1354
				else
1355
					yyval = mkrep( yyvsp[-5], yyvsp[-3], yyvsp[-1] );
1356
				}
1357
			}
1358
break;
1359
case 54:
1360
#line 657 "/usr/src/usr.bin/lex/parse.y"
1361
{
1362
			varlength = true;
1363
1364
			if ( yyvsp[-2] <= 0 )
1365
				{
1366
				synerr( _("iteration value must be positive") );
1367
				yyval = yyvsp[-4];
1368
				}
1369
1370
			else
1371
				yyval = mkrep( yyvsp[-4], yyvsp[-2], INFINITE_REPEAT );
1372
			}
1373
break;
1374
case 55:
1375
#line 671 "/usr/src/usr.bin/lex/parse.y"
1376
{
1377
			/* The singleton could be something like "(foo)",
1378
			 * in which case we have no idea what its length
1379
			 * is, so we punt here.
1380
			 */
1381
			varlength = true;
1382
1383
			if ( yyvsp[-1] <= 0 )
1384
				{
1385
				synerr( _("iteration value must be positive") );
1386
				yyval = yyvsp[-3];
1387
				}
1388
1389
			else
1390
				yyval = link_machines( yyvsp[-3],
1391
						copysingl( yyvsp[-3], yyvsp[-1] - 1 ) );
1392
			}
1393
break;
1394
case 56:
1395
#line 690 "/usr/src/usr.bin/lex/parse.y"
1396
{
1397
			if ( ! madeany )
1398
				{
1399
				/* Create the '.' character class. */
1400
                    ccldot = cclinit();
1401
                    ccladd( ccldot, '\n' );
1402
                    cclnegate( ccldot );
1403
1404
                    if ( useecs )
1405
                        mkeccl( ccltbl + cclmap[ccldot],
1406
                            ccllen[ccldot], nextecm,
1407
                            ecgroup, csize, csize );
1408
1409
				/* Create the (?s:'.') character class. */
1410
                    cclany = cclinit();
1411
                    cclnegate( cclany );
1412
1413
                    if ( useecs )
1414
                        mkeccl( ccltbl + cclmap[cclany],
1415
                            ccllen[cclany], nextecm,
1416
                            ecgroup, csize, csize );
1417
1418
				madeany = true;
1419
				}
1420
1421
			++rulelen;
1422
1423
            if (sf_dot_all())
1424
                yyval = mkstate( -cclany );
1425
            else
1426
                yyval = mkstate( -ccldot );
1427
			}
1428
break;
1429
case 57:
1430
#line 724 "/usr/src/usr.bin/lex/parse.y"
1431
{
1432
				/* Sort characters for fast searching.
1433
				 */
1434
				qsort( ccltbl + cclmap[yyvsp[0]], ccllen[yyvsp[0]], sizeof (*ccltbl), cclcmp );
1435
1436
			if ( useecs )
1437
				mkeccl( ccltbl + cclmap[yyvsp[0]], ccllen[yyvsp[0]],
1438
					nextecm, ecgroup, csize, csize );
1439
1440
			++rulelen;
1441
1442
			if (ccl_has_nl[yyvsp[0]])
1443
				rule_has_nl[num_rules] = true;
1444
1445
			yyval = mkstate( -yyvsp[0] );
1446
			}
1447
break;
1448
case 58:
1449
#line 742 "/usr/src/usr.bin/lex/parse.y"
1450
{
1451
			++rulelen;
1452
1453
			if (ccl_has_nl[yyvsp[0]])
1454
				rule_has_nl[num_rules] = true;
1455
1456
			yyval = mkstate( -yyvsp[0] );
1457
			}
1458
break;
1459
case 59:
1460
#line 752 "/usr/src/usr.bin/lex/parse.y"
1461
{ yyval = yyvsp[-1]; }
1462
break;
1463
case 60:
1464
#line 755 "/usr/src/usr.bin/lex/parse.y"
1465
{ yyval = yyvsp[-1]; }
1466
break;
1467
case 61:
1468
#line 758 "/usr/src/usr.bin/lex/parse.y"
1469
{
1470
			++rulelen;
1471
1472
			if (yyvsp[0] == nlch)
1473
				rule_has_nl[num_rules] = true;
1474
1475
            if (sf_case_ins() && has_case(yyvsp[0]))
1476
                /* create an alternation, as in (a|A) */
1477
                yyval = mkor (mkstate(yyvsp[0]), mkstate(reverse_case(yyvsp[0])));
1478
            else
1479
                yyval = mkstate( yyvsp[0] );
1480
			}
1481
break;
1482
case 62:
1483
#line 772 "/usr/src/usr.bin/lex/parse.y"
1484
{ yyval = ccl_set_diff  (yyvsp[-2], yyvsp[0]); }
1485
break;
1486
case 63:
1487
#line 773 "/usr/src/usr.bin/lex/parse.y"
1488
{ yyval = ccl_set_union (yyvsp[-2], yyvsp[0]); }
1489
break;
1490
case 65:
1491
#line 779 "/usr/src/usr.bin/lex/parse.y"
1492
{ yyval = yyvsp[-1]; }
1493
break;
1494
case 66:
1495
#line 782 "/usr/src/usr.bin/lex/parse.y"
1496
{
1497
			cclnegate( yyvsp[-1] );
1498
			yyval = yyvsp[-1];
1499
			}
1500
break;
1501
case 67:
1502
#line 789 "/usr/src/usr.bin/lex/parse.y"
1503
{
1504
1505
			if (sf_case_ins())
1506
			  {
1507
1508
			    /* If one end of the range has case and the other
1509
			     * does not, or the cases are different, then we're not
1510
			     * sure what range the user is trying to express.
1511
			     * Examples: [@-z] or [S-t]
1512
			     */
1513
			    if (has_case (yyvsp[-2]) != has_case (yyvsp[0])
1514
				     || (has_case (yyvsp[-2]) && (b_islower (yyvsp[-2]) != b_islower (yyvsp[0])))
1515
				     || (has_case (yyvsp[-2]) && (b_isupper (yyvsp[-2]) != b_isupper (yyvsp[0]))))
1516
			      format_warn3 (
1517
			      _("the character range [%c-%c] is ambiguous in a case-insensitive scanner"),
1518
					    yyvsp[-2], yyvsp[0]);
1519
1520
			    /* If the range spans uppercase characters but not
1521
			     * lowercase (or vice-versa), then should we automatically
1522
			     * include lowercase characters in the range?
1523
			     * Example: [@-_] spans [a-z] but not [A-Z]
1524
			     */
1525
			    else if (!has_case (yyvsp[-2]) && !has_case (yyvsp[0]) && !range_covers_case (yyvsp[-2], yyvsp[0]))
1526
			      format_warn3 (
1527
			      _("the character range [%c-%c] is ambiguous in a case-insensitive scanner"),
1528
					    yyvsp[-2], yyvsp[0]);
1529
			  }
1530
1531
			if ( yyvsp[-2] > yyvsp[0] )
1532
				synerr( _("negative range in character class") );
1533
1534
			else
1535
				{
1536
				for ( i = yyvsp[-2]; i <= yyvsp[0]; ++i )
1537
					ccladd( yyvsp[-3], i );
1538
1539
				/* Keep track if this ccl is staying in
1540
				 * alphabetical order.
1541
				 */
1542
				cclsorted = cclsorted && (yyvsp[-2] > lastchar);
1543
				lastchar = yyvsp[0];
1544
1545
                /* Do it again for upper/lowercase */
1546
                if (sf_case_ins() && has_case(yyvsp[-2]) && has_case(yyvsp[0])){
1547
                    yyvsp[-2] = reverse_case (yyvsp[-2]);
1548
                    yyvsp[0] = reverse_case (yyvsp[0]);
1549
1550
                    for ( i = yyvsp[-2]; i <= yyvsp[0]; ++i )
1551
                        ccladd( yyvsp[-3], i );
1552
1553
                    cclsorted = cclsorted && (yyvsp[-2] > lastchar);
1554
                    lastchar = yyvsp[0];
1555
                }
1556
1557
				}
1558
1559
			yyval = yyvsp[-3];
1560
			}
1561
break;
1562
case 68:
1563
#line 849 "/usr/src/usr.bin/lex/parse.y"
1564
{
1565
			ccladd( yyvsp[-1], yyvsp[0] );
1566
			cclsorted = cclsorted && (yyvsp[0] > lastchar);
1567
			lastchar = yyvsp[0];
1568
1569
            /* Do it again for upper/lowercase */
1570
            if (sf_case_ins() && has_case(yyvsp[0])){
1571
                yyvsp[0] = reverse_case (yyvsp[0]);
1572
                ccladd (yyvsp[-1], yyvsp[0]);
1573
1574
                cclsorted = cclsorted && (yyvsp[0] > lastchar);
1575
                lastchar = yyvsp[0];
1576
            }
1577
1578
			yyval = yyvsp[-1];
1579
			}
1580
break;
1581
case 69:
1582
#line 867 "/usr/src/usr.bin/lex/parse.y"
1583
{
1584
			/* Too hard to properly maintain cclsorted. */
1585
			cclsorted = false;
1586
			yyval = yyvsp[-1];
1587
			}
1588
break;
1589
case 70:
1590
#line 874 "/usr/src/usr.bin/lex/parse.y"
1591
{
1592
			cclsorted = true;
1593
			lastchar = 0;
1594
			currccl = yyval = cclinit();
1595
			}
1596
break;
1597
case 71:
1598
#line 882 "/usr/src/usr.bin/lex/parse.y"
1599
{ CCL_EXPR(isalnum); }
1600
break;
1601
case 72:
1602
#line 883 "/usr/src/usr.bin/lex/parse.y"
1603
{ CCL_EXPR(isalpha); }
1604
break;
1605
case 73:
1606
#line 884 "/usr/src/usr.bin/lex/parse.y"
1607
{ CCL_EXPR(isblank); }
1608
break;
1609
case 74:
1610
#line 885 "/usr/src/usr.bin/lex/parse.y"
1611
{ CCL_EXPR(iscntrl); }
1612
break;
1613
case 75:
1614
#line 886 "/usr/src/usr.bin/lex/parse.y"
1615
{ CCL_EXPR(isdigit); }
1616
break;
1617
case 76:
1618
#line 887 "/usr/src/usr.bin/lex/parse.y"
1619
{ CCL_EXPR(isgraph); }
1620
break;
1621
case 77:
1622
#line 888 "/usr/src/usr.bin/lex/parse.y"
1623
{
1624
                          CCL_EXPR(islower);
1625
                          if (sf_case_ins())
1626
                              CCL_EXPR(isupper);
1627
                        }
1628
break;
1629
case 78:
1630
#line 893 "/usr/src/usr.bin/lex/parse.y"
1631
{ CCL_EXPR(isprint); }
1632
break;
1633
case 79:
1634
#line 894 "/usr/src/usr.bin/lex/parse.y"
1635
{ CCL_EXPR(ispunct); }
1636
break;
1637
case 80:
1638
#line 895 "/usr/src/usr.bin/lex/parse.y"
1639
{ CCL_EXPR(isspace); }
1640
break;
1641
case 81:
1642
#line 896 "/usr/src/usr.bin/lex/parse.y"
1643
{ CCL_EXPR(isxdigit); }
1644
break;
1645
case 82:
1646
#line 897 "/usr/src/usr.bin/lex/parse.y"
1647
{
1648
                    CCL_EXPR(isupper);
1649
                    if (sf_case_ins())
1650
                        CCL_EXPR(islower);
1651
				}
1652
break;
1653
case 83:
1654
#line 903 "/usr/src/usr.bin/lex/parse.y"
1655
{ CCL_NEG_EXPR(isalnum); }
1656
break;
1657
case 84:
1658
#line 904 "/usr/src/usr.bin/lex/parse.y"
1659
{ CCL_NEG_EXPR(isalpha); }
1660
break;
1661
case 85:
1662
#line 905 "/usr/src/usr.bin/lex/parse.y"
1663
{ CCL_NEG_EXPR(isblank); }
1664
break;
1665
case 86:
1666
#line 906 "/usr/src/usr.bin/lex/parse.y"
1667
{ CCL_NEG_EXPR(iscntrl); }
1668
break;
1669
case 87:
1670
#line 907 "/usr/src/usr.bin/lex/parse.y"
1671
{ CCL_NEG_EXPR(isdigit); }
1672
break;
1673
case 88:
1674
#line 908 "/usr/src/usr.bin/lex/parse.y"
1675
{ CCL_NEG_EXPR(isgraph); }
1676
break;
1677
case 89:
1678
#line 909 "/usr/src/usr.bin/lex/parse.y"
1679
{ CCL_NEG_EXPR(isprint); }
1680
break;
1681
case 90:
1682
#line 910 "/usr/src/usr.bin/lex/parse.y"
1683
{ CCL_NEG_EXPR(ispunct); }
1684
break;
1685
case 91:
1686
#line 911 "/usr/src/usr.bin/lex/parse.y"
1687
{ CCL_NEG_EXPR(isspace); }
1688
break;
1689
case 92:
1690
#line 912 "/usr/src/usr.bin/lex/parse.y"
1691
{ CCL_NEG_EXPR(isxdigit); }
1692
break;
1693
case 93:
1694
#line 913 "/usr/src/usr.bin/lex/parse.y"
1695
{
1696
				if ( sf_case_ins() )
1697
					warn(_("[:^lower:] is ambiguous in case insensitive scanner"));
1698
				else
1699
					CCL_NEG_EXPR(islower);
1700
				}
1701
break;
1702
case 94:
1703
#line 919 "/usr/src/usr.bin/lex/parse.y"
1704
{
1705
				if ( sf_case_ins() )
1706
					warn(_("[:^upper:] ambiguous in case insensitive scanner"));
1707
				else
1708
					CCL_NEG_EXPR(isupper);
1709
				}
1710
break;
1711
case 95:
1712
#line 928 "/usr/src/usr.bin/lex/parse.y"
1713
{
1714
			if ( yyvsp[0] == nlch )
1715
				rule_has_nl[num_rules] = true;
1716
1717
			++rulelen;
1718
1719
            if (sf_case_ins() && has_case(yyvsp[0]))
1720
                yyval = mkor (mkstate(yyvsp[0]), mkstate(reverse_case(yyvsp[0])));
1721
            else
1722
                yyval = mkstate (yyvsp[0]);
1723
1724
			yyval = link_machines( yyvsp[-1], yyval);
1725
35240
			}
1726
35240
break;
1727
35240
case 96:
1728
35240
#line 943 "/usr/src/usr.bin/lex/parse.y"
1729
35240
{ yyval = mkstate( SYM_EPSILON ); }
1730
break;
1731
#line 1724 "parse.c"
1732
    }
1733
    yyssp -= yym;
1734
    yystate = *yyssp;
1735
    yyvsp -= yym;
1736
    yym = yylhs[yyn];
1737
4
    if (yystate == 0 && yym == 0)
1738
4
    {
1739
4
#if YYDEBUG
1740
        if (yydebug)
1741
            printf("%sdebug: after reduction, shifting from state 0 to\
1742
 state %d\n", YYPREFIX, YYFINAL);
1743
#endif
1744
        yystate = YYFINAL;
1745
        *++yyssp = YYFINAL;
1746
        *++yyvsp = yyval;
1747
        if (yychar < 0)
1748
        {
1749
            if ((yychar = yylex()) < 0) yychar = 0;
1750
#if YYDEBUG
1751
            if (yydebug)
1752
            {
1753
4
                yys = 0;
1754
                if (yychar <= YYMAXTOKEN) yys = yyname[yychar];
1755
                if (!yys) yys = "illegal-symbol";
1756

130220
                printf("%sdebug: state %d, reading %d (%s)\n",
1757
63230
                        YYPREFIX, YYFINAL, yychar, yys);
1758
9960
            }
1759
#endif
1760
25276
        }
1761
        if (yychar == 0) goto yyaccept;
1762
        goto yyloop;
1763
    }
1764
    if ((yyn = yygindex[yym]) && (yyn += yystate) >= 0 &&
1765
            yyn <= YYTABLESIZE && yycheck[yyn] == yystate)
1766

35236
        yystate = yytable[yyn];
1767
    else
1768
        yystate = yydgoto[yym];
1769
#if YYDEBUG
1770
35236
    if (yydebug)
1771
35236
        printf("%sdebug: after reduction, shifting from state %d \
1772
35236
to state %d\n", YYPREFIX, *yyssp, yystate);
1773
#endif
1774
    if (yyssp >= yysslim && yygrowstack())
1775
    {
1776
        goto yyoverflow;
1777
    }
1778
    *++yyssp = yystate;
1779
    *++yyvsp = yyval;
1780
    goto yyloop;
1781
yyoverflow:
1782
    yyerror("yacc stack overflow");
1783
yyabort:
1784
    if (yyss)
1785
4
            free(yyss);
1786
4
    if (yyvs)
1787
4
            free(yyvs);
1788
4
    yyss = yyssp = NULL;
1789
4
    yyvs = yyvsp = NULL;
1790
4
    yystacksize = 0;
1791
4
    return (1);
1792
4
yyaccept:
1793
4
    if (yyss)
1794
            free(yyss);
1795
    if (yyvs)
1796
            free(yyvs);
1797
    yyss = yyssp = NULL;
1798
    yyvs = yyvsp = NULL;
1799
    yystacksize = 0;
1800
    return (0);
1801
}