calc1.tab.c revision 1.5 1 1.4 christos /* $NetBSD: calc1.tab.c,v 1.5 2024/09/14 21:29:04 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.4 christos #define YYMAJOR 2
9 1.4 christos #define YYMINOR 0
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 #ifdef YYSTYPE
129 1.1 christos #undef YYSTYPE_IS_DECLARED
130 1.1 christos #define YYSTYPE_IS_DECLARED 1
131 1.1 christos #endif
132 1.1 christos #ifndef YYSTYPE_IS_DECLARED
133 1.1 christos #define YYSTYPE_IS_DECLARED 1
134 1.2 christos #line 31 "calc1.y"
135 1.5 christos typedef union YYSTYPE
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.5 christos typedef int 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.3 christos #if YYDEBUG
329 1.1 christos int yydebug;
330 1.3 christos #endif
331 1.1 christos
332 1.1 christos int yyerrflag;
333 1.1 christos int yychar;
334 1.1 christos YYSTYPE yyval;
335 1.1 christos YYSTYPE yylval;
336 1.3 christos int yynerrs;
337 1.1 christos
338 1.1 christos /* define the initial stack-sizes */
339 1.1 christos #ifdef YYSTACKSIZE
340 1.1 christos #undef YYMAXDEPTH
341 1.1 christos #define YYMAXDEPTH YYSTACKSIZE
342 1.1 christos #else
343 1.1 christos #ifdef YYMAXDEPTH
344 1.1 christos #define YYSTACKSIZE YYMAXDEPTH
345 1.1 christos #else
346 1.1 christos #define YYSTACKSIZE 10000
347 1.1 christos #define YYMAXDEPTH 10000
348 1.1 christos #endif
349 1.1 christos #endif
350 1.1 christos
351 1.1 christos #define YYINITSTACKSIZE 200
352 1.1 christos
353 1.1 christos typedef struct {
354 1.1 christos unsigned stacksize;
355 1.1 christos YYINT *s_base;
356 1.1 christos YYINT *s_mark;
357 1.1 christos YYINT *s_last;
358 1.1 christos YYSTYPE *l_base;
359 1.1 christos YYSTYPE *l_mark;
360 1.1 christos } YYSTACKDATA;
361 1.1 christos /* variables for the parser stack */
362 1.1 christos static YYSTACKDATA yystack;
363 1.1 christos #line 176 "calc1.y"
364 1.1 christos /* beginning of subroutines section */
365 1.1 christos
366 1.1 christos #define BSZ 50 /* buffer size for floating point numbers */
367 1.1 christos
368 1.1 christos /* lexical analysis */
369 1.1 christos
370 1.1 christos static void
371 1.1 christos yyerror(const char *s)
372 1.1 christos {
373 1.1 christos fprintf(stderr, "%s\n", s);
374 1.1 christos }
375 1.1 christos
376 1.1 christos int
377 1.1 christos yylex(void)
378 1.1 christos {
379 1.1 christos int c;
380 1.1 christos
381 1.1 christos while ((c = getchar()) == ' ')
382 1.1 christos { /* skip over blanks */
383 1.1 christos }
384 1.1 christos
385 1.1 christos if (isupper(c))
386 1.1 christos {
387 1.1 christos yylval.ival = c - 'A';
388 1.1 christos return (VREG);
389 1.1 christos }
390 1.1 christos if (islower(c))
391 1.1 christos {
392 1.1 christos yylval.ival = c - 'a';
393 1.1 christos return (DREG);
394 1.1 christos }
395 1.1 christos
396 1.1 christos if (isdigit(c) || c == '.')
397 1.1 christos {
398 1.1 christos /* gobble up digits, points, exponents */
399 1.1 christos char buf[BSZ + 1], *cp = buf;
400 1.1 christos int dot = 0, expr = 0;
401 1.1 christos
402 1.1 christos for (; (cp - buf) < BSZ; ++cp, c = getchar())
403 1.1 christos {
404 1.1 christos
405 1.1 christos *cp = (char) c;
406 1.1 christos if (isdigit(c))
407 1.1 christos continue;
408 1.1 christos if (c == '.')
409 1.1 christos {
410 1.1 christos if (dot++ || expr)
411 1.1 christos return ('.'); /* will cause syntax error */
412 1.1 christos continue;
413 1.1 christos }
414 1.1 christos
415 1.1 christos if (c == 'e')
416 1.1 christos {
417 1.1 christos if (expr++)
418 1.1 christos return ('e'); /* will cause syntax error */
419 1.1 christos continue;
420 1.1 christos }
421 1.1 christos
422 1.1 christos /* end of number */
423 1.1 christos break;
424 1.1 christos }
425 1.1 christos *cp = '\0';
426 1.1 christos
427 1.1 christos if ((cp - buf) >= BSZ)
428 1.1 christos printf("constant too long: truncated\n");
429 1.1 christos else
430 1.1 christos ungetc(c, stdin); /* push back last char read */
431 1.1 christos yylval.dval = atof(buf);
432 1.1 christos return (CONST);
433 1.1 christos }
434 1.1 christos return (c);
435 1.1 christos }
436 1.1 christos
437 1.1 christos static INTERVAL
438 1.1 christos hilo(double a, double b, double c, double d)
439 1.1 christos {
440 1.1 christos /* returns the smallest interval containing a, b, c, and d */
441 1.1 christos /* used by *, / routines */
442 1.1 christos INTERVAL v;
443 1.1 christos
444 1.1 christos if (a > b)
445 1.1 christos {
446 1.1 christos v.hi = a;
447 1.1 christos v.lo = b;
448 1.1 christos }
449 1.1 christos else
450 1.1 christos {
451 1.1 christos v.hi = b;
452 1.1 christos v.lo = a;
453 1.1 christos }
454 1.1 christos
455 1.1 christos if (c > d)
456 1.1 christos {
457 1.1 christos if (c > v.hi)
458 1.1 christos v.hi = c;
459 1.1 christos if (d < v.lo)
460 1.1 christos v.lo = d;
461 1.1 christos }
462 1.1 christos else
463 1.1 christos {
464 1.1 christos if (d > v.hi)
465 1.1 christos v.hi = d;
466 1.1 christos if (c < v.lo)
467 1.1 christos v.lo = c;
468 1.1 christos }
469 1.1 christos return (v);
470 1.1 christos }
471 1.1 christos
472 1.1 christos INTERVAL
473 1.1 christos vmul(double a, double b, INTERVAL v)
474 1.1 christos {
475 1.1 christos return (hilo(a * v.hi, a * v.lo, b * v.hi, b * v.lo));
476 1.1 christos }
477 1.1 christos
478 1.1 christos int
479 1.1 christos dcheck(INTERVAL v)
480 1.1 christos {
481 1.1 christos if (v.hi >= 0. && v.lo <= 0.)
482 1.1 christos {
483 1.1 christos printf("divisor interval contains 0.\n");
484 1.1 christos return (1);
485 1.1 christos }
486 1.1 christos return (0);
487 1.1 christos }
488 1.1 christos
489 1.1 christos INTERVAL
490 1.1 christos vdiv(double a, double b, INTERVAL v)
491 1.1 christos {
492 1.1 christos return (hilo(a / v.hi, a / v.lo, b / v.hi, b / v.lo));
493 1.1 christos }
494 1.3 christos #line 493 "calc1.tab.c"
495 1.1 christos
496 1.1 christos #if YYDEBUG
497 1.2 christos #include <stdio.h> /* needed for printf */
498 1.1 christos #endif
499 1.1 christos
500 1.1 christos #include <stdlib.h> /* needed for malloc, etc */
501 1.1 christos #include <string.h> /* needed for memset */
502 1.1 christos
503 1.1 christos /* allocate initial stack or double stack size, up to YYMAXDEPTH */
504 1.1 christos static int yygrowstack(YYSTACKDATA *data)
505 1.1 christos {
506 1.1 christos int i;
507 1.1 christos unsigned newsize;
508 1.1 christos YYINT *newss;
509 1.1 christos YYSTYPE *newvs;
510 1.1 christos
511 1.1 christos if ((newsize = data->stacksize) == 0)
512 1.1 christos newsize = YYINITSTACKSIZE;
513 1.1 christos else if (newsize >= YYMAXDEPTH)
514 1.1 christos return YYENOMEM;
515 1.1 christos else if ((newsize *= 2) > YYMAXDEPTH)
516 1.1 christos newsize = YYMAXDEPTH;
517 1.1 christos
518 1.1 christos i = (int) (data->s_mark - data->s_base);
519 1.1 christos newss = (YYINT *)realloc(data->s_base, newsize * sizeof(*newss));
520 1.1 christos if (newss == 0)
521 1.1 christos return YYENOMEM;
522 1.1 christos
523 1.1 christos data->s_base = newss;
524 1.1 christos data->s_mark = newss + i;
525 1.1 christos
526 1.1 christos newvs = (YYSTYPE *)realloc(data->l_base, newsize * sizeof(*newvs));
527 1.1 christos if (newvs == 0)
528 1.1 christos return YYENOMEM;
529 1.1 christos
530 1.1 christos data->l_base = newvs;
531 1.1 christos data->l_mark = newvs + i;
532 1.1 christos
533 1.1 christos data->stacksize = newsize;
534 1.1 christos data->s_last = data->s_base + newsize - 1;
535 1.1 christos return 0;
536 1.1 christos }
537 1.1 christos
538 1.1 christos #if YYPURE || defined(YY_NO_LEAKS)
539 1.1 christos static void yyfreestack(YYSTACKDATA *data)
540 1.1 christos {
541 1.1 christos free(data->s_base);
542 1.1 christos free(data->l_base);
543 1.1 christos memset(data, 0, sizeof(*data));
544 1.1 christos }
545 1.1 christos #else
546 1.1 christos #define yyfreestack(data) /* nothing */
547 1.1 christos #endif
548 1.1 christos
549 1.1 christos #define YYABORT goto yyabort
550 1.1 christos #define YYREJECT goto yyabort
551 1.1 christos #define YYACCEPT goto yyaccept
552 1.1 christos #define YYERROR goto yyerrlab
553 1.1 christos
554 1.1 christos int
555 1.1 christos YYPARSE_DECL()
556 1.1 christos {
557 1.1 christos int yym, yyn, yystate;
558 1.1 christos #if YYDEBUG
559 1.1 christos const char *yys;
560 1.1 christos
561 1.1 christos if ((yys = getenv("YYDEBUG")) != 0)
562 1.1 christos {
563 1.1 christos yyn = *yys;
564 1.1 christos if (yyn >= '0' && yyn <= '9')
565 1.1 christos yydebug = yyn - '0';
566 1.1 christos }
567 1.1 christos #endif
568 1.1 christos
569 1.5 christos /* yym is set below */
570 1.5 christos /* yyn is set below */
571 1.1 christos yynerrs = 0;
572 1.1 christos yyerrflag = 0;
573 1.1 christos yychar = YYEMPTY;
574 1.1 christos yystate = 0;
575 1.1 christos
576 1.1 christos #if YYPURE
577 1.1 christos memset(&yystack, 0, sizeof(yystack));
578 1.1 christos #endif
579 1.1 christos
580 1.1 christos if (yystack.s_base == NULL && yygrowstack(&yystack) == YYENOMEM) goto yyoverflow;
581 1.1 christos yystack.s_mark = yystack.s_base;
582 1.1 christos yystack.l_mark = yystack.l_base;
583 1.1 christos yystate = 0;
584 1.1 christos *yystack.s_mark = 0;
585 1.1 christos
586 1.1 christos yyloop:
587 1.1 christos if ((yyn = yydefred[yystate]) != 0) goto yyreduce;
588 1.1 christos if (yychar < 0)
589 1.1 christos {
590 1.2 christos yychar = YYLEX;
591 1.2 christos if (yychar < 0) yychar = YYEOF;
592 1.1 christos #if YYDEBUG
593 1.1 christos if (yydebug)
594 1.1 christos {
595 1.2 christos if ((yys = yyname[YYTRANSLATE(yychar)]) == NULL) yys = yyname[YYUNDFTOKEN];
596 1.1 christos printf("%sdebug: state %d, reading %d (%s)\n",
597 1.1 christos YYPREFIX, yystate, yychar, yys);
598 1.1 christos }
599 1.1 christos #endif
600 1.1 christos }
601 1.2 christos if (((yyn = yysindex[yystate]) != 0) && (yyn += yychar) >= 0 &&
602 1.2 christos yyn <= YYTABLESIZE && yycheck[yyn] == (YYINT) yychar)
603 1.1 christos {
604 1.1 christos #if YYDEBUG
605 1.1 christos if (yydebug)
606 1.1 christos printf("%sdebug: state %d, shifting to state %d\n",
607 1.1 christos YYPREFIX, yystate, yytable[yyn]);
608 1.1 christos #endif
609 1.2 christos if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack) == YYENOMEM) goto yyoverflow;
610 1.1 christos yystate = yytable[yyn];
611 1.1 christos *++yystack.s_mark = yytable[yyn];
612 1.1 christos *++yystack.l_mark = yylval;
613 1.1 christos yychar = YYEMPTY;
614 1.1 christos if (yyerrflag > 0) --yyerrflag;
615 1.1 christos goto yyloop;
616 1.1 christos }
617 1.2 christos if (((yyn = yyrindex[yystate]) != 0) && (yyn += yychar) >= 0 &&
618 1.2 christos yyn <= YYTABLESIZE && yycheck[yyn] == (YYINT) yychar)
619 1.1 christos {
620 1.1 christos yyn = yytable[yyn];
621 1.1 christos goto yyreduce;
622 1.1 christos }
623 1.2 christos if (yyerrflag != 0) goto yyinrecovery;
624 1.1 christos
625 1.1 christos YYERROR_CALL("syntax error");
626 1.1 christos
627 1.2 christos goto yyerrlab; /* redundant goto avoids 'unused label' warning */
628 1.1 christos yyerrlab:
629 1.1 christos ++yynerrs;
630 1.1 christos
631 1.1 christos yyinrecovery:
632 1.1 christos if (yyerrflag < 3)
633 1.1 christos {
634 1.1 christos yyerrflag = 3;
635 1.1 christos for (;;)
636 1.1 christos {
637 1.2 christos if (((yyn = yysindex[*yystack.s_mark]) != 0) && (yyn += YYERRCODE) >= 0 &&
638 1.2 christos yyn <= YYTABLESIZE && yycheck[yyn] == (YYINT) YYERRCODE)
639 1.1 christos {
640 1.1 christos #if YYDEBUG
641 1.1 christos if (yydebug)
642 1.1 christos printf("%sdebug: state %d, error recovery shifting\
643 1.1 christos to state %d\n", YYPREFIX, *yystack.s_mark, yytable[yyn]);
644 1.1 christos #endif
645 1.2 christos if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack) == YYENOMEM) goto yyoverflow;
646 1.1 christos yystate = yytable[yyn];
647 1.1 christos *++yystack.s_mark = yytable[yyn];
648 1.1 christos *++yystack.l_mark = yylval;
649 1.1 christos goto yyloop;
650 1.1 christos }
651 1.1 christos else
652 1.1 christos {
653 1.1 christos #if YYDEBUG
654 1.1 christos if (yydebug)
655 1.1 christos printf("%sdebug: error recovery discarding state %d\n",
656 1.1 christos YYPREFIX, *yystack.s_mark);
657 1.1 christos #endif
658 1.1 christos if (yystack.s_mark <= yystack.s_base) goto yyabort;
659 1.1 christos --yystack.s_mark;
660 1.1 christos --yystack.l_mark;
661 1.1 christos }
662 1.1 christos }
663 1.1 christos }
664 1.1 christos else
665 1.1 christos {
666 1.1 christos if (yychar == YYEOF) goto yyabort;
667 1.1 christos #if YYDEBUG
668 1.1 christos if (yydebug)
669 1.1 christos {
670 1.2 christos if ((yys = yyname[YYTRANSLATE(yychar)]) == NULL) yys = yyname[YYUNDFTOKEN];
671 1.1 christos printf("%sdebug: state %d, error recovery discards token %d (%s)\n",
672 1.1 christos YYPREFIX, yystate, yychar, yys);
673 1.1 christos }
674 1.1 christos #endif
675 1.1 christos yychar = YYEMPTY;
676 1.1 christos goto yyloop;
677 1.1 christos }
678 1.1 christos
679 1.1 christos yyreduce:
680 1.1 christos #if YYDEBUG
681 1.1 christos if (yydebug)
682 1.1 christos printf("%sdebug: state %d, reducing by rule %d (%s)\n",
683 1.1 christos YYPREFIX, yystate, yyn, yyrule[yyn]);
684 1.1 christos #endif
685 1.1 christos yym = yylen[yyn];
686 1.2 christos if (yym > 0)
687 1.1 christos yyval = yystack.l_mark[1-yym];
688 1.1 christos else
689 1.1 christos memset(&yyval, 0, sizeof yyval);
690 1.2 christos
691 1.1 christos switch (yyn)
692 1.1 christos {
693 1.1 christos case 3:
694 1.1 christos #line 57 "calc1.y"
695 1.1 christos {
696 1.1 christos (void) printf("%15.8f\n", yystack.l_mark[-1].dval);
697 1.1 christos }
698 1.5 christos #line 697 "calc1.tab.c"
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.5 christos #line 704 "calc1.tab.c"
706 1.1 christos break;
707 1.1 christos case 5:
708 1.1 christos #line 65 "calc1.y"
709 1.1 christos {
710 1.1 christos dreg[yystack.l_mark[-3].ival] = yystack.l_mark[-1].dval;
711 1.1 christos }
712 1.5 christos #line 711 "calc1.tab.c"
713 1.1 christos break;
714 1.1 christos case 6:
715 1.1 christos #line 69 "calc1.y"
716 1.1 christos {
717 1.1 christos vreg[yystack.l_mark[-3].ival] = yystack.l_mark[-1].vval;
718 1.1 christos }
719 1.5 christos #line 718 "calc1.tab.c"
720 1.1 christos break;
721 1.1 christos case 7:
722 1.1 christos #line 73 "calc1.y"
723 1.1 christos {
724 1.1 christos yyerrok;
725 1.1 christos }
726 1.5 christos #line 725 "calc1.tab.c"
727 1.1 christos break;
728 1.1 christos case 9:
729 1.1 christos #line 80 "calc1.y"
730 1.1 christos {
731 1.1 christos yyval.dval = dreg[yystack.l_mark[0].ival];
732 1.1 christos }
733 1.5 christos #line 732 "calc1.tab.c"
734 1.1 christos break;
735 1.1 christos case 10:
736 1.1 christos #line 84 "calc1.y"
737 1.1 christos {
738 1.1 christos yyval.dval = yystack.l_mark[-2].dval + yystack.l_mark[0].dval;
739 1.1 christos }
740 1.5 christos #line 739 "calc1.tab.c"
741 1.1 christos break;
742 1.1 christos case 11:
743 1.1 christos #line 88 "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.5 christos #line 746 "calc1.tab.c"
748 1.1 christos break;
749 1.1 christos case 12:
750 1.1 christos #line 92 "calc1.y"
751 1.1 christos {
752 1.1 christos yyval.dval = yystack.l_mark[-2].dval * yystack.l_mark[0].dval;
753 1.1 christos }
754 1.5 christos #line 753 "calc1.tab.c"
755 1.1 christos break;
756 1.1 christos case 13:
757 1.1 christos #line 96 "calc1.y"
758 1.1 christos {
759 1.1 christos yyval.dval = yystack.l_mark[-2].dval / yystack.l_mark[0].dval;
760 1.1 christos }
761 1.5 christos #line 760 "calc1.tab.c"
762 1.1 christos break;
763 1.1 christos case 14:
764 1.1 christos #line 100 "calc1.y"
765 1.1 christos {
766 1.1 christos yyval.dval = -yystack.l_mark[0].dval;
767 1.1 christos }
768 1.5 christos #line 767 "calc1.tab.c"
769 1.1 christos break;
770 1.1 christos case 15:
771 1.1 christos #line 104 "calc1.y"
772 1.1 christos {
773 1.1 christos yyval.dval = yystack.l_mark[-1].dval;
774 1.1 christos }
775 1.5 christos #line 774 "calc1.tab.c"
776 1.1 christos break;
777 1.1 christos case 16:
778 1.1 christos #line 110 "calc1.y"
779 1.1 christos {
780 1.1 christos yyval.vval.hi = yyval.vval.lo = yystack.l_mark[0].dval;
781 1.1 christos }
782 1.5 christos #line 781 "calc1.tab.c"
783 1.1 christos break;
784 1.1 christos case 17:
785 1.1 christos #line 114 "calc1.y"
786 1.1 christos {
787 1.1 christos yyval.vval.lo = yystack.l_mark[-3].dval;
788 1.1 christos yyval.vval.hi = yystack.l_mark[-1].dval;
789 1.1 christos if ( yyval.vval.lo > yyval.vval.hi )
790 1.1 christos {
791 1.1 christos (void) printf("interval out of order\n");
792 1.1 christos YYERROR;
793 1.1 christos }
794 1.1 christos }
795 1.5 christos #line 794 "calc1.tab.c"
796 1.1 christos break;
797 1.1 christos case 18:
798 1.1 christos #line 124 "calc1.y"
799 1.1 christos {
800 1.1 christos yyval.vval = vreg[yystack.l_mark[0].ival];
801 1.1 christos }
802 1.5 christos #line 801 "calc1.tab.c"
803 1.1 christos break;
804 1.1 christos case 19:
805 1.1 christos #line 128 "calc1.y"
806 1.1 christos {
807 1.1 christos yyval.vval.hi = yystack.l_mark[-2].vval.hi + yystack.l_mark[0].vval.hi;
808 1.1 christos yyval.vval.lo = yystack.l_mark[-2].vval.lo + yystack.l_mark[0].vval.lo;
809 1.1 christos }
810 1.5 christos #line 809 "calc1.tab.c"
811 1.1 christos break;
812 1.1 christos case 20:
813 1.1 christos #line 133 "calc1.y"
814 1.1 christos {
815 1.1 christos yyval.vval.hi = yystack.l_mark[-2].dval + yystack.l_mark[0].vval.hi;
816 1.1 christos yyval.vval.lo = yystack.l_mark[-2].dval + yystack.l_mark[0].vval.lo;
817 1.1 christos }
818 1.5 christos #line 817 "calc1.tab.c"
819 1.1 christos break;
820 1.1 christos case 21:
821 1.1 christos #line 138 "calc1.y"
822 1.1 christos {
823 1.1 christos yyval.vval.hi = yystack.l_mark[-2].vval.hi - yystack.l_mark[0].vval.lo;
824 1.1 christos yyval.vval.lo = yystack.l_mark[-2].vval.lo - yystack.l_mark[0].vval.hi;
825 1.1 christos }
826 1.5 christos #line 825 "calc1.tab.c"
827 1.1 christos break;
828 1.1 christos case 22:
829 1.1 christos #line 143 "calc1.y"
830 1.1 christos {
831 1.1 christos yyval.vval.hi = yystack.l_mark[-2].dval - yystack.l_mark[0].vval.lo;
832 1.1 christos yyval.vval.lo = yystack.l_mark[-2].dval - yystack.l_mark[0].vval.hi;
833 1.1 christos }
834 1.5 christos #line 833 "calc1.tab.c"
835 1.1 christos break;
836 1.1 christos case 23:
837 1.1 christos #line 148 "calc1.y"
838 1.1 christos {
839 1.1 christos yyval.vval = vmul( yystack.l_mark[-2].vval.lo, yystack.l_mark[-2].vval.hi, yystack.l_mark[0].vval );
840 1.1 christos }
841 1.5 christos #line 840 "calc1.tab.c"
842 1.1 christos break;
843 1.1 christos case 24:
844 1.1 christos #line 152 "calc1.y"
845 1.1 christos {
846 1.1 christos yyval.vval = vmul (yystack.l_mark[-2].dval, yystack.l_mark[-2].dval, yystack.l_mark[0].vval );
847 1.1 christos }
848 1.5 christos #line 847 "calc1.tab.c"
849 1.1 christos break;
850 1.1 christos case 25:
851 1.1 christos #line 156 "calc1.y"
852 1.1 christos {
853 1.1 christos if (dcheck(yystack.l_mark[0].vval)) YYERROR;
854 1.1 christos yyval.vval = vdiv ( yystack.l_mark[-2].vval.lo, yystack.l_mark[-2].vval.hi, yystack.l_mark[0].vval );
855 1.1 christos }
856 1.5 christos #line 855 "calc1.tab.c"
857 1.1 christos break;
858 1.1 christos case 26:
859 1.1 christos #line 161 "calc1.y"
860 1.1 christos {
861 1.1 christos if (dcheck ( yystack.l_mark[0].vval )) YYERROR;
862 1.1 christos yyval.vval = vdiv (yystack.l_mark[-2].dval, yystack.l_mark[-2].dval, yystack.l_mark[0].vval );
863 1.1 christos }
864 1.5 christos #line 863 "calc1.tab.c"
865 1.1 christos break;
866 1.1 christos case 27:
867 1.1 christos #line 166 "calc1.y"
868 1.1 christos {
869 1.1 christos yyval.vval.hi = -yystack.l_mark[0].vval.lo;
870 1.1 christos yyval.vval.lo = -yystack.l_mark[0].vval.hi;
871 1.1 christos }
872 1.5 christos #line 871 "calc1.tab.c"
873 1.1 christos break;
874 1.1 christos case 28:
875 1.1 christos #line 171 "calc1.y"
876 1.1 christos {
877 1.1 christos yyval.vval = yystack.l_mark[-1].vval;
878 1.1 christos }
879 1.5 christos #line 878 "calc1.tab.c"
880 1.1 christos break;
881 1.5 christos #line 880 "calc1.tab.c"
882 1.1 christos }
883 1.1 christos yystack.s_mark -= yym;
884 1.1 christos yystate = *yystack.s_mark;
885 1.1 christos yystack.l_mark -= yym;
886 1.1 christos yym = yylhs[yyn];
887 1.1 christos if (yystate == 0 && yym == 0)
888 1.1 christos {
889 1.1 christos #if YYDEBUG
890 1.1 christos if (yydebug)
891 1.1 christos printf("%sdebug: after reduction, shifting from state 0 to\
892 1.1 christos state %d\n", YYPREFIX, YYFINAL);
893 1.1 christos #endif
894 1.1 christos yystate = YYFINAL;
895 1.1 christos *++yystack.s_mark = YYFINAL;
896 1.1 christos *++yystack.l_mark = yyval;
897 1.1 christos if (yychar < 0)
898 1.1 christos {
899 1.2 christos yychar = YYLEX;
900 1.2 christos if (yychar < 0) yychar = YYEOF;
901 1.1 christos #if YYDEBUG
902 1.1 christos if (yydebug)
903 1.1 christos {
904 1.2 christos if ((yys = yyname[YYTRANSLATE(yychar)]) == NULL) yys = yyname[YYUNDFTOKEN];
905 1.1 christos printf("%sdebug: state %d, reading %d (%s)\n",
906 1.1 christos YYPREFIX, YYFINAL, yychar, yys);
907 1.1 christos }
908 1.1 christos #endif
909 1.1 christos }
910 1.1 christos if (yychar == YYEOF) goto yyaccept;
911 1.1 christos goto yyloop;
912 1.1 christos }
913 1.2 christos if (((yyn = yygindex[yym]) != 0) && (yyn += yystate) >= 0 &&
914 1.2 christos yyn <= YYTABLESIZE && yycheck[yyn] == (YYINT) yystate)
915 1.1 christos yystate = yytable[yyn];
916 1.1 christos else
917 1.1 christos yystate = yydgoto[yym];
918 1.1 christos #if YYDEBUG
919 1.1 christos if (yydebug)
920 1.1 christos printf("%sdebug: after reduction, shifting from state %d \
921 1.1 christos to state %d\n", YYPREFIX, *yystack.s_mark, yystate);
922 1.1 christos #endif
923 1.2 christos if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack) == YYENOMEM) goto yyoverflow;
924 1.1 christos *++yystack.s_mark = (YYINT) yystate;
925 1.1 christos *++yystack.l_mark = yyval;
926 1.1 christos goto yyloop;
927 1.1 christos
928 1.1 christos yyoverflow:
929 1.1 christos YYERROR_CALL("yacc stack overflow");
930 1.1 christos
931 1.1 christos yyabort:
932 1.1 christos yyfreestack(&yystack);
933 1.1 christos return (1);
934 1.1 christos
935 1.1 christos yyaccept:
936 1.1 christos yyfreestack(&yystack);
937 1.1 christos return (0);
938 1.1 christos }
939