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);
128 #undef YYSTYPE_IS_DECLARED
129 #define YYSTYPE_IS_DECLARED 1
131 #ifndef YYSTYPE_IS_DECLARED
132 #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')
571 memset(&yystack, 0, sizeof(yystack));
574 if (yystack.s_base == NULL && yygrowstack(&yystack) == YYENOMEM) goto yyoverflow;
575 yystack.s_mark = yystack.s_base;
576 yystack.l_mark = yystack.l_base;
581 if ((yyn = yydefred[yystate]) != 0) goto yyreduce;
584 if ((yychar = YYLEX) < 0) yychar = YYEOF;
588 yys = yyname[YYTRANSLATE(yychar)];
589 printf("%sdebug: state %d, reading %d (%s)\n",
590 YYPREFIX, yystate, yychar, yys);
594 if ((yyn = yysindex[yystate]) && (yyn += yychar) >= 0 &&
595 yyn <= YYTABLESIZE && yycheck[yyn] == yychar)
599 printf("%sdebug: state %d, shifting to state %d\n",
600 YYPREFIX, yystate, yytable[yyn]);
602 if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack) == YYENOMEM)
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]) && (yyn += yychar) >= 0 &&
614 yyn <= YYTABLESIZE && yycheck[yyn] == yychar)
619 if (yyerrflag) goto yyinrecovery;
621 YYERROR_CALL("syntax error");
634 if ((yyn = yysindex[*yystack.s_mark]) && (yyn += YYERRCODE) >= 0 &&
635 yyn <= YYTABLESIZE && yycheck[yyn] == YYERRCODE)
639 printf("%sdebug: state %d, error recovery shifting\
640 to state %d\n", YYPREFIX, *yystack.s_mark, yytable[yyn]);
642 if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack) == YYENOMEM)
646 yystate = yytable[yyn];
647 *++yystack.s_mark = yytable[yyn];
648 *++yystack.l_mark = yylval;
655 printf("%sdebug: error recovery discarding state %d\n",
656 YYPREFIX, *yystack.s_mark);
658 if (yystack.s_mark <= yystack.s_base) goto yyabort;
666 if (yychar == YYEOF) goto yyabort;
670 yys = yyname[YYTRANSLATE(yychar)];
671 printf("%sdebug: state %d, error recovery discards token %d (%s)\n",
672 YYPREFIX, yystate, yychar, yys);
682 printf("%sdebug: state %d, reducing by rule %d (%s)\n",
683 YYPREFIX, yystate, yyn, yyrule[yyn]);
687 yyval = yystack.l_mark[1-yym];
689 memset(&yyval, 0, sizeof yyval);
695 (void) printf("%15.8f\n", yystack.l_mark[-1].dval);
701 (void) printf("(%15.8f, %15.8f)\n", yystack.l_mark[-1].vval.lo, yystack.l_mark[-1].vval.hi);
707 dreg[yystack.l_mark[-3].ival] = yystack.l_mark[-1].dval;
713 vreg[yystack.l_mark[-3].ival] = yystack.l_mark[-1].vval;
725 yyval.dval = dreg[yystack.l_mark[0].ival];
731 yyval.dval = yystack.l_mark[-2].dval + yystack.l_mark[0].dval;
737 yyval.dval = yystack.l_mark[-2].dval - yystack.l_mark[0].dval;
743 yyval.dval = yystack.l_mark[-2].dval * yystack.l_mark[0].dval;
749 yyval.dval = yystack.l_mark[-2].dval / yystack.l_mark[0].dval;
755 yyval.dval = -yystack.l_mark[0].dval;
761 yyval.dval = yystack.l_mark[-1].dval;
767 yyval.vval.hi = yyval.vval.lo = yystack.l_mark[0].dval;
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");
785 yyval.vval = vreg[yystack.l_mark[0].ival];
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;
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;
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;
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;
819 yyval.vval = vmul( yystack.l_mark[-2].vval.lo, yystack.l_mark[-2].vval.hi, yystack.l_mark[0].vval );
825 yyval.vval = vmul (yystack.l_mark[-2].dval, yystack.l_mark[-2].dval, yystack.l_mark[0].vval );
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 );
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 );
845 yyval.vval.hi = -yystack.l_mark[0].vval.lo;
846 yyval.vval.lo = -yystack.l_mark[0].vval.hi;
852 yyval.vval = yystack.l_mark[-1].vval;
855 #line 856 "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;
873 if ((yychar = YYLEX) < 0) yychar = YYEOF;
877 yys = yyname[YYTRANSLATE(yychar)];
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]) && (yyn += yystate) >= 0 &&
887 yyn <= YYTABLESIZE && yycheck[yyn] == 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)
900 *++yystack.s_mark = (YYINT) yystate;
901 *++yystack.l_mark = yyval;
905 YYERROR_CALL("yacc stack overflow");
908 yyfreestack(&yystack);
912 yyfreestack(&yystack);