1452 lines
35 KiB
C
1452 lines
35 KiB
C
#ifndef lint
|
|
static char yysccsid[] = "@(#)yaccpar 1.9 (Berkeley) 02/21/93";
|
|
#endif
|
|
#define YYBYACC 1
|
|
#define YYMAJOR 1
|
|
#define YYMINOR 9
|
|
#define yyclearin (yychar=(-1))
|
|
#define yyerrok (yyerrflag=0)
|
|
#define YYRECOVERING (yyerrflag!=0)
|
|
#define YYPREFIX "yy"
|
|
#line 10 "./parse.y"
|
|
/*-
|
|
* Copyright (c) 1990 The Regents of the University of California.
|
|
* All rights reserved.
|
|
*
|
|
* This code is derived from software contributed to Berkeley by
|
|
* Vern Paxson.
|
|
*
|
|
* The United States Government has rights in this work pursuant
|
|
* to contract no. DE-AC03-76SF00098 between the United States
|
|
* Department of Energy and the University of California.
|
|
*
|
|
* Redistribution and use in source and binary forms with or without
|
|
* modification are permitted provided that: (1) source distributions retain
|
|
* this entire copyright notice and comment, and (2) distributions including
|
|
* binaries display the following acknowledgement: ``This product includes
|
|
* software developed by the University of California, Berkeley and its
|
|
* contributors'' in the documentation or other materials provided with the
|
|
* distribution and in all advertising materials mentioning features or use
|
|
* of this software. Neither the name of the University nor the names of
|
|
* its contributors may be used to endorse or promote products derived from
|
|
* this software without specific prior written permission.
|
|
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
|
|
* WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
|
|
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
|
|
*/
|
|
|
|
/* $Header$ */
|
|
|
|
|
|
/* Some versions of bison are broken in that they use alloca() but don't
|
|
* declare it properly. The following is the patented (just kidding!)
|
|
* #ifdef chud to fix the problem, courtesy of Francois Pinard.
|
|
*/
|
|
#ifdef YYBISON
|
|
/* AIX requires this to be the first thing in the file. What a piece. */
|
|
# ifdef _AIX
|
|
#pragma alloca
|
|
# endif
|
|
#endif
|
|
|
|
#include "flexdef.h"
|
|
|
|
/* The remainder of the alloca() cruft has to come after including flexdef.h,
|
|
* so HAVE_ALLOCA_H is (possibly) defined.
|
|
*/
|
|
#ifdef YYBISON
|
|
# ifdef __GNUC__
|
|
# ifndef alloca
|
|
# define alloca __builtin_alloca
|
|
# endif
|
|
# else
|
|
# if HAVE_ALLOCA_H
|
|
# include <alloca.h>
|
|
# else
|
|
# ifdef __hpux
|
|
void *alloca ();
|
|
# else
|
|
# ifdef __TURBOC__
|
|
# include <malloc.h>
|
|
# else
|
|
char *alloca ();
|
|
# endif
|
|
# endif
|
|
# endif
|
|
# endif
|
|
#endif
|
|
|
|
/* Bletch, ^^^^ that was ugly! */
|
|
|
|
|
|
int pat, scnum, eps, headcnt, trailcnt, anyccl, lastchar, i, rulelen;
|
|
int trlcontxt, xcluflg, currccl, cclsorted, varlength, variable_trail_rule;
|
|
|
|
int *scon_stk;
|
|
int scon_stk_ptr;
|
|
|
|
static int madeany = false; /* whether we've made the '.' character class */
|
|
int previous_continued_action; /* whether the previous rule's action was '|' */
|
|
|
|
/* Expand a POSIX character class expression. */
|
|
#define CCL_EXPR(func) \
|
|
{ \
|
|
int c; \
|
|
for ( c = 0; c < csize; ++c ) \
|
|
if ( isascii(c) && func(c) ) \
|
|
ccladd( currccl, c ); \
|
|
}
|
|
|
|
/* While POSIX defines isblank(), it's not ANSI C. */
|
|
#define IS_BLANK(c) ((c) == ' ' || (c) == '\t')
|
|
|
|
/* On some over-ambitious machines, such as DEC Alpha's, the default
|
|
* token type is "long" instead of "int"; this leads to problems with
|
|
* declaring yylval in flexdef.h. But so far, all the yacc's I've seen
|
|
* wrap their definitions of YYSTYPE with "#ifndef YYSTYPE"'s, so the
|
|
* following should ensure that the default token type is "int".
|
|
*/
|
|
#define YYSTYPE int
|
|
|
|
#line 112 "y.tab.c"
|
|
#define CHAR 257
|
|
#define NUMBER 258
|
|
#define SECTEND 259
|
|
#define SCDECL 260
|
|
#define XSCDECL 261
|
|
#define NAME 262
|
|
#define PREVCCL 263
|
|
#define EOF_OP 264
|
|
#define OPTION_OP 265
|
|
#define OPT_OUTFILE 266
|
|
#define OPT_PREFIX 267
|
|
#define OPT_YYCLASS 268
|
|
#define CCE_ALNUM 269
|
|
#define CCE_ALPHA 270
|
|
#define CCE_BLANK 271
|
|
#define CCE_CNTRL 272
|
|
#define CCE_DIGIT 273
|
|
#define CCE_GRAPH 274
|
|
#define CCE_LOWER 275
|
|
#define CCE_PRINT 276
|
|
#define CCE_PUNCT 277
|
|
#define CCE_SPACE 278
|
|
#define CCE_UPPER 279
|
|
#define CCE_XDIGIT 280
|
|
#define YYERRCODE 256
|
|
short yylhs[] = { -1,
|
|
0, 1, 2, 2, 2, 2, 3, 6, 6, 7,
|
|
7, 7, 8, 9, 9, 10, 10, 10, 4, 4,
|
|
4, 5, 12, 12, 12, 12, 14, 11, 11, 11,
|
|
15, 15, 15, 16, 13, 13, 13, 13, 18, 18,
|
|
17, 19, 19, 20, 20, 20, 20, 20, 20, 20,
|
|
20, 20, 20, 20, 20, 21, 21, 23, 23, 23,
|
|
23, 24, 24, 24, 24, 24, 24, 24, 24, 24,
|
|
24, 24, 24, 22, 22,
|
|
};
|
|
short yylen[] = { 2,
|
|
5, 0, 3, 2, 0, 1, 1, 1, 1, 2,
|
|
1, 1, 2, 2, 0, 3, 3, 3, 5, 5,
|
|
0, 0, 2, 1, 1, 1, 0, 4, 3, 0,
|
|
3, 1, 1, 1, 2, 3, 2, 1, 3, 1,
|
|
2, 2, 1, 2, 2, 2, 6, 5, 4, 1,
|
|
1, 1, 3, 3, 1, 3, 4, 4, 2, 2,
|
|
0, 1, 1, 1, 1, 1, 1, 1, 1, 1,
|
|
1, 1, 1, 2, 0,
|
|
};
|
|
short yydefred[] = { 2,
|
|
0, 0, 6, 0, 7, 8, 9, 15, 21, 0,
|
|
4, 0, 0, 12, 11, 0, 0, 0, 0, 14,
|
|
0, 1, 0, 10, 0, 0, 0, 0, 0, 21,
|
|
0, 16, 17, 18, 29, 33, 34, 0, 32, 0,
|
|
26, 55, 52, 25, 0, 50, 75, 0, 0, 0,
|
|
24, 0, 0, 0, 0, 51, 28, 0, 20, 23,
|
|
0, 0, 61, 0, 19, 0, 37, 0, 41, 0,
|
|
0, 44, 45, 46, 31, 74, 53, 54, 0, 0,
|
|
62, 63, 64, 65, 66, 67, 68, 69, 70, 71,
|
|
72, 73, 56, 60, 36, 0, 0, 57, 0, 49,
|
|
0, 58, 0, 48, 47,
|
|
};
|
|
short yydgoto[] = { 1,
|
|
2, 4, 9, 13, 22, 10, 16, 11, 12, 20,
|
|
23, 50, 51, 29, 38, 39, 52, 53, 54, 55,
|
|
56, 61, 64, 94,
|
|
};
|
|
short yysindex[] = { 0,
|
|
0, -235, 0, -191, 0, 0, 0, 0, 0, -207,
|
|
0, -215, -18, 0, 0, -202, 4, 26, 32, 0,
|
|
41, 0, -35, 0, -168, -166, -165, 38, -180, 0,
|
|
-30, 0, 0, 0, 0, 0, 0, -16, 0, -40,
|
|
0, 0, 0, 0, -2, 0, 0, -2, 8, 93,
|
|
0, -2, -25, -2, 15, 0, 0, -153, 0, 0,
|
|
-27, -26, 0, -88, 0, -23, 0, -2, 0, 15,
|
|
-150, 0, 0, 0, 0, 0, 0, 0, -3, 65,
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
0, 0, 0, 0, 0, -2, -21, 0, -145, 0,
|
|
-116, 0, -12, 0, 0,
|
|
};
|
|
short yyrindex[] = { 0,
|
|
0, -188, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
0, -154, 1, 0, 0, -140, 0, 0, 0, 0,
|
|
-176, 0, -28, 0, 0, 0, 0, 0, 0, 0,
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, -32,
|
|
0, 0, 0, 0, 0, 0, 0, 0, 22, 0,
|
|
0, 0, 106, 7, -10, 0, 0, 0, 0, 0,
|
|
0, 0, 0, 0, 0, 108, 0, 0, 0, -7,
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 46,
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
0, 0, 0, 0, 0, 9, 0, 0, 0, 0,
|
|
0, 0, 0, 0, 0,
|
|
};
|
|
short yygindex[] = { 0,
|
|
0, 0, 0, 92, 100, 0, 0, 0, 0, 0,
|
|
0, 0, 81, 0, 0, 69, 0, 27, 60, -29,
|
|
0, 0, 66, 0,
|
|
};
|
|
#define YYTABLESIZE 326
|
|
short yytable[] = { 43,
|
|
22, 30, 42, 47, 93, 22, 77, 30, 104, 48,
|
|
67, 22, 95, 30, 78, 46, 40, 22, 39, 21,
|
|
3, 69, 101, 43, 70, 43, 42, 58, 42, 43,
|
|
43, 47, 42, 42, 30, 43, 43, 48, 42, 42,
|
|
30, 21, 40, 46, 39, 57, 30, 40, 14, 39,
|
|
17, 18, 19, 40, 15, 39, 72, 73, 30, 24,
|
|
49, 30, 22, 45, 25, 22, 70, 5, 6, 7,
|
|
5, 5, 5, 8, 62, 36, 5, 74, 66, 27,
|
|
43, 37, 28, 42, 59, 27, 26, 30, 49, 98,
|
|
30, 30, 27, 32, 30, 33, 34, 68, 68, 35,
|
|
68, 63, 65, 100, 13, 13, 13, 97, 37, 99,
|
|
13, 102, 105, 43, 61, 38, 42, 35, 3, 3,
|
|
3, 40, 31, 30, 3, 60, 75, 96, 79, 0,
|
|
40, 0, 39, 0, 0, 0, 0, 71, 59, 0,
|
|
0, 103, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
0, 0, 0, 0, 0, 0, 0, 0, 80, 0,
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
81, 82, 83, 84, 85, 86, 87, 88, 89, 90,
|
|
91, 92, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
0, 0, 0, 30, 30, 41, 42, 22, 22, 76,
|
|
30, 30, 43, 44, 22, 22, 0, 0, 0, 0,
|
|
0, 0, 0, 0, 0, 0, 43, 0, 0, 42,
|
|
0, 0, 43, 80, 42, 42, 30, 30, 0, 0,
|
|
43, 0, 0, 30, 30, 81, 82, 83, 84, 85,
|
|
86, 87, 88, 89, 90, 91, 92, 0, 61, 0,
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
61, 61, 61, 61, 61, 61, 61, 61, 61, 61,
|
|
61, 61, 59, 0, 0, 0, 0, 0, 0, 0,
|
|
0, 0, 0, 0, 59, 59, 59, 59, 59, 59,
|
|
59, 59, 59, 59, 59, 59,
|
|
};
|
|
short yycheck[] = { 10,
|
|
0, 34, 10, 34, 93, 34, 34, 40, 125, 40,
|
|
36, 40, 36, 46, 41, 46, 10, 46, 10, 60,
|
|
256, 47, 44, 34, 54, 36, 34, 44, 36, 40,
|
|
41, 34, 40, 41, 34, 46, 47, 40, 46, 47,
|
|
40, 60, 36, 46, 36, 62, 46, 41, 256, 41,
|
|
266, 267, 268, 47, 262, 47, 42, 43, 91, 262,
|
|
91, 94, 91, 94, 61, 94, 96, 259, 260, 261,
|
|
259, 260, 261, 265, 48, 256, 265, 63, 52, 256,
|
|
91, 262, 42, 91, 125, 262, 61, 123, 91, 93,
|
|
123, 91, 61, 262, 94, 262, 262, 124, 124, 62,
|
|
124, 94, 10, 125, 259, 260, 261, 258, 262, 45,
|
|
265, 257, 125, 124, 93, 10, 124, 10, 259, 260,
|
|
261, 30, 23, 123, 265, 45, 58, 68, 63, -1,
|
|
124, -1, 124, -1, -1, -1, -1, 123, 93, -1,
|
|
-1, 258, -1, -1, -1, -1, -1, -1, -1, -1,
|
|
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
|
-1, -1, -1, -1, -1, -1, -1, -1, 257, -1,
|
|
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
|
269, 270, 271, 272, 273, 274, 275, 276, 277, 278,
|
|
279, 280, -1, -1, -1, -1, -1, -1, -1, -1,
|
|
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
|
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
|
-1, -1, -1, 256, 257, 256, 257, 256, 257, 257,
|
|
263, 264, 263, 264, 263, 264, -1, -1, -1, -1,
|
|
-1, -1, -1, -1, -1, -1, 257, -1, -1, 257,
|
|
-1, -1, 263, 257, 257, 263, 256, 257, -1, -1,
|
|
263, -1, -1, 263, 264, 269, 270, 271, 272, 273,
|
|
274, 275, 276, 277, 278, 279, 280, -1, 257, -1,
|
|
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
|
269, 270, 271, 272, 273, 274, 275, 276, 277, 278,
|
|
279, 280, 257, -1, -1, -1, -1, -1, -1, -1,
|
|
-1, -1, -1, -1, 269, 270, 271, 272, 273, 274,
|
|
275, 276, 277, 278, 279, 280,
|
|
};
|
|
#define YYFINAL 1
|
|
#ifndef YYDEBUG
|
|
#define YYDEBUG 0
|
|
#endif
|
|
#define YYMAXTOKEN 280
|
|
#if YYDEBUG
|
|
char *yyname[] = {
|
|
"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,
|
|
0,0,0,"'\"'",0,"'$'",0,0,0,"'('","')'","'*'","'+'","','","'-'","'.'","'/'",0,0,
|
|
0,0,0,0,0,0,0,0,0,0,"'<'","'='","'>'","'?'",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
|
0,0,0,0,0,0,0,0,0,"'['",0,"']'","'^'",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
|
0,0,0,0,0,0,0,"'{'","'|'","'}'",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
|
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
|
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
|
0,0,0,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",
|
|
"SCDECL","XSCDECL","NAME","PREVCCL","EOF_OP","OPTION_OP","OPT_OUTFILE",
|
|
"OPT_PREFIX","OPT_YYCLASS","CCE_ALNUM","CCE_ALPHA","CCE_BLANK","CCE_CNTRL",
|
|
"CCE_DIGIT","CCE_GRAPH","CCE_LOWER","CCE_PRINT","CCE_PUNCT","CCE_SPACE",
|
|
"CCE_UPPER","CCE_XDIGIT",
|
|
};
|
|
char *yyrule[] = {
|
|
"$accept : goal",
|
|
"goal : initlex sect1 sect1end sect2 initforrule",
|
|
"initlex :",
|
|
"sect1 : sect1 startconddecl namelist1",
|
|
"sect1 : sect1 options",
|
|
"sect1 :",
|
|
"sect1 : error",
|
|
"sect1end : SECTEND",
|
|
"startconddecl : SCDECL",
|
|
"startconddecl : XSCDECL",
|
|
"namelist1 : namelist1 NAME",
|
|
"namelist1 : NAME",
|
|
"namelist1 : error",
|
|
"options : OPTION_OP optionlist",
|
|
"optionlist : optionlist option",
|
|
"optionlist :",
|
|
"option : OPT_OUTFILE '=' NAME",
|
|
"option : OPT_PREFIX '=' NAME",
|
|
"option : OPT_YYCLASS '=' NAME",
|
|
"sect2 : sect2 scon initforrule flexrule '\\n'",
|
|
"sect2 : sect2 scon '{' sect2 '}'",
|
|
"sect2 :",
|
|
"initforrule :",
|
|
"flexrule : '^' rule",
|
|
"flexrule : rule",
|
|
"flexrule : EOF_OP",
|
|
"flexrule : error",
|
|
"scon_stk_ptr :",
|
|
"scon : '<' scon_stk_ptr namelist2 '>'",
|
|
"scon : '<' '*' '>'",
|
|
"scon :",
|
|
"namelist2 : namelist2 ',' sconname",
|
|
"namelist2 : sconname",
|
|
"namelist2 : error",
|
|
"sconname : NAME",
|
|
"rule : re2 re",
|
|
"rule : re2 re '$'",
|
|
"rule : re '$'",
|
|
"rule : re",
|
|
"re : re '|' series",
|
|
"re : series",
|
|
"re2 : re '/'",
|
|
"series : series singleton",
|
|
"series : singleton",
|
|
"singleton : singleton '*'",
|
|
"singleton : singleton '+'",
|
|
"singleton : singleton '?'",
|
|
"singleton : singleton '{' NUMBER ',' NUMBER '}'",
|
|
"singleton : singleton '{' NUMBER ',' '}'",
|
|
"singleton : singleton '{' NUMBER '}'",
|
|
"singleton : '.'",
|
|
"singleton : fullccl",
|
|
"singleton : PREVCCL",
|
|
"singleton : '\"' string '\"'",
|
|
"singleton : '(' re ')'",
|
|
"singleton : CHAR",
|
|
"fullccl : '[' ccl ']'",
|
|
"fullccl : '[' '^' ccl ']'",
|
|
"ccl : ccl CHAR '-' CHAR",
|
|
"ccl : ccl CHAR",
|
|
"ccl : ccl ccl_expr",
|
|
"ccl :",
|
|
"ccl_expr : CCE_ALNUM",
|
|
"ccl_expr : CCE_ALPHA",
|
|
"ccl_expr : CCE_BLANK",
|
|
"ccl_expr : CCE_CNTRL",
|
|
"ccl_expr : CCE_DIGIT",
|
|
"ccl_expr : CCE_GRAPH",
|
|
"ccl_expr : CCE_LOWER",
|
|
"ccl_expr : CCE_PRINT",
|
|
"ccl_expr : CCE_PUNCT",
|
|
"ccl_expr : CCE_SPACE",
|
|
"ccl_expr : CCE_UPPER",
|
|
"ccl_expr : CCE_XDIGIT",
|
|
"string : string CHAR",
|
|
"string :",
|
|
};
|
|
#endif
|
|
#ifndef YYSTYPE
|
|
typedef int YYSTYPE;
|
|
#endif
|
|
#ifdef YYSTACKSIZE
|
|
#undef YYMAXDEPTH
|
|
#define YYMAXDEPTH YYSTACKSIZE
|
|
#else
|
|
#ifdef YYMAXDEPTH
|
|
#define YYSTACKSIZE YYMAXDEPTH
|
|
#else
|
|
#define YYSTACKSIZE 500
|
|
#define YYMAXDEPTH 500
|
|
#endif
|
|
#endif
|
|
int yydebug;
|
|
int yynerrs;
|
|
int yyerrflag;
|
|
int yychar;
|
|
short *yyssp;
|
|
YYSTYPE *yyvsp;
|
|
YYSTYPE yyval;
|
|
YYSTYPE yylval;
|
|
short yyss[YYSTACKSIZE];
|
|
YYSTYPE yyvs[YYSTACKSIZE];
|
|
#define yystacksize YYSTACKSIZE
|
|
#line 776 "./parse.y"
|
|
|
|
|
|
/* build_eof_action - build the "<<EOF>>" action for the active start
|
|
* conditions
|
|
*/
|
|
|
|
void build_eof_action()
|
|
{
|
|
register int i;
|
|
char action_text[MAXLINE];
|
|
|
|
for ( i = 1; i <= scon_stk_ptr; ++i )
|
|
{
|
|
if ( sceof[scon_stk[i]] )
|
|
format_pinpoint_message(
|
|
"multiple <<EOF>> rules for start condition %s",
|
|
scname[scon_stk[i]] );
|
|
|
|
else
|
|
{
|
|
sceof[scon_stk[i]] = true;
|
|
sprintf( action_text, "case YY_STATE_EOF(%s):\n",
|
|
scname[scon_stk[i]] );
|
|
add_action( action_text );
|
|
}
|
|
}
|
|
|
|
line_directive_out( (FILE *) 0, 1 );
|
|
|
|
/* This isn't a normal rule after all - don't count it as
|
|
* such, so we don't have any holes in the rule numbering
|
|
* (which make generating "rule can never match" warnings
|
|
* more difficult.
|
|
*/
|
|
--num_rules;
|
|
++num_eof_rules;
|
|
}
|
|
|
|
|
|
/* format_synerr - write out formatted syntax error */
|
|
|
|
void format_synerr( msg, arg )
|
|
char msg[], arg[];
|
|
{
|
|
char errmsg[MAXLINE];
|
|
|
|
(void) sprintf( errmsg, msg, arg );
|
|
synerr( errmsg );
|
|
}
|
|
|
|
|
|
/* synerr - report a syntax error */
|
|
|
|
void synerr( str )
|
|
char str[];
|
|
{
|
|
syntaxerror = true;
|
|
pinpoint_message( str );
|
|
}
|
|
|
|
|
|
/* format_warn - write out formatted warning */
|
|
|
|
void format_warn( msg, arg )
|
|
char msg[], arg[];
|
|
{
|
|
char warn_msg[MAXLINE];
|
|
|
|
(void) sprintf( warn_msg, msg, arg );
|
|
warn( warn_msg );
|
|
}
|
|
|
|
|
|
/* warn - report a warning, unless -w was given */
|
|
|
|
void warn( str )
|
|
char str[];
|
|
{
|
|
line_warning( str, linenum );
|
|
}
|
|
|
|
/* format_pinpoint_message - write out a message formatted with one string,
|
|
* pinpointing its location
|
|
*/
|
|
|
|
void format_pinpoint_message( msg, arg )
|
|
char msg[], arg[];
|
|
{
|
|
char errmsg[MAXLINE];
|
|
|
|
(void) sprintf( errmsg, msg, arg );
|
|
pinpoint_message( errmsg );
|
|
}
|
|
|
|
|
|
/* pinpoint_message - write out a message, pinpointing its location */
|
|
|
|
void pinpoint_message( str )
|
|
char str[];
|
|
{
|
|
line_pinpoint( str, linenum );
|
|
}
|
|
|
|
|
|
/* line_warning - report a warning at a given line, unless -w was given */
|
|
|
|
void line_warning( str, line )
|
|
char str[];
|
|
int line;
|
|
{
|
|
char warning[MAXLINE];
|
|
|
|
if ( ! nowarn )
|
|
{
|
|
sprintf( warning, "warning, %s", str );
|
|
line_pinpoint( warning, line );
|
|
}
|
|
}
|
|
|
|
|
|
/* line_pinpoint - write out a message, pinpointing it at the given line */
|
|
|
|
void line_pinpoint( str, line )
|
|
char str[];
|
|
int line;
|
|
{
|
|
fprintf( stderr, "\"%s\", line %d: %s\n", infilename, line, str );
|
|
}
|
|
|
|
|
|
/* yyerror - eat up an error message from the parser;
|
|
* currently, messages are ignore
|
|
*/
|
|
|
|
void yyerror( msg )
|
|
char msg[];
|
|
{
|
|
}
|
|
#line 541 "y.tab.c"
|
|
#define YYABORT goto yyabort
|
|
#define YYREJECT goto yyabort
|
|
#define YYACCEPT goto yyaccept
|
|
#define YYERROR goto yyerrlab
|
|
int
|
|
yyparse()
|
|
{
|
|
register int yym, yyn, yystate;
|
|
#if YYDEBUG
|
|
register char *yys;
|
|
extern char *getenv();
|
|
|
|
if (yys = getenv("YYDEBUG"))
|
|
{
|
|
yyn = *yys;
|
|
if (yyn >= '0' && yyn <= '9')
|
|
yydebug = yyn - '0';
|
|
}
|
|
#endif
|
|
|
|
yynerrs = 0;
|
|
yyerrflag = 0;
|
|
yychar = (-1);
|
|
|
|
yyssp = yyss;
|
|
yyvsp = yyvs;
|
|
*yyssp = yystate = 0;
|
|
|
|
yyloop:
|
|
if (yyn = yydefred[yystate]) goto yyreduce;
|
|
if (yychar < 0)
|
|
{
|
|
if ((yychar = yylex()) < 0) yychar = 0;
|
|
#if YYDEBUG
|
|
if (yydebug)
|
|
{
|
|
yys = 0;
|
|
if (yychar <= YYMAXTOKEN) yys = yyname[yychar];
|
|
if (!yys) yys = "illegal-symbol";
|
|
printf("%sdebug: state %d, reading %d (%s)\n",
|
|
YYPREFIX, yystate, yychar, yys);
|
|
}
|
|
#endif
|
|
}
|
|
if ((yyn = yysindex[yystate]) && (yyn += yychar) >= 0 &&
|
|
yyn <= YYTABLESIZE && yycheck[yyn] == yychar)
|
|
{
|
|
#if YYDEBUG
|
|
if (yydebug)
|
|
printf("%sdebug: state %d, shifting to state %d\n",
|
|
YYPREFIX, yystate, yytable[yyn]);
|
|
#endif
|
|
if (yyssp >= yyss + yystacksize - 1)
|
|
{
|
|
goto yyoverflow;
|
|
}
|
|
*++yyssp = yystate = yytable[yyn];
|
|
*++yyvsp = yylval;
|
|
yychar = (-1);
|
|
if (yyerrflag > 0) --yyerrflag;
|
|
goto yyloop;
|
|
}
|
|
if ((yyn = yyrindex[yystate]) && (yyn += yychar) >= 0 &&
|
|
yyn <= YYTABLESIZE && yycheck[yyn] == yychar)
|
|
{
|
|
yyn = yytable[yyn];
|
|
goto yyreduce;
|
|
}
|
|
if (yyerrflag) goto yyinrecovery;
|
|
#ifdef lint
|
|
goto yynewerror;
|
|
#endif
|
|
yynewerror:
|
|
yyerror("syntax error");
|
|
#ifdef lint
|
|
goto yyerrlab;
|
|
#endif
|
|
yyerrlab:
|
|
++yynerrs;
|
|
yyinrecovery:
|
|
if (yyerrflag < 3)
|
|
{
|
|
yyerrflag = 3;
|
|
for (;;)
|
|
{
|
|
if ((yyn = yysindex[*yyssp]) && (yyn += YYERRCODE) >= 0 &&
|
|
yyn <= YYTABLESIZE && yycheck[yyn] == YYERRCODE)
|
|
{
|
|
#if YYDEBUG
|
|
if (yydebug)
|
|
printf("%sdebug: state %d, error recovery shifting\
|
|
to state %d\n", YYPREFIX, *yyssp, yytable[yyn]);
|
|
#endif
|
|
if (yyssp >= yyss + yystacksize - 1)
|
|
{
|
|
goto yyoverflow;
|
|
}
|
|
*++yyssp = yystate = yytable[yyn];
|
|
*++yyvsp = yylval;
|
|
goto yyloop;
|
|
}
|
|
else
|
|
{
|
|
#if YYDEBUG
|
|
if (yydebug)
|
|
printf("%sdebug: error recovery discarding state %d\n",
|
|
YYPREFIX, *yyssp);
|
|
#endif
|
|
if (yyssp <= yyss) goto yyabort;
|
|
--yyssp;
|
|
--yyvsp;
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (yychar == 0) goto yyabort;
|
|
#if YYDEBUG
|
|
if (yydebug)
|
|
{
|
|
yys = 0;
|
|
if (yychar <= YYMAXTOKEN) yys = yyname[yychar];
|
|
if (!yys) yys = "illegal-symbol";
|
|
printf("%sdebug: state %d, error recovery discards token %d (%s)\n",
|
|
YYPREFIX, yystate, yychar, yys);
|
|
}
|
|
#endif
|
|
yychar = (-1);
|
|
goto yyloop;
|
|
}
|
|
yyreduce:
|
|
#if YYDEBUG
|
|
if (yydebug)
|
|
printf("%sdebug: state %d, reducing by rule %d (%s)\n",
|
|
YYPREFIX, yystate, yyn, yyrule[yyn]);
|
|
#endif
|
|
yym = yylen[yyn];
|
|
yyval = yyvsp[1-yym];
|
|
switch (yyn)
|
|
{
|
|
case 1:
|
|
#line 113 "./parse.y"
|
|
{ /* add default rule */
|
|
int def_rule;
|
|
|
|
pat = cclinit();
|
|
cclnegate( pat );
|
|
|
|
def_rule = mkstate( -pat );
|
|
|
|
/* Remember the number of the default rule so we
|
|
* don't generate "can't match" warnings for it.
|
|
*/
|
|
default_rule = num_rules;
|
|
|
|
finish_rule( def_rule, false, 0, 0 );
|
|
|
|
for ( i = 1; i <= lastsc; ++i )
|
|
scset[i] = mkbranch( scset[i], def_rule );
|
|
|
|
if ( spprdflt )
|
|
add_action(
|
|
"YY_FATAL_ERROR( \"flex scanner jammed\" )" );
|
|
else
|
|
add_action( "ECHO" );
|
|
|
|
add_action( ";\n\tYY_BREAK\n" );
|
|
}
|
|
break;
|
|
case 2:
|
|
#line 142 "./parse.y"
|
|
{ /* initialize for processing rules */
|
|
|
|
/* Create default DFA start condition. */
|
|
scinstal( "INITIAL", false );
|
|
}
|
|
break;
|
|
case 6:
|
|
#line 153 "./parse.y"
|
|
{ synerr( "unknown error processing section 1" ); }
|
|
break;
|
|
case 7:
|
|
#line 157 "./parse.y"
|
|
{
|
|
check_options();
|
|
scon_stk = allocate_integer_array( lastsc + 1 );
|
|
scon_stk_ptr = 0;
|
|
}
|
|
break;
|
|
case 8:
|
|
#line 165 "./parse.y"
|
|
{ xcluflg = false; }
|
|
break;
|
|
case 9:
|
|
#line 168 "./parse.y"
|
|
{ xcluflg = true; }
|
|
break;
|
|
case 10:
|
|
#line 172 "./parse.y"
|
|
{ scinstal( nmstr, xcluflg ); }
|
|
break;
|
|
case 11:
|
|
#line 175 "./parse.y"
|
|
{ scinstal( nmstr, xcluflg ); }
|
|
break;
|
|
case 12:
|
|
#line 178 "./parse.y"
|
|
{ synerr( "bad start condition list" ); }
|
|
break;
|
|
case 16:
|
|
#line 189 "./parse.y"
|
|
{
|
|
outfilename = copy_string( nmstr );
|
|
did_outfilename = 1;
|
|
}
|
|
break;
|
|
case 17:
|
|
#line 194 "./parse.y"
|
|
{ prefix = copy_string( nmstr ); }
|
|
break;
|
|
case 18:
|
|
#line 196 "./parse.y"
|
|
{ yyclass = copy_string( nmstr ); }
|
|
break;
|
|
case 19:
|
|
#line 200 "./parse.y"
|
|
{ scon_stk_ptr = yyvsp[-3]; }
|
|
break;
|
|
case 20:
|
|
#line 202 "./parse.y"
|
|
{ scon_stk_ptr = yyvsp[-3]; }
|
|
break;
|
|
case 22:
|
|
#line 207 "./parse.y"
|
|
{
|
|
/* Initialize for a parse of one rule. */
|
|
trlcontxt = variable_trail_rule = varlength = false;
|
|
trailcnt = headcnt = rulelen = 0;
|
|
current_state_type = STATE_NORMAL;
|
|
previous_continued_action = continued_action;
|
|
in_rule = true;
|
|
|
|
new_rule();
|
|
}
|
|
break;
|
|
case 23:
|
|
#line 220 "./parse.y"
|
|
{
|
|
pat = yyvsp[0];
|
|
finish_rule( pat, variable_trail_rule,
|
|
headcnt, trailcnt );
|
|
|
|
if ( scon_stk_ptr > 0 )
|
|
{
|
|
for ( i = 1; i <= scon_stk_ptr; ++i )
|
|
scbol[scon_stk[i]] =
|
|
mkbranch( scbol[scon_stk[i]],
|
|
pat );
|
|
}
|
|
|
|
else
|
|
{
|
|
/* Add to all non-exclusive start conditions,
|
|
* including the default (0) start condition.
|
|
*/
|
|
|
|
for ( i = 1; i <= lastsc; ++i )
|
|
if ( ! scxclu[i] )
|
|
scbol[i] = mkbranch( scbol[i],
|
|
pat );
|
|
}
|
|
|
|
if ( ! bol_needed )
|
|
{
|
|
bol_needed = true;
|
|
|
|
if ( performance_report > 1 )
|
|
pinpoint_message(
|
|
"'^' operator results in sub-optimal performance" );
|
|
}
|
|
}
|
|
break;
|
|
case 24:
|
|
#line 256 "./parse.y"
|
|
{
|
|
pat = yyvsp[0];
|
|
finish_rule( pat, variable_trail_rule,
|
|
headcnt, trailcnt );
|
|
|
|
if ( scon_stk_ptr > 0 )
|
|
{
|
|
for ( i = 1; i <= scon_stk_ptr; ++i )
|
|
scset[scon_stk[i]] =
|
|
mkbranch( scset[scon_stk[i]],
|
|
pat );
|
|
}
|
|
|
|
else
|
|
{
|
|
for ( i = 1; i <= lastsc; ++i )
|
|
if ( ! scxclu[i] )
|
|
scset[i] =
|
|
mkbranch( scset[i],
|
|
pat );
|
|
}
|
|
}
|
|
break;
|
|
case 25:
|
|
#line 280 "./parse.y"
|
|
{
|
|
if ( scon_stk_ptr > 0 )
|
|
build_eof_action();
|
|
|
|
else
|
|
{
|
|
/* This EOF applies to all start conditions
|
|
* which don't already have EOF actions.
|
|
*/
|
|
for ( i = 1; i <= lastsc; ++i )
|
|
if ( ! sceof[i] )
|
|
scon_stk[++scon_stk_ptr] = i;
|
|
|
|
if ( scon_stk_ptr == 0 )
|
|
warn(
|
|
"all start conditions already have <<EOF>> rules" );
|
|
|
|
else
|
|
build_eof_action();
|
|
}
|
|
}
|
|
break;
|
|
case 26:
|
|
#line 303 "./parse.y"
|
|
{ synerr( "unrecognized rule" ); }
|
|
break;
|
|
case 27:
|
|
#line 307 "./parse.y"
|
|
{ yyval = scon_stk_ptr; }
|
|
break;
|
|
case 28:
|
|
#line 311 "./parse.y"
|
|
{ yyval = yyvsp[-2]; }
|
|
break;
|
|
case 29:
|
|
#line 314 "./parse.y"
|
|
{
|
|
yyval = scon_stk_ptr;
|
|
|
|
for ( i = 1; i <= lastsc; ++i )
|
|
{
|
|
int j;
|
|
|
|
for ( j = 1; j <= scon_stk_ptr; ++j )
|
|
if ( scon_stk[j] == i )
|
|
break;
|
|
|
|
if ( j > scon_stk_ptr )
|
|
scon_stk[++scon_stk_ptr] = i;
|
|
}
|
|
}
|
|
break;
|
|
case 30:
|
|
#line 331 "./parse.y"
|
|
{ yyval = scon_stk_ptr; }
|
|
break;
|
|
case 33:
|
|
#line 339 "./parse.y"
|
|
{ synerr( "bad start condition list" ); }
|
|
break;
|
|
case 34:
|
|
#line 343 "./parse.y"
|
|
{
|
|
if ( (scnum = sclookup( nmstr )) == 0 )
|
|
format_pinpoint_message(
|
|
"undeclared start condition %s",
|
|
nmstr );
|
|
else
|
|
{
|
|
for ( i = 1; i <= scon_stk_ptr; ++i )
|
|
if ( scon_stk[i] == scnum )
|
|
{
|
|
format_warn(
|
|
"<%s> specified twice",
|
|
scname[scnum] );
|
|
break;
|
|
}
|
|
|
|
if ( i > scon_stk_ptr )
|
|
scon_stk[++scon_stk_ptr] = scnum;
|
|
}
|
|
}
|
|
break;
|
|
case 35:
|
|
#line 366 "./parse.y"
|
|
{
|
|
if ( transchar[lastst[yyvsp[0]]] != SYM_EPSILON )
|
|
/* Provide final transition \now/ so it
|
|
* will be marked as a trailing context
|
|
* state.
|
|
*/
|
|
yyvsp[0] = link_machines( yyvsp[0],
|
|
mkstate( SYM_EPSILON ) );
|
|
|
|
mark_beginning_as_normal( yyvsp[0] );
|
|
current_state_type = STATE_NORMAL;
|
|
|
|
if ( previous_continued_action )
|
|
{
|
|
/* We need to treat this as variable trailing
|
|
* context so that the backup does not happen
|
|
* in the action but before the action switch
|
|
* statement. If the backup happens in the
|
|
* action, then the rules "falling into" this
|
|
* one's action will *also* do the backup,
|
|
* erroneously.
|
|
*/
|
|
if ( ! varlength || headcnt != 0 )
|
|
warn(
|
|
"trailing context made variable due to preceding '|' action" );
|
|
|
|
/* Mark as variable. */
|
|
varlength = true;
|
|
headcnt = 0;
|
|
}
|
|
|
|
if ( lex_compat || (varlength && headcnt == 0) )
|
|
{ /* variable trailing context rule */
|
|
/* Mark the first part of the rule as the
|
|
* accepting "head" part of a trailing
|
|
* context rule.
|
|
*
|
|
* By the way, we didn't do this at the
|
|
* beginning of this production because back
|
|
* then current_state_type was set up for a
|
|
* trail rule, and add_accept() can create
|
|
* a new state ...
|
|
*/
|
|
add_accept( yyvsp[-1],
|
|
num_rules | YY_TRAILING_HEAD_MASK );
|
|
variable_trail_rule = true;
|
|
}
|
|
|
|
else
|
|
trailcnt = rulelen;
|
|
|
|
yyval = link_machines( yyvsp[-1], yyvsp[0] );
|
|
}
|
|
break;
|
|
case 36:
|
|
#line 421 "./parse.y"
|
|
{ synerr( "trailing context used twice" ); }
|
|
break;
|
|
case 37:
|
|
#line 424 "./parse.y"
|
|
{
|
|
headcnt = 0;
|
|
trailcnt = 1;
|
|
rulelen = 1;
|
|
varlength = false;
|
|
|
|
current_state_type = STATE_TRAILING_CONTEXT;
|
|
|
|
if ( trlcontxt )
|
|
{
|
|
synerr( "trailing context used twice" );
|
|
yyval = mkstate( SYM_EPSILON );
|
|
}
|
|
|
|
else if ( previous_continued_action )
|
|
{
|
|
/* See the comment in the rule for "re2 re"
|
|
* above.
|
|
*/
|
|
warn(
|
|
"trailing context made variable due to preceding '|' action" );
|
|
|
|
varlength = true;
|
|
}
|
|
|
|
if ( lex_compat || varlength )
|
|
{
|
|
/* Again, see the comment in the rule for
|
|
* "re2 re" above.
|
|
*/
|
|
add_accept( yyvsp[-1],
|
|
num_rules | YY_TRAILING_HEAD_MASK );
|
|
variable_trail_rule = true;
|
|
}
|
|
|
|
trlcontxt = true;
|
|
|
|
eps = mkstate( SYM_EPSILON );
|
|
yyval = link_machines( yyvsp[-1],
|
|
link_machines( eps, mkstate( '\n' ) ) );
|
|
}
|
|
break;
|
|
case 38:
|
|
#line 467 "./parse.y"
|
|
{
|
|
yyval = yyvsp[0];
|
|
|
|
if ( trlcontxt )
|
|
{
|
|
if ( lex_compat || (varlength && headcnt == 0) )
|
|
/* Both head and trail are
|
|
* variable-length.
|
|
*/
|
|
variable_trail_rule = true;
|
|
else
|
|
trailcnt = rulelen;
|
|
}
|
|
}
|
|
break;
|
|
case 39:
|
|
#line 485 "./parse.y"
|
|
{
|
|
varlength = true;
|
|
yyval = mkor( yyvsp[-2], yyvsp[0] );
|
|
}
|
|
break;
|
|
case 40:
|
|
#line 491 "./parse.y"
|
|
{ yyval = yyvsp[0]; }
|
|
break;
|
|
case 41:
|
|
#line 496 "./parse.y"
|
|
{
|
|
/* This rule is written separately so the
|
|
* reduction will occur before the trailing
|
|
* series is parsed.
|
|
*/
|
|
|
|
if ( trlcontxt )
|
|
synerr( "trailing context used twice" );
|
|
else
|
|
trlcontxt = true;
|
|
|
|
if ( varlength )
|
|
/* We hope the trailing context is
|
|
* fixed-length.
|
|
*/
|
|
varlength = false;
|
|
else
|
|
headcnt = rulelen;
|
|
|
|
rulelen = 0;
|
|
|
|
current_state_type = STATE_TRAILING_CONTEXT;
|
|
yyval = yyvsp[-1];
|
|
}
|
|
break;
|
|
case 42:
|
|
#line 523 "./parse.y"
|
|
{
|
|
/* This is where concatenation of adjacent patterns
|
|
* gets done.
|
|
*/
|
|
yyval = link_machines( yyvsp[-1], yyvsp[0] );
|
|
}
|
|
break;
|
|
case 43:
|
|
#line 531 "./parse.y"
|
|
{ yyval = yyvsp[0]; }
|
|
break;
|
|
case 44:
|
|
#line 535 "./parse.y"
|
|
{
|
|
varlength = true;
|
|
|
|
yyval = mkclos( yyvsp[-1] );
|
|
}
|
|
break;
|
|
case 45:
|
|
#line 542 "./parse.y"
|
|
{
|
|
varlength = true;
|
|
yyval = mkposcl( yyvsp[-1] );
|
|
}
|
|
break;
|
|
case 46:
|
|
#line 548 "./parse.y"
|
|
{
|
|
varlength = true;
|
|
yyval = mkopt( yyvsp[-1] );
|
|
}
|
|
break;
|
|
case 47:
|
|
#line 554 "./parse.y"
|
|
{
|
|
varlength = true;
|
|
|
|
if ( yyvsp[-3] > yyvsp[-1] || yyvsp[-3] < 0 )
|
|
{
|
|
synerr( "bad iteration values" );
|
|
yyval = yyvsp[-5];
|
|
}
|
|
else
|
|
{
|
|
if ( yyvsp[-3] == 0 )
|
|
{
|
|
if ( yyvsp[-1] <= 0 )
|
|
{
|
|
synerr(
|
|
"bad iteration values" );
|
|
yyval = yyvsp[-5];
|
|
}
|
|
else
|
|
yyval = mkopt(
|
|
mkrep( yyvsp[-5], 1, yyvsp[-1] ) );
|
|
}
|
|
else
|
|
yyval = mkrep( yyvsp[-5], yyvsp[-3], yyvsp[-1] );
|
|
}
|
|
}
|
|
break;
|
|
case 48:
|
|
#line 582 "./parse.y"
|
|
{
|
|
varlength = true;
|
|
|
|
if ( yyvsp[-2] <= 0 )
|
|
{
|
|
synerr( "iteration value must be positive" );
|
|
yyval = yyvsp[-4];
|
|
}
|
|
|
|
else
|
|
yyval = mkrep( yyvsp[-4], yyvsp[-2], INFINITY );
|
|
}
|
|
break;
|
|
case 49:
|
|
#line 596 "./parse.y"
|
|
{
|
|
/* The singleton could be something like "(foo)",
|
|
* in which case we have no idea what its length
|
|
* is, so we punt here.
|
|
*/
|
|
varlength = true;
|
|
|
|
if ( yyvsp[-1] <= 0 )
|
|
{
|
|
synerr( "iteration value must be positive" );
|
|
yyval = yyvsp[-3];
|
|
}
|
|
|
|
else
|
|
yyval = link_machines( yyvsp[-3],
|
|
copysingl( yyvsp[-3], yyvsp[-1] - 1 ) );
|
|
}
|
|
break;
|
|
case 50:
|
|
#line 615 "./parse.y"
|
|
{
|
|
if ( ! madeany )
|
|
{
|
|
/* Create the '.' character class. */
|
|
anyccl = cclinit();
|
|
ccladd( anyccl, '\n' );
|
|
cclnegate( anyccl );
|
|
|
|
if ( useecs )
|
|
mkeccl( ccltbl + cclmap[anyccl],
|
|
ccllen[anyccl], nextecm,
|
|
ecgroup, csize, csize );
|
|
|
|
madeany = true;
|
|
}
|
|
|
|
++rulelen;
|
|
|
|
yyval = mkstate( -anyccl );
|
|
}
|
|
break;
|
|
case 51:
|
|
#line 637 "./parse.y"
|
|
{
|
|
if ( ! cclsorted )
|
|
/* Sort characters for fast searching. We
|
|
* use a shell sort since this list could
|
|
* be large.
|
|
*/
|
|
cshell( ccltbl + cclmap[yyvsp[0]], ccllen[yyvsp[0]], true );
|
|
|
|
if ( useecs )
|
|
mkeccl( ccltbl + cclmap[yyvsp[0]], ccllen[yyvsp[0]],
|
|
nextecm, ecgroup, csize, csize );
|
|
|
|
++rulelen;
|
|
|
|
yyval = mkstate( -yyvsp[0] );
|
|
}
|
|
break;
|
|
case 52:
|
|
#line 655 "./parse.y"
|
|
{
|
|
++rulelen;
|
|
|
|
yyval = mkstate( -yyvsp[0] );
|
|
}
|
|
break;
|
|
case 53:
|
|
#line 662 "./parse.y"
|
|
{ yyval = yyvsp[-1]; }
|
|
break;
|
|
case 54:
|
|
#line 665 "./parse.y"
|
|
{ yyval = yyvsp[-1]; }
|
|
break;
|
|
case 55:
|
|
#line 668 "./parse.y"
|
|
{
|
|
++rulelen;
|
|
|
|
if ( caseins && yyvsp[0] >= 'A' && yyvsp[0] <= 'Z' )
|
|
yyvsp[0] = clower( yyvsp[0] );
|
|
|
|
yyval = mkstate( yyvsp[0] );
|
|
}
|
|
break;
|
|
case 56:
|
|
#line 679 "./parse.y"
|
|
{ yyval = yyvsp[-1]; }
|
|
break;
|
|
case 57:
|
|
#line 682 "./parse.y"
|
|
{
|
|
cclnegate( yyvsp[-1] );
|
|
yyval = yyvsp[-1];
|
|
}
|
|
break;
|
|
case 58:
|
|
#line 689 "./parse.y"
|
|
{
|
|
if ( caseins )
|
|
{
|
|
if ( yyvsp[-2] >= 'A' && yyvsp[-2] <= 'Z' )
|
|
yyvsp[-2] = clower( yyvsp[-2] );
|
|
if ( yyvsp[0] >= 'A' && yyvsp[0] <= 'Z' )
|
|
yyvsp[0] = clower( yyvsp[0] );
|
|
}
|
|
|
|
if ( yyvsp[-2] > yyvsp[0] )
|
|
synerr( "negative range in character class" );
|
|
|
|
else
|
|
{
|
|
for ( i = yyvsp[-2]; i <= yyvsp[0]; ++i )
|
|
ccladd( yyvsp[-3], i );
|
|
|
|
/* Keep track if this ccl is staying in
|
|
* alphabetical order.
|
|
*/
|
|
cclsorted = cclsorted && (yyvsp[-2] > lastchar);
|
|
lastchar = yyvsp[0];
|
|
}
|
|
|
|
yyval = yyvsp[-3];
|
|
}
|
|
break;
|
|
case 59:
|
|
#line 717 "./parse.y"
|
|
{
|
|
if ( caseins && yyvsp[0] >= 'A' && yyvsp[0] <= 'Z' )
|
|
yyvsp[0] = clower( yyvsp[0] );
|
|
|
|
ccladd( yyvsp[-1], yyvsp[0] );
|
|
cclsorted = cclsorted && (yyvsp[0] > lastchar);
|
|
lastchar = yyvsp[0];
|
|
yyval = yyvsp[-1];
|
|
}
|
|
break;
|
|
case 60:
|
|
#line 728 "./parse.y"
|
|
{
|
|
/* Too hard to properly maintain cclsorted. */
|
|
cclsorted = false;
|
|
yyval = yyvsp[-1];
|
|
}
|
|
break;
|
|
case 61:
|
|
#line 735 "./parse.y"
|
|
{
|
|
cclsorted = true;
|
|
lastchar = 0;
|
|
currccl = yyval = cclinit();
|
|
}
|
|
break;
|
|
case 62:
|
|
#line 742 "./parse.y"
|
|
{ CCL_EXPR(isalnum) }
|
|
break;
|
|
case 63:
|
|
#line 743 "./parse.y"
|
|
{ CCL_EXPR(isalpha) }
|
|
break;
|
|
case 64:
|
|
#line 744 "./parse.y"
|
|
{ CCL_EXPR(IS_BLANK) }
|
|
break;
|
|
case 65:
|
|
#line 745 "./parse.y"
|
|
{ CCL_EXPR(iscntrl) }
|
|
break;
|
|
case 66:
|
|
#line 746 "./parse.y"
|
|
{ CCL_EXPR(isdigit) }
|
|
break;
|
|
case 67:
|
|
#line 747 "./parse.y"
|
|
{ CCL_EXPR(isgraph) }
|
|
break;
|
|
case 68:
|
|
#line 748 "./parse.y"
|
|
{ CCL_EXPR(islower) }
|
|
break;
|
|
case 69:
|
|
#line 749 "./parse.y"
|
|
{ CCL_EXPR(isprint) }
|
|
break;
|
|
case 70:
|
|
#line 750 "./parse.y"
|
|
{ CCL_EXPR(ispunct) }
|
|
break;
|
|
case 71:
|
|
#line 751 "./parse.y"
|
|
{ CCL_EXPR(isspace) }
|
|
break;
|
|
case 72:
|
|
#line 752 "./parse.y"
|
|
{
|
|
if ( caseins )
|
|
CCL_EXPR(islower)
|
|
else
|
|
CCL_EXPR(isupper)
|
|
}
|
|
break;
|
|
case 73:
|
|
#line 758 "./parse.y"
|
|
{ CCL_EXPR(isxdigit) }
|
|
break;
|
|
case 74:
|
|
#line 762 "./parse.y"
|
|
{
|
|
if ( caseins && yyvsp[0] >= 'A' && yyvsp[0] <= 'Z' )
|
|
yyvsp[0] = clower( yyvsp[0] );
|
|
|
|
++rulelen;
|
|
|
|
yyval = link_machines( yyvsp[-1], mkstate( yyvsp[0] ) );
|
|
}
|
|
break;
|
|
case 75:
|
|
#line 772 "./parse.y"
|
|
{ yyval = mkstate( SYM_EPSILON ); }
|
|
break;
|
|
#line 1397 "y.tab.c"
|
|
}
|
|
yyssp -= yym;
|
|
yystate = *yyssp;
|
|
yyvsp -= yym;
|
|
yym = yylhs[yyn];
|
|
if (yystate == 0 && yym == 0)
|
|
{
|
|
#if YYDEBUG
|
|
if (yydebug)
|
|
printf("%sdebug: after reduction, shifting from state 0 to\
|
|
state %d\n", YYPREFIX, YYFINAL);
|
|
#endif
|
|
yystate = YYFINAL;
|
|
*++yyssp = YYFINAL;
|
|
*++yyvsp = yyval;
|
|
if (yychar < 0)
|
|
{
|
|
if ((yychar = yylex()) < 0) yychar = 0;
|
|
#if YYDEBUG
|
|
if (yydebug)
|
|
{
|
|
yys = 0;
|
|
if (yychar <= YYMAXTOKEN) yys = yyname[yychar];
|
|
if (!yys) yys = "illegal-symbol";
|
|
printf("%sdebug: state %d, reading %d (%s)\n",
|
|
YYPREFIX, YYFINAL, yychar, yys);
|
|
}
|
|
#endif
|
|
}
|
|
if (yychar == 0) goto yyaccept;
|
|
goto yyloop;
|
|
}
|
|
if ((yyn = yygindex[yym]) && (yyn += yystate) >= 0 &&
|
|
yyn <= YYTABLESIZE && yycheck[yyn] == yystate)
|
|
yystate = yytable[yyn];
|
|
else
|
|
yystate = yydgoto[yym];
|
|
#if YYDEBUG
|
|
if (yydebug)
|
|
printf("%sdebug: after reduction, shifting from state %d \
|
|
to state %d\n", YYPREFIX, *yyssp, yystate);
|
|
#endif
|
|
if (yyssp >= yyss + yystacksize - 1)
|
|
{
|
|
goto yyoverflow;
|
|
}
|
|
*++yyssp = yystate;
|
|
*++yyvsp = yyval;
|
|
goto yyloop;
|
|
yyoverflow:
|
|
yyerror("yacc stack overflow");
|
|
yyabort:
|
|
return (1);
|
|
yyaccept:
|
|
return (0);
|
|
}
|