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)
18 #define yyparse calc1_parse
22 #define yylex calc1_lex
26 #define yyerror calc1_error
30 #define yychar calc1_char
34 #define yyval calc1_val
38 #define yylval calc1_lval
42 #define yydebug calc1_debug
46 #define yynerrs calc1_nerrs
50 #define yyerrflag calc1_errflag
51 #endif /* yyerrflag */
54 #define yylhs calc1_lhs
58 #define yylen calc1_len
62 #define yydefred calc1_defred
66 #define yydgoto calc1_dgoto
70 #define yysindex calc1_sindex
74 #define yyrindex calc1_rindex
78 #define yygindex calc1_gindex
82 #define yytable calc1_table
86 #define yycheck calc1_check
90 #define yyname calc1_name
94 #define yyrule calc1_rule
96 #define YYPREFIX "calc1_"
102 /* http://dinosaur.compilertools.net/yacc/index.html */
109 typedef struct interval
115 INTERVAL vmul(double, double, INTERVAL);
116 INTERVAL vdiv(double, double, INTERVAL);
118 extern int yylex(void);
119 static void yyerror(const char *s);
121 int dcheck(INTERVAL);
127 #undef YYSTYPE_IS_DECLARED
128 #define YYSTYPE_IS_DECLARED 1
130 #ifndef YYSTYPE_IS_DECLARED
131 #define YYSTYPE_IS_DECLARED 1
139 #endif /* !YYSTYPE_IS_DECLARED */
140 #line 141 "calc1.tab.c"
142 /* compatibility with bison */
144 /* compatibility with FreeBSD */
145 # ifdef YYPARSE_PARAM_TYPE
146 # define YYPARSE_DECL() yyparse(YYPARSE_PARAM_TYPE YYPARSE_PARAM)
148 # define YYPARSE_DECL() yyparse(void *YYPARSE_PARAM)
151 # define YYPARSE_DECL() yyparse(void)
154 /* Parameters sent to lex. */
156 # define YYLEX_DECL() yylex(void *YYLEX_PARAM)
157 # define YYLEX yylex(YYLEX_PARAM)
159 # define YYLEX_DECL() yylex(void)
160 # define YYLEX yylex()
163 /* Parameters sent to yyerror. */
165 #define YYERROR_DECL() yyerror(const char *s)
168 #define YYERROR_CALL(msg) yyerror(msg)
171 extern int YYPARSE_DECL();
177 #define YYERRCODE 256
179 static const YYINT calc1_lhs[] = { -1,
180 3, 3, 0, 0, 0, 0, 0, 1, 1, 1,
181 1, 1, 1, 1, 1, 2, 2, 2, 2, 2,
182 2, 2, 2, 2, 2, 2, 2, 2,
184 static const YYINT calc1_len[] = { 2,
185 0, 2, 2, 2, 4, 4, 2, 1, 1, 3,
186 3, 3, 3, 2, 3, 1, 5, 1, 3, 3,
187 3, 3, 3, 3, 3, 3, 2, 3,
189 static const YYINT calc1_defred[] = { 0,
190 0, 0, 0, 8, 0, 0, 0, 0, 0, 7,
191 0, 0, 9, 18, 14, 27, 0, 0, 0, 0,
192 0, 0, 3, 0, 0, 0, 0, 4, 0, 0,
193 0, 0, 0, 15, 0, 28, 0, 0, 0, 0,
194 12, 24, 13, 26, 0, 0, 23, 25, 14, 0,
195 0, 0, 0, 0, 5, 6, 0, 0, 0, 12,
198 static const YYINT calc1_dgoto[] = { 7,
201 static const YYINT calc1_sindex[] = { -40,
202 -8, -48, -47, 0, -37, -37, 0, 2, 17, 0,
203 -34, -37, 0, 0, 0, 0, -25, 90, -37, -37,
204 -37, -37, 0, -37, -37, -37, -37, 0, -34, -34,
205 25, 125, 31, 0, -34, 0, -11, 37, -11, 37,
206 0, 0, 0, 0, 37, 37, 0, 0, 0, 111,
207 -34, -34, -34, -34, 0, 0, 118, 69, 69, 0,
210 static const YYINT calc1_rindex[] = { 0,
211 0, 38, 44, 0, 0, 0, 0, 0, 0, 0,
212 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
213 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
214 0, -9, 0, 0, 0, 0, 51, -3, 56, 61,
215 0, 0, 0, 0, 67, 72, 0, 0, 0, 0,
216 0, 0, 0, 0, 0, 0, 0, 78, 83, 0,
219 static const YYINT calc1_gindex[] = { 0,
222 #define YYTABLESIZE 225
223 static const YYINT calc1_table[] = { 6,
224 16, 10, 6, 8, 5, 30, 20, 5, 15, 17,
225 29, 23, 11, 12, 31, 34, 21, 19, 35, 20,
226 0, 22, 37, 39, 41, 43, 28, 0, 0, 0,
227 21, 16, 49, 50, 55, 22, 0, 20, 57, 20,
228 56, 20, 0, 21, 19, 0, 20, 9, 22, 0,
229 0, 0, 0, 18, 58, 59, 60, 61, 26, 24,
230 10, 25, 0, 27, 0, 11, 53, 51, 0, 52,
231 22, 54, 26, 24, 0, 25, 19, 27, 26, 9,
232 9, 21, 9, 27, 9, 18, 18, 10, 18, 0,
233 18, 10, 11, 10, 10, 10, 11, 0, 11, 11,
234 11, 22, 0, 22, 0, 22, 0, 19, 0, 19,
235 53, 19, 21, 0, 21, 54, 21, 0, 10, 0,
236 10, 0, 10, 11, 0, 11, 0, 11, 16, 18,
237 36, 26, 24, 0, 25, 33, 27, 0, 0, 0,
238 0, 0, 38, 40, 42, 44, 0, 45, 46, 47,
239 48, 34, 53, 51, 0, 52, 0, 54, 62, 53,
240 51, 0, 52, 0, 54, 0, 21, 19, 0, 20,
241 0, 22, 0, 0, 0, 0, 0, 0, 0, 0,
242 0, 0, 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, 1, 2, 3, 4, 13,
248 static const YYINT calc1_check[] = { 40,
249 10, 10, 40, 0, 45, 40, 10, 45, 5, 6,
250 45, 10, 61, 61, 11, 41, 42, 43, 44, 45,
251 -1, 47, 19, 20, 21, 22, 10, -1, -1, -1,
252 42, 41, 29, 30, 10, 47, -1, 41, 35, 43,
253 10, 45, -1, 42, 43, -1, 45, 10, 47, -1,
254 -1, -1, -1, 10, 51, 52, 53, 54, 42, 43,
255 10, 45, -1, 47, -1, 10, 42, 43, -1, 45,
256 10, 47, 42, 43, -1, 45, 10, 47, 42, 42,
257 43, 10, 45, 47, 47, 42, 43, 10, 45, -1,
258 47, 41, 10, 43, 44, 45, 41, -1, 43, 44,
259 45, 41, -1, 43, -1, 45, -1, 41, -1, 43,
260 42, 45, 41, -1, 43, 47, 45, -1, 41, -1,
261 43, -1, 45, 41, -1, 43, -1, 45, 5, 6,
262 41, 42, 43, -1, 45, 12, 47, -1, -1, -1,
263 -1, -1, 19, 20, 21, 22, -1, 24, 25, 26,
264 27, 41, 42, 43, -1, 45, -1, 47, 41, 42,
265 43, -1, 45, -1, 47, -1, 42, 43, -1, 45,
266 -1, 47, -1, -1, -1, -1, -1, -1, -1, -1,
267 -1, -1, -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, 256, 257, 258, 259, 257,
271 258, 259, 257, -1, 259,
277 #define YYMAXTOKEN 260
278 #define YYUNDFTOKEN 266
279 #define YYTRANSLATE(a) ((a) > YYMAXTOKEN ? YYUNDFTOKEN : (a))
281 static const char *const calc1_name[] = {
283 "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,
284 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,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,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,"DREG","VREG","CONST","UMINUS",0,0,0,0,0,"illegal-symbol",
292 static const char *const calc1_rule[] = {
295 "lines : lines line",
298 "line : DREG '=' dexp '\\n'",
299 "line : VREG '=' vexp '\\n'",
300 "line : error '\\n'",
303 "dexp : dexp '+' dexp",
304 "dexp : dexp '-' dexp",
305 "dexp : dexp '*' dexp",
306 "dexp : dexp '/' dexp",
308 "dexp : '(' dexp ')'",
310 "vexp : '(' dexp ',' dexp ')'",
312 "vexp : vexp '+' vexp",
313 "vexp : dexp '+' vexp",
314 "vexp : vexp '-' vexp",
315 "vexp : dexp '-' vexp",
316 "vexp : vexp '*' vexp",
317 "vexp : dexp '*' vexp",
318 "vexp : vexp '/' vexp",
319 "vexp : dexp '/' vexp",
321 "vexp : '(' vexp ')'",
336 /* define the initial stack-sizes */
339 #define YYMAXDEPTH YYSTACKSIZE
342 #define YYSTACKSIZE YYMAXDEPTH
344 #define YYSTACKSIZE 10000
345 #define YYMAXDEPTH 10000
349 #define YYINITSTACKSIZE 200
359 /* variables for the parser stack */
360 static YYSTACKDATA yystack;
362 /* beginning of subroutines section */
364 #define BSZ 50 /* buffer size for floating point numbers */
366 /* lexical analysis */
369 yyerror(const char *s)
371 fprintf(stderr, "%s\n", s);
379 while ((c = getchar()) == ' ')
380 { /* skip over blanks */
385 yylval.ival = c - 'A';
390 yylval.ival = c - 'a';
394 if (isdigit(c) || c == '.')
396 /* gobble up digits, points, exponents */
397 char buf[BSZ + 1], *cp = buf;
398 int dot = 0, expr = 0;
400 for (; (cp - buf) < BSZ; ++cp, c = getchar())
409 return ('.'); /* will cause syntax error */
416 return ('e'); /* will cause syntax error */
425 if ((cp - buf) >= BSZ)
426 printf("constant too long: truncated\n");
428 ungetc(c, stdin); /* push back last char read */
429 yylval.dval = atof(buf);
436 hilo(double a, double b, double c, double d)
438 /* returns the smallest interval containing a, b, c, and d */
439 /* used by *, / routines */
471 vmul(double a, double b, INTERVAL v)
473 return (hilo(a * v.hi, a * v.lo, b * v.hi, b * v.lo));
479 if (v.hi >= 0. && v.lo <= 0.)
481 printf("divisor interval contains 0.\n");
488 vdiv(double a, double b, INTERVAL v)
490 return (hilo(a / v.hi, a / v.lo, b / v.hi, b / v.lo));
492 #line 493 "calc1.tab.c"
495 #include <stdio.h> /* needed for printf */
498 #include <stdlib.h> /* needed for malloc, etc */
499 #include <string.h> /* needed for memset */
501 /* allocate initial stack or double stack size, up to YYMAXDEPTH */
502 static int yygrowstack(YYSTACKDATA *data)
509 if ((newsize = data->stacksize) == 0)
510 newsize = YYINITSTACKSIZE;
511 else if (newsize >= YYMAXDEPTH)
513 else if ((newsize *= 2) > YYMAXDEPTH)
514 newsize = YYMAXDEPTH;
516 i = (int) (data->s_mark - data->s_base);
517 newss = (YYINT *)realloc(data->s_base, newsize * sizeof(*newss));
521 data->s_base = newss;
522 data->s_mark = newss + i;
524 newvs = (YYSTYPE *)realloc(data->l_base, newsize * sizeof(*newvs));
528 data->l_base = newvs;
529 data->l_mark = newvs + i;
531 data->stacksize = newsize;
532 data->s_last = data->s_base + newsize - 1;
536 #if YYPURE || defined(YY_NO_LEAKS)
537 static void yyfreestack(YYSTACKDATA *data)
541 memset(data, 0, sizeof(*data));
544 #define yyfreestack(data) /* nothing */
547 #define YYABORT goto yyabort
548 #define YYREJECT goto yyabort
549 #define YYACCEPT goto yyaccept
550 #define YYERROR goto yyerrlab
555 int yym, yyn, yystate;
559 if ((yys = getenv("YYDEBUG")) != NULL)
562 if (yyn >= '0' && yyn <= '9')
575 memset(&yystack, 0, sizeof(yystack));
578 if (yystack.s_base == NULL && yygrowstack(&yystack) == YYENOMEM) goto yyoverflow;
579 yystack.s_mark = yystack.s_base;
580 yystack.l_mark = yystack.l_base;
585 if ((yyn = yydefred[yystate]) != 0) goto yyreduce;
589 if (yychar < 0) yychar = YYEOF;
593 if ((yys = yyname[YYTRANSLATE(yychar)]) == NULL) yys = yyname[YYUNDFTOKEN];
594 printf("%sdebug: state %d, reading %d (%s)\n",
595 YYPREFIX, yystate, yychar, yys);
599 if (((yyn = yysindex[yystate]) != 0) && (yyn += yychar) >= 0 &&
600 yyn <= YYTABLESIZE && yycheck[yyn] == (YYINT) yychar)
604 printf("%sdebug: state %d, shifting to state %d\n",
605 YYPREFIX, yystate, yytable[yyn]);
607 if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack) == YYENOMEM) goto yyoverflow;
608 yystate = yytable[yyn];
609 *++yystack.s_mark = yytable[yyn];
610 *++yystack.l_mark = yylval;
612 if (yyerrflag > 0) --yyerrflag;
615 if (((yyn = yyrindex[yystate]) != 0) && (yyn += yychar) >= 0 &&
616 yyn <= YYTABLESIZE && yycheck[yyn] == (YYINT) yychar)
621 if (yyerrflag != 0) goto yyinrecovery;
623 YYERROR_CALL("syntax error");
625 goto yyerrlab; /* redundant goto avoids 'unused label' warning */
635 if (((yyn = yysindex[*yystack.s_mark]) != 0) && (yyn += YYERRCODE) >= 0 &&
636 yyn <= YYTABLESIZE && yycheck[yyn] == (YYINT) YYERRCODE)
640 printf("%sdebug: state %d, error recovery shifting\
641 to state %d\n", YYPREFIX, *yystack.s_mark, yytable[yyn]);
643 if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack) == YYENOMEM) goto yyoverflow;
644 yystate = yytable[yyn];
645 *++yystack.s_mark = yytable[yyn];
646 *++yystack.l_mark = yylval;
653 printf("%sdebug: error recovery discarding state %d\n",
654 YYPREFIX, *yystack.s_mark);
656 if (yystack.s_mark <= yystack.s_base) goto yyabort;
664 if (yychar == YYEOF) goto yyabort;
668 if ((yys = yyname[YYTRANSLATE(yychar)]) == NULL) yys = yyname[YYUNDFTOKEN];
669 printf("%sdebug: state %d, error recovery discards token %d (%s)\n",
670 YYPREFIX, yystate, yychar, yys);
680 printf("%sdebug: state %d, reducing by rule %d (%s)\n",
681 YYPREFIX, yystate, yyn, yyrule[yyn]);
685 yyval = yystack.l_mark[1-yym];
687 memset(&yyval, 0, sizeof yyval);
694 (void) printf("%15.8f\n", yystack.l_mark[-1].dval);
700 (void) printf("(%15.8f, %15.8f)\n", yystack.l_mark[-1].vval.lo, yystack.l_mark[-1].vval.hi);
706 dreg[yystack.l_mark[-3].ival] = yystack.l_mark[-1].dval;
712 vreg[yystack.l_mark[-3].ival] = yystack.l_mark[-1].vval;
724 yyval.dval = dreg[yystack.l_mark[0].ival];
730 yyval.dval = yystack.l_mark[-2].dval + yystack.l_mark[0].dval;
736 yyval.dval = yystack.l_mark[-2].dval - yystack.l_mark[0].dval;
742 yyval.dval = yystack.l_mark[-2].dval * yystack.l_mark[0].dval;
748 yyval.dval = yystack.l_mark[-2].dval / yystack.l_mark[0].dval;
754 yyval.dval = -yystack.l_mark[0].dval;
760 yyval.dval = yystack.l_mark[-1].dval;
766 yyval.vval.hi = yyval.vval.lo = yystack.l_mark[0].dval;
772 yyval.vval.lo = yystack.l_mark[-3].dval;
773 yyval.vval.hi = yystack.l_mark[-1].dval;
774 if ( yyval.vval.lo > yyval.vval.hi )
776 (void) printf("interval out of order\n");
784 yyval.vval = vreg[yystack.l_mark[0].ival];
790 yyval.vval.hi = yystack.l_mark[-2].vval.hi + yystack.l_mark[0].vval.hi;
791 yyval.vval.lo = yystack.l_mark[-2].vval.lo + yystack.l_mark[0].vval.lo;
797 yyval.vval.hi = yystack.l_mark[-2].dval + yystack.l_mark[0].vval.hi;
798 yyval.vval.lo = yystack.l_mark[-2].dval + yystack.l_mark[0].vval.lo;
804 yyval.vval.hi = yystack.l_mark[-2].vval.hi - yystack.l_mark[0].vval.lo;
805 yyval.vval.lo = yystack.l_mark[-2].vval.lo - yystack.l_mark[0].vval.hi;
811 yyval.vval.hi = yystack.l_mark[-2].dval - yystack.l_mark[0].vval.lo;
812 yyval.vval.lo = yystack.l_mark[-2].dval - yystack.l_mark[0].vval.hi;
818 yyval.vval = vmul( yystack.l_mark[-2].vval.lo, yystack.l_mark[-2].vval.hi, yystack.l_mark[0].vval );
824 yyval.vval = vmul (yystack.l_mark[-2].dval, yystack.l_mark[-2].dval, yystack.l_mark[0].vval );
830 if (dcheck(yystack.l_mark[0].vval)) YYERROR;
831 yyval.vval = vdiv ( yystack.l_mark[-2].vval.lo, yystack.l_mark[-2].vval.hi, yystack.l_mark[0].vval );
837 if (dcheck ( yystack.l_mark[0].vval )) YYERROR;
838 yyval.vval = vdiv (yystack.l_mark[-2].dval, yystack.l_mark[-2].dval, yystack.l_mark[0].vval );
844 yyval.vval.hi = -yystack.l_mark[0].vval.lo;
845 yyval.vval.lo = -yystack.l_mark[0].vval.hi;
851 yyval.vval = yystack.l_mark[-1].vval;
854 #line 855 "calc1.tab.c"
856 yystack.s_mark -= yym;
857 yystate = *yystack.s_mark;
858 yystack.l_mark -= yym;
860 if (yystate == 0 && yym == 0)
864 printf("%sdebug: after reduction, shifting from state 0 to\
865 state %d\n", YYPREFIX, YYFINAL);
868 *++yystack.s_mark = YYFINAL;
869 *++yystack.l_mark = yyval;
873 if (yychar < 0) yychar = YYEOF;
877 if ((yys = yyname[YYTRANSLATE(yychar)]) == NULL) yys = yyname[YYUNDFTOKEN];
878 printf("%sdebug: state %d, reading %d (%s)\n",
879 YYPREFIX, YYFINAL, yychar, yys);
883 if (yychar == YYEOF) goto yyaccept;
886 if (((yyn = yygindex[yym]) != 0) && (yyn += yystate) >= 0 &&
887 yyn <= YYTABLESIZE && yycheck[yyn] == (YYINT) yystate)
888 yystate = yytable[yyn];
890 yystate = yydgoto[yym];
893 printf("%sdebug: after reduction, shifting from state %d \
894 to state %d\n", YYPREFIX, *yystack.s_mark, yystate);
896 if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack) == YYENOMEM) goto yyoverflow;
897 *++yystack.s_mark = (YYINT) yystate;
898 *++yystack.l_mark = yyval;
902 YYERROR_CALL("yacc stack overflow");
905 yyfreestack(&yystack);
909 yyfreestack(&yystack);