1 1.4 christos /* $NetBSD: calc2.tab.c,v 1.6 2026/01/18 16:41:30 christos Exp $ */ 2 1.1 christos 3 1.1 christos /* original parser id follows */ 4 1.1 christos /* yysccsid[] = "@(#)yaccpar 1.9 (Berkeley) 02/21/93" */ 5 1.1 christos /* (use YYMAJOR/YYMINOR for ifdefs dependent on parser version) */ 6 1.1 christos 7 1.1 christos #define YYBYACC 1 8 1.4 christos #define YYMAJOR 2 9 1.4 christos #define YYMINOR 0 10 1.1 christos #define YYCHECK "yyyymmdd" 11 1.1 christos 12 1.1 christos #define YYEMPTY (-1) 13 1.1 christos #define yyclearin (yychar = YYEMPTY) 14 1.1 christos #define yyerrok (yyerrflag = 0) 15 1.1 christos #define YYRECOVERING() (yyerrflag != 0) 16 1.1 christos #define YYENOMEM (-2) 17 1.1 christos #define YYEOF 0 18 1.1 christos 19 1.1 christos #ifndef yyparse 20 1.1 christos #define yyparse calc2_parse 21 1.1 christos #endif /* yyparse */ 22 1.1 christos 23 1.1 christos #ifndef yylex 24 1.1 christos #define yylex calc2_lex 25 1.1 christos #endif /* yylex */ 26 1.1 christos 27 1.1 christos #ifndef yyerror 28 1.1 christos #define yyerror calc2_error 29 1.1 christos #endif /* yyerror */ 30 1.1 christos 31 1.1 christos #ifndef yychar 32 1.1 christos #define yychar calc2_char 33 1.1 christos #endif /* yychar */ 34 1.1 christos 35 1.1 christos #ifndef yyval 36 1.1 christos #define yyval calc2_val 37 1.1 christos #endif /* yyval */ 38 1.1 christos 39 1.1 christos #ifndef yylval 40 1.1 christos #define yylval calc2_lval 41 1.1 christos #endif /* yylval */ 42 1.1 christos 43 1.1 christos #ifndef yydebug 44 1.1 christos #define yydebug calc2_debug 45 1.1 christos #endif /* yydebug */ 46 1.1 christos 47 1.1 christos #ifndef yynerrs 48 1.1 christos #define yynerrs calc2_nerrs 49 1.1 christos #endif /* yynerrs */ 50 1.1 christos 51 1.1 christos #ifndef yyerrflag 52 1.1 christos #define yyerrflag calc2_errflag 53 1.1 christos #endif /* yyerrflag */ 54 1.1 christos 55 1.1 christos #ifndef yylhs 56 1.1 christos #define yylhs calc2_lhs 57 1.1 christos #endif /* yylhs */ 58 1.1 christos 59 1.1 christos #ifndef yylen 60 1.1 christos #define yylen calc2_len 61 1.1 christos #endif /* yylen */ 62 1.1 christos 63 1.1 christos #ifndef yydefred 64 1.1 christos #define yydefred calc2_defred 65 1.1 christos #endif /* yydefred */ 66 1.1 christos 67 1.1 christos #ifndef yydgoto 68 1.1 christos #define yydgoto calc2_dgoto 69 1.1 christos #endif /* yydgoto */ 70 1.1 christos 71 1.1 christos #ifndef yysindex 72 1.1 christos #define yysindex calc2_sindex 73 1.1 christos #endif /* yysindex */ 74 1.1 christos 75 1.1 christos #ifndef yyrindex 76 1.1 christos #define yyrindex calc2_rindex 77 1.1 christos #endif /* yyrindex */ 78 1.1 christos 79 1.1 christos #ifndef yygindex 80 1.1 christos #define yygindex calc2_gindex 81 1.1 christos #endif /* yygindex */ 82 1.1 christos 83 1.1 christos #ifndef yytable 84 1.1 christos #define yytable calc2_table 85 1.1 christos #endif /* yytable */ 86 1.1 christos 87 1.1 christos #ifndef yycheck 88 1.1 christos #define yycheck calc2_check 89 1.1 christos #endif /* yycheck */ 90 1.1 christos 91 1.1 christos #ifndef yyname 92 1.1 christos #define yyname calc2_name 93 1.1 christos #endif /* yyname */ 94 1.1 christos 95 1.1 christos #ifndef yyrule 96 1.1 christos #define yyrule calc2_rule 97 1.1 christos #endif /* yyrule */ 98 1.1 christos #define YYPREFIX "calc2_" 99 1.1 christos 100 1.1 christos #define YYPURE 0 101 1.1 christos 102 1.1 christos #line 7 "calc2.y" 103 1.1 christos # include <stdio.h> 104 1.1 christos # include <ctype.h> 105 1.1 christos 106 1.1 christos #ifdef YYBISON 107 1.1 christos #define YYLEX_PARAM base 108 1.1 christos #define YYLEX_DECL() yylex(int *YYLEX_PARAM) 109 1.1 christos #define YYERROR_DECL() yyerror(int regs[26], int *base, const char *s) 110 1.1 christos int YYLEX_DECL(); 111 1.1 christos static void YYERROR_DECL(); 112 1.1 christos #endif 113 1.1 christos 114 1.1 christos #line 113 "calc2.tab.c" 115 1.1 christos 116 1.1 christos #if ! defined(YYSTYPE) && ! defined(YYSTYPE_IS_DECLARED) 117 1.1 christos /* Default: YYSTYPE is the semantic value type. */ 118 1.1 christos typedef int YYSTYPE; 119 1.1 christos # define YYSTYPE_IS_DECLARED 1 120 1.1 christos #endif 121 1.1 christos 122 1.1 christos /* compatibility with bison */ 123 1.1 christos #ifdef YYPARSE_PARAM 124 1.1 christos /* compatibility with FreeBSD */ 125 1.1 christos # ifdef YYPARSE_PARAM_TYPE 126 1.1 christos # define YYPARSE_DECL() yyparse(YYPARSE_PARAM_TYPE YYPARSE_PARAM) 127 1.1 christos # else 128 1.1 christos # define YYPARSE_DECL() yyparse(void *YYPARSE_PARAM) 129 1.1 christos # endif 130 1.1 christos #else 131 1.1 christos # define YYPARSE_DECL() yyparse(int regs[26], int *base) 132 1.1 christos #endif 133 1.1 christos 134 1.1 christos /* Parameters sent to lex. */ 135 1.1 christos #ifdef YYLEX_PARAM 136 1.1 christos # define YYLEX_DECL() yylex(void *YYLEX_PARAM) 137 1.1 christos # define YYLEX yylex(YYLEX_PARAM) 138 1.1 christos #else 139 1.1 christos # define YYLEX_DECL() yylex(int *base) 140 1.1 christos # define YYLEX yylex(base) 141 1.1 christos #endif 142 1.1 christos 143 1.1 christos /* Parameters sent to yyerror. */ 144 1.1 christos #ifndef YYERROR_DECL 145 1.1 christos #define YYERROR_DECL() yyerror(int regs[26], int *base, const char *s) 146 1.1 christos #endif 147 1.1 christos #ifndef YYERROR_CALL 148 1.1 christos #define YYERROR_CALL(msg) yyerror(regs, base, msg) 149 1.1 christos #endif 150 1.1 christos 151 1.1 christos extern int YYPARSE_DECL(); 152 1.1 christos 153 1.1 christos #define DIGIT 257 154 1.1 christos #define LETTER 258 155 1.1 christos #define UMINUS 259 156 1.1 christos #define YYERRCODE 256 157 1.5 christos typedef int YYINT; 158 1.1 christos static const YYINT calc2_lhs[] = { -1, 159 1.1 christos 0, 0, 0, 1, 1, 2, 2, 2, 2, 2, 160 1.1 christos 2, 2, 2, 2, 2, 2, 3, 3, 161 1.1 christos }; 162 1.1 christos static const YYINT calc2_len[] = { 2, 163 1.1 christos 0, 3, 3, 1, 3, 3, 3, 3, 3, 3, 164 1.1 christos 3, 3, 3, 2, 1, 1, 1, 2, 165 1.1 christos }; 166 1.1 christos static const YYINT calc2_defred[] = { 1, 167 1.1 christos 0, 0, 17, 0, 0, 0, 0, 0, 0, 3, 168 1.1 christos 0, 15, 14, 0, 2, 0, 0, 0, 0, 0, 169 1.1 christos 0, 0, 18, 0, 6, 0, 0, 0, 0, 9, 170 1.1 christos 10, 11, 171 1.1 christos }; 172 1.1 christos static const YYINT calc2_dgoto[] = { 1, 173 1.1 christos 7, 8, 9, 174 1.1 christos }; 175 1.1 christos static const YYINT calc2_sindex[] = { 0, 176 1.1 christos -40, -7, 0, -55, -38, -38, 1, -29, -247, 0, 177 1.1 christos -38, 0, 0, 22, 0, -38, -38, -38, -38, -38, 178 1.1 christos -38, -38, 0, -29, 0, 51, 60, -20, -20, 0, 179 1.1 christos 0, 0, 180 1.1 christos }; 181 1.1 christos static const YYINT calc2_rindex[] = { 0, 182 1.1 christos 0, 0, 0, 2, 0, 0, 0, 9, -9, 0, 183 1.1 christos 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 184 1.1 christos 0, 0, 0, 10, 0, -6, 14, 5, 13, 0, 185 1.1 christos 0, 0, 186 1.1 christos }; 187 1.1 christos static const YYINT calc2_gindex[] = { 0, 188 1.1 christos 0, 65, 0, 189 1.1 christos }; 190 1.1 christos #define YYTABLESIZE 220 191 1.1 christos static const YYINT calc2_table[] = { 6, 192 1.1 christos 16, 6, 10, 13, 5, 11, 5, 22, 17, 23, 193 1.1 christos 15, 15, 20, 18, 7, 19, 22, 21, 4, 5, 194 1.1 christos 0, 20, 8, 12, 0, 0, 21, 16, 16, 0, 195 1.1 christos 0, 16, 16, 16, 13, 16, 0, 16, 15, 15, 196 1.1 christos 0, 0, 7, 15, 15, 7, 15, 7, 15, 7, 197 1.1 christos 8, 12, 0, 8, 12, 8, 0, 8, 22, 17, 198 1.1 christos 0, 0, 25, 20, 18, 0, 19, 0, 21, 13, 199 1.1 christos 14, 0, 0, 0, 0, 24, 0, 0, 0, 0, 200 1.1 christos 26, 27, 28, 29, 30, 31, 32, 22, 17, 0, 201 1.1 christos 0, 0, 20, 18, 16, 19, 22, 21, 0, 0, 202 1.1 christos 0, 20, 18, 0, 19, 0, 21, 0, 0, 0, 203 1.1 christos 0, 0, 0, 0, 16, 0, 0, 13, 0, 0, 204 1.1 christos 0, 0, 0, 0, 0, 15, 0, 0, 7, 0, 205 1.1 christos 0, 0, 0, 0, 0, 0, 8, 12, 0, 0, 206 1.1 christos 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 207 1.1 christos 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 208 1.1 christos 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 209 1.1 christos 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 210 1.1 christos 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 211 1.1 christos 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 212 1.1 christos 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 213 1.1 christos 0, 0, 0, 0, 0, 2, 3, 4, 3, 12, 214 1.1 christos }; 215 1.1 christos static const YYINT calc2_check[] = { 40, 216 1.1 christos 10, 40, 10, 10, 45, 61, 45, 37, 38, 257, 217 1.1 christos 10, 10, 42, 43, 10, 45, 37, 47, 10, 10, 218 1.1 christos -1, 42, 10, 10, -1, -1, 47, 37, 38, -1, 219 1.1 christos -1, 41, 42, 43, 41, 45, -1, 47, 37, 38, 220 1.1 christos -1, -1, 38, 42, 43, 41, 45, 43, 47, 45, 221 1.1 christos 38, 38, -1, 41, 41, 43, -1, 45, 37, 38, 222 1.1 christos -1, -1, 41, 42, 43, -1, 45, -1, 47, 5, 223 1.1 christos 6, -1, -1, -1, -1, 11, -1, -1, -1, -1, 224 1.1 christos 16, 17, 18, 19, 20, 21, 22, 37, 38, -1, 225 1.1 christos -1, -1, 42, 43, 124, 45, 37, 47, -1, -1, 226 1.1 christos -1, 42, 43, -1, 45, -1, 47, -1, -1, -1, 227 1.1 christos -1, -1, -1, -1, 124, -1, -1, 124, -1, -1, 228 1.1 christos -1, -1, -1, -1, -1, 124, -1, -1, 124, -1, 229 1.1 christos -1, -1, -1, -1, -1, -1, 124, 124, -1, -1, 230 1.1 christos -1, -1, -1, -1, -1, 124, -1, -1, -1, -1, 231 1.1 christos -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 232 1.1 christos -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 233 1.1 christos -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 234 1.1 christos -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 235 1.1 christos -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 236 1.1 christos -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 237 1.1 christos -1, -1, -1, -1, -1, 256, 257, 258, 257, 258, 238 1.1 christos }; 239 1.1 christos #define YYFINAL 1 240 1.1 christos #ifndef YYDEBUG 241 1.1 christos #define YYDEBUG 0 242 1.1 christos #endif 243 1.1 christos #define YYMAXTOKEN 259 244 1.1 christos #define YYUNDFTOKEN 265 245 1.1 christos #define YYTRANSLATE(a) ((a) > YYMAXTOKEN ? YYUNDFTOKEN : (a)) 246 1.1 christos #if YYDEBUG 247 1.6 christos #ifndef NULL 248 1.6 christos #define NULL (void*)0 249 1.6 christos #endif 250 1.1 christos static const char *const calc2_name[] = { 251 1.1 christos 252 1.6 christos "end-of-file",NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,"'\\n'",NULL,NULL, 253 1.6 christos NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, 254 1.6 christos NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,"'%'","'&'",NULL,"'('","')'","'*'", 255 1.6 christos "'+'",NULL,"'-'",NULL,"'/'",NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, 256 1.6 christos NULL,NULL,NULL,"'='",NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, 257 1.6 christos NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, 258 1.6 christos NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, 259 1.6 christos NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, 260 1.6 christos NULL,NULL,NULL,"'|'",NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, 261 1.6 christos NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, 262 1.6 christos NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, 263 1.6 christos NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, 264 1.6 christos NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, 265 1.6 christos NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, 266 1.6 christos NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, 267 1.6 christos NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, 268 1.6 christos NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,"DIGIT","LETTER","UMINUS",NULL, 269 1.6 christos NULL,NULL,NULL,NULL,"illegal-symbol", 270 1.1 christos }; 271 1.1 christos static const char *const calc2_rule[] = { 272 1.1 christos "$accept : list", 273 1.1 christos "list :", 274 1.1 christos "list : list stat '\\n'", 275 1.1 christos "list : list error '\\n'", 276 1.1 christos "stat : expr", 277 1.1 christos "stat : LETTER '=' expr", 278 1.1 christos "expr : '(' expr ')'", 279 1.1 christos "expr : expr '+' expr", 280 1.1 christos "expr : expr '-' expr", 281 1.1 christos "expr : expr '*' expr", 282 1.1 christos "expr : expr '/' expr", 283 1.1 christos "expr : expr '%' expr", 284 1.1 christos "expr : expr '&' expr", 285 1.1 christos "expr : expr '|' expr", 286 1.1 christos "expr : '-' expr", 287 1.1 christos "expr : LETTER", 288 1.1 christos "expr : number", 289 1.1 christos "number : DIGIT", 290 1.1 christos "number : number DIGIT", 291 1.1 christos 292 1.1 christos }; 293 1.1 christos #endif 294 1.1 christos 295 1.3 christos #if YYDEBUG 296 1.1 christos int yydebug; 297 1.3 christos #endif 298 1.1 christos 299 1.1 christos int yyerrflag; 300 1.1 christos int yychar; 301 1.1 christos YYSTYPE yyval; 302 1.1 christos YYSTYPE yylval; 303 1.3 christos int yynerrs; 304 1.1 christos 305 1.1 christos /* define the initial stack-sizes */ 306 1.1 christos #ifdef YYSTACKSIZE 307 1.1 christos #undef YYMAXDEPTH 308 1.1 christos #define YYMAXDEPTH YYSTACKSIZE 309 1.1 christos #else 310 1.1 christos #ifdef YYMAXDEPTH 311 1.1 christos #define YYSTACKSIZE YYMAXDEPTH 312 1.1 christos #else 313 1.1 christos #define YYSTACKSIZE 10000 314 1.1 christos #define YYMAXDEPTH 10000 315 1.1 christos #endif 316 1.1 christos #endif 317 1.1 christos 318 1.1 christos #define YYINITSTACKSIZE 200 319 1.1 christos 320 1.1 christos typedef struct { 321 1.1 christos unsigned stacksize; 322 1.1 christos YYINT *s_base; 323 1.1 christos YYINT *s_mark; 324 1.1 christos YYINT *s_last; 325 1.1 christos YYSTYPE *l_base; 326 1.1 christos YYSTYPE *l_mark; 327 1.1 christos } YYSTACKDATA; 328 1.1 christos /* variables for the parser stack */ 329 1.1 christos static YYSTACKDATA yystack; 330 1.1 christos #line 73 "calc2.y" 331 1.1 christos /* start of programs */ 332 1.1 christos 333 1.1 christos #ifdef YYBYACC 334 1.1 christos extern int YYLEX_DECL(); 335 1.1 christos #endif 336 1.1 christos 337 1.1 christos int 338 1.1 christos main (void) 339 1.1 christos { 340 1.1 christos int regs[26]; 341 1.1 christos int base = 10; 342 1.1 christos 343 1.1 christos while(!feof(stdin)) { 344 1.1 christos yyparse(regs, &base); 345 1.1 christos } 346 1.1 christos return 0; 347 1.1 christos } 348 1.1 christos 349 1.1 christos #define UNUSED(x) ((void)(x)) 350 1.1 christos 351 1.1 christos static void 352 1.1 christos YYERROR_DECL() 353 1.1 christos { 354 1.1 christos UNUSED(regs); /* %parse-param regs is not actually used here */ 355 1.1 christos UNUSED(base); /* %parse-param base is not actually used here */ 356 1.1 christos fprintf(stderr, "%s\n", s); 357 1.1 christos } 358 1.1 christos 359 1.1 christos int 360 1.1 christos YYLEX_DECL() 361 1.1 christos { 362 1.1 christos /* lexical analysis routine */ 363 1.1 christos /* returns LETTER for a lower case letter, yylval = 0 through 25 */ 364 1.1 christos /* return DIGIT for a digit, yylval = 0 through 9 */ 365 1.1 christos /* all other characters are returned immediately */ 366 1.1 christos 367 1.1 christos int c; 368 1.1 christos 369 1.1 christos while( (c=getchar()) == ' ' ) { /* skip blanks */ } 370 1.1 christos 371 1.1 christos /* c is now nonblank */ 372 1.1 christos 373 1.1 christos if( islower( c )) { 374 1.1 christos yylval = c - 'a'; 375 1.1 christos return ( LETTER ); 376 1.1 christos } 377 1.1 christos if( isdigit( c )) { 378 1.1 christos yylval = (c - '0') % (*base); 379 1.1 christos return ( DIGIT ); 380 1.1 christos } 381 1.1 christos return( c ); 382 1.1 christos } 383 1.6 christos #line 382 "calc2.tab.c" 384 1.1 christos 385 1.1 christos #if YYDEBUG 386 1.2 christos #include <stdio.h> /* needed for printf */ 387 1.1 christos #endif 388 1.1 christos 389 1.1 christos #include <stdlib.h> /* needed for malloc, etc */ 390 1.1 christos #include <string.h> /* needed for memset */ 391 1.1 christos 392 1.1 christos /* allocate initial stack or double stack size, up to YYMAXDEPTH */ 393 1.1 christos static int yygrowstack(YYSTACKDATA *data) 394 1.1 christos { 395 1.1 christos int i; 396 1.1 christos unsigned newsize; 397 1.1 christos YYINT *newss; 398 1.1 christos YYSTYPE *newvs; 399 1.1 christos 400 1.1 christos if ((newsize = data->stacksize) == 0) 401 1.1 christos newsize = YYINITSTACKSIZE; 402 1.1 christos else if (newsize >= YYMAXDEPTH) 403 1.1 christos return YYENOMEM; 404 1.1 christos else if ((newsize *= 2) > YYMAXDEPTH) 405 1.1 christos newsize = YYMAXDEPTH; 406 1.1 christos 407 1.1 christos i = (int) (data->s_mark - data->s_base); 408 1.1 christos newss = (YYINT *)realloc(data->s_base, newsize * sizeof(*newss)); 409 1.6 christos if (newss == NULL) 410 1.1 christos return YYENOMEM; 411 1.1 christos 412 1.1 christos data->s_base = newss; 413 1.1 christos data->s_mark = newss + i; 414 1.1 christos 415 1.1 christos newvs = (YYSTYPE *)realloc(data->l_base, newsize * sizeof(*newvs)); 416 1.6 christos if (newvs == NULL) 417 1.1 christos return YYENOMEM; 418 1.1 christos 419 1.1 christos data->l_base = newvs; 420 1.1 christos data->l_mark = newvs + i; 421 1.1 christos 422 1.1 christos data->stacksize = newsize; 423 1.1 christos data->s_last = data->s_base + newsize - 1; 424 1.1 christos return 0; 425 1.1 christos } 426 1.1 christos 427 1.1 christos #if YYPURE || defined(YY_NO_LEAKS) 428 1.1 christos static void yyfreestack(YYSTACKDATA *data) 429 1.1 christos { 430 1.1 christos free(data->s_base); 431 1.1 christos free(data->l_base); 432 1.1 christos memset(data, 0, sizeof(*data)); 433 1.1 christos } 434 1.1 christos #else 435 1.1 christos #define yyfreestack(data) /* nothing */ 436 1.1 christos #endif 437 1.1 christos 438 1.1 christos #define YYABORT goto yyabort 439 1.1 christos #define YYREJECT goto yyabort 440 1.1 christos #define YYACCEPT goto yyaccept 441 1.1 christos #define YYERROR goto yyerrlab 442 1.1 christos 443 1.1 christos int 444 1.1 christos YYPARSE_DECL() 445 1.1 christos { 446 1.1 christos int yym, yyn, yystate; 447 1.1 christos #if YYDEBUG 448 1.1 christos const char *yys; 449 1.1 christos 450 1.6 christos if ((yys = getenv("YYDEBUG")) != NULL) 451 1.1 christos { 452 1.1 christos yyn = *yys; 453 1.1 christos if (yyn >= '0' && yyn <= '9') 454 1.1 christos yydebug = yyn - '0'; 455 1.1 christos } 456 1.1 christos #endif 457 1.1 christos 458 1.5 christos /* yym is set below */ 459 1.5 christos /* yyn is set below */ 460 1.1 christos yynerrs = 0; 461 1.1 christos yyerrflag = 0; 462 1.1 christos yychar = YYEMPTY; 463 1.1 christos yystate = 0; 464 1.1 christos 465 1.1 christos #if YYPURE 466 1.1 christos memset(&yystack, 0, sizeof(yystack)); 467 1.1 christos #endif 468 1.1 christos 469 1.1 christos if (yystack.s_base == NULL && yygrowstack(&yystack) == YYENOMEM) goto yyoverflow; 470 1.1 christos yystack.s_mark = yystack.s_base; 471 1.1 christos yystack.l_mark = yystack.l_base; 472 1.1 christos yystate = 0; 473 1.1 christos *yystack.s_mark = 0; 474 1.1 christos 475 1.1 christos yyloop: 476 1.1 christos if ((yyn = yydefred[yystate]) != 0) goto yyreduce; 477 1.1 christos if (yychar < 0) 478 1.1 christos { 479 1.2 christos yychar = YYLEX; 480 1.2 christos if (yychar < 0) yychar = YYEOF; 481 1.1 christos #if YYDEBUG 482 1.1 christos if (yydebug) 483 1.1 christos { 484 1.2 christos if ((yys = yyname[YYTRANSLATE(yychar)]) == NULL) yys = yyname[YYUNDFTOKEN]; 485 1.1 christos printf("%sdebug: state %d, reading %d (%s)\n", 486 1.1 christos YYPREFIX, yystate, yychar, yys); 487 1.1 christos } 488 1.1 christos #endif 489 1.1 christos } 490 1.2 christos if (((yyn = yysindex[yystate]) != 0) && (yyn += yychar) >= 0 && 491 1.2 christos yyn <= YYTABLESIZE && yycheck[yyn] == (YYINT) yychar) 492 1.1 christos { 493 1.1 christos #if YYDEBUG 494 1.1 christos if (yydebug) 495 1.1 christos printf("%sdebug: state %d, shifting to state %d\n", 496 1.1 christos YYPREFIX, yystate, yytable[yyn]); 497 1.1 christos #endif 498 1.2 christos if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack) == YYENOMEM) goto yyoverflow; 499 1.1 christos yystate = yytable[yyn]; 500 1.1 christos *++yystack.s_mark = yytable[yyn]; 501 1.1 christos *++yystack.l_mark = yylval; 502 1.1 christos yychar = YYEMPTY; 503 1.1 christos if (yyerrflag > 0) --yyerrflag; 504 1.1 christos goto yyloop; 505 1.1 christos } 506 1.2 christos if (((yyn = yyrindex[yystate]) != 0) && (yyn += yychar) >= 0 && 507 1.2 christos yyn <= YYTABLESIZE && yycheck[yyn] == (YYINT) yychar) 508 1.1 christos { 509 1.1 christos yyn = yytable[yyn]; 510 1.1 christos goto yyreduce; 511 1.1 christos } 512 1.2 christos if (yyerrflag != 0) goto yyinrecovery; 513 1.1 christos 514 1.1 christos YYERROR_CALL("syntax error"); 515 1.1 christos 516 1.2 christos goto yyerrlab; /* redundant goto avoids 'unused label' warning */ 517 1.1 christos yyerrlab: 518 1.1 christos ++yynerrs; 519 1.1 christos 520 1.1 christos yyinrecovery: 521 1.1 christos if (yyerrflag < 3) 522 1.1 christos { 523 1.1 christos yyerrflag = 3; 524 1.1 christos for (;;) 525 1.1 christos { 526 1.2 christos if (((yyn = yysindex[*yystack.s_mark]) != 0) && (yyn += YYERRCODE) >= 0 && 527 1.2 christos yyn <= YYTABLESIZE && yycheck[yyn] == (YYINT) YYERRCODE) 528 1.1 christos { 529 1.1 christos #if YYDEBUG 530 1.1 christos if (yydebug) 531 1.1 christos printf("%sdebug: state %d, error recovery shifting\ 532 1.1 christos to state %d\n", YYPREFIX, *yystack.s_mark, yytable[yyn]); 533 1.1 christos #endif 534 1.2 christos if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack) == YYENOMEM) goto yyoverflow; 535 1.1 christos yystate = yytable[yyn]; 536 1.1 christos *++yystack.s_mark = yytable[yyn]; 537 1.1 christos *++yystack.l_mark = yylval; 538 1.1 christos goto yyloop; 539 1.1 christos } 540 1.1 christos else 541 1.1 christos { 542 1.1 christos #if YYDEBUG 543 1.1 christos if (yydebug) 544 1.1 christos printf("%sdebug: error recovery discarding state %d\n", 545 1.1 christos YYPREFIX, *yystack.s_mark); 546 1.1 christos #endif 547 1.1 christos if (yystack.s_mark <= yystack.s_base) goto yyabort; 548 1.1 christos --yystack.s_mark; 549 1.1 christos --yystack.l_mark; 550 1.1 christos } 551 1.1 christos } 552 1.1 christos } 553 1.1 christos else 554 1.1 christos { 555 1.1 christos if (yychar == YYEOF) goto yyabort; 556 1.1 christos #if YYDEBUG 557 1.1 christos if (yydebug) 558 1.1 christos { 559 1.2 christos if ((yys = yyname[YYTRANSLATE(yychar)]) == NULL) yys = yyname[YYUNDFTOKEN]; 560 1.1 christos printf("%sdebug: state %d, error recovery discards token %d (%s)\n", 561 1.1 christos YYPREFIX, yystate, yychar, yys); 562 1.1 christos } 563 1.1 christos #endif 564 1.1 christos yychar = YYEMPTY; 565 1.1 christos goto yyloop; 566 1.1 christos } 567 1.1 christos 568 1.1 christos yyreduce: 569 1.1 christos #if YYDEBUG 570 1.1 christos if (yydebug) 571 1.1 christos printf("%sdebug: state %d, reducing by rule %d (%s)\n", 572 1.1 christos YYPREFIX, yystate, yyn, yyrule[yyn]); 573 1.1 christos #endif 574 1.1 christos yym = yylen[yyn]; 575 1.2 christos if (yym > 0) 576 1.1 christos yyval = yystack.l_mark[1-yym]; 577 1.1 christos else 578 1.1 christos memset(&yyval, 0, sizeof yyval); 579 1.2 christos 580 1.1 christos switch (yyn) 581 1.1 christos { 582 1.1 christos case 3: 583 1.1 christos #line 35 "calc2.y" 584 1.1 christos { yyerrok ; } 585 1.6 christos #line 584 "calc2.tab.c" 586 1.1 christos break; 587 1.1 christos case 4: 588 1.1 christos #line 39 "calc2.y" 589 1.1 christos { printf("%d\n",yystack.l_mark[0]);} 590 1.6 christos #line 589 "calc2.tab.c" 591 1.1 christos break; 592 1.1 christos case 5: 593 1.1 christos #line 41 "calc2.y" 594 1.1 christos { regs[yystack.l_mark[-2]] = yystack.l_mark[0]; } 595 1.6 christos #line 594 "calc2.tab.c" 596 1.1 christos break; 597 1.1 christos case 6: 598 1.1 christos #line 45 "calc2.y" 599 1.1 christos { yyval = yystack.l_mark[-1]; } 600 1.6 christos #line 599 "calc2.tab.c" 601 1.1 christos break; 602 1.1 christos case 7: 603 1.1 christos #line 47 "calc2.y" 604 1.1 christos { yyval = yystack.l_mark[-2] + yystack.l_mark[0]; } 605 1.6 christos #line 604 "calc2.tab.c" 606 1.1 christos break; 607 1.1 christos case 8: 608 1.1 christos #line 49 "calc2.y" 609 1.1 christos { yyval = yystack.l_mark[-2] - yystack.l_mark[0]; } 610 1.6 christos #line 609 "calc2.tab.c" 611 1.1 christos break; 612 1.1 christos case 9: 613 1.1 christos #line 51 "calc2.y" 614 1.1 christos { yyval = yystack.l_mark[-2] * yystack.l_mark[0]; } 615 1.6 christos #line 614 "calc2.tab.c" 616 1.1 christos break; 617 1.1 christos case 10: 618 1.1 christos #line 53 "calc2.y" 619 1.1 christos { yyval = yystack.l_mark[-2] / yystack.l_mark[0]; } 620 1.6 christos #line 619 "calc2.tab.c" 621 1.1 christos break; 622 1.1 christos case 11: 623 1.1 christos #line 55 "calc2.y" 624 1.1 christos { yyval = yystack.l_mark[-2] % yystack.l_mark[0]; } 625 1.6 christos #line 624 "calc2.tab.c" 626 1.1 christos break; 627 1.1 christos case 12: 628 1.1 christos #line 57 "calc2.y" 629 1.1 christos { yyval = yystack.l_mark[-2] & yystack.l_mark[0]; } 630 1.6 christos #line 629 "calc2.tab.c" 631 1.1 christos break; 632 1.1 christos case 13: 633 1.1 christos #line 59 "calc2.y" 634 1.1 christos { yyval = yystack.l_mark[-2] | yystack.l_mark[0]; } 635 1.6 christos #line 634 "calc2.tab.c" 636 1.1 christos break; 637 1.1 christos case 14: 638 1.1 christos #line 61 "calc2.y" 639 1.1 christos { yyval = - yystack.l_mark[0]; } 640 1.6 christos #line 639 "calc2.tab.c" 641 1.1 christos break; 642 1.1 christos case 15: 643 1.1 christos #line 63 "calc2.y" 644 1.1 christos { yyval = regs[yystack.l_mark[0]]; } 645 1.6 christos #line 644 "calc2.tab.c" 646 1.1 christos break; 647 1.1 christos case 17: 648 1.1 christos #line 68 "calc2.y" 649 1.1 christos { yyval = yystack.l_mark[0]; (*base) = (yystack.l_mark[0]==0) ? 8 : 10; } 650 1.6 christos #line 649 "calc2.tab.c" 651 1.1 christos break; 652 1.1 christos case 18: 653 1.1 christos #line 70 "calc2.y" 654 1.1 christos { yyval = (*base) * yystack.l_mark[-1] + yystack.l_mark[0]; } 655 1.6 christos #line 654 "calc2.tab.c" 656 1.1 christos break; 657 1.6 christos #line 656 "calc2.tab.c" 658 1.1 christos } 659 1.1 christos yystack.s_mark -= yym; 660 1.1 christos yystate = *yystack.s_mark; 661 1.1 christos yystack.l_mark -= yym; 662 1.1 christos yym = yylhs[yyn]; 663 1.1 christos if (yystate == 0 && yym == 0) 664 1.1 christos { 665 1.1 christos #if YYDEBUG 666 1.1 christos if (yydebug) 667 1.1 christos printf("%sdebug: after reduction, shifting from state 0 to\ 668 1.1 christos state %d\n", YYPREFIX, YYFINAL); 669 1.1 christos #endif 670 1.1 christos yystate = YYFINAL; 671 1.1 christos *++yystack.s_mark = YYFINAL; 672 1.1 christos *++yystack.l_mark = yyval; 673 1.1 christos if (yychar < 0) 674 1.1 christos { 675 1.2 christos yychar = YYLEX; 676 1.2 christos if (yychar < 0) yychar = YYEOF; 677 1.1 christos #if YYDEBUG 678 1.1 christos if (yydebug) 679 1.1 christos { 680 1.2 christos if ((yys = yyname[YYTRANSLATE(yychar)]) == NULL) yys = yyname[YYUNDFTOKEN]; 681 1.1 christos printf("%sdebug: state %d, reading %d (%s)\n", 682 1.1 christos YYPREFIX, YYFINAL, yychar, yys); 683 1.1 christos } 684 1.1 christos #endif 685 1.1 christos } 686 1.1 christos if (yychar == YYEOF) goto yyaccept; 687 1.1 christos goto yyloop; 688 1.1 christos } 689 1.2 christos if (((yyn = yygindex[yym]) != 0) && (yyn += yystate) >= 0 && 690 1.2 christos yyn <= YYTABLESIZE && yycheck[yyn] == (YYINT) yystate) 691 1.1 christos yystate = yytable[yyn]; 692 1.1 christos else 693 1.1 christos yystate = yydgoto[yym]; 694 1.1 christos #if YYDEBUG 695 1.1 christos if (yydebug) 696 1.1 christos printf("%sdebug: after reduction, shifting from state %d \ 697 1.1 christos to state %d\n", YYPREFIX, *yystack.s_mark, yystate); 698 1.1 christos #endif 699 1.2 christos if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack) == YYENOMEM) goto yyoverflow; 700 1.1 christos *++yystack.s_mark = (YYINT) yystate; 701 1.1 christos *++yystack.l_mark = yyval; 702 1.1 christos goto yyloop; 703 1.1 christos 704 1.1 christos yyoverflow: 705 1.1 christos YYERROR_CALL("yacc stack overflow"); 706 1.1 christos 707 1.1 christos yyabort: 708 1.1 christos yyfreestack(&yystack); 709 1.1 christos return (1); 710 1.1 christos 711 1.1 christos yyaccept: 712 1.1 christos yyfreestack(&yystack); 713 1.1 christos return (0); 714 1.1 christos } 715