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