1264790Sbapt/* $Id: yaccpar.skel,v 1.5 2014/04/07 21:51:00 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 41264790Sbapt#if YYDEBUG 42264790Sbaptextern char *yyname[]; 43264790Sbaptextern char *yyrule[]; 44264790Sbapt#endif 45264790Sbapt%% global_vars 46264790Sbapt 47264790Sbaptint yydebug; 48264790Sbaptint yynerrs; 49264790Sbapt%% impure_vars 50264790Sbapt 51264790Sbaptint yyerrflag; 52264790Sbaptint yychar; 53264790SbaptYYSTYPE yyval; 54264790SbaptYYSTYPE yylval; 55264790Sbapt%% hdr_defs 56264790Sbapt 57264790Sbapt/* define the initial stack-sizes */ 58264790Sbapt#ifdef YYSTACKSIZE 59264790Sbapt#undef YYMAXDEPTH 60264790Sbapt#define YYMAXDEPTH YYSTACKSIZE 61264790Sbapt#else 62264790Sbapt#ifdef YYMAXDEPTH 63264790Sbapt#define YYSTACKSIZE YYMAXDEPTH 64264790Sbapt#else 65264790Sbapt#define YYSTACKSIZE 10000 66264790Sbapt#define YYMAXDEPTH 10000 67264790Sbapt#endif 68264790Sbapt#endif 69264790Sbapt 70264790Sbapt#define YYINITSTACKSIZE 200 71264790Sbapt 72264790Sbapttypedef struct { 73264790Sbapt unsigned stacksize; 74264790Sbapt YYINT *s_base; 75264790Sbapt YYINT *s_mark; 76264790Sbapt YYINT *s_last; 77264790Sbapt YYSTYPE *l_base; 78264790Sbapt YYSTYPE *l_mark; 79264790Sbapt} YYSTACKDATA; 80264790Sbapt%% hdr_vars 81264790Sbapt/* variables for the parser stack */ 82264790Sbaptstatic YYSTACKDATA yystack; 83264790Sbapt%% body_vars 84264790Sbapt int yyerrflag; 85264790Sbapt int yychar; 86264790Sbapt YYSTYPE yyval; 87264790Sbapt YYSTYPE yylval; 88264790Sbapt 89264790Sbapt /* variables for the parser stack */ 90264790Sbapt YYSTACKDATA yystack; 91264790Sbapt%% body_1 92264790Sbapt 93264790Sbapt#if YYDEBUG 94264790Sbapt#include <stdio.h> /* needed for printf */ 95264790Sbapt#endif 96264790Sbapt 97264790Sbapt#include <stdlib.h> /* needed for malloc, etc */ 98264790Sbapt#include <string.h> /* needed for memset */ 99264790Sbapt 100264790Sbapt/* allocate initial stack or double stack size, up to YYMAXDEPTH */ 101264790Sbaptstatic int yygrowstack(YYSTACKDATA *data) 102264790Sbapt{ 103264790Sbapt int i; 104264790Sbapt unsigned newsize; 105264790Sbapt YYINT *newss; 106264790Sbapt YYSTYPE *newvs; 107264790Sbapt 108264790Sbapt if ((newsize = data->stacksize) == 0) 109264790Sbapt newsize = YYINITSTACKSIZE; 110264790Sbapt else if (newsize >= YYMAXDEPTH) 111264790Sbapt return YYENOMEM; 112264790Sbapt else if ((newsize *= 2) > YYMAXDEPTH) 113264790Sbapt newsize = YYMAXDEPTH; 114264790Sbapt 115264790Sbapt i = (int) (data->s_mark - data->s_base); 116264790Sbapt newss = (YYINT *)realloc(data->s_base, newsize * sizeof(*newss)); 117264790Sbapt if (newss == 0) 118264790Sbapt return YYENOMEM; 119264790Sbapt 120264790Sbapt data->s_base = newss; 121264790Sbapt data->s_mark = newss + i; 122264790Sbapt 123264790Sbapt newvs = (YYSTYPE *)realloc(data->l_base, newsize * sizeof(*newvs)); 124264790Sbapt if (newvs == 0) 125264790Sbapt return YYENOMEM; 126264790Sbapt 127264790Sbapt data->l_base = newvs; 128264790Sbapt data->l_mark = newvs + i; 129264790Sbapt 130264790Sbapt data->stacksize = newsize; 131264790Sbapt data->s_last = data->s_base + newsize - 1; 132264790Sbapt return 0; 133264790Sbapt} 134264790Sbapt 135264790Sbapt#if YYPURE || defined(YY_NO_LEAKS) 136264790Sbaptstatic void yyfreestack(YYSTACKDATA *data) 137264790Sbapt{ 138264790Sbapt free(data->s_base); 139264790Sbapt free(data->l_base); 140264790Sbapt memset(data, 0, sizeof(*data)); 141264790Sbapt} 142264790Sbapt#else 143264790Sbapt#define yyfreestack(data) /* nothing */ 144264790Sbapt#endif 145264790Sbapt 146264790Sbapt#define YYABORT goto yyabort 147264790Sbapt#define YYREJECT goto yyabort 148264790Sbapt#define YYACCEPT goto yyaccept 149264790Sbapt#define YYERROR goto yyerrlab 150264790Sbapt 151264790Sbaptint 152264790SbaptYYPARSE_DECL() 153264790Sbapt{ 154264790Sbapt%% body_2 155264790Sbapt int yym, yyn, yystate; 156264790Sbapt#if YYDEBUG 157264790Sbapt const char *yys; 158264790Sbapt 159264790Sbapt if ((yys = getenv("YYDEBUG")) != 0) 160264790Sbapt { 161264790Sbapt yyn = *yys; 162264790Sbapt if (yyn >= '0' && yyn <= '9') 163264790Sbapt yydebug = yyn - '0'; 164264790Sbapt } 165264790Sbapt#endif 166264790Sbapt 167264790Sbapt yynerrs = 0; 168264790Sbapt yyerrflag = 0; 169264790Sbapt yychar = YYEMPTY; 170264790Sbapt yystate = 0; 171264790Sbapt 172264790Sbapt#if YYPURE 173264790Sbapt memset(&yystack, 0, sizeof(yystack)); 174264790Sbapt#endif 175264790Sbapt 176264790Sbapt if (yystack.s_base == NULL && yygrowstack(&yystack) == YYENOMEM) goto yyoverflow; 177264790Sbapt yystack.s_mark = yystack.s_base; 178264790Sbapt yystack.l_mark = yystack.l_base; 179264790Sbapt yystate = 0; 180264790Sbapt *yystack.s_mark = 0; 181264790Sbapt 182264790Sbaptyyloop: 183264790Sbapt if ((yyn = yydefred[yystate]) != 0) goto yyreduce; 184264790Sbapt if (yychar < 0) 185264790Sbapt { 186264790Sbapt if ((yychar = YYLEX) < 0) yychar = YYEOF; 187264790Sbapt#if YYDEBUG 188264790Sbapt if (yydebug) 189264790Sbapt { 190264790Sbapt yys = yyname[YYTRANSLATE(yychar)]; 191264790Sbapt printf("%sdebug: state %d, reading %d (%s)\n", 192264790Sbapt YYPREFIX, yystate, yychar, yys); 193264790Sbapt } 194264790Sbapt#endif 195264790Sbapt } 196264790Sbapt if ((yyn = yysindex[yystate]) && (yyn += yychar) >= 0 && 197264790Sbapt yyn <= YYTABLESIZE && yycheck[yyn] == yychar) 198264790Sbapt { 199264790Sbapt#if YYDEBUG 200264790Sbapt if (yydebug) 201264790Sbapt printf("%sdebug: state %d, shifting to state %d\n", 202264790Sbapt YYPREFIX, yystate, yytable[yyn]); 203264790Sbapt#endif 204264790Sbapt if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack) == YYENOMEM) 205264790Sbapt { 206264790Sbapt goto yyoverflow; 207264790Sbapt } 208264790Sbapt yystate = yytable[yyn]; 209264790Sbapt *++yystack.s_mark = yytable[yyn]; 210264790Sbapt *++yystack.l_mark = yylval; 211264790Sbapt yychar = YYEMPTY; 212264790Sbapt if (yyerrflag > 0) --yyerrflag; 213264790Sbapt goto yyloop; 214264790Sbapt } 215264790Sbapt if ((yyn = yyrindex[yystate]) && (yyn += yychar) >= 0 && 216264790Sbapt yyn <= YYTABLESIZE && yycheck[yyn] == yychar) 217264790Sbapt { 218264790Sbapt yyn = yytable[yyn]; 219264790Sbapt goto yyreduce; 220264790Sbapt } 221264790Sbapt if (yyerrflag) goto yyinrecovery; 222264790Sbapt 223264790Sbapt YYERROR_CALL("syntax error"); 224264790Sbapt 225264790Sbapt goto yyerrlab; 226264790Sbapt 227264790Sbaptyyerrlab: 228264790Sbapt ++yynerrs; 229264790Sbapt 230264790Sbaptyyinrecovery: 231264790Sbapt if (yyerrflag < 3) 232264790Sbapt { 233264790Sbapt yyerrflag = 3; 234264790Sbapt for (;;) 235264790Sbapt { 236264790Sbapt if ((yyn = yysindex[*yystack.s_mark]) && (yyn += YYERRCODE) >= 0 && 237264790Sbapt yyn <= YYTABLESIZE && yycheck[yyn] == YYERRCODE) 238264790Sbapt { 239264790Sbapt#if YYDEBUG 240264790Sbapt if (yydebug) 241264790Sbapt printf("%sdebug: state %d, error recovery shifting\ 242264790Sbapt to state %d\n", YYPREFIX, *yystack.s_mark, yytable[yyn]); 243264790Sbapt#endif 244264790Sbapt if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack) == YYENOMEM) 245264790Sbapt { 246264790Sbapt goto yyoverflow; 247264790Sbapt } 248264790Sbapt yystate = yytable[yyn]; 249264790Sbapt *++yystack.s_mark = yytable[yyn]; 250264790Sbapt *++yystack.l_mark = yylval; 251264790Sbapt goto yyloop; 252264790Sbapt } 253264790Sbapt else 254264790Sbapt { 255264790Sbapt#if YYDEBUG 256264790Sbapt if (yydebug) 257264790Sbapt printf("%sdebug: error recovery discarding state %d\n", 258264790Sbapt YYPREFIX, *yystack.s_mark); 259264790Sbapt#endif 260264790Sbapt if (yystack.s_mark <= yystack.s_base) goto yyabort; 261264790Sbapt --yystack.s_mark; 262264790Sbapt --yystack.l_mark; 263264790Sbapt } 264264790Sbapt } 265264790Sbapt } 266264790Sbapt else 267264790Sbapt { 268264790Sbapt if (yychar == YYEOF) goto yyabort; 269264790Sbapt#if YYDEBUG 270264790Sbapt if (yydebug) 271264790Sbapt { 272264790Sbapt yys = yyname[YYTRANSLATE(yychar)]; 273264790Sbapt printf("%sdebug: state %d, error recovery discards token %d (%s)\n", 274264790Sbapt YYPREFIX, yystate, yychar, yys); 275264790Sbapt } 276264790Sbapt#endif 277264790Sbapt yychar = YYEMPTY; 278264790Sbapt goto yyloop; 279264790Sbapt } 280264790Sbapt 281264790Sbaptyyreduce: 282264790Sbapt#if YYDEBUG 283264790Sbapt if (yydebug) 284264790Sbapt printf("%sdebug: state %d, reducing by rule %d (%s)\n", 285264790Sbapt YYPREFIX, yystate, yyn, yyrule[yyn]); 286264790Sbapt#endif 287264790Sbapt yym = yylen[yyn]; 288264790Sbapt if (yym) 289264790Sbapt yyval = yystack.l_mark[1-yym]; 290264790Sbapt else 291264790Sbapt memset(&yyval, 0, sizeof yyval); 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 { 312264790Sbapt if ((yychar = YYLEX) < 0) yychar = YYEOF; 313264790Sbapt#if YYDEBUG 314264790Sbapt if (yydebug) 315264790Sbapt { 316264790Sbapt yys = yyname[YYTRANSLATE(yychar)]; 317264790Sbapt printf("%sdebug: state %d, reading %d (%s)\n", 318264790Sbapt YYPREFIX, YYFINAL, yychar, yys); 319264790Sbapt } 320264790Sbapt#endif 321264790Sbapt } 322264790Sbapt if (yychar == YYEOF) goto yyaccept; 323264790Sbapt goto yyloop; 324264790Sbapt } 325264790Sbapt if ((yyn = yygindex[yym]) && (yyn += yystate) >= 0 && 326264790Sbapt yyn <= YYTABLESIZE && yycheck[yyn] == yystate) 327264790Sbapt yystate = yytable[yyn]; 328264790Sbapt else 329264790Sbapt yystate = yydgoto[yym]; 330264790Sbapt#if YYDEBUG 331264790Sbapt if (yydebug) 332264790Sbapt printf("%sdebug: after reduction, shifting from state %d \ 333264790Sbaptto state %d\n", YYPREFIX, *yystack.s_mark, yystate); 334264790Sbapt#endif 335264790Sbapt if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack) == YYENOMEM) 336264790Sbapt { 337264790Sbapt goto yyoverflow; 338264790Sbapt } 339264790Sbapt *++yystack.s_mark = (YYINT) yystate; 340264790Sbapt *++yystack.l_mark = yyval; 341264790Sbapt goto yyloop; 342264790Sbapt 343264790Sbaptyyoverflow: 344264790Sbapt YYERROR_CALL("yacc stack overflow"); 345264790Sbapt 346264790Sbaptyyabort: 347264790Sbapt yyfreestack(&yystack); 348264790Sbapt return (1); 349264790Sbapt 350264790Sbaptyyaccept: 351264790Sbapt yyfreestack(&yystack); 352264790Sbapt return (0); 353264790Sbapt} 354