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 ')'",
334 /* define the initial stack-sizes */
337 #define YYMAXDEPTH YYSTACKSIZE
340 #define YYSTACKSIZE YYMAXDEPTH
342 #define YYSTACKSIZE 10000
343 #define YYMAXDEPTH 10000
347 #define YYINITSTACKSIZE 200
357 /* variables for the parser stack */
358 static YYSTACKDATA yystack;
360 /* beginning of subroutines section */
362 #define BSZ 50 /* buffer size for floating point numbers */
364 /* lexical analysis */
367 yyerror(const char *s)
369 fprintf(stderr, "%s\n", s);
377 while ((c = getchar()) == ' ')
378 { /* skip over blanks */
383 yylval.ival = c - 'A';
388 yylval.ival = c - 'a';
392 if (isdigit(c) || c == '.')
394 /* gobble up digits, points, exponents */
395 char buf[BSZ + 1], *cp = buf;
396 int dot = 0, expr = 0;
398 for (; (cp - buf) < BSZ; ++cp, c = getchar())
407 return ('.'); /* will cause syntax error */
414 return ('e'); /* will cause syntax error */
423 if ((cp - buf) >= BSZ)
424 printf("constant too long: truncated\n");
426 ungetc(c, stdin); /* push back last char read */
427 yylval.dval = atof(buf);
434 hilo(double a, double b, double c, double d)
436 /* returns the smallest interval containing a, b, c, and d */
437 /* used by *, / routines */
469 vmul(double a, double b, INTERVAL v)
471 return (hilo(a * v.hi, a * v.lo, b * v.hi, b * v.lo));
477 if (v.hi >= 0. && v.lo <= 0.)
479 printf("divisor interval contains 0.\n");
486 vdiv(double a, double b, INTERVAL v)
488 return (hilo(a / v.hi, a / v.lo, b / v.hi, b / v.lo));
490 #line 491 "calc1.tab.c"
493 #include <stdio.h> /* needed for printf */
496 #include <stdlib.h> /* needed for malloc, etc */
497 #include <string.h> /* needed for memset */
499 /* allocate initial stack or double stack size, up to YYMAXDEPTH */
500 static int yygrowstack(YYSTACKDATA *data)
507 if ((newsize = data->stacksize) == 0)
508 newsize = YYINITSTACKSIZE;
509 else if (newsize >= YYMAXDEPTH)
511 else if ((newsize *= 2) > YYMAXDEPTH)
512 newsize = YYMAXDEPTH;
514 i = (int) (data->s_mark - data->s_base);
515 newss = (YYINT *)realloc(data->s_base, newsize * sizeof(*newss));
519 data->s_base = newss;
520 data->s_mark = newss + i;
522 newvs = (YYSTYPE *)realloc(data->l_base, newsize * sizeof(*newvs));
526 data->l_base = newvs;
527 data->l_mark = newvs + i;
529 data->stacksize = newsize;
530 data->s_last = data->s_base + newsize - 1;
534 #if YYPURE || defined(YY_NO_LEAKS)
535 static void yyfreestack(YYSTACKDATA *data)
539 memset(data, 0, sizeof(*data));
542 #define yyfreestack(data) /* nothing */
545 #define YYABORT goto yyabort
546 #define YYREJECT goto yyabort
547 #define YYACCEPT goto yyaccept
548 #define YYERROR goto yyerrlab
553 int yym, yyn, yystate;
557 if ((yys = getenv("YYDEBUG")) != 0)
560 if (yyn >= '0' && yyn <= '9')
573 memset(&yystack, 0, sizeof(yystack));
576 if (yystack.s_base == NULL && yygrowstack(&yystack) == YYENOMEM) goto yyoverflow;
577 yystack.s_mark = yystack.s_base;
578 yystack.l_mark = yystack.l_base;
583 if ((yyn = yydefred[yystate]) != 0) goto yyreduce;
587 if (yychar < 0) yychar = YYEOF;
591 if ((yys = yyname[YYTRANSLATE(yychar)]) == NULL) yys = yyname[YYUNDFTOKEN];
592 printf("%sdebug: state %d, reading %d (%s)\n",
593 YYPREFIX, yystate, yychar, yys);
597 if (((yyn = yysindex[yystate]) != 0) && (yyn += yychar) >= 0 &&
598 yyn <= YYTABLESIZE && yycheck[yyn] == (YYINT) yychar)
602 printf("%sdebug: state %d, shifting to state %d\n",
603 YYPREFIX, yystate, yytable[yyn]);
605 if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack) == YYENOMEM) goto yyoverflow;
606 yystate = yytable[yyn];
607 *++yystack.s_mark = yytable[yyn];
608 *++yystack.l_mark = yylval;
610 if (yyerrflag > 0) --yyerrflag;
613 if (((yyn = yyrindex[yystate]) != 0) && (yyn += yychar) >= 0 &&
614 yyn <= YYTABLESIZE && yycheck[yyn] == (YYINT) yychar)
619 if (yyerrflag != 0) goto yyinrecovery;
621 YYERROR_CALL("syntax error");
623 goto yyerrlab; /* redundant goto avoids 'unused label' warning */
633 if (((yyn = yysindex[*yystack.s_mark]) != 0) && (yyn += YYERRCODE) >= 0 &&
634 yyn <= YYTABLESIZE && yycheck[yyn] == (YYINT) YYERRCODE)
638 printf("%sdebug: state %d, error recovery shifting\
639 to state %d\n", YYPREFIX, *yystack.s_mark, yytable[yyn]);
641 if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack) == YYENOMEM) goto yyoverflow;
642 yystate = yytable[yyn];
643 *++yystack.s_mark = yytable[yyn];
644 *++yystack.l_mark = yylval;
651 printf("%sdebug: error recovery discarding state %d\n",
652 YYPREFIX, *yystack.s_mark);
654 if (yystack.s_mark <= yystack.s_base) goto yyabort;
662 if (yychar == YYEOF) goto yyabort;
666 if ((yys = yyname[YYTRANSLATE(yychar)]) == NULL) yys = yyname[YYUNDFTOKEN];
667 printf("%sdebug: state %d, error recovery discards token %d (%s)\n",
668 YYPREFIX, yystate, yychar, yys);
678 printf("%sdebug: state %d, reducing by rule %d (%s)\n",
679 YYPREFIX, yystate, yyn, yyrule[yyn]);
683 yyval = yystack.l_mark[1-yym];
685 memset(&yyval, 0, sizeof yyval);
692 (void) printf("%15.8f\n", yystack.l_mark[-1].dval);
698 (void) printf("(%15.8f, %15.8f)\n", yystack.l_mark[-1].vval.lo, yystack.l_mark[-1].vval.hi);
704 dreg[yystack.l_mark[-3].ival] = yystack.l_mark[-1].dval;
710 vreg[yystack.l_mark[-3].ival] = yystack.l_mark[-1].vval;
722 yyval.dval = dreg[yystack.l_mark[0].ival];
728 yyval.dval = yystack.l_mark[-2].dval + yystack.l_mark[0].dval;
734 yyval.dval = yystack.l_mark[-2].dval - yystack.l_mark[0].dval;
740 yyval.dval = yystack.l_mark[-2].dval * yystack.l_mark[0].dval;
746 yyval.dval = yystack.l_mark[-2].dval / yystack.l_mark[0].dval;
752 yyval.dval = -yystack.l_mark[0].dval;
758 yyval.dval = yystack.l_mark[-1].dval;
764 yyval.vval.hi = yyval.vval.lo = yystack.l_mark[0].dval;
770 yyval.vval.lo = yystack.l_mark[-3].dval;
771 yyval.vval.hi = yystack.l_mark[-1].dval;
772 if ( yyval.vval.lo > yyval.vval.hi )
774 (void) printf("interval out of order\n");
782 yyval.vval = vreg[yystack.l_mark[0].ival];
788 yyval.vval.hi = yystack.l_mark[-2].vval.hi + yystack.l_mark[0].vval.hi;
789 yyval.vval.lo = yystack.l_mark[-2].vval.lo + yystack.l_mark[0].vval.lo;
795 yyval.vval.hi = yystack.l_mark[-2].dval + yystack.l_mark[0].vval.hi;
796 yyval.vval.lo = yystack.l_mark[-2].dval + yystack.l_mark[0].vval.lo;
802 yyval.vval.hi = yystack.l_mark[-2].vval.hi - yystack.l_mark[0].vval.lo;
803 yyval.vval.lo = yystack.l_mark[-2].vval.lo - yystack.l_mark[0].vval.hi;
809 yyval.vval.hi = yystack.l_mark[-2].dval - yystack.l_mark[0].vval.lo;
810 yyval.vval.lo = yystack.l_mark[-2].dval - yystack.l_mark[0].vval.hi;
816 yyval.vval = vmul( yystack.l_mark[-2].vval.lo, yystack.l_mark[-2].vval.hi, yystack.l_mark[0].vval );
822 yyval.vval = vmul (yystack.l_mark[-2].dval, yystack.l_mark[-2].dval, yystack.l_mark[0].vval );
828 if (dcheck(yystack.l_mark[0].vval)) YYERROR;
829 yyval.vval = vdiv ( yystack.l_mark[-2].vval.lo, yystack.l_mark[-2].vval.hi, yystack.l_mark[0].vval );
835 if (dcheck ( yystack.l_mark[0].vval )) YYERROR;
836 yyval.vval = vdiv (yystack.l_mark[-2].dval, yystack.l_mark[-2].dval, yystack.l_mark[0].vval );
842 yyval.vval.hi = -yystack.l_mark[0].vval.lo;
843 yyval.vval.lo = -yystack.l_mark[0].vval.hi;
849 yyval.vval = yystack.l_mark[-1].vval;
852 #line 853 "calc1.tab.c"
854 yystack.s_mark -= yym;
855 yystate = *yystack.s_mark;
856 yystack.l_mark -= yym;
858 if (yystate == 0 && yym == 0)
862 printf("%sdebug: after reduction, shifting from state 0 to\
863 state %d\n", YYPREFIX, YYFINAL);
866 *++yystack.s_mark = YYFINAL;
867 *++yystack.l_mark = yyval;
871 if (yychar < 0) yychar = YYEOF;
875 if ((yys = yyname[YYTRANSLATE(yychar)]) == NULL) yys = yyname[YYUNDFTOKEN];
876 printf("%sdebug: state %d, reading %d (%s)\n",
877 YYPREFIX, YYFINAL, yychar, yys);
881 if (yychar == YYEOF) goto yyaccept;
884 if (((yyn = yygindex[yym]) != 0) && (yyn += yystate) >= 0 &&
885 yyn <= YYTABLESIZE && yycheck[yyn] == (YYINT) yystate)
886 yystate = yytable[yyn];
888 yystate = yydgoto[yym];
891 printf("%sdebug: after reduction, shifting from state %d \
892 to state %d\n", YYPREFIX, *yystack.s_mark, yystate);
894 if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack) == YYENOMEM) goto yyoverflow;
895 *++yystack.s_mark = (YYINT) yystate;
896 *++yystack.l_mark = yyval;
900 YYERROR_CALL("yacc stack overflow");
903 yyfreestack(&yystack);
907 yyfreestack(&yystack);