www.pudn.com > flex_bingle.rar > parse.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 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: /home/daffy/u0/vern/flex/RCS/parse.y,v 2.28 95/04/21 11:51:51 vern Exp $ */ 
 
 
/* 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  
#  else 
#   ifdef __hpux 
void *alloca (); 
#   else 
#    ifdef __TURBOC__ 
#     include  
#    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 "<>" 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 <> 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 <> 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); 
}