1 /* original parser id follows */
2 /* yysccsid[] = "@(#)yaccpar 1.9 (Berkeley) 02/21/93" */
3 /* (use YYMAJOR/YYMINOR for ifdefs dependent on parser version) */
8 #define YYCHECK "yyyymmdd"
11 #define yyclearin (yychar = YYEMPTY)
12 #define yyerrok (yyerrflag = 0)
13 #define YYRECOVERING() (yyerrflag != 0)
16 #ident "check variant syntax features"
19 #define yyparse varsyntax_calc1_parse
23 #define yylex varsyntax_calc1_lex
27 #define yyerror varsyntax_calc1_error
31 #define yychar varsyntax_calc1_char
35 #define yyval varsyntax_calc1_val
39 #define yylval varsyntax_calc1_lval
43 #define yydebug varsyntax_calc1_debug
47 #define yynerrs varsyntax_calc1_nerrs
51 #define yyerrflag varsyntax_calc1_errflag
52 #endif /* yyerrflag */
55 #define yylhs varsyntax_calc1_lhs
59 #define yylen varsyntax_calc1_len
63 #define yydefred varsyntax_calc1_defred
67 #define yydgoto varsyntax_calc1_dgoto
71 #define yysindex varsyntax_calc1_sindex
75 #define yyrindex varsyntax_calc1_rindex
79 #define yygindex varsyntax_calc1_gindex
83 #define yytable varsyntax_calc1_table
87 #define yycheck varsyntax_calc1_check
91 #define yyname varsyntax_calc1_name
95 #define yyrule varsyntax_calc1_rule
97 #define YYPREFIX "varsyntax_calc1_"
101 #line 3 "varsyntax_calc1.y"
103 /* http://dinosaur.compilertools.net/yacc/index.html * /*/
110 typedef struct interval
116 INTERVAL vmul(double, double, INTERVAL);
117 INTERVAL vdiv(double, double, INTERVAL);
119 extern int yylex(void);
120 static void yyerror(const char *s);
122 int dcheck(INTERVAL);
128 #undef YYSTYPE_IS_DECLARED
129 #define YYSTYPE_IS_DECLARED 1
131 #ifndef YYSTYPE_IS_DECLARED
132 #define YYSTYPE_IS_DECLARED 1
133 #line 32 "varsyntax_calc1.y"
136 int ival; /* dreg & vreg array index values*/
137 double dval; /* floating point values*/
138 INTERVAL vval; /* interval values*/
140 #endif /* !YYSTYPE_IS_DECLARED */
141 #line 142 "varsyntax_calc1.tab.c"
143 /* compatibility with bison */
145 /* compatibility with FreeBSD */
146 # ifdef YYPARSE_PARAM_TYPE
147 # define YYPARSE_DECL() yyparse(YYPARSE_PARAM_TYPE YYPARSE_PARAM)
149 # define YYPARSE_DECL() yyparse(void *YYPARSE_PARAM)
152 # define YYPARSE_DECL() yyparse(void)
155 /* Parameters sent to lex. */
157 # define YYLEX_DECL() yylex(void *YYLEX_PARAM)
158 # define YYLEX yylex(YYLEX_PARAM)
160 # define YYLEX_DECL() yylex(void)
161 # define YYLEX yylex()
164 /* Parameters sent to yyerror. */
166 #define YYERROR_DECL() yyerror(const char *s)
169 #define YYERROR_CALL(msg) yyerror(msg)
172 extern int YYPARSE_DECL();
178 #define YYERRCODE 256
180 static const YYINT varsyntax_calc1_lhs[] = { -1,
181 3, 3, 0, 0, 0, 0, 0, 1, 1, 1,
182 1, 1, 1, 1, 1, 2, 2, 2, 2, 2,
183 2, 2, 2, 2, 2, 2, 2, 2,
185 static const YYINT varsyntax_calc1_len[] = { 2,
186 0, 2, 2, 2, 4, 4, 2, 1, 1, 3,
187 3, 3, 3, 2, 3, 1, 5, 1, 3, 3,
188 3, 3, 3, 3, 3, 3, 2, 3,
190 static const YYINT varsyntax_calc1_defred[] = { 0,
191 0, 0, 0, 8, 0, 0, 0, 0, 0, 7,
192 0, 0, 9, 18, 14, 27, 0, 0, 0, 0,
193 0, 0, 3, 0, 0, 0, 0, 4, 0, 0,
194 0, 0, 0, 15, 0, 28, 0, 0, 0, 0,
195 12, 24, 13, 26, 0, 0, 23, 25, 14, 0,
196 0, 0, 0, 0, 5, 6, 0, 0, 0, 12,
199 static const YYINT varsyntax_calc1_dgoto[] = { 7,
202 static const YYINT varsyntax_calc1_sindex[] = { -40,
203 -8, -48, -47, 0, -37, -37, 0, 2, 17, 0,
204 -34, -37, 0, 0, 0, 0, -25, 90, -37, -37,
205 -37, -37, 0, -37, -37, -37, -37, 0, -34, -34,
206 25, 125, 31, 0, -34, 0, -11, 37, -11, 37,
207 0, 0, 0, 0, 37, 37, 0, 0, 0, 111,
208 -34, -34, -34, -34, 0, 0, 118, 69, 69, 0,
211 static const YYINT varsyntax_calc1_rindex[] = { 0,
212 0, 38, 44, 0, 0, 0, 0, 0, 0, 0,
213 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
214 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
215 0, -9, 0, 0, 0, 0, 51, -3, 56, 61,
216 0, 0, 0, 0, 67, 72, 0, 0, 0, 0,
217 0, 0, 0, 0, 0, 0, 0, 78, 83, 0,
220 static const YYINT varsyntax_calc1_gindex[] = { 0,
223 #define YYTABLESIZE 225
224 static const YYINT varsyntax_calc1_table[] = { 6,
225 16, 10, 6, 8, 5, 30, 20, 5, 15, 17,
226 29, 23, 11, 12, 31, 34, 21, 19, 35, 20,
227 0, 22, 37, 39, 41, 43, 28, 0, 0, 0,
228 21, 16, 49, 50, 55, 22, 0, 20, 57, 20,
229 56, 20, 0, 21, 19, 0, 20, 9, 22, 0,
230 0, 0, 0, 18, 58, 59, 60, 61, 26, 24,
231 10, 25, 0, 27, 0, 11, 53, 51, 0, 52,
232 22, 54, 26, 24, 0, 25, 19, 27, 26, 9,
233 9, 21, 9, 27, 9, 18, 18, 10, 18, 0,
234 18, 10, 11, 10, 10, 10, 11, 0, 11, 11,
235 11, 22, 0, 22, 0, 22, 0, 19, 0, 19,
236 53, 19, 21, 0, 21, 54, 21, 0, 10, 0,
237 10, 0, 10, 11, 0, 11, 0, 11, 16, 18,
238 36, 26, 24, 0, 25, 33, 27, 0, 0, 0,
239 0, 0, 38, 40, 42, 44, 0, 45, 46, 47,
240 48, 34, 53, 51, 0, 52, 0, 54, 62, 53,
241 51, 0, 52, 0, 54, 0, 21, 19, 0, 20,
242 0, 22, 0, 0, 0, 0, 0, 0, 0, 0,
243 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
244 0, 0, 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, 1, 2, 3, 4, 13,
249 static const YYINT varsyntax_calc1_check[] = { 40,
250 10, 10, 40, 0, 45, 40, 10, 45, 5, 6,
251 45, 10, 61, 61, 11, 41, 42, 43, 44, 45,
252 -1, 47, 19, 20, 21, 22, 10, -1, -1, -1,
253 42, 41, 29, 30, 10, 47, -1, 41, 35, 43,
254 10, 45, -1, 42, 43, -1, 45, 10, 47, -1,
255 -1, -1, -1, 10, 51, 52, 53, 54, 42, 43,
256 10, 45, -1, 47, -1, 10, 42, 43, -1, 45,
257 10, 47, 42, 43, -1, 45, 10, 47, 42, 42,
258 43, 10, 45, 47, 47, 42, 43, 10, 45, -1,
259 47, 41, 10, 43, 44, 45, 41, -1, 43, 44,
260 45, 41, -1, 43, -1, 45, -1, 41, -1, 43,
261 42, 45, 41, -1, 43, 47, 45, -1, 41, -1,
262 43, -1, 45, 41, -1, 43, -1, 45, 5, 6,
263 41, 42, 43, -1, 45, 12, 47, -1, -1, -1,
264 -1, -1, 19, 20, 21, 22, -1, 24, 25, 26,
265 27, 41, 42, 43, -1, 45, -1, 47, 41, 42,
266 43, -1, 45, -1, 47, -1, 42, 43, -1, 45,
267 -1, 47, -1, -1, -1, -1, -1, -1, -1, -1,
268 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
269 -1, -1, -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, 256, 257, 258, 259, 257,
272 258, 259, 257, -1, 259,
278 #define YYMAXTOKEN 260
279 #define YYUNDFTOKEN 266
280 #define YYTRANSLATE(a) ((a) > YYMAXTOKEN ? YYUNDFTOKEN : (a))
282 static const char *const varsyntax_calc1_name[] = {
284 "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,
285 0,0,0,0,0,0,0,0,0,"'('","')'","'*'","'+'","','","'-'",0,"'/'",0,0,0,0,0,0,0,0,0,
286 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,
287 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,
288 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,
289 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,
290 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,
291 0,0,"DREG","VREG","CONST","UMINUS",0,0,0,0,0,"illegal-symbol",
293 static const char *const varsyntax_calc1_rule[] = {
296 "lines : lines line",
299 "line : DREG '=' dexp '\\n'",
300 "line : VREG '=' vexp '\\n'",
301 "line : error '\\n'",
304 "dexp : dexp '+' dexp",
305 "dexp : dexp '-' dexp",
306 "dexp : dexp '*' dexp",
307 "dexp : dexp '/' dexp",
309 "dexp : '(' dexp ')'",
311 "vexp : '(' dexp ',' dexp ')'",
313 "vexp : vexp '+' vexp",
314 "vexp : dexp '+' vexp",
315 "vexp : vexp '-' vexp",
316 "vexp : dexp '-' vexp",
317 "vexp : vexp '*' vexp",
318 "vexp : dexp '*' vexp",
319 "vexp : vexp '/' vexp",
320 "vexp : dexp '/' vexp",
322 "vexp : '(' vexp ')'",
337 /* define the initial stack-sizes */
340 #define YYMAXDEPTH YYSTACKSIZE
343 #define YYSTACKSIZE YYMAXDEPTH
345 #define YYSTACKSIZE 10000
346 #define YYMAXDEPTH 10000
350 #define YYINITSTACKSIZE 200
360 /* variables for the parser stack */
361 static YYSTACKDATA yystack;
362 #line 178 "varsyntax_calc1.y"
363 /* beginning of subroutines section */
365 #define BSZ 50 /* buffer size for floating point numbers */
367 /* lexical analysis */
370 yyerror(const char *s)
372 fprintf(stderr, "%s\n", s);
380 while ((c = getchar()) == ' ')
381 { /* skip over blanks */
386 yylval.ival = c - 'A';
391 yylval.ival = c - 'a';
395 if (isdigit(c) || c == '.')
397 /* gobble up digits, points, exponents */
398 char buf[BSZ + 1], *cp = buf;
399 int dot = 0, expr = 0;
401 for (; (cp - buf) < BSZ; ++cp, c = getchar())
410 return ('.'); /* will cause syntax error */
417 return ('e'); /* will cause syntax error */
426 if ((cp - buf) >= BSZ)
427 printf("constant too long: truncated\n");
429 ungetc(c, stdin); /* push back last char read */
430 yylval.dval = atof(buf);
437 hilo(double a, double b, double c, double d)
439 /* returns the smallest interval containing a, b, c, and d */
440 /* used by *, / routines */
472 vmul(double a, double b, INTERVAL v)
474 return (hilo(a * v.hi, a * v.lo, b * v.hi, b * v.lo));
480 if (v.hi >= 0. && v.lo <= 0.)
482 printf("divisor interval contains 0.\n");
489 vdiv(double a, double b, INTERVAL v)
491 return (hilo(a / v.hi, a / v.lo, b / v.hi, b / v.lo));
493 #line 494 "varsyntax_calc1.tab.c"
496 #include <stdio.h> /* needed for printf */
499 #include <stdlib.h> /* needed for malloc, etc */
500 #include <string.h> /* needed for memset */
502 /* allocate initial stack or double stack size, up to YYMAXDEPTH */
503 static int yygrowstack(YYSTACKDATA *data)
510 if ((newsize = data->stacksize) == 0)
511 newsize = YYINITSTACKSIZE;
512 else if (newsize >= YYMAXDEPTH)
514 else if ((newsize *= 2) > YYMAXDEPTH)
515 newsize = YYMAXDEPTH;
517 i = (int) (data->s_mark - data->s_base);
518 newss = (YYINT *)realloc(data->s_base, newsize * sizeof(*newss));
522 data->s_base = newss;
523 data->s_mark = newss + i;
525 newvs = (YYSTYPE *)realloc(data->l_base, newsize * sizeof(*newvs));
529 data->l_base = newvs;
530 data->l_mark = newvs + i;
532 data->stacksize = newsize;
533 data->s_last = data->s_base + newsize - 1;
537 #if YYPURE || defined(YY_NO_LEAKS)
538 static void yyfreestack(YYSTACKDATA *data)
542 memset(data, 0, sizeof(*data));
545 #define yyfreestack(data) /* nothing */
548 #define YYABORT goto yyabort
549 #define YYREJECT goto yyabort
550 #define YYACCEPT goto yyaccept
551 #define YYERROR goto yyerrlab
556 int yym, yyn, yystate;
560 if ((yys = getenv("YYDEBUG")) != 0)
563 if (yyn >= '0' && yyn <= '9')
576 memset(&yystack, 0, sizeof(yystack));
579 if (yystack.s_base == NULL && yygrowstack(&yystack) == YYENOMEM) goto yyoverflow;
580 yystack.s_mark = yystack.s_base;
581 yystack.l_mark = yystack.l_base;
586 if ((yyn = yydefred[yystate]) != 0) goto yyreduce;
590 if (yychar < 0) yychar = YYEOF;
594 if ((yys = yyname[YYTRANSLATE(yychar)]) == NULL) yys = yyname[YYUNDFTOKEN];
595 printf("%sdebug: state %d, reading %d (%s)\n",
596 YYPREFIX, yystate, yychar, yys);
600 if (((yyn = yysindex[yystate]) != 0) && (yyn += yychar) >= 0 &&
601 yyn <= YYTABLESIZE && yycheck[yyn] == (YYINT) yychar)
605 printf("%sdebug: state %d, shifting to state %d\n",
606 YYPREFIX, yystate, yytable[yyn]);
608 if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack) == YYENOMEM) goto yyoverflow;
609 yystate = yytable[yyn];
610 *++yystack.s_mark = yytable[yyn];
611 *++yystack.l_mark = yylval;
613 if (yyerrflag > 0) --yyerrflag;
616 if (((yyn = yyrindex[yystate]) != 0) && (yyn += yychar) >= 0 &&
617 yyn <= YYTABLESIZE && yycheck[yyn] == (YYINT) yychar)
622 if (yyerrflag != 0) goto yyinrecovery;
624 YYERROR_CALL("syntax error");
626 goto yyerrlab; /* redundant goto avoids 'unused label' warning */
636 if (((yyn = yysindex[*yystack.s_mark]) != 0) && (yyn += YYERRCODE) >= 0 &&
637 yyn <= YYTABLESIZE && yycheck[yyn] == (YYINT) YYERRCODE)
641 printf("%sdebug: state %d, error recovery shifting\
642 to state %d\n", YYPREFIX, *yystack.s_mark, yytable[yyn]);
644 if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack) == YYENOMEM) goto yyoverflow;
645 yystate = yytable[yyn];
646 *++yystack.s_mark = yytable[yyn];
647 *++yystack.l_mark = yylval;
654 printf("%sdebug: error recovery discarding state %d\n",
655 YYPREFIX, *yystack.s_mark);
657 if (yystack.s_mark <= yystack.s_base) goto yyabort;
665 if (yychar == YYEOF) goto yyabort;
669 if ((yys = yyname[YYTRANSLATE(yychar)]) == NULL) yys = yyname[YYUNDFTOKEN];
670 printf("%sdebug: state %d, error recovery discards token %d (%s)\n",
671 YYPREFIX, yystate, yychar, yys);
681 printf("%sdebug: state %d, reducing by rule %d (%s)\n",
682 YYPREFIX, yystate, yyn, yyrule[yyn]);
686 yyval = yystack.l_mark[1-yym];
688 memset(&yyval, 0, sizeof yyval);
693 #line 59 "varsyntax_calc1.y"
695 (void) printf("%15.8f\n", yystack.l_mark[-1].dval);
699 #line 63 "varsyntax_calc1.y"
701 (void) printf("(%15.8f, %15.8f)\n", yystack.l_mark[-1].vval.lo, yystack.l_mark[-1].vval.hi);
705 #line 67 "varsyntax_calc1.y"
707 dreg[yystack.l_mark[-3].ival] = yystack.l_mark[-1].dval;
711 #line 71 "varsyntax_calc1.y"
713 vreg[yystack.l_mark[-3].ival] = yystack.l_mark[-1].vval;
717 #line 75 "varsyntax_calc1.y"
723 #line 82 "varsyntax_calc1.y"
725 yyval.dval = dreg[yystack.l_mark[0].ival]; /* $$ & $1 are sufficient here*/
729 #line 86 "varsyntax_calc1.y"
731 yyval.dval = yystack.l_mark[-2].dval + yystack.l_mark[0].dval;
735 #line 90 "varsyntax_calc1.y"
737 yyval.dval = yystack.l_mark[-2].dval - yystack.l_mark[0].dval;
741 #line 94 "varsyntax_calc1.y"
743 yyval.dval = yystack.l_mark[-2].dval * yystack.l_mark[0].dval;
747 #line 98 "varsyntax_calc1.y"
749 yyval.dval = yystack.l_mark[-2].dval / yystack.l_mark[0].dval;
753 #line 102 "varsyntax_calc1.y"
755 yyval.dval = -yystack.l_mark[0].dval;
759 #line 106 "varsyntax_calc1.y"
761 yyval.dval = yystack.l_mark[-1].dval;
765 #line 112 "varsyntax_calc1.y"
767 yyval.vval.hi = yyval.vval.lo = yystack.l_mark[0].dval;
771 #line 116 "varsyntax_calc1.y"
773 yyval.vval.lo = yystack.l_mark[-3].dval;
774 yyval.vval.hi = yystack.l_mark[-1].dval;
775 if ( yyval.vval.lo > yyval.vval.hi )
777 (void) printf("interval out of order\n");
783 #line 126 "varsyntax_calc1.y"
785 yyval.vval = vreg[yystack.l_mark[0].ival];
789 #line 130 "varsyntax_calc1.y"
791 yyval.vval.hi = yystack.l_mark[-2].vval.hi + yystack.l_mark[0].vval.hi;
792 yyval.vval.lo = yystack.l_mark[-2].vval.lo + yystack.l_mark[0].vval.lo;
796 #line 135 "varsyntax_calc1.y"
798 yyval.vval.hi = yystack.l_mark[-2].dval + yystack.l_mark[0].vval.hi;
799 yyval.vval.lo = yystack.l_mark[-2].dval + yystack.l_mark[0].vval.lo;
803 #line 140 "varsyntax_calc1.y"
805 yyval.vval.hi = yystack.l_mark[-2].vval.hi - yystack.l_mark[0].vval.lo;
806 yyval.vval.lo = yystack.l_mark[-2].vval.lo - yystack.l_mark[0].vval.hi;
810 #line 145 "varsyntax_calc1.y"
812 yyval.vval.hi = yystack.l_mark[-2].dval - yystack.l_mark[0].vval.lo;
813 yyval.vval.lo = yystack.l_mark[-2].dval - yystack.l_mark[0].vval.hi;
817 #line 150 "varsyntax_calc1.y"
819 yyval.vval = vmul( yystack.l_mark[-2].vval.lo, yystack.l_mark[-2].vval.hi, yystack.l_mark[0].vval );
823 #line 154 "varsyntax_calc1.y"
825 yyval.vval = vmul (yystack.l_mark[-2].dval, yystack.l_mark[-2].dval, yystack.l_mark[0].vval );
829 #line 158 "varsyntax_calc1.y"
831 if (dcheck(yystack.l_mark[0].vval)) YYERROR;
832 yyval.vval = vdiv ( yystack.l_mark[-2].vval.lo, yystack.l_mark[-2].vval.hi, yystack.l_mark[0].vval );
836 #line 163 "varsyntax_calc1.y"
838 if (dcheck ( yystack.l_mark[0].vval )) YYERROR;
839 yyval.vval = vdiv (yystack.l_mark[-2].dval, yystack.l_mark[-2].dval, yystack.l_mark[0].vval );
843 #line 168 "varsyntax_calc1.y"
845 yyval.vval.hi = -yystack.l_mark[0].vval.lo;
846 yyval.vval.lo = -yystack.l_mark[0].vval.hi;
850 #line 173 "varsyntax_calc1.y"
852 yyval.vval = yystack.l_mark[-1].vval;
855 #line 856 "varsyntax_calc1.tab.c"
857 yystack.s_mark -= yym;
858 yystate = *yystack.s_mark;
859 yystack.l_mark -= yym;
861 if (yystate == 0 && yym == 0)
865 printf("%sdebug: after reduction, shifting from state 0 to\
866 state %d\n", YYPREFIX, YYFINAL);
869 *++yystack.s_mark = YYFINAL;
870 *++yystack.l_mark = yyval;
874 if (yychar < 0) yychar = YYEOF;
878 if ((yys = yyname[YYTRANSLATE(yychar)]) == NULL) yys = yyname[YYUNDFTOKEN];
879 printf("%sdebug: state %d, reading %d (%s)\n",
880 YYPREFIX, YYFINAL, yychar, yys);
884 if (yychar == YYEOF) goto yyaccept;
887 if (((yyn = yygindex[yym]) != 0) && (yyn += yystate) >= 0 &&
888 yyn <= YYTABLESIZE && yycheck[yyn] == (YYINT) yystate)
889 yystate = yytable[yyn];
891 yystate = yydgoto[yym];
894 printf("%sdebug: after reduction, shifting from state %d \
895 to state %d\n", YYPREFIX, *yystack.s_mark, yystate);
897 if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack) == YYENOMEM) goto yyoverflow;
898 *++yystack.s_mark = (YYINT) yystate;
899 *++yystack.l_mark = yyval;
903 YYERROR_CALL("yacc stack overflow");
906 yyfreestack(&yystack);
910 yyfreestack(&yystack);