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 ')'",
335 /* define the initial stack-sizes */
338 #define YYMAXDEPTH YYSTACKSIZE
341 #define YYSTACKSIZE YYMAXDEPTH
343 #define YYSTACKSIZE 10000
344 #define YYMAXDEPTH 10000
348 #define YYINITSTACKSIZE 200
358 /* variables for the parser stack */
359 static YYSTACKDATA yystack;
360 #line 178 "varsyntax_calc1.y"
361 /* beginning of subroutines section */
363 #define BSZ 50 /* buffer size for floating point numbers */
365 /* lexical analysis */
368 yyerror(const char *s)
370 fprintf(stderr, "%s\n", s);
378 while ((c = getchar()) == ' ')
379 { /* skip over blanks */
384 yylval.ival = c - 'A';
389 yylval.ival = c - 'a';
393 if (isdigit(c) || c == '.')
395 /* gobble up digits, points, exponents */
396 char buf[BSZ + 1], *cp = buf;
397 int dot = 0, expr = 0;
399 for (; (cp - buf) < BSZ; ++cp, c = getchar())
408 return ('.'); /* will cause syntax error */
415 return ('e'); /* will cause syntax error */
424 if ((cp - buf) >= BSZ)
425 printf("constant too long: truncated\n");
427 ungetc(c, stdin); /* push back last char read */
428 yylval.dval = atof(buf);
435 hilo(double a, double b, double c, double d)
437 /* returns the smallest interval containing a, b, c, and d */
438 /* used by *, / routines */
470 vmul(double a, double b, INTERVAL v)
472 return (hilo(a * v.hi, a * v.lo, b * v.hi, b * v.lo));
478 if (v.hi >= 0. && v.lo <= 0.)
480 printf("divisor interval contains 0.\n");
487 vdiv(double a, double b, INTERVAL v)
489 return (hilo(a / v.hi, a / v.lo, b / v.hi, b / v.lo));
491 #line 492 "varsyntax_calc1.tab.c"
494 #include <stdio.h> /* needed for printf */
497 #include <stdlib.h> /* needed for malloc, etc */
498 #include <string.h> /* needed for memset */
500 /* allocate initial stack or double stack size, up to YYMAXDEPTH */
501 static int yygrowstack(YYSTACKDATA *data)
508 if ((newsize = data->stacksize) == 0)
509 newsize = YYINITSTACKSIZE;
510 else if (newsize >= YYMAXDEPTH)
512 else if ((newsize *= 2) > YYMAXDEPTH)
513 newsize = YYMAXDEPTH;
515 i = (int) (data->s_mark - data->s_base);
516 newss = (YYINT *)realloc(data->s_base, newsize * sizeof(*newss));
520 data->s_base = newss;
521 data->s_mark = newss + i;
523 newvs = (YYSTYPE *)realloc(data->l_base, newsize * sizeof(*newvs));
527 data->l_base = newvs;
528 data->l_mark = newvs + i;
530 data->stacksize = newsize;
531 data->s_last = data->s_base + newsize - 1;
535 #if YYPURE || defined(YY_NO_LEAKS)
536 static void yyfreestack(YYSTACKDATA *data)
540 memset(data, 0, sizeof(*data));
543 #define yyfreestack(data) /* nothing */
546 #define YYABORT goto yyabort
547 #define YYREJECT goto yyabort
548 #define YYACCEPT goto yyaccept
549 #define YYERROR goto yyerrlab
554 int yym, yyn, yystate;
558 if ((yys = getenv("YYDEBUG")) != 0)
561 if (yyn >= '0' && yyn <= '9')
574 memset(&yystack, 0, sizeof(yystack));
577 if (yystack.s_base == NULL && yygrowstack(&yystack) == YYENOMEM) goto yyoverflow;
578 yystack.s_mark = yystack.s_base;
579 yystack.l_mark = yystack.l_base;
584 if ((yyn = yydefred[yystate]) != 0) goto yyreduce;
588 if (yychar < 0) yychar = YYEOF;
592 if ((yys = yyname[YYTRANSLATE(yychar)]) == NULL) yys = yyname[YYUNDFTOKEN];
593 printf("%sdebug: state %d, reading %d (%s)\n",
594 YYPREFIX, yystate, yychar, yys);
598 if (((yyn = yysindex[yystate]) != 0) && (yyn += yychar) >= 0 &&
599 yyn <= YYTABLESIZE && yycheck[yyn] == (YYINT) yychar)
603 printf("%sdebug: state %d, shifting to state %d\n",
604 YYPREFIX, yystate, yytable[yyn]);
606 if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack) == YYENOMEM) goto yyoverflow;
607 yystate = yytable[yyn];
608 *++yystack.s_mark = yytable[yyn];
609 *++yystack.l_mark = yylval;
611 if (yyerrflag > 0) --yyerrflag;
614 if (((yyn = yyrindex[yystate]) != 0) && (yyn += yychar) >= 0 &&
615 yyn <= YYTABLESIZE && yycheck[yyn] == (YYINT) yychar)
620 if (yyerrflag != 0) goto yyinrecovery;
622 YYERROR_CALL("syntax error");
624 goto yyerrlab; /* redundant goto avoids 'unused label' warning */
634 if (((yyn = yysindex[*yystack.s_mark]) != 0) && (yyn += YYERRCODE) >= 0 &&
635 yyn <= YYTABLESIZE && yycheck[yyn] == (YYINT) 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) goto yyoverflow;
643 yystate = yytable[yyn];
644 *++yystack.s_mark = yytable[yyn];
645 *++yystack.l_mark = yylval;
652 printf("%sdebug: error recovery discarding state %d\n",
653 YYPREFIX, *yystack.s_mark);
655 if (yystack.s_mark <= yystack.s_base) goto yyabort;
663 if (yychar == YYEOF) goto yyabort;
667 if ((yys = yyname[YYTRANSLATE(yychar)]) == NULL) yys = yyname[YYUNDFTOKEN];
668 printf("%sdebug: state %d, error recovery discards token %d (%s)\n",
669 YYPREFIX, yystate, yychar, yys);
679 printf("%sdebug: state %d, reducing by rule %d (%s)\n",
680 YYPREFIX, yystate, yyn, yyrule[yyn]);
684 yyval = yystack.l_mark[1-yym];
686 memset(&yyval, 0, sizeof yyval);
691 #line 59 "varsyntax_calc1.y"
693 (void) printf("%15.8f\n", yystack.l_mark[-1].dval);
697 #line 63 "varsyntax_calc1.y"
699 (void) printf("(%15.8f, %15.8f)\n", yystack.l_mark[-1].vval.lo, yystack.l_mark[-1].vval.hi);
703 #line 67 "varsyntax_calc1.y"
705 dreg[yystack.l_mark[-3].ival] = yystack.l_mark[-1].dval;
709 #line 71 "varsyntax_calc1.y"
711 vreg[yystack.l_mark[-3].ival] = yystack.l_mark[-1].vval;
715 #line 75 "varsyntax_calc1.y"
721 #line 82 "varsyntax_calc1.y"
723 yyval.dval = dreg[yystack.l_mark[0].ival]; /* $$ & $1 are sufficient here*/
727 #line 86 "varsyntax_calc1.y"
729 yyval.dval = yystack.l_mark[-2].dval + yystack.l_mark[0].dval;
733 #line 90 "varsyntax_calc1.y"
735 yyval.dval = yystack.l_mark[-2].dval - yystack.l_mark[0].dval;
739 #line 94 "varsyntax_calc1.y"
741 yyval.dval = yystack.l_mark[-2].dval * yystack.l_mark[0].dval;
745 #line 98 "varsyntax_calc1.y"
747 yyval.dval = yystack.l_mark[-2].dval / yystack.l_mark[0].dval;
751 #line 102 "varsyntax_calc1.y"
753 yyval.dval = -yystack.l_mark[0].dval;
757 #line 106 "varsyntax_calc1.y"
759 yyval.dval = yystack.l_mark[-1].dval;
763 #line 112 "varsyntax_calc1.y"
765 yyval.vval.hi = yyval.vval.lo = yystack.l_mark[0].dval;
769 #line 116 "varsyntax_calc1.y"
771 yyval.vval.lo = yystack.l_mark[-3].dval;
772 yyval.vval.hi = yystack.l_mark[-1].dval;
773 if ( yyval.vval.lo > yyval.vval.hi )
775 (void) printf("interval out of order\n");
781 #line 126 "varsyntax_calc1.y"
783 yyval.vval = vreg[yystack.l_mark[0].ival];
787 #line 130 "varsyntax_calc1.y"
789 yyval.vval.hi = yystack.l_mark[-2].vval.hi + yystack.l_mark[0].vval.hi;
790 yyval.vval.lo = yystack.l_mark[-2].vval.lo + yystack.l_mark[0].vval.lo;
794 #line 135 "varsyntax_calc1.y"
796 yyval.vval.hi = yystack.l_mark[-2].dval + yystack.l_mark[0].vval.hi;
797 yyval.vval.lo = yystack.l_mark[-2].dval + yystack.l_mark[0].vval.lo;
801 #line 140 "varsyntax_calc1.y"
803 yyval.vval.hi = yystack.l_mark[-2].vval.hi - yystack.l_mark[0].vval.lo;
804 yyval.vval.lo = yystack.l_mark[-2].vval.lo - yystack.l_mark[0].vval.hi;
808 #line 145 "varsyntax_calc1.y"
810 yyval.vval.hi = yystack.l_mark[-2].dval - yystack.l_mark[0].vval.lo;
811 yyval.vval.lo = yystack.l_mark[-2].dval - yystack.l_mark[0].vval.hi;
815 #line 150 "varsyntax_calc1.y"
817 yyval.vval = vmul( yystack.l_mark[-2].vval.lo, yystack.l_mark[-2].vval.hi, yystack.l_mark[0].vval );
821 #line 154 "varsyntax_calc1.y"
823 yyval.vval = vmul (yystack.l_mark[-2].dval, yystack.l_mark[-2].dval, yystack.l_mark[0].vval );
827 #line 158 "varsyntax_calc1.y"
829 if (dcheck(yystack.l_mark[0].vval)) YYERROR;
830 yyval.vval = vdiv ( yystack.l_mark[-2].vval.lo, yystack.l_mark[-2].vval.hi, yystack.l_mark[0].vval );
834 #line 163 "varsyntax_calc1.y"
836 if (dcheck ( yystack.l_mark[0].vval )) YYERROR;
837 yyval.vval = vdiv (yystack.l_mark[-2].dval, yystack.l_mark[-2].dval, yystack.l_mark[0].vval );
841 #line 168 "varsyntax_calc1.y"
843 yyval.vval.hi = -yystack.l_mark[0].vval.lo;
844 yyval.vval.lo = -yystack.l_mark[0].vval.hi;
848 #line 173 "varsyntax_calc1.y"
850 yyval.vval = yystack.l_mark[-1].vval;
853 #line 854 "varsyntax_calc1.tab.c"
855 yystack.s_mark -= yym;
856 yystate = *yystack.s_mark;
857 yystack.l_mark -= yym;
859 if (yystate == 0 && yym == 0)
863 printf("%sdebug: after reduction, shifting from state 0 to\
864 state %d\n", YYPREFIX, YYFINAL);
867 *++yystack.s_mark = YYFINAL;
868 *++yystack.l_mark = yyval;
872 if (yychar < 0) yychar = YYEOF;
876 if ((yys = yyname[YYTRANSLATE(yychar)]) == NULL) yys = yyname[YYUNDFTOKEN];
877 printf("%sdebug: state %d, reading %d (%s)\n",
878 YYPREFIX, YYFINAL, yychar, yys);
882 if (yychar == YYEOF) goto yyaccept;
885 if (((yyn = yygindex[yym]) != 0) && (yyn += yystate) >= 0 &&
886 yyn <= YYTABLESIZE && yycheck[yyn] == (YYINT) yystate)
887 yystate = yytable[yyn];
889 yystate = yydgoto[yym];
892 printf("%sdebug: after reduction, shifting from state %d \
893 to state %d\n", YYPREFIX, *yystack.s_mark, yystate);
895 if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack) == YYENOMEM) goto yyoverflow;
896 *++yystack.s_mark = (YYINT) yystate;
897 *++yystack.l_mark = yyval;
901 YYERROR_CALL("yacc stack overflow");
904 yyfreestack(&yystack);
908 yyfreestack(&yystack);