1319297Sdelphij/* $Id: yaccpar.skel,v 1.8 2016/12/02 21:44:42 tom Exp $ */ 2264790Sbapt 3264790Sbapt#include "defs.h" 4264790Sbapt 5264790Sbapt/* If the skeleton is changed, the banner should be changed so that */ 6264790Sbapt/* the altered version can be easily distinguished from the original. */ 7264790Sbapt/* */ 8264790Sbapt/* The #defines included with the banner are there because they are */ 9264790Sbapt/* useful in subsequent code. The macros #defined in the header or */ 10264790Sbapt/* the body either are not useful outside of semantic actions or */ 11264790Sbapt/* are conditional. */ 12264790Sbapt 13264790Sbapt%% banner 14264790Sbapt/* original parser id follows */ 15264790Sbapt/* yysccsid[] = "@(#)yaccpar 1.9 (Berkeley) 02/21/93" */ 16264790Sbapt/* (use YYMAJOR/YYMINOR for ifdefs dependent on parser version) */ 17264790Sbapt 18264790Sbapt#define YYBYACC 1 19264790Sbapt%% insert VERSION here 20264790Sbapt 21264790Sbapt#define YYEMPTY (-1) 22264790Sbapt#define yyclearin (yychar = YYEMPTY) 23264790Sbapt#define yyerrok (yyerrflag = 0) 24264790Sbapt#define YYRECOVERING() (yyerrflag != 0) 25264790Sbapt#define YYENOMEM (-2) 26264790Sbapt#define YYEOF 0 27264790Sbapt%% xdecls 28264790Sbapt 29264790Sbaptextern int YYPARSE_DECL(); 30264790Sbapt%% tables 31264790Sbaptextern YYINT yylhs[]; 32264790Sbaptextern YYINT yylen[]; 33264790Sbaptextern YYINT yydefred[]; 34264790Sbaptextern YYINT yydgoto[]; 35264790Sbaptextern YYINT yysindex[]; 36264790Sbaptextern YYINT yyrindex[]; 37264790Sbaptextern YYINT yygindex[]; 38264790Sbaptextern YYINT yytable[]; 39264790Sbaptextern YYINT yycheck[]; 40264790Sbapt 41319297Sdelphij#if YYDEBUG || defined(yytname) 42319297Sdelphijextern char *yyname[]; 43319297Sdelphij#endif 44264790Sbapt#if YYDEBUG 45264790Sbaptextern char *yyrule[]; 46264790Sbapt#endif 47264790Sbapt%% global_vars 48264790Sbapt 49264790Sbaptint yydebug; 50264790Sbaptint yynerrs; 51264790Sbapt%% impure_vars 52264790Sbapt 53264790Sbaptint yyerrflag; 54264790Sbaptint yychar; 55264790SbaptYYSTYPE yyval; 56264790SbaptYYSTYPE yylval; 57264790Sbapt%% hdr_defs 58264790Sbapt 59264790Sbapt/* define the initial stack-sizes */ 60264790Sbapt#ifdef YYSTACKSIZE 61264790Sbapt#undef YYMAXDEPTH 62264790Sbapt#define YYMAXDEPTH YYSTACKSIZE 63264790Sbapt#else 64264790Sbapt#ifdef YYMAXDEPTH 65264790Sbapt#define YYSTACKSIZE YYMAXDEPTH 66264790Sbapt#else 67264790Sbapt#define YYSTACKSIZE 10000 68264790Sbapt#define YYMAXDEPTH 10000 69264790Sbapt#endif 70264790Sbapt#endif 71264790Sbapt 72264790Sbapt#define YYINITSTACKSIZE 200 73264790Sbapt 74264790Sbapttypedef struct { 75264790Sbapt unsigned stacksize; 76264790Sbapt YYINT *s_base; 77264790Sbapt YYINT *s_mark; 78264790Sbapt YYINT *s_last; 79264790Sbapt YYSTYPE *l_base; 80264790Sbapt YYSTYPE *l_mark; 81264790Sbapt} YYSTACKDATA; 82264790Sbapt%% hdr_vars 83264790Sbapt/* variables for the parser stack */ 84264790Sbaptstatic YYSTACKDATA yystack; 85264790Sbapt%% body_vars 86264790Sbapt int yyerrflag; 87264790Sbapt int yychar; 88264790Sbapt YYSTYPE yyval; 89264790Sbapt YYSTYPE yylval; 90264790Sbapt 91264790Sbapt /* variables for the parser stack */ 92264790Sbapt YYSTACKDATA yystack; 93264790Sbapt%% body_1 94264790Sbapt 95264790Sbapt#if YYDEBUG 96319297Sdelphij#include <stdio.h> /* needed for printf */ 97264790Sbapt#endif 98264790Sbapt 99264790Sbapt#include <stdlib.h> /* needed for malloc, etc */ 100264790Sbapt#include <string.h> /* needed for memset */ 101264790Sbapt 102264790Sbapt/* allocate initial stack or double stack size, up to YYMAXDEPTH */ 103264790Sbaptstatic int yygrowstack(YYSTACKDATA *data) 104264790Sbapt{ 105264790Sbapt int i; 106264790Sbapt unsigned newsize; 107264790Sbapt YYINT *newss; 108264790Sbapt YYSTYPE *newvs; 109264790Sbapt 110264790Sbapt if ((newsize = data->stacksize) == 0) 111264790Sbapt newsize = YYINITSTACKSIZE; 112264790Sbapt else if (newsize >= YYMAXDEPTH) 113264790Sbapt return YYENOMEM; 114264790Sbapt else if ((newsize *= 2) > YYMAXDEPTH) 115264790Sbapt newsize = YYMAXDEPTH; 116264790Sbapt 117264790Sbapt i = (int) (data->s_mark - data->s_base); 118264790Sbapt newss = (YYINT *)realloc(data->s_base, newsize * sizeof(*newss)); 119264790Sbapt if (newss == 0) 120264790Sbapt return YYENOMEM; 121264790Sbapt 122264790Sbapt data->s_base = newss; 123264790Sbapt data->s_mark = newss + i; 124264790Sbapt 125264790Sbapt newvs = (YYSTYPE *)realloc(data->l_base, newsize * sizeof(*newvs)); 126264790Sbapt if (newvs == 0) 127264790Sbapt return YYENOMEM; 128264790Sbapt 129264790Sbapt data->l_base = newvs; 130264790Sbapt data->l_mark = newvs + i; 131264790Sbapt 132264790Sbapt data->stacksize = newsize; 133264790Sbapt data->s_last = data->s_base + newsize - 1; 134264790Sbapt return 0; 135264790Sbapt} 136264790Sbapt 137264790Sbapt#if YYPURE || defined(YY_NO_LEAKS) 138264790Sbaptstatic void yyfreestack(YYSTACKDATA *data) 139264790Sbapt{ 140264790Sbapt free(data->s_base); 141264790Sbapt free(data->l_base); 142264790Sbapt memset(data, 0, sizeof(*data)); 143264790Sbapt} 144264790Sbapt#else 145264790Sbapt#define yyfreestack(data) /* nothing */ 146264790Sbapt#endif 147264790Sbapt 148264790Sbapt#define YYABORT goto yyabort 149264790Sbapt#define YYREJECT goto yyabort 150264790Sbapt#define YYACCEPT goto yyaccept 151264790Sbapt#define YYERROR goto yyerrlab 152264790Sbapt 153264790Sbaptint 154264790SbaptYYPARSE_DECL() 155264790Sbapt{ 156264790Sbapt%% body_2 157264790Sbapt int yym, yyn, yystate; 158264790Sbapt#if YYDEBUG 159264790Sbapt const char *yys; 160264790Sbapt 161264790Sbapt if ((yys = getenv("YYDEBUG")) != 0) 162264790Sbapt { 163264790Sbapt yyn = *yys; 164264790Sbapt if (yyn >= '0' && yyn <= '9') 165264790Sbapt yydebug = yyn - '0'; 166264790Sbapt } 167264790Sbapt#endif 168264790Sbapt 169319297Sdelphij%% body_3 170319297Sdelphij yym = 0; 171319297Sdelphij yyn = 0; 172264790Sbapt yynerrs = 0; 173264790Sbapt yyerrflag = 0; 174264790Sbapt yychar = YYEMPTY; 175264790Sbapt yystate = 0; 176264790Sbapt 177264790Sbapt#if YYPURE 178264790Sbapt memset(&yystack, 0, sizeof(yystack)); 179264790Sbapt#endif 180264790Sbapt 181264790Sbapt if (yystack.s_base == NULL && yygrowstack(&yystack) == YYENOMEM) goto yyoverflow; 182264790Sbapt yystack.s_mark = yystack.s_base; 183264790Sbapt yystack.l_mark = yystack.l_base; 184264790Sbapt yystate = 0; 185264790Sbapt *yystack.s_mark = 0; 186264790Sbapt 187264790Sbaptyyloop: 188264790Sbapt if ((yyn = yydefred[yystate]) != 0) goto yyreduce; 189264790Sbapt if (yychar < 0) 190264790Sbapt { 191319297Sdelphij yychar = YYLEX; 192319297Sdelphij if (yychar < 0) yychar = YYEOF; 193264790Sbapt#if YYDEBUG 194264790Sbapt if (yydebug) 195264790Sbapt { 196319297Sdelphij if ((yys = yyname[YYTRANSLATE(yychar)]) == NULL) yys = yyname[YYUNDFTOKEN]; 197264790Sbapt printf("%sdebug: state %d, reading %d (%s)\n", 198264790Sbapt YYPREFIX, yystate, yychar, yys); 199264790Sbapt } 200264790Sbapt#endif 201264790Sbapt } 202319297Sdelphij if (((yyn = yysindex[yystate]) != 0) && (yyn += yychar) >= 0 && 203319297Sdelphij yyn <= YYTABLESIZE && yycheck[yyn] == (YYINT) yychar) 204264790Sbapt { 205264790Sbapt#if YYDEBUG 206264790Sbapt if (yydebug) 207264790Sbapt printf("%sdebug: state %d, shifting to state %d\n", 208264790Sbapt YYPREFIX, yystate, yytable[yyn]); 209264790Sbapt#endif 210319297Sdelphij if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack) == YYENOMEM) goto yyoverflow; 211264790Sbapt yystate = yytable[yyn]; 212264790Sbapt *++yystack.s_mark = yytable[yyn]; 213264790Sbapt *++yystack.l_mark = yylval; 214264790Sbapt yychar = YYEMPTY; 215264790Sbapt if (yyerrflag > 0) --yyerrflag; 216264790Sbapt goto yyloop; 217264790Sbapt } 218319297Sdelphij if (((yyn = yyrindex[yystate]) != 0) && (yyn += yychar) >= 0 && 219319297Sdelphij yyn <= YYTABLESIZE && yycheck[yyn] == (YYINT) yychar) 220264790Sbapt { 221264790Sbapt yyn = yytable[yyn]; 222264790Sbapt goto yyreduce; 223264790Sbapt } 224319297Sdelphij if (yyerrflag != 0) goto yyinrecovery; 225264790Sbapt 226264790Sbapt YYERROR_CALL("syntax error"); 227264790Sbapt 228319297Sdelphij goto yyerrlab; /* redundant goto avoids 'unused label' warning */ 229264790Sbaptyyerrlab: 230264790Sbapt ++yynerrs; 231264790Sbapt 232264790Sbaptyyinrecovery: 233264790Sbapt if (yyerrflag < 3) 234264790Sbapt { 235264790Sbapt yyerrflag = 3; 236264790Sbapt for (;;) 237264790Sbapt { 238319297Sdelphij if (((yyn = yysindex[*yystack.s_mark]) != 0) && (yyn += YYERRCODE) >= 0 && 239319297Sdelphij yyn <= YYTABLESIZE && yycheck[yyn] == (YYINT) YYERRCODE) 240264790Sbapt { 241264790Sbapt#if YYDEBUG 242264790Sbapt if (yydebug) 243264790Sbapt printf("%sdebug: state %d, error recovery shifting\ 244264790Sbapt to state %d\n", YYPREFIX, *yystack.s_mark, yytable[yyn]); 245264790Sbapt#endif 246319297Sdelphij if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack) == YYENOMEM) goto yyoverflow; 247264790Sbapt yystate = yytable[yyn]; 248264790Sbapt *++yystack.s_mark = yytable[yyn]; 249264790Sbapt *++yystack.l_mark = yylval; 250264790Sbapt goto yyloop; 251264790Sbapt } 252264790Sbapt else 253264790Sbapt { 254264790Sbapt#if YYDEBUG 255264790Sbapt if (yydebug) 256264790Sbapt printf("%sdebug: error recovery discarding state %d\n", 257264790Sbapt YYPREFIX, *yystack.s_mark); 258264790Sbapt#endif 259264790Sbapt if (yystack.s_mark <= yystack.s_base) goto yyabort; 260264790Sbapt --yystack.s_mark; 261264790Sbapt --yystack.l_mark; 262264790Sbapt } 263264790Sbapt } 264264790Sbapt } 265264790Sbapt else 266264790Sbapt { 267264790Sbapt if (yychar == YYEOF) goto yyabort; 268264790Sbapt#if YYDEBUG 269264790Sbapt if (yydebug) 270264790Sbapt { 271319297Sdelphij if ((yys = yyname[YYTRANSLATE(yychar)]) == NULL) yys = yyname[YYUNDFTOKEN]; 272264790Sbapt printf("%sdebug: state %d, error recovery discards token %d (%s)\n", 273264790Sbapt YYPREFIX, yystate, yychar, yys); 274264790Sbapt } 275264790Sbapt#endif 276264790Sbapt yychar = YYEMPTY; 277264790Sbapt goto yyloop; 278264790Sbapt } 279264790Sbapt 280264790Sbaptyyreduce: 281264790Sbapt#if YYDEBUG 282264790Sbapt if (yydebug) 283264790Sbapt printf("%sdebug: state %d, reducing by rule %d (%s)\n", 284264790Sbapt YYPREFIX, yystate, yyn, yyrule[yyn]); 285264790Sbapt#endif 286264790Sbapt yym = yylen[yyn]; 287319297Sdelphij if (yym > 0) 288264790Sbapt yyval = yystack.l_mark[1-yym]; 289264790Sbapt else 290264790Sbapt memset(&yyval, 0, sizeof yyval); 291319297Sdelphij 292264790Sbapt switch (yyn) 293264790Sbapt { 294264790Sbapt%% trailer 295264790Sbapt } 296264790Sbapt yystack.s_mark -= yym; 297264790Sbapt yystate = *yystack.s_mark; 298264790Sbapt yystack.l_mark -= yym; 299264790Sbapt yym = yylhs[yyn]; 300264790Sbapt if (yystate == 0 && yym == 0) 301264790Sbapt { 302264790Sbapt#if YYDEBUG 303264790Sbapt if (yydebug) 304264790Sbapt printf("%sdebug: after reduction, shifting from state 0 to\ 305264790Sbapt state %d\n", YYPREFIX, YYFINAL); 306264790Sbapt#endif 307264790Sbapt yystate = YYFINAL; 308264790Sbapt *++yystack.s_mark = YYFINAL; 309264790Sbapt *++yystack.l_mark = yyval; 310264790Sbapt if (yychar < 0) 311264790Sbapt { 312319297Sdelphij yychar = YYLEX; 313319297Sdelphij if (yychar < 0) yychar = YYEOF; 314264790Sbapt#if YYDEBUG 315264790Sbapt if (yydebug) 316264790Sbapt { 317319297Sdelphij if ((yys = yyname[YYTRANSLATE(yychar)]) == NULL) yys = yyname[YYUNDFTOKEN]; 318264790Sbapt printf("%sdebug: state %d, reading %d (%s)\n", 319264790Sbapt YYPREFIX, YYFINAL, yychar, yys); 320264790Sbapt } 321264790Sbapt#endif 322264790Sbapt } 323264790Sbapt if (yychar == YYEOF) goto yyaccept; 324264790Sbapt goto yyloop; 325264790Sbapt } 326319297Sdelphij if (((yyn = yygindex[yym]) != 0) && (yyn += yystate) >= 0 && 327319297Sdelphij yyn <= YYTABLESIZE && yycheck[yyn] == (YYINT) yystate) 328264790Sbapt yystate = yytable[yyn]; 329264790Sbapt else 330264790Sbapt yystate = yydgoto[yym]; 331264790Sbapt#if YYDEBUG 332264790Sbapt if (yydebug) 333264790Sbapt printf("%sdebug: after reduction, shifting from state %d \ 334264790Sbaptto state %d\n", YYPREFIX, *yystack.s_mark, yystate); 335264790Sbapt#endif 336319297Sdelphij if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack) == YYENOMEM) goto yyoverflow; 337264790Sbapt *++yystack.s_mark = (YYINT) yystate; 338264790Sbapt *++yystack.l_mark = yyval; 339264790Sbapt goto yyloop; 340264790Sbapt 341264790Sbaptyyoverflow: 342264790Sbapt YYERROR_CALL("yacc stack overflow"); 343264790Sbapt 344264790Sbaptyyabort: 345264790Sbapt yyfreestack(&yystack); 346264790Sbapt return (1); 347264790Sbapt 348264790Sbaptyyaccept: 349264790Sbapt yyfreestack(&yystack); 350264790Sbapt return (0); 351264790Sbapt} 352