varsyntax_calc1.tab.c revision 1.6 1 /* $NetBSD: varsyntax_calc1.tab.c,v 1.6 2026/01/18 16:41:31 christos Exp $ */
2
3 /* original parser id follows */
4 /* yysccsid[] = "@(#)yaccpar 1.9 (Berkeley) 02/21/93" */
5 /* (use YYMAJOR/YYMINOR for ifdefs dependent on parser version) */
6
7 #define YYBYACC 1
8 #define YYMAJOR 2
9 #define YYMINOR 0
10 #define YYCHECK "yyyymmdd"
11
12 #define YYEMPTY (-1)
13 #define yyclearin (yychar = YYEMPTY)
14 #define yyerrok (yyerrflag = 0)
15 #define YYRECOVERING() (yyerrflag != 0)
16 #define YYENOMEM (-2)
17 #define YYEOF 0
18 #ident "check variant syntax features"
19
20 #ifndef yyparse
21 #define yyparse varsyntax_calc1_parse
22 #endif /* yyparse */
23
24 #ifndef yylex
25 #define yylex varsyntax_calc1_lex
26 #endif /* yylex */
27
28 #ifndef yyerror
29 #define yyerror varsyntax_calc1_error
30 #endif /* yyerror */
31
32 #ifndef yychar
33 #define yychar varsyntax_calc1_char
34 #endif /* yychar */
35
36 #ifndef yyval
37 #define yyval varsyntax_calc1_val
38 #endif /* yyval */
39
40 #ifndef yylval
41 #define yylval varsyntax_calc1_lval
42 #endif /* yylval */
43
44 #ifndef yydebug
45 #define yydebug varsyntax_calc1_debug
46 #endif /* yydebug */
47
48 #ifndef yynerrs
49 #define yynerrs varsyntax_calc1_nerrs
50 #endif /* yynerrs */
51
52 #ifndef yyerrflag
53 #define yyerrflag varsyntax_calc1_errflag
54 #endif /* yyerrflag */
55
56 #ifndef yylhs
57 #define yylhs varsyntax_calc1_lhs
58 #endif /* yylhs */
59
60 #ifndef yylen
61 #define yylen varsyntax_calc1_len
62 #endif /* yylen */
63
64 #ifndef yydefred
65 #define yydefred varsyntax_calc1_defred
66 #endif /* yydefred */
67
68 #ifndef yydgoto
69 #define yydgoto varsyntax_calc1_dgoto
70 #endif /* yydgoto */
71
72 #ifndef yysindex
73 #define yysindex varsyntax_calc1_sindex
74 #endif /* yysindex */
75
76 #ifndef yyrindex
77 #define yyrindex varsyntax_calc1_rindex
78 #endif /* yyrindex */
79
80 #ifndef yygindex
81 #define yygindex varsyntax_calc1_gindex
82 #endif /* yygindex */
83
84 #ifndef yytable
85 #define yytable varsyntax_calc1_table
86 #endif /* yytable */
87
88 #ifndef yycheck
89 #define yycheck varsyntax_calc1_check
90 #endif /* yycheck */
91
92 #ifndef yyname
93 #define yyname varsyntax_calc1_name
94 #endif /* yyname */
95
96 #ifndef yyrule
97 #define yyrule varsyntax_calc1_rule
98 #endif /* yyrule */
99 #define YYPREFIX "varsyntax_calc1_"
100
101 #define YYPURE 0
102
103 #line 3 "varsyntax_calc1.y"
104
105 /* http://dinosaur.compilertools.net/yacc/index.html * /*/
106
107 #include <stdlib.h>
108 #include <stdio.h>
109 #include <ctype.h>
110 #include <math.h>
111
112 typedef struct interval
113 {
114 double lo, hi;
115 }
116 INTERVAL;
117
118 INTERVAL vmul(double, double, INTERVAL);
119 INTERVAL vdiv(double, double, INTERVAL);
120
121 extern int yylex(void);
122 static void yyerror(const char *s);
123
124 int dcheck(INTERVAL);
125
126 double dreg[26];
127 INTERVAL vreg[26];
128
129 #ifdef YYSTYPE
130 #undef YYSTYPE_IS_DECLARED
131 #define YYSTYPE_IS_DECLARED 1
132 #endif
133 #ifndef YYSTYPE_IS_DECLARED
134 #define YYSTYPE_IS_DECLARED 1
135 #line 32 "varsyntax_calc1.y"
136 typedef union YYSTYPE
137 {
138 int ival; /* dreg & vreg array index values*/
139 double dval; /* floating point values*/
140 INTERVAL vval; /* interval values*/
141 } YYSTYPE;
142 #endif /* !YYSTYPE_IS_DECLARED */
143 #line 142 "varsyntax_calc1.tab.c"
144
145 /* compatibility with bison */
146 #ifdef YYPARSE_PARAM
147 /* compatibility with FreeBSD */
148 # ifdef YYPARSE_PARAM_TYPE
149 # define YYPARSE_DECL() yyparse(YYPARSE_PARAM_TYPE YYPARSE_PARAM)
150 # else
151 # define YYPARSE_DECL() yyparse(void *YYPARSE_PARAM)
152 # endif
153 #else
154 # define YYPARSE_DECL() yyparse(void)
155 #endif
156
157 /* Parameters sent to lex. */
158 #ifdef YYLEX_PARAM
159 # define YYLEX_DECL() yylex(void *YYLEX_PARAM)
160 # define YYLEX yylex(YYLEX_PARAM)
161 #else
162 # define YYLEX_DECL() yylex(void)
163 # define YYLEX yylex()
164 #endif
165
166 /* Parameters sent to yyerror. */
167 #ifndef YYERROR_DECL
168 #define YYERROR_DECL() yyerror(const char *s)
169 #endif
170 #ifndef YYERROR_CALL
171 #define YYERROR_CALL(msg) yyerror(msg)
172 #endif
173
174 extern int YYPARSE_DECL();
175
176 #define DREG 257
177 #define VREG 258
178 #define CONST 259
179 #define UMINUS 260
180 #define YYERRCODE 256
181 typedef int YYINT;
182 static const YYINT varsyntax_calc1_lhs[] = { -1,
183 3, 3, 0, 0, 0, 0, 0, 1, 1, 1,
184 1, 1, 1, 1, 1, 2, 2, 2, 2, 2,
185 2, 2, 2, 2, 2, 2, 2, 2,
186 };
187 static const YYINT varsyntax_calc1_len[] = { 2,
188 0, 2, 2, 2, 4, 4, 2, 1, 1, 3,
189 3, 3, 3, 2, 3, 1, 5, 1, 3, 3,
190 3, 3, 3, 3, 3, 3, 2, 3,
191 };
192 static const YYINT varsyntax_calc1_defred[] = { 0,
193 0, 0, 0, 8, 0, 0, 0, 0, 0, 7,
194 0, 0, 9, 18, 14, 27, 0, 0, 0, 0,
195 0, 0, 3, 0, 0, 0, 0, 4, 0, 0,
196 0, 0, 0, 15, 0, 28, 0, 0, 0, 0,
197 12, 24, 13, 26, 0, 0, 23, 25, 14, 0,
198 0, 0, 0, 0, 5, 6, 0, 0, 0, 12,
199 13, 17,
200 };
201 static const YYINT varsyntax_calc1_dgoto[] = { 7,
202 32, 9, 0,
203 };
204 static const YYINT varsyntax_calc1_sindex[] = { -40,
205 -8, -48, -47, 0, -37, -37, 0, 2, 17, 0,
206 -34, -37, 0, 0, 0, 0, -25, 90, -37, -37,
207 -37, -37, 0, -37, -37, -37, -37, 0, -34, -34,
208 25, 125, 31, 0, -34, 0, -11, 37, -11, 37,
209 0, 0, 0, 0, 37, 37, 0, 0, 0, 111,
210 -34, -34, -34, -34, 0, 0, 118, 69, 69, 0,
211 0, 0,
212 };
213 static const YYINT varsyntax_calc1_rindex[] = { 0,
214 0, 38, 44, 0, 0, 0, 0, 0, 0, 0,
215 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
216 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
217 0, -9, 0, 0, 0, 0, 51, -3, 56, 61,
218 0, 0, 0, 0, 67, 72, 0, 0, 0, 0,
219 0, 0, 0, 0, 0, 0, 0, 78, 83, 0,
220 0, 0,
221 };
222 static const YYINT varsyntax_calc1_gindex[] = { 0,
223 4, 124, 0,
224 };
225 #define YYTABLESIZE 225
226 static const YYINT varsyntax_calc1_table[] = { 6,
227 16, 10, 6, 8, 5, 30, 20, 5, 15, 17,
228 29, 23, 11, 12, 31, 34, 21, 19, 35, 20,
229 0, 22, 37, 39, 41, 43, 28, 0, 0, 0,
230 21, 16, 49, 50, 55, 22, 0, 20, 57, 20,
231 56, 20, 0, 21, 19, 0, 20, 9, 22, 0,
232 0, 0, 0, 18, 58, 59, 60, 61, 26, 24,
233 10, 25, 0, 27, 0, 11, 53, 51, 0, 52,
234 22, 54, 26, 24, 0, 25, 19, 27, 26, 9,
235 9, 21, 9, 27, 9, 18, 18, 10, 18, 0,
236 18, 10, 11, 10, 10, 10, 11, 0, 11, 11,
237 11, 22, 0, 22, 0, 22, 0, 19, 0, 19,
238 53, 19, 21, 0, 21, 54, 21, 0, 10, 0,
239 10, 0, 10, 11, 0, 11, 0, 11, 16, 18,
240 36, 26, 24, 0, 25, 33, 27, 0, 0, 0,
241 0, 0, 38, 40, 42, 44, 0, 45, 46, 47,
242 48, 34, 53, 51, 0, 52, 0, 54, 62, 53,
243 51, 0, 52, 0, 54, 0, 21, 19, 0, 20,
244 0, 22, 0, 0, 0, 0, 0, 0, 0, 0,
245 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
246 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
247 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
248 0, 0, 0, 0, 0, 1, 2, 3, 4, 13,
249 14, 4, 13, 0, 4,
250 };
251 static const YYINT varsyntax_calc1_check[] = { 40,
252 10, 10, 40, 0, 45, 40, 10, 45, 5, 6,
253 45, 10, 61, 61, 11, 41, 42, 43, 44, 45,
254 -1, 47, 19, 20, 21, 22, 10, -1, -1, -1,
255 42, 41, 29, 30, 10, 47, -1, 41, 35, 43,
256 10, 45, -1, 42, 43, -1, 45, 10, 47, -1,
257 -1, -1, -1, 10, 51, 52, 53, 54, 42, 43,
258 10, 45, -1, 47, -1, 10, 42, 43, -1, 45,
259 10, 47, 42, 43, -1, 45, 10, 47, 42, 42,
260 43, 10, 45, 47, 47, 42, 43, 10, 45, -1,
261 47, 41, 10, 43, 44, 45, 41, -1, 43, 44,
262 45, 41, -1, 43, -1, 45, -1, 41, -1, 43,
263 42, 45, 41, -1, 43, 47, 45, -1, 41, -1,
264 43, -1, 45, 41, -1, 43, -1, 45, 5, 6,
265 41, 42, 43, -1, 45, 12, 47, -1, -1, -1,
266 -1, -1, 19, 20, 21, 22, -1, 24, 25, 26,
267 27, 41, 42, 43, -1, 45, -1, 47, 41, 42,
268 43, -1, 45, -1, 47, -1, 42, 43, -1, 45,
269 -1, 47, -1, -1, -1, -1, -1, -1, -1, -1,
270 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
271 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
272 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
273 -1, -1, -1, -1, -1, 256, 257, 258, 259, 257,
274 258, 259, 257, -1, 259,
275 };
276 #define YYFINAL 7
277 #ifndef YYDEBUG
278 #define YYDEBUG 0
279 #endif
280 #define YYMAXTOKEN 260
281 #define YYUNDFTOKEN 266
282 #define YYTRANSLATE(a) ((a) > YYMAXTOKEN ? YYUNDFTOKEN : (a))
283 #if YYDEBUG
284 #ifndef NULL
285 #define NULL (void*)0
286 #endif
287 static const char *const varsyntax_calc1_name[] = {
288
289 "end-of-file",NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,"'\\n'",NULL,NULL,
290 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
291 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,"'('","')'","'*'","'+'",
292 "','","'-'",NULL,"'/'",NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
293 NULL,NULL,"'='",NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
294 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
295 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
296 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
297 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
298 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
299 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
300 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
301 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
302 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
303 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
304 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
305 NULL,NULL,NULL,NULL,NULL,NULL,NULL,"DREG","VREG","CONST","UMINUS",NULL,NULL,
306 NULL,NULL,NULL,"illegal-symbol",
307 };
308 static const char *const varsyntax_calc1_rule[] = {
309 "$accept : line",
310 "lines :",
311 "lines : lines line",
312 "line : dexp '\\n'",
313 "line : vexp '\\n'",
314 "line : DREG '=' dexp '\\n'",
315 "line : VREG '=' vexp '\\n'",
316 "line : error '\\n'",
317 "dexp : CONST",
318 "dexp : DREG",
319 "dexp : dexp '+' dexp",
320 "dexp : dexp '-' dexp",
321 "dexp : dexp '*' dexp",
322 "dexp : dexp '/' dexp",
323 "dexp : '-' dexp",
324 "dexp : '(' dexp ')'",
325 "vexp : dexp",
326 "vexp : '(' dexp ',' dexp ')'",
327 "vexp : VREG",
328 "vexp : vexp '+' vexp",
329 "vexp : dexp '+' vexp",
330 "vexp : vexp '-' vexp",
331 "vexp : dexp '-' vexp",
332 "vexp : vexp '*' vexp",
333 "vexp : dexp '*' vexp",
334 "vexp : vexp '/' vexp",
335 "vexp : dexp '/' vexp",
336 "vexp : '-' vexp",
337 "vexp : '(' vexp ')'",
338
339 };
340 #endif
341
342 #if YYDEBUG
343 int yydebug;
344 #endif
345
346 int yyerrflag;
347 int yychar;
348 YYSTYPE yyval;
349 YYSTYPE yylval;
350 int yynerrs;
351
352 /* define the initial stack-sizes */
353 #ifdef YYSTACKSIZE
354 #undef YYMAXDEPTH
355 #define YYMAXDEPTH YYSTACKSIZE
356 #else
357 #ifdef YYMAXDEPTH
358 #define YYSTACKSIZE YYMAXDEPTH
359 #else
360 #define YYSTACKSIZE 10000
361 #define YYMAXDEPTH 10000
362 #endif
363 #endif
364
365 #define YYINITSTACKSIZE 200
366
367 typedef struct {
368 unsigned stacksize;
369 YYINT *s_base;
370 YYINT *s_mark;
371 YYINT *s_last;
372 YYSTYPE *l_base;
373 YYSTYPE *l_mark;
374 } YYSTACKDATA;
375 /* variables for the parser stack */
376 static YYSTACKDATA yystack;
377 #line 178 "varsyntax_calc1.y"
378 /* beginning of subroutines section */
379
380 #define BSZ 50 /* buffer size for floating point numbers */
381
382 /* lexical analysis */
383
384 static void
385 yyerror(const char *s)
386 {
387 fprintf(stderr, "%s\n", s);
388 }
389
390 int
391 yylex(void)
392 {
393 int c;
394
395 while ((c = getchar()) == ' ')
396 { /* skip over blanks */
397 }
398
399 if (isupper(c))
400 {
401 yylval.ival = c - 'A';
402 return (VREG);
403 }
404 if (islower(c))
405 {
406 yylval.ival = c - 'a';
407 return (DREG);
408 }
409
410 if (isdigit(c) || c == '.')
411 {
412 /* gobble up digits, points, exponents */
413 char buf[BSZ + 1], *cp = buf;
414 int dot = 0, expr = 0;
415
416 for (; (cp - buf) < BSZ; ++cp, c = getchar())
417 {
418
419 *cp = (char) c;
420 if (isdigit(c))
421 continue;
422 if (c == '.')
423 {
424 if (dot++ || expr)
425 return ('.'); /* will cause syntax error */
426 continue;
427 }
428
429 if (c == 'e')
430 {
431 if (expr++)
432 return ('e'); /* will cause syntax error */
433 continue;
434 }
435
436 /* end of number */
437 break;
438 }
439 *cp = '\0';
440
441 if ((cp - buf) >= BSZ)
442 printf("constant too long: truncated\n");
443 else
444 ungetc(c, stdin); /* push back last char read */
445 yylval.dval = atof(buf);
446 return (CONST);
447 }
448 return (c);
449 }
450
451 static INTERVAL
452 hilo(double a, double b, double c, double d)
453 {
454 /* returns the smallest interval containing a, b, c, and d */
455 /* used by *, / routines */
456 INTERVAL v;
457
458 if (a > b)
459 {
460 v.hi = a;
461 v.lo = b;
462 }
463 else
464 {
465 v.hi = b;
466 v.lo = a;
467 }
468
469 if (c > d)
470 {
471 if (c > v.hi)
472 v.hi = c;
473 if (d < v.lo)
474 v.lo = d;
475 }
476 else
477 {
478 if (d > v.hi)
479 v.hi = d;
480 if (c < v.lo)
481 v.lo = c;
482 }
483 return (v);
484 }
485
486 INTERVAL
487 vmul(double a, double b, INTERVAL v)
488 {
489 return (hilo(a * v.hi, a * v.lo, b * v.hi, b * v.lo));
490 }
491
492 int
493 dcheck(INTERVAL v)
494 {
495 if (v.hi >= 0. && v.lo <= 0.)
496 {
497 printf("divisor interval contains 0.\n");
498 return (1);
499 }
500 return (0);
501 }
502
503 INTERVAL
504 vdiv(double a, double b, INTERVAL v)
505 {
506 return (hilo(a / v.hi, a / v.lo, b / v.hi, b / v.lo));
507 }
508 #line 507 "varsyntax_calc1.tab.c"
509
510 #if YYDEBUG
511 #include <stdio.h> /* needed for printf */
512 #endif
513
514 #include <stdlib.h> /* needed for malloc, etc */
515 #include <string.h> /* needed for memset */
516
517 /* allocate initial stack or double stack size, up to YYMAXDEPTH */
518 static int yygrowstack(YYSTACKDATA *data)
519 {
520 int i;
521 unsigned newsize;
522 YYINT *newss;
523 YYSTYPE *newvs;
524
525 if ((newsize = data->stacksize) == 0)
526 newsize = YYINITSTACKSIZE;
527 else if (newsize >= YYMAXDEPTH)
528 return YYENOMEM;
529 else if ((newsize *= 2) > YYMAXDEPTH)
530 newsize = YYMAXDEPTH;
531
532 i = (int) (data->s_mark - data->s_base);
533 newss = (YYINT *)realloc(data->s_base, newsize * sizeof(*newss));
534 if (newss == NULL)
535 return YYENOMEM;
536
537 data->s_base = newss;
538 data->s_mark = newss + i;
539
540 newvs = (YYSTYPE *)realloc(data->l_base, newsize * sizeof(*newvs));
541 if (newvs == NULL)
542 return YYENOMEM;
543
544 data->l_base = newvs;
545 data->l_mark = newvs + i;
546
547 data->stacksize = newsize;
548 data->s_last = data->s_base + newsize - 1;
549 return 0;
550 }
551
552 #if YYPURE || defined(YY_NO_LEAKS)
553 static void yyfreestack(YYSTACKDATA *data)
554 {
555 free(data->s_base);
556 free(data->l_base);
557 memset(data, 0, sizeof(*data));
558 }
559 #else
560 #define yyfreestack(data) /* nothing */
561 #endif
562
563 #define YYABORT goto yyabort
564 #define YYREJECT goto yyabort
565 #define YYACCEPT goto yyaccept
566 #define YYERROR goto yyerrlab
567
568 int
569 YYPARSE_DECL()
570 {
571 int yym, yyn, yystate;
572 #if YYDEBUG
573 const char *yys;
574
575 if ((yys = getenv("YYDEBUG")) != NULL)
576 {
577 yyn = *yys;
578 if (yyn >= '0' && yyn <= '9')
579 yydebug = yyn - '0';
580 }
581 #endif
582
583 /* yym is set below */
584 /* yyn is set below */
585 yynerrs = 0;
586 yyerrflag = 0;
587 yychar = YYEMPTY;
588 yystate = 0;
589
590 #if YYPURE
591 memset(&yystack, 0, sizeof(yystack));
592 #endif
593
594 if (yystack.s_base == NULL && yygrowstack(&yystack) == YYENOMEM) goto yyoverflow;
595 yystack.s_mark = yystack.s_base;
596 yystack.l_mark = yystack.l_base;
597 yystate = 0;
598 *yystack.s_mark = 0;
599
600 yyloop:
601 if ((yyn = yydefred[yystate]) != 0) goto yyreduce;
602 if (yychar < 0)
603 {
604 yychar = YYLEX;
605 if (yychar < 0) yychar = YYEOF;
606 #if YYDEBUG
607 if (yydebug)
608 {
609 if ((yys = yyname[YYTRANSLATE(yychar)]) == NULL) yys = yyname[YYUNDFTOKEN];
610 printf("%sdebug: state %d, reading %d (%s)\n",
611 YYPREFIX, yystate, yychar, yys);
612 }
613 #endif
614 }
615 if (((yyn = yysindex[yystate]) != 0) && (yyn += yychar) >= 0 &&
616 yyn <= YYTABLESIZE && yycheck[yyn] == (YYINT) yychar)
617 {
618 #if YYDEBUG
619 if (yydebug)
620 printf("%sdebug: state %d, shifting to state %d\n",
621 YYPREFIX, yystate, yytable[yyn]);
622 #endif
623 if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack) == YYENOMEM) goto yyoverflow;
624 yystate = yytable[yyn];
625 *++yystack.s_mark = yytable[yyn];
626 *++yystack.l_mark = yylval;
627 yychar = YYEMPTY;
628 if (yyerrflag > 0) --yyerrflag;
629 goto yyloop;
630 }
631 if (((yyn = yyrindex[yystate]) != 0) && (yyn += yychar) >= 0 &&
632 yyn <= YYTABLESIZE && yycheck[yyn] == (YYINT) yychar)
633 {
634 yyn = yytable[yyn];
635 goto yyreduce;
636 }
637 if (yyerrflag != 0) goto yyinrecovery;
638
639 YYERROR_CALL("syntax error");
640
641 goto yyerrlab; /* redundant goto avoids 'unused label' warning */
642 yyerrlab:
643 ++yynerrs;
644
645 yyinrecovery:
646 if (yyerrflag < 3)
647 {
648 yyerrflag = 3;
649 for (;;)
650 {
651 if (((yyn = yysindex[*yystack.s_mark]) != 0) && (yyn += YYERRCODE) >= 0 &&
652 yyn <= YYTABLESIZE && yycheck[yyn] == (YYINT) YYERRCODE)
653 {
654 #if YYDEBUG
655 if (yydebug)
656 printf("%sdebug: state %d, error recovery shifting\
657 to state %d\n", YYPREFIX, *yystack.s_mark, yytable[yyn]);
658 #endif
659 if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack) == YYENOMEM) goto yyoverflow;
660 yystate = yytable[yyn];
661 *++yystack.s_mark = yytable[yyn];
662 *++yystack.l_mark = yylval;
663 goto yyloop;
664 }
665 else
666 {
667 #if YYDEBUG
668 if (yydebug)
669 printf("%sdebug: error recovery discarding state %d\n",
670 YYPREFIX, *yystack.s_mark);
671 #endif
672 if (yystack.s_mark <= yystack.s_base) goto yyabort;
673 --yystack.s_mark;
674 --yystack.l_mark;
675 }
676 }
677 }
678 else
679 {
680 if (yychar == YYEOF) goto yyabort;
681 #if YYDEBUG
682 if (yydebug)
683 {
684 if ((yys = yyname[YYTRANSLATE(yychar)]) == NULL) yys = yyname[YYUNDFTOKEN];
685 printf("%sdebug: state %d, error recovery discards token %d (%s)\n",
686 YYPREFIX, yystate, yychar, yys);
687 }
688 #endif
689 yychar = YYEMPTY;
690 goto yyloop;
691 }
692
693 yyreduce:
694 #if YYDEBUG
695 if (yydebug)
696 printf("%sdebug: state %d, reducing by rule %d (%s)\n",
697 YYPREFIX, yystate, yyn, yyrule[yyn]);
698 #endif
699 yym = yylen[yyn];
700 if (yym > 0)
701 yyval = yystack.l_mark[1-yym];
702 else
703 memset(&yyval, 0, sizeof yyval);
704
705 switch (yyn)
706 {
707 case 3:
708 #line 59 "varsyntax_calc1.y"
709 {
710 (void) printf("%15.8f\n", yystack.l_mark[-1].dval);
711 }
712 #line 711 "varsyntax_calc1.tab.c"
713 break;
714 case 4:
715 #line 63 "varsyntax_calc1.y"
716 {
717 (void) printf("(%15.8f, %15.8f)\n", yystack.l_mark[-1].vval.lo, yystack.l_mark[-1].vval.hi);
718 }
719 #line 718 "varsyntax_calc1.tab.c"
720 break;
721 case 5:
722 #line 67 "varsyntax_calc1.y"
723 {
724 dreg[yystack.l_mark[-3].ival] = yystack.l_mark[-1].dval;
725 }
726 #line 725 "varsyntax_calc1.tab.c"
727 break;
728 case 6:
729 #line 71 "varsyntax_calc1.y"
730 {
731 vreg[yystack.l_mark[-3].ival] = yystack.l_mark[-1].vval;
732 }
733 #line 732 "varsyntax_calc1.tab.c"
734 break;
735 case 7:
736 #line 75 "varsyntax_calc1.y"
737 {
738 yyerrok;
739 }
740 #line 739 "varsyntax_calc1.tab.c"
741 break;
742 case 9:
743 #line 82 "varsyntax_calc1.y"
744 {
745 yyval.dval = dreg[yystack.l_mark[0].ival]; /* $$ & $1 are sufficient here*/
746 }
747 #line 746 "varsyntax_calc1.tab.c"
748 break;
749 case 10:
750 #line 86 "varsyntax_calc1.y"
751 {
752 yyval.dval = yystack.l_mark[-2].dval + yystack.l_mark[0].dval;
753 }
754 #line 753 "varsyntax_calc1.tab.c"
755 break;
756 case 11:
757 #line 90 "varsyntax_calc1.y"
758 {
759 yyval.dval = yystack.l_mark[-2].dval - yystack.l_mark[0].dval;
760 }
761 #line 760 "varsyntax_calc1.tab.c"
762 break;
763 case 12:
764 #line 94 "varsyntax_calc1.y"
765 {
766 yyval.dval = yystack.l_mark[-2].dval * yystack.l_mark[0].dval;
767 }
768 #line 767 "varsyntax_calc1.tab.c"
769 break;
770 case 13:
771 #line 98 "varsyntax_calc1.y"
772 {
773 yyval.dval = yystack.l_mark[-2].dval / yystack.l_mark[0].dval;
774 }
775 #line 774 "varsyntax_calc1.tab.c"
776 break;
777 case 14:
778 #line 102 "varsyntax_calc1.y"
779 {
780 yyval.dval = -yystack.l_mark[0].dval;
781 }
782 #line 781 "varsyntax_calc1.tab.c"
783 break;
784 case 15:
785 #line 106 "varsyntax_calc1.y"
786 {
787 yyval.dval = yystack.l_mark[-1].dval;
788 }
789 #line 788 "varsyntax_calc1.tab.c"
790 break;
791 case 16:
792 #line 112 "varsyntax_calc1.y"
793 {
794 yyval.vval.hi = yyval.vval.lo = yystack.l_mark[0].dval;
795 }
796 #line 795 "varsyntax_calc1.tab.c"
797 break;
798 case 17:
799 #line 116 "varsyntax_calc1.y"
800 {
801 yyval.vval.lo = yystack.l_mark[-3].dval;
802 yyval.vval.hi = yystack.l_mark[-1].dval;
803 if ( yyval.vval.lo > yyval.vval.hi )
804 {
805 (void) printf("interval out of order\n");
806 YYERROR;
807 }
808 }
809 #line 808 "varsyntax_calc1.tab.c"
810 break;
811 case 18:
812 #line 126 "varsyntax_calc1.y"
813 {
814 yyval.vval = vreg[yystack.l_mark[0].ival];
815 }
816 #line 815 "varsyntax_calc1.tab.c"
817 break;
818 case 19:
819 #line 130 "varsyntax_calc1.y"
820 {
821 yyval.vval.hi = yystack.l_mark[-2].vval.hi + yystack.l_mark[0].vval.hi;
822 yyval.vval.lo = yystack.l_mark[-2].vval.lo + yystack.l_mark[0].vval.lo;
823 }
824 #line 823 "varsyntax_calc1.tab.c"
825 break;
826 case 20:
827 #line 135 "varsyntax_calc1.y"
828 {
829 yyval.vval.hi = yystack.l_mark[-2].dval + yystack.l_mark[0].vval.hi;
830 yyval.vval.lo = yystack.l_mark[-2].dval + yystack.l_mark[0].vval.lo;
831 }
832 #line 831 "varsyntax_calc1.tab.c"
833 break;
834 case 21:
835 #line 140 "varsyntax_calc1.y"
836 {
837 yyval.vval.hi = yystack.l_mark[-2].vval.hi - yystack.l_mark[0].vval.lo;
838 yyval.vval.lo = yystack.l_mark[-2].vval.lo - yystack.l_mark[0].vval.hi;
839 }
840 #line 839 "varsyntax_calc1.tab.c"
841 break;
842 case 22:
843 #line 145 "varsyntax_calc1.y"
844 {
845 yyval.vval.hi = yystack.l_mark[-2].dval - yystack.l_mark[0].vval.lo;
846 yyval.vval.lo = yystack.l_mark[-2].dval - yystack.l_mark[0].vval.hi;
847 }
848 #line 847 "varsyntax_calc1.tab.c"
849 break;
850 case 23:
851 #line 150 "varsyntax_calc1.y"
852 {
853 yyval.vval = vmul( yystack.l_mark[-2].vval.lo, yystack.l_mark[-2].vval.hi, yystack.l_mark[0].vval );
854 }
855 #line 854 "varsyntax_calc1.tab.c"
856 break;
857 case 24:
858 #line 154 "varsyntax_calc1.y"
859 {
860 yyval.vval = vmul (yystack.l_mark[-2].dval, yystack.l_mark[-2].dval, yystack.l_mark[0].vval );
861 }
862 #line 861 "varsyntax_calc1.tab.c"
863 break;
864 case 25:
865 #line 158 "varsyntax_calc1.y"
866 {
867 if (dcheck(yystack.l_mark[0].vval)) YYERROR;
868 yyval.vval = vdiv ( yystack.l_mark[-2].vval.lo, yystack.l_mark[-2].vval.hi, yystack.l_mark[0].vval );
869 }
870 #line 869 "varsyntax_calc1.tab.c"
871 break;
872 case 26:
873 #line 163 "varsyntax_calc1.y"
874 {
875 if (dcheck ( yystack.l_mark[0].vval )) YYERROR;
876 yyval.vval = vdiv (yystack.l_mark[-2].dval, yystack.l_mark[-2].dval, yystack.l_mark[0].vval );
877 }
878 #line 877 "varsyntax_calc1.tab.c"
879 break;
880 case 27:
881 #line 168 "varsyntax_calc1.y"
882 {
883 yyval.vval.hi = -yystack.l_mark[0].vval.lo;
884 yyval.vval.lo = -yystack.l_mark[0].vval.hi;
885 }
886 #line 885 "varsyntax_calc1.tab.c"
887 break;
888 case 28:
889 #line 173 "varsyntax_calc1.y"
890 {
891 yyval.vval = yystack.l_mark[-1].vval;
892 }
893 #line 892 "varsyntax_calc1.tab.c"
894 break;
895 #line 894 "varsyntax_calc1.tab.c"
896 }
897 yystack.s_mark -= yym;
898 yystate = *yystack.s_mark;
899 yystack.l_mark -= yym;
900 yym = yylhs[yyn];
901 if (yystate == 0 && yym == 0)
902 {
903 #if YYDEBUG
904 if (yydebug)
905 printf("%sdebug: after reduction, shifting from state 0 to\
906 state %d\n", YYPREFIX, YYFINAL);
907 #endif
908 yystate = YYFINAL;
909 *++yystack.s_mark = YYFINAL;
910 *++yystack.l_mark = yyval;
911 if (yychar < 0)
912 {
913 yychar = YYLEX;
914 if (yychar < 0) yychar = YYEOF;
915 #if YYDEBUG
916 if (yydebug)
917 {
918 if ((yys = yyname[YYTRANSLATE(yychar)]) == NULL) yys = yyname[YYUNDFTOKEN];
919 printf("%sdebug: state %d, reading %d (%s)\n",
920 YYPREFIX, YYFINAL, yychar, yys);
921 }
922 #endif
923 }
924 if (yychar == YYEOF) goto yyaccept;
925 goto yyloop;
926 }
927 if (((yyn = yygindex[yym]) != 0) && (yyn += yystate) >= 0 &&
928 yyn <= YYTABLESIZE && yycheck[yyn] == (YYINT) yystate)
929 yystate = yytable[yyn];
930 else
931 yystate = yydgoto[yym];
932 #if YYDEBUG
933 if (yydebug)
934 printf("%sdebug: after reduction, shifting from state %d \
935 to state %d\n", YYPREFIX, *yystack.s_mark, yystate);
936 #endif
937 if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack) == YYENOMEM) goto yyoverflow;
938 *++yystack.s_mark = (YYINT) yystate;
939 *++yystack.l_mark = yyval;
940 goto yyloop;
941
942 yyoverflow:
943 YYERROR_CALL("yacc stack overflow");
944
945 yyabort:
946 yyfreestack(&yystack);
947 return (1);
948
949 yyaccept:
950 yyfreestack(&yystack);
951 return (0);
952 }
953