calc1.tab.c revision 1.1.1.1 1 1.1 christos /* $NetBSD: calc1.tab.c,v 1.1.1.1 2015/01/03 22:58:24 christos Exp $ */
2 1.1 christos
3 1.1 christos /* original parser id follows */
4 1.1 christos /* yysccsid[] = "@(#)yaccpar 1.9 (Berkeley) 02/21/93" */
5 1.1 christos /* (use YYMAJOR/YYMINOR for ifdefs dependent on parser version) */
6 1.1 christos
7 1.1 christos #define YYBYACC 1
8 1.1 christos #define YYMAJOR 1
9 1.1 christos #define YYMINOR 9
10 1.1 christos #define YYCHECK "yyyymmdd"
11 1.1 christos
12 1.1 christos #define YYEMPTY (-1)
13 1.1 christos #define yyclearin (yychar = YYEMPTY)
14 1.1 christos #define yyerrok (yyerrflag = 0)
15 1.1 christos #define YYRECOVERING() (yyerrflag != 0)
16 1.1 christos #define YYENOMEM (-2)
17 1.1 christos #define YYEOF 0
18 1.1 christos
19 1.1 christos #ifndef yyparse
20 1.1 christos #define yyparse calc1_parse
21 1.1 christos #endif /* yyparse */
22 1.1 christos
23 1.1 christos #ifndef yylex
24 1.1 christos #define yylex calc1_lex
25 1.1 christos #endif /* yylex */
26 1.1 christos
27 1.1 christos #ifndef yyerror
28 1.1 christos #define yyerror calc1_error
29 1.1 christos #endif /* yyerror */
30 1.1 christos
31 1.1 christos #ifndef yychar
32 1.1 christos #define yychar calc1_char
33 1.1 christos #endif /* yychar */
34 1.1 christos
35 1.1 christos #ifndef yyval
36 1.1 christos #define yyval calc1_val
37 1.1 christos #endif /* yyval */
38 1.1 christos
39 1.1 christos #ifndef yylval
40 1.1 christos #define yylval calc1_lval
41 1.1 christos #endif /* yylval */
42 1.1 christos
43 1.1 christos #ifndef yydebug
44 1.1 christos #define yydebug calc1_debug
45 1.1 christos #endif /* yydebug */
46 1.1 christos
47 1.1 christos #ifndef yynerrs
48 1.1 christos #define yynerrs calc1_nerrs
49 1.1 christos #endif /* yynerrs */
50 1.1 christos
51 1.1 christos #ifndef yyerrflag
52 1.1 christos #define yyerrflag calc1_errflag
53 1.1 christos #endif /* yyerrflag */
54 1.1 christos
55 1.1 christos #ifndef yylhs
56 1.1 christos #define yylhs calc1_lhs
57 1.1 christos #endif /* yylhs */
58 1.1 christos
59 1.1 christos #ifndef yylen
60 1.1 christos #define yylen calc1_len
61 1.1 christos #endif /* yylen */
62 1.1 christos
63 1.1 christos #ifndef yydefred
64 1.1 christos #define yydefred calc1_defred
65 1.1 christos #endif /* yydefred */
66 1.1 christos
67 1.1 christos #ifndef yydgoto
68 1.1 christos #define yydgoto calc1_dgoto
69 1.1 christos #endif /* yydgoto */
70 1.1 christos
71 1.1 christos #ifndef yysindex
72 1.1 christos #define yysindex calc1_sindex
73 1.1 christos #endif /* yysindex */
74 1.1 christos
75 1.1 christos #ifndef yyrindex
76 1.1 christos #define yyrindex calc1_rindex
77 1.1 christos #endif /* yyrindex */
78 1.1 christos
79 1.1 christos #ifndef yygindex
80 1.1 christos #define yygindex calc1_gindex
81 1.1 christos #endif /* yygindex */
82 1.1 christos
83 1.1 christos #ifndef yytable
84 1.1 christos #define yytable calc1_table
85 1.1 christos #endif /* yytable */
86 1.1 christos
87 1.1 christos #ifndef yycheck
88 1.1 christos #define yycheck calc1_check
89 1.1 christos #endif /* yycheck */
90 1.1 christos
91 1.1 christos #ifndef yyname
92 1.1 christos #define yyname calc1_name
93 1.1 christos #endif /* yyname */
94 1.1 christos
95 1.1 christos #ifndef yyrule
96 1.1 christos #define yyrule calc1_rule
97 1.1 christos #endif /* yyrule */
98 1.1 christos #define YYPREFIX "calc1_"
99 1.1 christos
100 1.1 christos #define YYPURE 0
101 1.1 christos
102 1.1 christos #line 2 "calc1.y"
103 1.1 christos
104 1.1 christos /* http://dinosaur.compilertools.net/yacc/index.html */
105 1.1 christos
106 1.1 christos #include <stdlib.h>
107 1.1 christos #include <stdio.h>
108 1.1 christos #include <ctype.h>
109 1.1 christos #include <math.h>
110 1.1 christos
111 1.1 christos typedef struct interval
112 1.1 christos {
113 1.1 christos double lo, hi;
114 1.1 christos }
115 1.1 christos INTERVAL;
116 1.1 christos
117 1.1 christos INTERVAL vmul(double, double, INTERVAL);
118 1.1 christos INTERVAL vdiv(double, double, INTERVAL);
119 1.1 christos
120 1.1 christos extern int yylex(void);
121 1.1 christos static void yyerror(const char *s);
122 1.1 christos
123 1.1 christos int dcheck(INTERVAL);
124 1.1 christos
125 1.1 christos double dreg[26];
126 1.1 christos INTERVAL vreg[26];
127 1.1 christos
128 1.1 christos #line 31 "calc1.y"
129 1.1 christos #ifdef YYSTYPE
130 1.1 christos #undef YYSTYPE_IS_DECLARED
131 1.1 christos #define YYSTYPE_IS_DECLARED 1
132 1.1 christos #endif
133 1.1 christos #ifndef YYSTYPE_IS_DECLARED
134 1.1 christos #define YYSTYPE_IS_DECLARED 1
135 1.1 christos typedef union
136 1.1 christos {
137 1.1 christos int ival;
138 1.1 christos double dval;
139 1.1 christos INTERVAL vval;
140 1.1 christos } YYSTYPE;
141 1.1 christos #endif /* !YYSTYPE_IS_DECLARED */
142 1.1 christos #line 141 "calc1.tab.c"
143 1.1 christos
144 1.1 christos /* compatibility with bison */
145 1.1 christos #ifdef YYPARSE_PARAM
146 1.1 christos /* compatibility with FreeBSD */
147 1.1 christos # ifdef YYPARSE_PARAM_TYPE
148 1.1 christos # define YYPARSE_DECL() yyparse(YYPARSE_PARAM_TYPE YYPARSE_PARAM)
149 1.1 christos # else
150 1.1 christos # define YYPARSE_DECL() yyparse(void *YYPARSE_PARAM)
151 1.1 christos # endif
152 1.1 christos #else
153 1.1 christos # define YYPARSE_DECL() yyparse(void)
154 1.1 christos #endif
155 1.1 christos
156 1.1 christos /* Parameters sent to lex. */
157 1.1 christos #ifdef YYLEX_PARAM
158 1.1 christos # define YYLEX_DECL() yylex(void *YYLEX_PARAM)
159 1.1 christos # define YYLEX yylex(YYLEX_PARAM)
160 1.1 christos #else
161 1.1 christos # define YYLEX_DECL() yylex(void)
162 1.1 christos # define YYLEX yylex()
163 1.1 christos #endif
164 1.1 christos
165 1.1 christos /* Parameters sent to yyerror. */
166 1.1 christos #ifndef YYERROR_DECL
167 1.1 christos #define YYERROR_DECL() yyerror(const char *s)
168 1.1 christos #endif
169 1.1 christos #ifndef YYERROR_CALL
170 1.1 christos #define YYERROR_CALL(msg) yyerror(msg)
171 1.1 christos #endif
172 1.1 christos
173 1.1 christos extern int YYPARSE_DECL();
174 1.1 christos
175 1.1 christos #define DREG 257
176 1.1 christos #define VREG 258
177 1.1 christos #define CONST 259
178 1.1 christos #define UMINUS 260
179 1.1 christos #define YYERRCODE 256
180 1.1 christos typedef short YYINT;
181 1.1 christos static const YYINT calc1_lhs[] = { -1,
182 1.1 christos 3, 3, 0, 0, 0, 0, 0, 1, 1, 1,
183 1.1 christos 1, 1, 1, 1, 1, 2, 2, 2, 2, 2,
184 1.1 christos 2, 2, 2, 2, 2, 2, 2, 2,
185 1.1 christos };
186 1.1 christos static const YYINT calc1_len[] = { 2,
187 1.1 christos 0, 2, 2, 2, 4, 4, 2, 1, 1, 3,
188 1.1 christos 3, 3, 3, 2, 3, 1, 5, 1, 3, 3,
189 1.1 christos 3, 3, 3, 3, 3, 3, 2, 3,
190 1.1 christos };
191 1.1 christos static const YYINT calc1_defred[] = { 0,
192 1.1 christos 0, 0, 0, 8, 0, 0, 0, 0, 0, 7,
193 1.1 christos 0, 0, 9, 18, 14, 27, 0, 0, 0, 0,
194 1.1 christos 0, 0, 3, 0, 0, 0, 0, 4, 0, 0,
195 1.1 christos 0, 0, 0, 15, 0, 28, 0, 0, 0, 0,
196 1.1 christos 12, 24, 13, 26, 0, 0, 23, 25, 14, 0,
197 1.1 christos 0, 0, 0, 0, 5, 6, 0, 0, 0, 12,
198 1.1 christos 13, 17,
199 1.1 christos };
200 1.1 christos static const YYINT calc1_dgoto[] = { 7,
201 1.1 christos 32, 9, 0,
202 1.1 christos };
203 1.1 christos static const YYINT calc1_sindex[] = { -40,
204 1.1 christos -8, -48, -47, 0, -37, -37, 0, 2, 17, 0,
205 1.1 christos -34, -37, 0, 0, 0, 0, -25, 90, -37, -37,
206 1.1 christos -37, -37, 0, -37, -37, -37, -37, 0, -34, -34,
207 1.1 christos 25, 125, 31, 0, -34, 0, -11, 37, -11, 37,
208 1.1 christos 0, 0, 0, 0, 37, 37, 0, 0, 0, 111,
209 1.1 christos -34, -34, -34, -34, 0, 0, 118, 69, 69, 0,
210 1.1 christos 0, 0,
211 1.1 christos };
212 1.1 christos static const YYINT calc1_rindex[] = { 0,
213 1.1 christos 0, 38, 44, 0, 0, 0, 0, 0, 0, 0,
214 1.1 christos 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
215 1.1 christos 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
216 1.1 christos 0, -9, 0, 0, 0, 0, 51, -3, 56, 61,
217 1.1 christos 0, 0, 0, 0, 67, 72, 0, 0, 0, 0,
218 1.1 christos 0, 0, 0, 0, 0, 0, 0, 78, 83, 0,
219 1.1 christos 0, 0,
220 1.1 christos };
221 1.1 christos static const YYINT calc1_gindex[] = { 0,
222 1.1 christos 4, 124, 0,
223 1.1 christos };
224 1.1 christos #define YYTABLESIZE 225
225 1.1 christos static const YYINT calc1_table[] = { 6,
226 1.1 christos 16, 10, 6, 8, 5, 30, 20, 5, 15, 17,
227 1.1 christos 29, 23, 11, 12, 31, 34, 21, 19, 35, 20,
228 1.1 christos 0, 22, 37, 39, 41, 43, 28, 0, 0, 0,
229 1.1 christos 21, 16, 49, 50, 55, 22, 0, 20, 57, 20,
230 1.1 christos 56, 20, 0, 21, 19, 0, 20, 9, 22, 0,
231 1.1 christos 0, 0, 0, 18, 58, 59, 60, 61, 26, 24,
232 1.1 christos 10, 25, 0, 27, 0, 11, 53, 51, 0, 52,
233 1.1 christos 22, 54, 26, 24, 0, 25, 19, 27, 26, 9,
234 1.1 christos 9, 21, 9, 27, 9, 18, 18, 10, 18, 0,
235 1.1 christos 18, 10, 11, 10, 10, 10, 11, 0, 11, 11,
236 1.1 christos 11, 22, 0, 22, 0, 22, 0, 19, 0, 19,
237 1.1 christos 53, 19, 21, 0, 21, 54, 21, 0, 10, 0,
238 1.1 christos 10, 0, 10, 11, 0, 11, 0, 11, 16, 18,
239 1.1 christos 36, 26, 24, 0, 25, 33, 27, 0, 0, 0,
240 1.1 christos 0, 0, 38, 40, 42, 44, 0, 45, 46, 47,
241 1.1 christos 48, 34, 53, 51, 0, 52, 0, 54, 62, 53,
242 1.1 christos 51, 0, 52, 0, 54, 0, 21, 19, 0, 20,
243 1.1 christos 0, 22, 0, 0, 0, 0, 0, 0, 0, 0,
244 1.1 christos 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
245 1.1 christos 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
246 1.1 christos 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
247 1.1 christos 0, 0, 0, 0, 0, 1, 2, 3, 4, 13,
248 1.1 christos 14, 4, 13, 0, 4,
249 1.1 christos };
250 1.1 christos static const YYINT calc1_check[] = { 40,
251 1.1 christos 10, 10, 40, 0, 45, 40, 10, 45, 5, 6,
252 1.1 christos 45, 10, 61, 61, 11, 41, 42, 43, 44, 45,
253 1.1 christos -1, 47, 19, 20, 21, 22, 10, -1, -1, -1,
254 1.1 christos 42, 41, 29, 30, 10, 47, -1, 41, 35, 43,
255 1.1 christos 10, 45, -1, 42, 43, -1, 45, 10, 47, -1,
256 1.1 christos -1, -1, -1, 10, 51, 52, 53, 54, 42, 43,
257 1.1 christos 10, 45, -1, 47, -1, 10, 42, 43, -1, 45,
258 1.1 christos 10, 47, 42, 43, -1, 45, 10, 47, 42, 42,
259 1.1 christos 43, 10, 45, 47, 47, 42, 43, 10, 45, -1,
260 1.1 christos 47, 41, 10, 43, 44, 45, 41, -1, 43, 44,
261 1.1 christos 45, 41, -1, 43, -1, 45, -1, 41, -1, 43,
262 1.1 christos 42, 45, 41, -1, 43, 47, 45, -1, 41, -1,
263 1.1 christos 43, -1, 45, 41, -1, 43, -1, 45, 5, 6,
264 1.1 christos 41, 42, 43, -1, 45, 12, 47, -1, -1, -1,
265 1.1 christos -1, -1, 19, 20, 21, 22, -1, 24, 25, 26,
266 1.1 christos 27, 41, 42, 43, -1, 45, -1, 47, 41, 42,
267 1.1 christos 43, -1, 45, -1, 47, -1, 42, 43, -1, 45,
268 1.1 christos -1, 47, -1, -1, -1, -1, -1, -1, -1, -1,
269 1.1 christos -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
270 1.1 christos -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
271 1.1 christos -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
272 1.1 christos -1, -1, -1, -1, -1, 256, 257, 258, 259, 257,
273 1.1 christos 258, 259, 257, -1, 259,
274 1.1 christos };
275 1.1 christos #define YYFINAL 7
276 1.1 christos #ifndef YYDEBUG
277 1.1 christos #define YYDEBUG 0
278 1.1 christos #endif
279 1.1 christos #define YYMAXTOKEN 260
280 1.1 christos #define YYUNDFTOKEN 266
281 1.1 christos #define YYTRANSLATE(a) ((a) > YYMAXTOKEN ? YYUNDFTOKEN : (a))
282 1.1 christos #if YYDEBUG
283 1.1 christos static const char *const calc1_name[] = {
284 1.1 christos
285 1.1 christos "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,
286 1.1 christos 0,0,0,0,0,0,0,0,0,"'('","')'","'*'","'+'","','","'-'",0,"'/'",0,0,0,0,0,0,0,0,0,
287 1.1 christos 0,0,0,0,"'='",0,0,0,0,0,0,0,0,0,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 1.1 christos 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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 1.1 christos 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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 1.1 christos 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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 1.1 christos 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
292 1.1 christos 0,0,"DREG","VREG","CONST","UMINUS",0,0,0,0,0,"illegal-symbol",
293 1.1 christos };
294 1.1 christos static const char *const calc1_rule[] = {
295 1.1 christos "$accept : line",
296 1.1 christos "lines :",
297 1.1 christos "lines : lines line",
298 1.1 christos "line : dexp '\\n'",
299 1.1 christos "line : vexp '\\n'",
300 1.1 christos "line : DREG '=' dexp '\\n'",
301 1.1 christos "line : VREG '=' vexp '\\n'",
302 1.1 christos "line : error '\\n'",
303 1.1 christos "dexp : CONST",
304 1.1 christos "dexp : DREG",
305 1.1 christos "dexp : dexp '+' dexp",
306 1.1 christos "dexp : dexp '-' dexp",
307 1.1 christos "dexp : dexp '*' dexp",
308 1.1 christos "dexp : dexp '/' dexp",
309 1.1 christos "dexp : '-' dexp",
310 1.1 christos "dexp : '(' dexp ')'",
311 1.1 christos "vexp : dexp",
312 1.1 christos "vexp : '(' dexp ',' dexp ')'",
313 1.1 christos "vexp : VREG",
314 1.1 christos "vexp : vexp '+' vexp",
315 1.1 christos "vexp : dexp '+' vexp",
316 1.1 christos "vexp : vexp '-' vexp",
317 1.1 christos "vexp : dexp '-' vexp",
318 1.1 christos "vexp : vexp '*' vexp",
319 1.1 christos "vexp : dexp '*' vexp",
320 1.1 christos "vexp : vexp '/' vexp",
321 1.1 christos "vexp : dexp '/' vexp",
322 1.1 christos "vexp : '-' vexp",
323 1.1 christos "vexp : '(' vexp ')'",
324 1.1 christos
325 1.1 christos };
326 1.1 christos #endif
327 1.1 christos
328 1.1 christos int yydebug;
329 1.1 christos int yynerrs;
330 1.1 christos
331 1.1 christos int yyerrflag;
332 1.1 christos int yychar;
333 1.1 christos YYSTYPE yyval;
334 1.1 christos YYSTYPE yylval;
335 1.1 christos
336 1.1 christos /* define the initial stack-sizes */
337 1.1 christos #ifdef YYSTACKSIZE
338 1.1 christos #undef YYMAXDEPTH
339 1.1 christos #define YYMAXDEPTH YYSTACKSIZE
340 1.1 christos #else
341 1.1 christos #ifdef YYMAXDEPTH
342 1.1 christos #define YYSTACKSIZE YYMAXDEPTH
343 1.1 christos #else
344 1.1 christos #define YYSTACKSIZE 10000
345 1.1 christos #define YYMAXDEPTH 10000
346 1.1 christos #endif
347 1.1 christos #endif
348 1.1 christos
349 1.1 christos #define YYINITSTACKSIZE 200
350 1.1 christos
351 1.1 christos typedef struct {
352 1.1 christos unsigned stacksize;
353 1.1 christos YYINT *s_base;
354 1.1 christos YYINT *s_mark;
355 1.1 christos YYINT *s_last;
356 1.1 christos YYSTYPE *l_base;
357 1.1 christos YYSTYPE *l_mark;
358 1.1 christos } YYSTACKDATA;
359 1.1 christos /* variables for the parser stack */
360 1.1 christos static YYSTACKDATA yystack;
361 1.1 christos #line 176 "calc1.y"
362 1.1 christos /* beginning of subroutines section */
363 1.1 christos
364 1.1 christos #define BSZ 50 /* buffer size for floating point numbers */
365 1.1 christos
366 1.1 christos /* lexical analysis */
367 1.1 christos
368 1.1 christos static void
369 1.1 christos yyerror(const char *s)
370 1.1 christos {
371 1.1 christos fprintf(stderr, "%s\n", s);
372 1.1 christos }
373 1.1 christos
374 1.1 christos int
375 1.1 christos yylex(void)
376 1.1 christos {
377 1.1 christos int c;
378 1.1 christos
379 1.1 christos while ((c = getchar()) == ' ')
380 1.1 christos { /* skip over blanks */
381 1.1 christos }
382 1.1 christos
383 1.1 christos if (isupper(c))
384 1.1 christos {
385 1.1 christos yylval.ival = c - 'A';
386 1.1 christos return (VREG);
387 1.1 christos }
388 1.1 christos if (islower(c))
389 1.1 christos {
390 1.1 christos yylval.ival = c - 'a';
391 1.1 christos return (DREG);
392 1.1 christos }
393 1.1 christos
394 1.1 christos if (isdigit(c) || c == '.')
395 1.1 christos {
396 1.1 christos /* gobble up digits, points, exponents */
397 1.1 christos char buf[BSZ + 1], *cp = buf;
398 1.1 christos int dot = 0, expr = 0;
399 1.1 christos
400 1.1 christos for (; (cp - buf) < BSZ; ++cp, c = getchar())
401 1.1 christos {
402 1.1 christos
403 1.1 christos *cp = (char) c;
404 1.1 christos if (isdigit(c))
405 1.1 christos continue;
406 1.1 christos if (c == '.')
407 1.1 christos {
408 1.1 christos if (dot++ || expr)
409 1.1 christos return ('.'); /* will cause syntax error */
410 1.1 christos continue;
411 1.1 christos }
412 1.1 christos
413 1.1 christos if (c == 'e')
414 1.1 christos {
415 1.1 christos if (expr++)
416 1.1 christos return ('e'); /* will cause syntax error */
417 1.1 christos continue;
418 1.1 christos }
419 1.1 christos
420 1.1 christos /* end of number */
421 1.1 christos break;
422 1.1 christos }
423 1.1 christos *cp = '\0';
424 1.1 christos
425 1.1 christos if ((cp - buf) >= BSZ)
426 1.1 christos printf("constant too long: truncated\n");
427 1.1 christos else
428 1.1 christos ungetc(c, stdin); /* push back last char read */
429 1.1 christos yylval.dval = atof(buf);
430 1.1 christos return (CONST);
431 1.1 christos }
432 1.1 christos return (c);
433 1.1 christos }
434 1.1 christos
435 1.1 christos static INTERVAL
436 1.1 christos hilo(double a, double b, double c, double d)
437 1.1 christos {
438 1.1 christos /* returns the smallest interval containing a, b, c, and d */
439 1.1 christos /* used by *, / routines */
440 1.1 christos INTERVAL v;
441 1.1 christos
442 1.1 christos if (a > b)
443 1.1 christos {
444 1.1 christos v.hi = a;
445 1.1 christos v.lo = b;
446 1.1 christos }
447 1.1 christos else
448 1.1 christos {
449 1.1 christos v.hi = b;
450 1.1 christos v.lo = a;
451 1.1 christos }
452 1.1 christos
453 1.1 christos if (c > d)
454 1.1 christos {
455 1.1 christos if (c > v.hi)
456 1.1 christos v.hi = c;
457 1.1 christos if (d < v.lo)
458 1.1 christos v.lo = d;
459 1.1 christos }
460 1.1 christos else
461 1.1 christos {
462 1.1 christos if (d > v.hi)
463 1.1 christos v.hi = d;
464 1.1 christos if (c < v.lo)
465 1.1 christos v.lo = c;
466 1.1 christos }
467 1.1 christos return (v);
468 1.1 christos }
469 1.1 christos
470 1.1 christos INTERVAL
471 1.1 christos vmul(double a, double b, INTERVAL v)
472 1.1 christos {
473 1.1 christos return (hilo(a * v.hi, a * v.lo, b * v.hi, b * v.lo));
474 1.1 christos }
475 1.1 christos
476 1.1 christos int
477 1.1 christos dcheck(INTERVAL v)
478 1.1 christos {
479 1.1 christos if (v.hi >= 0. && v.lo <= 0.)
480 1.1 christos {
481 1.1 christos printf("divisor interval contains 0.\n");
482 1.1 christos return (1);
483 1.1 christos }
484 1.1 christos return (0);
485 1.1 christos }
486 1.1 christos
487 1.1 christos INTERVAL
488 1.1 christos vdiv(double a, double b, INTERVAL v)
489 1.1 christos {
490 1.1 christos return (hilo(a / v.hi, a / v.lo, b / v.hi, b / v.lo));
491 1.1 christos }
492 1.1 christos #line 491 "calc1.tab.c"
493 1.1 christos
494 1.1 christos #if YYDEBUG
495 1.1 christos #include <stdio.h> /* needed for printf */
496 1.1 christos #endif
497 1.1 christos
498 1.1 christos #include <stdlib.h> /* needed for malloc, etc */
499 1.1 christos #include <string.h> /* needed for memset */
500 1.1 christos
501 1.1 christos /* allocate initial stack or double stack size, up to YYMAXDEPTH */
502 1.1 christos static int yygrowstack(YYSTACKDATA *data)
503 1.1 christos {
504 1.1 christos int i;
505 1.1 christos unsigned newsize;
506 1.1 christos YYINT *newss;
507 1.1 christos YYSTYPE *newvs;
508 1.1 christos
509 1.1 christos if ((newsize = data->stacksize) == 0)
510 1.1 christos newsize = YYINITSTACKSIZE;
511 1.1 christos else if (newsize >= YYMAXDEPTH)
512 1.1 christos return YYENOMEM;
513 1.1 christos else if ((newsize *= 2) > YYMAXDEPTH)
514 1.1 christos newsize = YYMAXDEPTH;
515 1.1 christos
516 1.1 christos i = (int) (data->s_mark - data->s_base);
517 1.1 christos newss = (YYINT *)realloc(data->s_base, newsize * sizeof(*newss));
518 1.1 christos if (newss == 0)
519 1.1 christos return YYENOMEM;
520 1.1 christos
521 1.1 christos data->s_base = newss;
522 1.1 christos data->s_mark = newss + i;
523 1.1 christos
524 1.1 christos newvs = (YYSTYPE *)realloc(data->l_base, newsize * sizeof(*newvs));
525 1.1 christos if (newvs == 0)
526 1.1 christos return YYENOMEM;
527 1.1 christos
528 1.1 christos data->l_base = newvs;
529 1.1 christos data->l_mark = newvs + i;
530 1.1 christos
531 1.1 christos data->stacksize = newsize;
532 1.1 christos data->s_last = data->s_base + newsize - 1;
533 1.1 christos return 0;
534 1.1 christos }
535 1.1 christos
536 1.1 christos #if YYPURE || defined(YY_NO_LEAKS)
537 1.1 christos static void yyfreestack(YYSTACKDATA *data)
538 1.1 christos {
539 1.1 christos free(data->s_base);
540 1.1 christos free(data->l_base);
541 1.1 christos memset(data, 0, sizeof(*data));
542 1.1 christos }
543 1.1 christos #else
544 1.1 christos #define yyfreestack(data) /* nothing */
545 1.1 christos #endif
546 1.1 christos
547 1.1 christos #define YYABORT goto yyabort
548 1.1 christos #define YYREJECT goto yyabort
549 1.1 christos #define YYACCEPT goto yyaccept
550 1.1 christos #define YYERROR goto yyerrlab
551 1.1 christos
552 1.1 christos int
553 1.1 christos YYPARSE_DECL()
554 1.1 christos {
555 1.1 christos int yym, yyn, yystate;
556 1.1 christos #if YYDEBUG
557 1.1 christos const char *yys;
558 1.1 christos
559 1.1 christos if ((yys = getenv("YYDEBUG")) != 0)
560 1.1 christos {
561 1.1 christos yyn = *yys;
562 1.1 christos if (yyn >= '0' && yyn <= '9')
563 1.1 christos yydebug = yyn - '0';
564 1.1 christos }
565 1.1 christos #endif
566 1.1 christos
567 1.1 christos yynerrs = 0;
568 1.1 christos yyerrflag = 0;
569 1.1 christos yychar = YYEMPTY;
570 1.1 christos yystate = 0;
571 1.1 christos
572 1.1 christos #if YYPURE
573 1.1 christos memset(&yystack, 0, sizeof(yystack));
574 1.1 christos #endif
575 1.1 christos
576 1.1 christos if (yystack.s_base == NULL && yygrowstack(&yystack) == YYENOMEM) goto yyoverflow;
577 1.1 christos yystack.s_mark = yystack.s_base;
578 1.1 christos yystack.l_mark = yystack.l_base;
579 1.1 christos yystate = 0;
580 1.1 christos *yystack.s_mark = 0;
581 1.1 christos
582 1.1 christos yyloop:
583 1.1 christos if ((yyn = yydefred[yystate]) != 0) goto yyreduce;
584 1.1 christos if (yychar < 0)
585 1.1 christos {
586 1.1 christos if ((yychar = YYLEX) < 0) yychar = YYEOF;
587 1.1 christos #if YYDEBUG
588 1.1 christos if (yydebug)
589 1.1 christos {
590 1.1 christos yys = yyname[YYTRANSLATE(yychar)];
591 1.1 christos printf("%sdebug: state %d, reading %d (%s)\n",
592 1.1 christos YYPREFIX, yystate, yychar, yys);
593 1.1 christos }
594 1.1 christos #endif
595 1.1 christos }
596 1.1 christos if ((yyn = yysindex[yystate]) && (yyn += yychar) >= 0 &&
597 1.1 christos yyn <= YYTABLESIZE && yycheck[yyn] == yychar)
598 1.1 christos {
599 1.1 christos #if YYDEBUG
600 1.1 christos if (yydebug)
601 1.1 christos printf("%sdebug: state %d, shifting to state %d\n",
602 1.1 christos YYPREFIX, yystate, yytable[yyn]);
603 1.1 christos #endif
604 1.1 christos if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack) == YYENOMEM)
605 1.1 christos {
606 1.1 christos goto yyoverflow;
607 1.1 christos }
608 1.1 christos yystate = yytable[yyn];
609 1.1 christos *++yystack.s_mark = yytable[yyn];
610 1.1 christos *++yystack.l_mark = yylval;
611 1.1 christos yychar = YYEMPTY;
612 1.1 christos if (yyerrflag > 0) --yyerrflag;
613 1.1 christos goto yyloop;
614 1.1 christos }
615 1.1 christos if ((yyn = yyrindex[yystate]) && (yyn += yychar) >= 0 &&
616 1.1 christos yyn <= YYTABLESIZE && yycheck[yyn] == yychar)
617 1.1 christos {
618 1.1 christos yyn = yytable[yyn];
619 1.1 christos goto yyreduce;
620 1.1 christos }
621 1.1 christos if (yyerrflag) goto yyinrecovery;
622 1.1 christos
623 1.1 christos YYERROR_CALL("syntax error");
624 1.1 christos
625 1.1 christos goto yyerrlab;
626 1.1 christos
627 1.1 christos yyerrlab:
628 1.1 christos ++yynerrs;
629 1.1 christos
630 1.1 christos yyinrecovery:
631 1.1 christos if (yyerrflag < 3)
632 1.1 christos {
633 1.1 christos yyerrflag = 3;
634 1.1 christos for (;;)
635 1.1 christos {
636 1.1 christos if ((yyn = yysindex[*yystack.s_mark]) && (yyn += YYERRCODE) >= 0 &&
637 1.1 christos yyn <= YYTABLESIZE && yycheck[yyn] == YYERRCODE)
638 1.1 christos {
639 1.1 christos #if YYDEBUG
640 1.1 christos if (yydebug)
641 1.1 christos printf("%sdebug: state %d, error recovery shifting\
642 1.1 christos to state %d\n", YYPREFIX, *yystack.s_mark, yytable[yyn]);
643 1.1 christos #endif
644 1.1 christos if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack) == YYENOMEM)
645 1.1 christos {
646 1.1 christos goto yyoverflow;
647 1.1 christos }
648 1.1 christos yystate = yytable[yyn];
649 1.1 christos *++yystack.s_mark = yytable[yyn];
650 1.1 christos *++yystack.l_mark = yylval;
651 1.1 christos goto yyloop;
652 1.1 christos }
653 1.1 christos else
654 1.1 christos {
655 1.1 christos #if YYDEBUG
656 1.1 christos if (yydebug)
657 1.1 christos printf("%sdebug: error recovery discarding state %d\n",
658 1.1 christos YYPREFIX, *yystack.s_mark);
659 1.1 christos #endif
660 1.1 christos if (yystack.s_mark <= yystack.s_base) goto yyabort;
661 1.1 christos --yystack.s_mark;
662 1.1 christos --yystack.l_mark;
663 1.1 christos }
664 1.1 christos }
665 1.1 christos }
666 1.1 christos else
667 1.1 christos {
668 1.1 christos if (yychar == YYEOF) goto yyabort;
669 1.1 christos #if YYDEBUG
670 1.1 christos if (yydebug)
671 1.1 christos {
672 1.1 christos yys = yyname[YYTRANSLATE(yychar)];
673 1.1 christos printf("%sdebug: state %d, error recovery discards token %d (%s)\n",
674 1.1 christos YYPREFIX, yystate, yychar, yys);
675 1.1 christos }
676 1.1 christos #endif
677 1.1 christos yychar = YYEMPTY;
678 1.1 christos goto yyloop;
679 1.1 christos }
680 1.1 christos
681 1.1 christos yyreduce:
682 1.1 christos #if YYDEBUG
683 1.1 christos if (yydebug)
684 1.1 christos printf("%sdebug: state %d, reducing by rule %d (%s)\n",
685 1.1 christos YYPREFIX, yystate, yyn, yyrule[yyn]);
686 1.1 christos #endif
687 1.1 christos yym = yylen[yyn];
688 1.1 christos if (yym)
689 1.1 christos yyval = yystack.l_mark[1-yym];
690 1.1 christos else
691 1.1 christos memset(&yyval, 0, sizeof yyval);
692 1.1 christos switch (yyn)
693 1.1 christos {
694 1.1 christos case 3:
695 1.1 christos #line 57 "calc1.y"
696 1.1 christos {
697 1.1 christos (void) printf("%15.8f\n", yystack.l_mark[-1].dval);
698 1.1 christos }
699 1.1 christos break;
700 1.1 christos case 4:
701 1.1 christos #line 61 "calc1.y"
702 1.1 christos {
703 1.1 christos (void) printf("(%15.8f, %15.8f)\n", yystack.l_mark[-1].vval.lo, yystack.l_mark[-1].vval.hi);
704 1.1 christos }
705 1.1 christos break;
706 1.1 christos case 5:
707 1.1 christos #line 65 "calc1.y"
708 1.1 christos {
709 1.1 christos dreg[yystack.l_mark[-3].ival] = yystack.l_mark[-1].dval;
710 1.1 christos }
711 1.1 christos break;
712 1.1 christos case 6:
713 1.1 christos #line 69 "calc1.y"
714 1.1 christos {
715 1.1 christos vreg[yystack.l_mark[-3].ival] = yystack.l_mark[-1].vval;
716 1.1 christos }
717 1.1 christos break;
718 1.1 christos case 7:
719 1.1 christos #line 73 "calc1.y"
720 1.1 christos {
721 1.1 christos yyerrok;
722 1.1 christos }
723 1.1 christos break;
724 1.1 christos case 9:
725 1.1 christos #line 80 "calc1.y"
726 1.1 christos {
727 1.1 christos yyval.dval = dreg[yystack.l_mark[0].ival];
728 1.1 christos }
729 1.1 christos break;
730 1.1 christos case 10:
731 1.1 christos #line 84 "calc1.y"
732 1.1 christos {
733 1.1 christos yyval.dval = yystack.l_mark[-2].dval + yystack.l_mark[0].dval;
734 1.1 christos }
735 1.1 christos break;
736 1.1 christos case 11:
737 1.1 christos #line 88 "calc1.y"
738 1.1 christos {
739 1.1 christos yyval.dval = yystack.l_mark[-2].dval - yystack.l_mark[0].dval;
740 1.1 christos }
741 1.1 christos break;
742 1.1 christos case 12:
743 1.1 christos #line 92 "calc1.y"
744 1.1 christos {
745 1.1 christos yyval.dval = yystack.l_mark[-2].dval * yystack.l_mark[0].dval;
746 1.1 christos }
747 1.1 christos break;
748 1.1 christos case 13:
749 1.1 christos #line 96 "calc1.y"
750 1.1 christos {
751 1.1 christos yyval.dval = yystack.l_mark[-2].dval / yystack.l_mark[0].dval;
752 1.1 christos }
753 1.1 christos break;
754 1.1 christos case 14:
755 1.1 christos #line 100 "calc1.y"
756 1.1 christos {
757 1.1 christos yyval.dval = -yystack.l_mark[0].dval;
758 1.1 christos }
759 1.1 christos break;
760 1.1 christos case 15:
761 1.1 christos #line 104 "calc1.y"
762 1.1 christos {
763 1.1 christos yyval.dval = yystack.l_mark[-1].dval;
764 1.1 christos }
765 1.1 christos break;
766 1.1 christos case 16:
767 1.1 christos #line 110 "calc1.y"
768 1.1 christos {
769 1.1 christos yyval.vval.hi = yyval.vval.lo = yystack.l_mark[0].dval;
770 1.1 christos }
771 1.1 christos break;
772 1.1 christos case 17:
773 1.1 christos #line 114 "calc1.y"
774 1.1 christos {
775 1.1 christos yyval.vval.lo = yystack.l_mark[-3].dval;
776 1.1 christos yyval.vval.hi = yystack.l_mark[-1].dval;
777 1.1 christos if ( yyval.vval.lo > yyval.vval.hi )
778 1.1 christos {
779 1.1 christos (void) printf("interval out of order\n");
780 1.1 christos YYERROR;
781 1.1 christos }
782 1.1 christos }
783 1.1 christos break;
784 1.1 christos case 18:
785 1.1 christos #line 124 "calc1.y"
786 1.1 christos {
787 1.1 christos yyval.vval = vreg[yystack.l_mark[0].ival];
788 1.1 christos }
789 1.1 christos break;
790 1.1 christos case 19:
791 1.1 christos #line 128 "calc1.y"
792 1.1 christos {
793 1.1 christos yyval.vval.hi = yystack.l_mark[-2].vval.hi + yystack.l_mark[0].vval.hi;
794 1.1 christos yyval.vval.lo = yystack.l_mark[-2].vval.lo + yystack.l_mark[0].vval.lo;
795 1.1 christos }
796 1.1 christos break;
797 1.1 christos case 20:
798 1.1 christos #line 133 "calc1.y"
799 1.1 christos {
800 1.1 christos yyval.vval.hi = yystack.l_mark[-2].dval + yystack.l_mark[0].vval.hi;
801 1.1 christos yyval.vval.lo = yystack.l_mark[-2].dval + yystack.l_mark[0].vval.lo;
802 1.1 christos }
803 1.1 christos break;
804 1.1 christos case 21:
805 1.1 christos #line 138 "calc1.y"
806 1.1 christos {
807 1.1 christos yyval.vval.hi = yystack.l_mark[-2].vval.hi - yystack.l_mark[0].vval.lo;
808 1.1 christos yyval.vval.lo = yystack.l_mark[-2].vval.lo - yystack.l_mark[0].vval.hi;
809 1.1 christos }
810 1.1 christos break;
811 1.1 christos case 22:
812 1.1 christos #line 143 "calc1.y"
813 1.1 christos {
814 1.1 christos yyval.vval.hi = yystack.l_mark[-2].dval - yystack.l_mark[0].vval.lo;
815 1.1 christos yyval.vval.lo = yystack.l_mark[-2].dval - yystack.l_mark[0].vval.hi;
816 1.1 christos }
817 1.1 christos break;
818 1.1 christos case 23:
819 1.1 christos #line 148 "calc1.y"
820 1.1 christos {
821 1.1 christos yyval.vval = vmul( yystack.l_mark[-2].vval.lo, yystack.l_mark[-2].vval.hi, yystack.l_mark[0].vval );
822 1.1 christos }
823 1.1 christos break;
824 1.1 christos case 24:
825 1.1 christos #line 152 "calc1.y"
826 1.1 christos {
827 1.1 christos yyval.vval = vmul (yystack.l_mark[-2].dval, yystack.l_mark[-2].dval, yystack.l_mark[0].vval );
828 1.1 christos }
829 1.1 christos break;
830 1.1 christos case 25:
831 1.1 christos #line 156 "calc1.y"
832 1.1 christos {
833 1.1 christos if (dcheck(yystack.l_mark[0].vval)) YYERROR;
834 1.1 christos yyval.vval = vdiv ( yystack.l_mark[-2].vval.lo, yystack.l_mark[-2].vval.hi, yystack.l_mark[0].vval );
835 1.1 christos }
836 1.1 christos break;
837 1.1 christos case 26:
838 1.1 christos #line 161 "calc1.y"
839 1.1 christos {
840 1.1 christos if (dcheck ( yystack.l_mark[0].vval )) YYERROR;
841 1.1 christos yyval.vval = vdiv (yystack.l_mark[-2].dval, yystack.l_mark[-2].dval, yystack.l_mark[0].vval );
842 1.1 christos }
843 1.1 christos break;
844 1.1 christos case 27:
845 1.1 christos #line 166 "calc1.y"
846 1.1 christos {
847 1.1 christos yyval.vval.hi = -yystack.l_mark[0].vval.lo;
848 1.1 christos yyval.vval.lo = -yystack.l_mark[0].vval.hi;
849 1.1 christos }
850 1.1 christos break;
851 1.1 christos case 28:
852 1.1 christos #line 171 "calc1.y"
853 1.1 christos {
854 1.1 christos yyval.vval = yystack.l_mark[-1].vval;
855 1.1 christos }
856 1.1 christos break;
857 1.1 christos #line 856 "calc1.tab.c"
858 1.1 christos }
859 1.1 christos yystack.s_mark -= yym;
860 1.1 christos yystate = *yystack.s_mark;
861 1.1 christos yystack.l_mark -= yym;
862 1.1 christos yym = yylhs[yyn];
863 1.1 christos if (yystate == 0 && yym == 0)
864 1.1 christos {
865 1.1 christos #if YYDEBUG
866 1.1 christos if (yydebug)
867 1.1 christos printf("%sdebug: after reduction, shifting from state 0 to\
868 1.1 christos state %d\n", YYPREFIX, YYFINAL);
869 1.1 christos #endif
870 1.1 christos yystate = YYFINAL;
871 1.1 christos *++yystack.s_mark = YYFINAL;
872 1.1 christos *++yystack.l_mark = yyval;
873 1.1 christos if (yychar < 0)
874 1.1 christos {
875 1.1 christos if ((yychar = YYLEX) < 0) yychar = YYEOF;
876 1.1 christos #if YYDEBUG
877 1.1 christos if (yydebug)
878 1.1 christos {
879 1.1 christos yys = yyname[YYTRANSLATE(yychar)];
880 1.1 christos printf("%sdebug: state %d, reading %d (%s)\n",
881 1.1 christos YYPREFIX, YYFINAL, yychar, yys);
882 1.1 christos }
883 1.1 christos #endif
884 1.1 christos }
885 1.1 christos if (yychar == YYEOF) goto yyaccept;
886 1.1 christos goto yyloop;
887 1.1 christos }
888 1.1 christos if ((yyn = yygindex[yym]) && (yyn += yystate) >= 0 &&
889 1.1 christos yyn <= YYTABLESIZE && yycheck[yyn] == yystate)
890 1.1 christos yystate = yytable[yyn];
891 1.1 christos else
892 1.1 christos yystate = yydgoto[yym];
893 1.1 christos #if YYDEBUG
894 1.1 christos if (yydebug)
895 1.1 christos printf("%sdebug: after reduction, shifting from state %d \
896 1.1 christos to state %d\n", YYPREFIX, *yystack.s_mark, yystate);
897 1.1 christos #endif
898 1.1 christos if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack) == YYENOMEM)
899 1.1 christos {
900 1.1 christos goto yyoverflow;
901 1.1 christos }
902 1.1 christos *++yystack.s_mark = (YYINT) yystate;
903 1.1 christos *++yystack.l_mark = yyval;
904 1.1 christos goto yyloop;
905 1.1 christos
906 1.1 christos yyoverflow:
907 1.1 christos YYERROR_CALL("yacc stack overflow");
908 1.1 christos
909 1.1 christos yyabort:
910 1.1 christos yyfreestack(&yystack);
911 1.1 christos return (1);
912 1.1 christos
913 1.1 christos yyaccept:
914 1.1 christos yyfreestack(&yystack);
915 1.1 christos return (0);
916 1.1 christos }
917