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