Commit | Line | Data |
---|---|---|
dd3b648e | 1 | |
65c93482 | 2 | /* A Bison parser, made from ./expread.y */ |
dd3b648e RP |
3 | |
4 | #define INT 258 | |
5 | #define CHAR 259 | |
6 | #define UINT 260 | |
7 | #define FLOAT 261 | |
8 | #define STRING 262 | |
9 | #define NAME 263 | |
10 | #define BLOCKNAME 264 | |
11 | #define TYPENAME 265 | |
12 | #define NAME_OR_INT 266 | |
13 | #define NAME_OR_UINT 267 | |
14 | #define STRUCT 268 | |
15 | #define UNION 269 | |
16 | #define ENUM 270 | |
17 | #define SIZEOF 271 | |
18 | #define UNSIGNED 272 | |
19 | #define COLONCOLON 273 | |
20 | #define ERROR 274 | |
21 | #define SIGNED 275 | |
22 | #define LONG 276 | |
23 | #define SHORT 277 | |
24 | #define INT_KEYWORD 278 | |
25 | #define LAST 279 | |
26 | #define REGNAME 280 | |
27 | #define VARIABLE 281 | |
28 | #define ASSIGN_MODIFY 282 | |
29 | #define THIS 283 | |
30 | #define ABOVE_COMMA 284 | |
31 | #define OR 285 | |
32 | #define AND 286 | |
33 | #define EQUAL 287 | |
34 | #define NOTEQUAL 288 | |
35 | #define LEQ 289 | |
36 | #define GEQ 290 | |
37 | #define LSH 291 | |
38 | #define RSH 292 | |
39 | #define UNARY 293 | |
40 | #define INCREMENT 294 | |
41 | #define DECREMENT 295 | |
42 | #define ARROW 296 | |
43 | ||
65c93482 | 44 | #line 29 "./expread.y" |
dd3b648e RP |
45 | |
46 | #include <stdio.h> | |
47 | #include "defs.h" | |
48 | #include "param.h" | |
49 | #include "symtab.h" | |
50 | #include "frame.h" | |
51 | #include "expression.h" | |
52 | #include "value.h" | |
53 | #include "command.h" | |
54 | ||
55 | static struct expression *expout; | |
56 | static int expout_size; | |
57 | static int expout_ptr; | |
58 | ||
59 | static int yylex (); | |
60 | static void yyerror (); | |
61 | static void write_exp_elt (); | |
62 | static void write_exp_elt_opcode (); | |
63 | static void write_exp_elt_sym (); | |
64 | static void write_exp_elt_longcst (); | |
65 | static void write_exp_elt_dblcst (); | |
66 | static void write_exp_elt_type (); | |
67 | static void write_exp_elt_intern (); | |
68 | static void write_exp_string (); | |
69 | static void start_arglist (); | |
70 | static int end_arglist (); | |
71 | static void free_funcalls (); | |
72 | static char *copy_name (); | |
73 | static int parse_number (); | |
74 | ||
75 | /* If this is nonzero, this block is used as the lexical context | |
76 | for symbol names. */ | |
77 | ||
78 | static struct block *expression_context_block; | |
79 | ||
80 | /* The innermost context required by the stack and register variables | |
81 | we've encountered so far. */ | |
82 | struct block *innermost_block; | |
83 | ||
84 | /* The block in which the most recently discovered symbol was found. */ | |
85 | struct block *block_found; | |
86 | ||
87 | /* Number of arguments seen so far in innermost function call. */ | |
88 | static int arglist_len; | |
89 | ||
90 | /* Data structure for saving values of arglist_len | |
91 | for function calls whose arguments contain other function calls. */ | |
92 | ||
93 | struct funcall | |
94 | { | |
95 | struct funcall *next; | |
96 | int arglist_len; | |
97 | }; | |
98 | ||
99 | struct funcall *funcall_chain; | |
100 | ||
101 | /* This kind of datum is used to represent the name | |
102 | of a symbol token. */ | |
103 | ||
104 | struct stoken | |
105 | { | |
106 | char *ptr; | |
107 | int length; | |
108 | }; | |
109 | ||
110 | struct ttype | |
111 | { | |
112 | struct stoken stoken; | |
113 | struct type *type; | |
114 | }; | |
115 | ||
116 | struct symtoken | |
117 | { | |
118 | struct stoken stoken; | |
119 | struct symbol *sym; | |
120 | int is_a_field_of_this; | |
121 | }; | |
122 | ||
123 | /* For parsing of complicated types. | |
124 | An array should be preceded in the list by the size of the array. */ | |
125 | enum type_pieces | |
126 | {tp_end = -1, tp_pointer, tp_reference, tp_array, tp_function}; | |
65c93482 JK |
127 | /* The stack can contain either an enum type_pieces or an int. */ |
128 | union type_stack_elt { | |
129 | enum type_pieces piece; | |
130 | int int_val; | |
131 | }; | |
132 | static union type_stack_elt *type_stack; | |
dd3b648e RP |
133 | static int type_stack_depth, type_stack_size; |
134 | ||
135 | static void push_type (); | |
65c93482 | 136 | static void push_type_int (); |
dd3b648e | 137 | static enum type_pieces pop_type (); |
65c93482 | 138 | static int pop_type_int (); |
dd3b648e RP |
139 | |
140 | /* Allow debugging of parsing. */ | |
141 | #define YYDEBUG 1 | |
142 | ||
65c93482 | 143 | #line 132 "./expread.y" |
dd3b648e RP |
144 | typedef union |
145 | { | |
146 | LONGEST lval; | |
147 | unsigned LONGEST ulval; | |
148 | double dval; | |
149 | struct symbol *sym; | |
150 | struct type *tval; | |
151 | struct stoken sval; | |
152 | struct ttype tsym; | |
153 | struct symtoken ssym; | |
154 | int voidval; | |
155 | struct block *bval; | |
156 | enum exp_opcode opcode; | |
157 | struct internalvar *ivar; | |
158 | ||
159 | struct type **tvec; | |
160 | int *ivec; | |
161 | } YYSTYPE; | |
162 | ||
163 | #ifndef YYLTYPE | |
164 | typedef | |
165 | struct yyltype | |
166 | { | |
167 | int timestamp; | |
168 | int first_line; | |
169 | int first_column; | |
170 | int last_line; | |
171 | int last_column; | |
172 | char *text; | |
173 | } | |
174 | yyltype; | |
175 | ||
176 | #define YYLTYPE yyltype | |
177 | #endif | |
178 | ||
179 | #include <stdio.h> | |
180 | ||
181 | #ifndef __STDC__ | |
182 | #define const | |
183 | #endif | |
184 | ||
185 | ||
186 | ||
689f801a | 187 | #define YYFINAL 197 |
dd3b648e RP |
188 | #define YYFLAG -32768 |
189 | #define YYNTBASE 66 | |
190 | ||
191 | #define YYTRANSLATE(x) ((unsigned)(x) <= 296 ? yytranslate[x] : 84) | |
192 | ||
193 | static const char yytranslate[] = { 0, | |
194 | 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, | |
195 | 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, | |
196 | 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, | |
197 | 2, 2, 59, 2, 2, 2, 51, 37, 2, 58, | |
198 | 62, 49, 47, 29, 48, 56, 50, 2, 2, 2, | |
199 | 2, 2, 2, 2, 2, 2, 2, 65, 2, 40, | |
200 | 31, 41, 32, 46, 2, 2, 2, 2, 2, 2, | |
201 | 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, | |
202 | 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, | |
203 | 57, 2, 61, 36, 2, 2, 2, 2, 2, 2, | |
204 | 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, | |
205 | 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, | |
206 | 2, 2, 63, 35, 64, 60, 2, 2, 2, 2, | |
207 | 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, | |
208 | 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, | |
209 | 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, | |
210 | 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, | |
211 | 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, | |
212 | 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, | |
213 | 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, | |
214 | 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, | |
215 | 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, | |
216 | 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, | |
217 | 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, | |
218 | 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, | |
219 | 2, 2, 2, 2, 2, 1, 2, 3, 4, 5, | |
220 | 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, | |
221 | 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, | |
222 | 26, 27, 28, 30, 33, 34, 38, 39, 42, 43, | |
223 | 44, 45, 52, 53, 54, 55 | |
224 | }; | |
225 | ||
beff312e RP |
226 | static const short yyprhs[] = { 0, |
227 | 0, 2, 4, 8, 11, 14, 17, 20, 23, 26, | |
228 | 29, 32, 35, 38, 42, 47, 51, 56, 61, 62, | |
229 | 68, 69, 71, 75, 80, 85, 89, 93, 97, 101, | |
230 | 105, 109, 113, 117, 121, 125, 129, 133, 137, 141, | |
231 | 145, 149, 153, 157, 161, 165, 171, 175, 179, 181, | |
232 | 183, 185, 187, 189, 191, 193, 195, 197, 199, 204, | |
233 | 206, 208, 210, 214, 218, 222, 227, 230, 232, 234, | |
234 | 237, 239, 242, 244, 247, 249, 253, 256, 258, 261, | |
235 | 263, 266, 270, 273, 275, 279, 286, 295, 305, 307, | |
236 | 309, 311, 313, 316, 320, 323, 327, 331, 336, 339, | |
237 | 343, 346, 349, 352, 355, 357, 360, 362, 364, 366, | |
238 | 368, 370, 372, 376, 378, 380, 382, 384, 386, 388 | |
239 | }; | |
240 | ||
241 | static const short yyrhs[] = { 67, | |
242 | 0, 68, 0, 67, 29, 68, 0, 49, 68, 0, | |
243 | 37, 68, 0, 48, 68, 0, 59, 68, 0, 60, | |
244 | 68, 0, 53, 68, 0, 54, 68, 0, 68, 53, | |
245 | 0, 68, 54, 0, 16, 68, 0, 68, 55, 82, | |
246 | 0, 68, 55, 49, 68, 0, 68, 56, 82, 0, | |
247 | 68, 56, 49, 68, 0, 68, 57, 67, 61, 0, | |
248 | 0, 68, 58, 69, 70, 62, 0, 0, 68, 0, | |
249 | 70, 29, 68, 0, 63, 78, 64, 68, 0, 58, | |
250 | 78, 62, 68, 0, 58, 67, 62, 0, 68, 46, | |
251 | 68, 0, 68, 49, 68, 0, 68, 50, 68, 0, | |
252 | 68, 51, 68, 0, 68, 47, 68, 0, 68, 48, | |
253 | 68, 0, 68, 44, 68, 0, 68, 45, 68, 0, | |
254 | 68, 38, 68, 0, 68, 39, 68, 0, 68, 42, | |
255 | 68, 0, 68, 43, 68, 0, 68, 40, 68, 0, | |
256 | 68, 41, 68, 0, 68, 37, 68, 0, 68, 36, | |
257 | 68, 0, 68, 35, 68, 0, 68, 34, 68, 0, | |
258 | 68, 33, 68, 0, 68, 32, 68, 65, 68, 0, | |
259 | 68, 31, 68, 0, 68, 27, 68, 0, 3, 0, | |
260 | 11, 0, 5, 0, 12, 0, 4, 0, 6, 0, | |
261 | 72, 0, 24, 0, 25, 0, 26, 0, 16, 58, | |
262 | 78, 62, 0, 7, 0, 28, 0, 9, 0, 71, | |
263 | 18, 82, 0, 71, 18, 82, 0, 79, 18, 82, | |
264 | 0, 79, 18, 60, 82, 0, 18, 82, 0, 83, | |
265 | 0, 79, 0, 79, 74, 0, 49, 0, 49, 74, | |
266 | 0, 37, 0, 37, 74, 0, 75, 0, 58, 74, | |
267 | 62, 0, 75, 76, 0, 76, 0, 75, 77, 0, | |
268 | 77, 0, 57, 61, 0, 57, 3, 61, 0, 58, | |
269 | 62, 0, 73, 0, 79, 18, 49, 0, 78, 58, | |
270 | 79, 18, 49, 62, 0, 78, 58, 79, 18, 49, | |
271 | 62, 58, 62, 0, 78, 58, 79, 18, 49, 62, | |
272 | 58, 81, 62, 0, 10, 0, 23, 0, 21, 0, | |
273 | 22, 0, 21, 23, 0, 17, 21, 23, 0, 21, | |
274 | 21, 0, 21, 21, 23, 0, 17, 21, 21, 0, | |
275 | 17, 21, 21, 23, 0, 22, 23, 0, 17, 22, | |
276 | 23, 0, 13, 82, 0, 14, 82, 0, 15, 82, | |
277 | 0, 17, 80, 0, 17, 0, 20, 80, 0, 20, | |
278 | 0, 10, 0, 23, 0, 21, 0, 22, 0, 78, | |
279 | 0, 81, 29, 78, 0, 8, 0, 9, 0, 10, | |
280 | 0, 11, 0, 12, 0, 8, 0, 9, 0 | |
281 | }; | |
282 | ||
283 | #if YYDEBUG != 0 | |
284 | static const short yyrline[] = { 0, | |
65c93482 JK |
285 | 225, 229, 230, 235, 238, 241, 245, 249, 253, 257, |
286 | 261, 265, 269, 273, 279, 283, 289, 293, 297, 301, | |
287 | 307, 310, 314, 318, 324, 330, 336, 340, 344, 348, | |
288 | 352, 356, 360, 364, 368, 372, 376, 380, 384, 388, | |
289 | 392, 396, 400, 404, 408, 412, 416, 420, 426, 436, | |
290 | 449, 461, 474, 481, 488, 491, 497, 503, 509, 516, | |
55b32c02 JG |
291 | 523, 530, 548, 558, 570, 583, 601, 647, 741, 742, |
292 | 777, 779, 781, 783, 785, 788, 790, 795, 801, 803, | |
293 | 807, 809, 813, 817, 818, 820, 822, 825, 832, 834, | |
294 | 836, 838, 840, 842, 844, 846, 848, 850, 852, 854, | |
295 | 856, 859, 862, 865, 867, 869, 871, 875, 876, 882, | |
296 | 888, 897, 902, 909, 910, 911, 912, 913, 916, 917 | |
dd3b648e RP |
297 | }; |
298 | ||
beff312e | 299 | static const char * const yytname[] = { "$", |
dd3b648e RP |
300 | "error","$illegal.","INT","CHAR","UINT","FLOAT","STRING","NAME","BLOCKNAME","TYPENAME", |
301 | "NAME_OR_INT","NAME_OR_UINT","STRUCT","UNION","ENUM","SIZEOF","UNSIGNED","COLONCOLON","ERROR","SIGNED", | |
302 | "LONG","SHORT","INT_KEYWORD","LAST","REGNAME","VARIABLE","ASSIGN_MODIFY","THIS","','","ABOVE_COMMA", | |
303 | "'='","'?'","OR","AND","'|'","'^'","'&'","EQUAL","NOTEQUAL","'<'", | |
304 | "'>'","LEQ","GEQ","LSH","RSH","'@'","'+'","'-'","'*'","'/'", | |
305 | "'%'","UNARY","INCREMENT","DECREMENT","ARROW","'.'","'['","'('","'!'","'~'", | |
beff312e RP |
306 | "']'","')'","'{'","'}'","':'","start","exp1","exp","@1","arglist", |
307 | "block","variable","ptype","abs_decl","direct_abs_decl","array_mod","func_mod","type","typebase","typename", | |
308 | "nonempty_typelist","name","name_not_typename","" | |
dd3b648e | 309 | }; |
beff312e | 310 | #endif |
dd3b648e RP |
311 | |
312 | static const short yyr1[] = { 0, | |
313 | 66, 67, 67, 68, 68, 68, 68, 68, 68, 68, | |
314 | 68, 68, 68, 68, 68, 68, 68, 68, 69, 68, | |
315 | 70, 70, 70, 68, 68, 68, 68, 68, 68, 68, | |
316 | 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, | |
317 | 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, | |
318 | 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, | |
689f801a JK |
319 | 68, 71, 71, 72, 72, 72, 72, 72, 73, 73, |
320 | 74, 74, 74, 74, 74, 75, 75, 75, 75, 75, | |
321 | 76, 76, 77, 78, 78, 78, 78, 78, 79, 79, | |
dd3b648e | 322 | 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, |
689f801a JK |
323 | 79, 79, 79, 79, 79, 79, 79, 80, 80, 80, |
324 | 80, 81, 81, 82, 82, 82, 82, 82, 83, 83 | |
dd3b648e RP |
325 | }; |
326 | ||
327 | static const short yyr2[] = { 0, | |
328 | 1, 1, 3, 2, 2, 2, 2, 2, 2, 2, | |
329 | 2, 2, 2, 3, 4, 3, 4, 4, 0, 5, | |
330 | 0, 1, 3, 4, 4, 3, 3, 3, 3, 3, | |
331 | 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, | |
332 | 3, 3, 3, 3, 3, 5, 3, 3, 1, 1, | |
333 | 1, 1, 1, 1, 1, 1, 1, 1, 4, 1, | |
689f801a JK |
334 | 1, 1, 3, 3, 3, 4, 2, 1, 1, 2, |
335 | 1, 2, 1, 2, 1, 3, 2, 1, 2, 1, | |
336 | 2, 3, 2, 1, 3, 6, 8, 9, 1, 1, | |
337 | 1, 1, 2, 3, 2, 3, 3, 4, 2, 3, | |
338 | 2, 2, 2, 2, 1, 2, 1, 1, 1, 1, | |
339 | 1, 1, 3, 1, 1, 1, 1, 1, 1, 1 | |
dd3b648e RP |
340 | }; |
341 | ||
342 | static const short yydefact[] = { 0, | |
689f801a JK |
343 | 49, 53, 51, 54, 60, 119, 120, 89, 50, 52, |
344 | 0, 0, 0, 0, 105, 0, 107, 91, 92, 90, | |
dd3b648e | 345 | 56, 57, 58, 61, 0, 0, 0, 0, 0, 0, |
689f801a JK |
346 | 0, 0, 0, 1, 2, 0, 55, 0, 68, 114, |
347 | 115, 116, 117, 118, 101, 102, 103, 0, 13, 108, | |
348 | 110, 111, 109, 104, 67, 110, 111, 106, 95, 93, | |
349 | 99, 5, 6, 4, 9, 10, 0, 84, 0, 69, | |
350 | 7, 8, 0, 69, 0, 0, 0, 0, 0, 0, | |
dd3b648e | 351 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, |
689f801a JK |
352 | 0, 0, 0, 0, 0, 0, 0, 11, 12, 0, |
353 | 0, 0, 19, 0, 0, 0, 97, 94, 100, 96, | |
354 | 26, 0, 0, 0, 73, 71, 0, 0, 70, 75, | |
355 | 78, 80, 0, 0, 3, 48, 47, 0, 45, 44, | |
356 | 43, 42, 41, 35, 36, 39, 40, 37, 38, 33, | |
357 | 34, 27, 31, 32, 28, 29, 30, 0, 14, 0, | |
358 | 16, 0, 21, 64, 0, 65, 59, 98, 0, 25, | |
359 | 85, 74, 72, 0, 81, 83, 0, 0, 77, 79, | |
360 | 24, 0, 15, 17, 18, 22, 0, 66, 0, 82, | |
361 | 76, 46, 0, 20, 0, 23, 86, 0, 87, 112, | |
362 | 0, 0, 88, 113, 0, 0, 0 | |
dd3b648e RP |
363 | }; |
364 | ||
689f801a JK |
365 | static const short yydefgoto[] = { 195, |
366 | 67, 35, 153, 177, 36, 37, 68, 119, 120, 121, | |
367 | 122, 69, 38, 54, 191, 156, 39 | |
dd3b648e RP |
368 | }; |
369 | ||
689f801a JK |
370 | static const short yypact[] = { 167, |
371 | -32768,-32768,-32768,-32768,-32768,-32768, 7,-32768,-32768,-32768, | |
372 | 22, 22, 22, 228, 190, 22, 245, 119, -7,-32768, | |
373 | -32768,-32768,-32768,-32768, 167, 167, 167, 167, 167, 167, | |
374 | 167, 167, 528, 60, 303, 33,-32768, 76,-32768,-32768, | |
375 | -32768,-32768,-32768,-32768,-32768,-32768,-32768, 167, 216,-32768, | |
376 | 134, 77,-32768,-32768,-32768,-32768,-32768,-32768, 78,-32768, | |
377 | -32768, 216, 216, 216, 216, 216, 59,-32768, -52, 75, | |
378 | 216, 216, -55, 80, 167, 167, 167, 167, 167, 167, | |
379 | 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, | |
380 | 167, 167, 167, 167, 167, 167, 167,-32768,-32768, 198, | |
381 | 249, 167,-32768, 22, 138, -34, 90,-32768,-32768,-32768, | |
382 | -32768, 528, 167, 96, 165, 165, 26, 104,-32768, -50, | |
383 | -32768,-32768, 167, 47, 303, 303, 303, 268, 355, 379, | |
384 | 402, 424, 445, 464, 464, 479, 479, 479, 479, 506, | |
385 | 506, 518, 529, 529, 216, 216, 216, 167,-32768, 167, | |
386 | -32768, -2, 167, 98, 22,-32768, 32,-32768, 113, 216, | |
387 | -32768,-32768,-32768, 62,-32768,-32768, 82, 106,-32768,-32768, | |
388 | 216, 167, 216, 216,-32768, 303, 68,-32768, 137,-32768, | |
389 | -32768, 330, 167,-32768, 132, 303, 139, 105,-32768, 141, | |
390 | 73, 528,-32768, 141, 196, 201,-32768 | |
dd3b648e RP |
391 | }; |
392 | ||
393 | static const short yypgoto[] = {-32768, | |
689f801a JK |
394 | 1, -14,-32768,-32768,-32768,-32768,-32768, 36,-32768, 83, |
395 | 85, -29, -28, 200,-32768, 10,-32768 | |
dd3b648e RP |
396 | }; |
397 | ||
398 | ||
689f801a | 399 | #define YYLAST 587 |
dd3b648e RP |
400 | |
401 | ||
402 | static const short yytable[] = { 49, | |
689f801a JK |
403 | 34, 70, 112, 73, 74, 112, 117, 168, 123, 113, |
404 | 62, 63, 64, 65, 66, 61, 71, 72, 106, 70, | |
405 | 45, 46, 47, 112, -62, 55, 75, 157, 164, 40, | |
406 | 41, 42, 43, 44, 1, 2, 3, 4, 5, 6, | |
407 | 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, | |
408 | 104, 17, 18, 19, 20, 21, 22, 23, 175, 24, | |
409 | 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, | |
410 | 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, | |
411 | 145, 146, 147, 159, 28, 29, 165, 75, 75, 30, | |
412 | 31, 32, 114, 105, 33, 161, 183, 124, 160, 109, | |
413 | 110, 192, 152, 40, 41, 42, 43, 44, 171, 149, | |
414 | 151, 115, 158, 154, 8, -63, 115, 11, 12, 13, | |
415 | 111, 15, 180, 116, 17, 18, 19, 20, 116, 184, | |
416 | 179, 117, 118, 173, 193, 174, 117, 118, 176, 59, | |
417 | 115, 60, 160, 181, 161, 40, 41, 42, 43, 44, | |
418 | 162, 163, 116, 167, 107, 155, 108, 182, 190, 74, | |
419 | 117, 118, 194, 74, 178, 166, 189, 166, 186, 1, | |
420 | 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, | |
421 | 12, 13, 14, 15, 16, 185, 17, 18, 19, 20, | |
422 | 21, 22, 23, 187, 24, 196, 188, 155, 112, 50, | |
423 | 197, 115, 169, 25, 170, 40, 41, 42, 43, 44, | |
424 | 51, 52, 53, 116, 26, 27, 58, 0, 0, 28, | |
425 | 29, 117, 118, 0, 30, 31, 32, 0, 0, 33, | |
426 | 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, | |
427 | 11, 12, 13, 14, 15, 16, 148, 17, 18, 19, | |
428 | 20, 21, 22, 23, 50, 24, 40, 41, 42, 43, | |
429 | 44, 0, 0, 0, 25, 56, 57, 53, 98, 99, | |
430 | 100, 101, 102, 103, 0, 26, 27, 0, 0, 0, | |
431 | 28, 29, 0, 0, 0, 48, 31, 32, 0, 0, | |
432 | 33, 0, 0, 0, 76, 0, 0, 150, 77, 78, | |
433 | 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, | |
434 | 89, 90, 91, 92, 93, 94, 95, 96, 97, 0, | |
435 | 98, 99, 100, 101, 102, 103, 0, 0, 0, 76, | |
436 | 0, 0, 172, 77, 78, 79, 80, 81, 82, 83, | |
437 | 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, | |
438 | 94, 95, 96, 97, 0, 98, 99, 100, 101, 102, | |
439 | 103, 78, 79, 80, 81, 82, 83, 84, 85, 86, | |
440 | 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, | |
441 | 97, 0, 98, 99, 100, 101, 102, 103, 80, 81, | |
442 | 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, | |
443 | 92, 93, 94, 95, 96, 97, 0, 98, 99, 100, | |
444 | 101, 102, 103, 81, 82, 83, 84, 85, 86, 87, | |
445 | 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, | |
446 | 0, 98, 99, 100, 101, 102, 103, 82, 83, 84, | |
dd3b648e | 447 | 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, |
689f801a | 448 | 95, 96, 97, 0, 98, 99, 100, 101, 102, 103, |
dd3b648e | 449 | 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, |
689f801a JK |
450 | 93, 94, 95, 96, 97, 0, 98, 99, 100, 101, |
451 | 102, 103, 84, 85, 86, 87, 88, 89, 90, 91, | |
452 | 92, 93, 94, 95, 96, 97, 0, 98, 99, 100, | |
453 | 101, 102, 103, 86, 87, 88, 89, 90, 91, 92, | |
454 | 93, 94, 95, 96, 97, 0, 98, 99, 100, 101, | |
455 | 102, 103, 90, 91, 92, 93, 94, 95, 96, 97, | |
456 | 0, 98, 99, 100, 101, 102, 103, 8, 0, 0, | |
457 | 11, 12, 13, 0, 15, 0, 0, 17, 18, 19, | |
458 | 20, 92, 93, 94, 95, 96, 97, 0, 98, 99, | |
459 | 100, 101, 102, 103, 93, 94, 95, 96, 97, 0, | |
460 | 98, 99, 100, 101, 102, 103, 0, 95, 96, 97, | |
461 | 0, 98, 99, 100, 101, 102, 103 | |
dd3b648e RP |
462 | }; |
463 | ||
464 | static const short yycheck[] = { 14, | |
689f801a JK |
465 | 0, 30, 58, 33, 33, 58, 57, 58, 64, 62, |
466 | 25, 26, 27, 28, 29, 23, 31, 32, 48, 48, | |
467 | 11, 12, 13, 58, 18, 16, 29, 62, 3, 8, | |
468 | 9, 10, 11, 12, 3, 4, 5, 6, 7, 8, | |
469 | 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, | |
470 | 18, 20, 21, 22, 23, 24, 25, 26, 61, 28, | |
dd3b648e RP |
471 | 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, |
472 | 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, | |
689f801a JK |
473 | 95, 96, 97, 112, 53, 54, 61, 29, 29, 58, |
474 | 59, 60, 18, 18, 63, 49, 29, 18, 113, 23, | |
475 | 23, 29, 102, 8, 9, 10, 11, 12, 123, 100, | |
476 | 101, 37, 23, 104, 10, 18, 37, 13, 14, 15, | |
477 | 62, 17, 61, 49, 20, 21, 22, 23, 49, 62, | |
478 | 18, 57, 58, 148, 62, 150, 57, 58, 153, 21, | |
479 | 37, 23, 157, 62, 49, 8, 9, 10, 11, 12, | |
480 | 115, 116, 49, 118, 21, 60, 23, 172, 188, 188, | |
481 | 57, 58, 192, 192, 155, 62, 62, 62, 183, 3, | |
482 | 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, | |
483 | 14, 15, 16, 17, 18, 49, 20, 21, 22, 23, | |
484 | 24, 25, 26, 62, 28, 0, 58, 60, 58, 10, | |
485 | 0, 37, 120, 37, 120, 8, 9, 10, 11, 12, | |
486 | 21, 22, 23, 49, 48, 49, 17, -1, -1, 53, | |
487 | 54, 57, 58, -1, 58, 59, 60, -1, -1, 63, | |
488 | 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, | |
489 | 13, 14, 15, 16, 17, 18, 49, 20, 21, 22, | |
490 | 23, 24, 25, 26, 10, 28, 8, 9, 10, 11, | |
491 | 12, -1, -1, -1, 37, 21, 22, 23, 53, 54, | |
492 | 55, 56, 57, 58, -1, 48, 49, -1, -1, -1, | |
493 | 53, 54, -1, -1, -1, 58, 59, 60, -1, -1, | |
494 | 63, -1, -1, -1, 27, -1, -1, 49, 31, 32, | |
495 | 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, | |
496 | 43, 44, 45, 46, 47, 48, 49, 50, 51, -1, | |
497 | 53, 54, 55, 56, 57, 58, -1, -1, -1, 27, | |
498 | -1, -1, 65, 31, 32, 33, 34, 35, 36, 37, | |
dd3b648e RP |
499 | 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, |
500 | 48, 49, 50, 51, -1, 53, 54, 55, 56, 57, | |
689f801a JK |
501 | 58, 32, 33, 34, 35, 36, 37, 38, 39, 40, |
502 | 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, | |
503 | 51, -1, 53, 54, 55, 56, 57, 58, 34, 35, | |
dd3b648e RP |
504 | 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, |
505 | 46, 47, 48, 49, 50, 51, -1, 53, 54, 55, | |
689f801a JK |
506 | 56, 57, 58, 35, 36, 37, 38, 39, 40, 41, |
507 | 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, | |
508 | -1, 53, 54, 55, 56, 57, 58, 36, 37, 38, | |
509 | 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, | |
dd3b648e | 510 | 49, 50, 51, -1, 53, 54, 55, 56, 57, 58, |
689f801a JK |
511 | 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, |
512 | 47, 48, 49, 50, 51, -1, 53, 54, 55, 56, | |
513 | 57, 58, 38, 39, 40, 41, 42, 43, 44, 45, | |
514 | 46, 47, 48, 49, 50, 51, -1, 53, 54, 55, | |
515 | 56, 57, 58, 40, 41, 42, 43, 44, 45, 46, | |
516 | 47, 48, 49, 50, 51, -1, 53, 54, 55, 56, | |
517 | 57, 58, 44, 45, 46, 47, 48, 49, 50, 51, | |
518 | -1, 53, 54, 55, 56, 57, 58, 10, -1, -1, | |
519 | 13, 14, 15, -1, 17, -1, -1, 20, 21, 22, | |
520 | 23, 46, 47, 48, 49, 50, 51, -1, 53, 54, | |
521 | 55, 56, 57, 58, 47, 48, 49, 50, 51, -1, | |
522 | 53, 54, 55, 56, 57, 58, -1, 49, 50, 51, | |
523 | -1, 53, 54, 55, 56, 57, 58 | |
dd3b648e | 524 | }; |
dd3b648e | 525 | /* -*-C-*- Note some compilers choke on comments on `#line' lines. */ |
55b32c02 | 526 | #line 3 "/usr/latest/lib/bison.simple" |
dd3b648e RP |
527 | |
528 | /* Skeleton output parser for bison, | |
beff312e | 529 | Copyright (C) 1984, 1989, 1990 Bob Corbett and Richard Stallman |
dd3b648e | 530 | |
55b32c02 JG |
531 | This program is free software; you can redistribute it and/or modify |
532 | it under the terms of the GNU General Public License as published by | |
533 | the Free Software Foundation; either version 1, or (at your option) | |
534 | any later version. | |
99a7de40 | 535 | |
55b32c02 JG |
536 | This program is distributed in the hope that it will be useful, |
537 | but WITHOUT ANY WARRANTY; without even the implied warranty of | |
538 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
539 | GNU General Public License for more details. | |
99a7de40 | 540 | |
55b32c02 JG |
541 | You should have received a copy of the GNU General Public License |
542 | along with this program; if not, write to the Free Software | |
543 | Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ | |
dd3b648e RP |
544 | |
545 | ||
beff312e RP |
546 | #ifndef alloca |
547 | #ifdef __GNUC__ | |
548 | #define alloca __builtin_alloca | |
549 | #else /* Not GNU C. */ | |
dd3b648e RP |
550 | #if (!defined (__STDC__) && defined (sparc)) || defined (__sparc__) |
551 | #include <alloca.h> | |
beff312e RP |
552 | #else /* Not sparc */ |
553 | #ifdef MSDOS | |
554 | #include <malloc.h> | |
555 | #endif /* MSDOS */ | |
556 | #endif /* Not sparc. */ | |
557 | #endif /* Not GNU C. */ | |
558 | #endif /* alloca not defined. */ | |
dd3b648e RP |
559 | |
560 | /* This is the parser code that is written into each bison parser | |
561 | when the %semantic_parser declaration is not specified in the grammar. | |
562 | It was written by Richard Stallman by simplifying the hairy parser | |
563 | used when %semantic_parser is specified. */ | |
564 | ||
565 | /* Note: there must be only one dollar sign in this file. | |
566 | It is replaced by the list of actions, each action | |
567 | as one case of the switch. */ | |
568 | ||
569 | #define yyerrok (yyerrstatus = 0) | |
570 | #define yyclearin (yychar = YYEMPTY) | |
571 | #define YYEMPTY -2 | |
572 | #define YYEOF 0 | |
dd3b648e RP |
573 | #define YYACCEPT return(0) |
574 | #define YYABORT return(1) | |
beff312e RP |
575 | #define YYERROR goto yyerrlab1 |
576 | /* Like YYERROR except do call yyerror. | |
577 | This remains here temporarily to ease the | |
578 | transition to the new meaning of YYERROR, for GCC. | |
579 | Once GCC version 2 has supplanted version 1, this can go. */ | |
580 | #define YYFAIL goto yyerrlab | |
581 | #define YYRECOVERING() (!!yyerrstatus) | |
582 | #define YYBACKUP(token, value) \ | |
583 | do \ | |
584 | if (yychar == YYEMPTY && yylen == 1) \ | |
585 | { yychar = (token), yylval = (value); \ | |
586 | yychar1 = YYTRANSLATE (yychar); \ | |
587 | YYPOPSTACK; \ | |
588 | goto yybackup; \ | |
589 | } \ | |
590 | else \ | |
591 | { yyerror ("syntax error: cannot back up"); YYERROR; } \ | |
592 | while (0) | |
dd3b648e RP |
593 | |
594 | #define YYTERROR 1 | |
595 | #define YYERRCODE 256 | |
596 | ||
beff312e | 597 | #ifndef YYPURE |
dd3b648e RP |
598 | #define YYLEX yylex() |
599 | #endif | |
600 | ||
beff312e RP |
601 | #ifdef YYPURE |
602 | #ifdef YYLSP_NEEDED | |
dd3b648e | 603 | #define YYLEX yylex(&yylval, &yylloc) |
beff312e RP |
604 | #else |
605 | #define YYLEX yylex(&yylval) | |
606 | #endif | |
dd3b648e RP |
607 | #endif |
608 | ||
609 | /* If nonreentrant, generate the variables here */ | |
610 | ||
beff312e | 611 | #ifndef YYPURE |
dd3b648e RP |
612 | |
613 | int yychar; /* the lookahead symbol */ | |
614 | YYSTYPE yylval; /* the semantic value of the */ | |
615 | /* lookahead symbol */ | |
616 | ||
beff312e | 617 | #ifdef YYLSP_NEEDED |
dd3b648e RP |
618 | YYLTYPE yylloc; /* location data for the lookahead */ |
619 | /* symbol */ | |
beff312e | 620 | #endif |
dd3b648e RP |
621 | |
622 | int yynerrs; /* number of parse errors so far */ | |
beff312e | 623 | #endif /* not YYPURE */ |
dd3b648e RP |
624 | |
625 | #if YYDEBUG != 0 | |
626 | int yydebug; /* nonzero means print parse trace */ | |
627 | /* Since this is uninitialized, it does not stop multiple parsers | |
628 | from coexisting. */ | |
629 | #endif | |
630 | ||
beff312e | 631 | /* YYINITDEPTH indicates the initial size of the parser's stacks */ |
dd3b648e | 632 | |
beff312e RP |
633 | #ifndef YYINITDEPTH |
634 | #define YYINITDEPTH 200 | |
dd3b648e RP |
635 | #endif |
636 | ||
beff312e | 637 | /* YYMAXDEPTH is the maximum size the stacks can grow to |
dd3b648e RP |
638 | (effective only if the built-in stack extension method is used). */ |
639 | ||
beff312e RP |
640 | #if YYMAXDEPTH == 0 |
641 | #undef YYMAXDEPTH | |
642 | #endif | |
643 | ||
644 | #ifndef YYMAXDEPTH | |
645 | #define YYMAXDEPTH 10000 | |
dd3b648e | 646 | #endif |
beff312e RP |
647 | \f |
648 | #ifndef __cplusplus | |
649 | ||
650 | /* This is the most reliable way to avoid incompatibilities | |
651 | in available built-in functions on various systems. */ | |
652 | static void | |
653 | __yy_bcopy (from, to, count) | |
654 | char *from; | |
655 | char *to; | |
656 | int count; | |
657 | { | |
658 | register char *f = from; | |
659 | register char *t = to; | |
660 | register int i = count; | |
661 | ||
662 | while (i-- > 0) | |
663 | *t++ = *f++; | |
664 | } | |
dd3b648e | 665 | |
beff312e | 666 | #else /* __cplusplus */ |
dd3b648e | 667 | |
beff312e RP |
668 | /* This is the most reliable way to avoid incompatibilities |
669 | in available built-in functions on various systems. */ | |
670 | static void | |
671 | __yy_bcopy (char *from, char *to, int count) | |
672 | { | |
673 | register char *f = from; | |
674 | register char *t = to; | |
675 | register int i = count; | |
676 | ||
677 | while (i-- > 0) | |
678 | *t++ = *f++; | |
679 | } | |
680 | ||
681 | #endif | |
682 | \f | |
55b32c02 | 683 | #line 160 "/usr/latest/lib/bison.simple" |
dd3b648e RP |
684 | int |
685 | yyparse() | |
686 | { | |
687 | register int yystate; | |
688 | register int yyn; | |
689 | register short *yyssp; | |
690 | register YYSTYPE *yyvsp; | |
dd3b648e RP |
691 | int yyerrstatus; /* number of tokens to shift before error messages enabled */ |
692 | int yychar1; /* lookahead token as an internal (translated) token number */ | |
693 | ||
beff312e RP |
694 | short yyssa[YYINITDEPTH]; /* the state stack */ |
695 | YYSTYPE yyvsa[YYINITDEPTH]; /* the semantic value stack */ | |
dd3b648e RP |
696 | |
697 | short *yyss = yyssa; /* refer to the stacks thru separate pointers */ | |
698 | YYSTYPE *yyvs = yyvsa; /* to allow yyoverflow to reallocate them elsewhere */ | |
beff312e RP |
699 | |
700 | #ifdef YYLSP_NEEDED | |
dd3b648e | 701 | YYLTYPE *yyls = yylsa; |
beff312e RP |
702 | YYLTYPE *yylsp; |
703 | YYLTYPE yylsa[YYINITDEPTH]; /* the location stack */ | |
dd3b648e | 704 | |
beff312e RP |
705 | #define YYPOPSTACK (yyvsp--, yysp--, yylsp--) |
706 | #else | |
707 | #define YYPOPSTACK (yyvsp--, yysp--) | |
708 | #endif | |
dd3b648e | 709 | |
beff312e RP |
710 | int yystacksize = YYINITDEPTH; |
711 | ||
712 | #ifdef YYPURE | |
dd3b648e RP |
713 | int yychar; |
714 | YYSTYPE yylval; | |
dd3b648e | 715 | int yynerrs; |
beff312e RP |
716 | #ifdef YYLSP_NEEDED |
717 | YYLTYPE yylloc; | |
718 | #endif | |
dd3b648e RP |
719 | #endif |
720 | ||
721 | YYSTYPE yyval; /* the variable used to return */ | |
722 | /* semantic values from the action */ | |
723 | /* routines */ | |
724 | ||
725 | int yylen; | |
726 | ||
727 | #if YYDEBUG != 0 | |
728 | if (yydebug) | |
729 | fprintf(stderr, "Starting parse\n"); | |
730 | #endif | |
731 | ||
732 | yystate = 0; | |
733 | yyerrstatus = 0; | |
734 | yynerrs = 0; | |
735 | yychar = YYEMPTY; /* Cause a token to be read. */ | |
736 | ||
737 | /* Initialize stack pointers. | |
738 | Waste one element of value and location stack | |
739 | so that they stay on the same level as the state stack. */ | |
740 | ||
741 | yyssp = yyss - 1; | |
742 | yyvsp = yyvs; | |
beff312e | 743 | #ifdef YYLSP_NEEDED |
dd3b648e | 744 | yylsp = yyls; |
beff312e | 745 | #endif |
dd3b648e RP |
746 | |
747 | /* Push a new state, which is found in yystate . */ | |
748 | /* In all cases, when you get here, the value and location stacks | |
749 | have just been pushed. so pushing a state here evens the stacks. */ | |
750 | yynewstate: | |
751 | ||
752 | *++yyssp = yystate; | |
753 | ||
beff312e | 754 | if (yyssp >= yyss + yystacksize - 1) |
dd3b648e RP |
755 | { |
756 | /* Give user a chance to reallocate the stack */ | |
757 | /* Use copies of these so that the &'s don't force the real ones into memory. */ | |
758 | YYSTYPE *yyvs1 = yyvs; | |
dd3b648e | 759 | short *yyss1 = yyss; |
beff312e RP |
760 | #ifdef YYLSP_NEEDED |
761 | YYLTYPE *yyls1 = yyls; | |
762 | #endif | |
dd3b648e RP |
763 | |
764 | /* Get the current used size of the three stacks, in elements. */ | |
765 | int size = yyssp - yyss + 1; | |
766 | ||
767 | #ifdef yyoverflow | |
768 | /* Each stack pointer address is followed by the size of | |
769 | the data in use in that stack, in bytes. */ | |
770 | yyoverflow("parser stack overflow", | |
771 | &yyss1, size * sizeof (*yyssp), | |
772 | &yyvs1, size * sizeof (*yyvsp), | |
beff312e | 773 | #ifdef YYLSP_NEEDED |
dd3b648e | 774 | &yyls1, size * sizeof (*yylsp), |
beff312e RP |
775 | #endif |
776 | &yystacksize); | |
dd3b648e | 777 | |
beff312e RP |
778 | yyss = yyss1; yyvs = yyvs1; |
779 | #ifdef YYLSP_NEEDED | |
780 | yyls = yyls1; | |
781 | #endif | |
dd3b648e RP |
782 | #else /* no yyoverflow */ |
783 | /* Extend the stack our own way. */ | |
beff312e RP |
784 | if (yystacksize >= YYMAXDEPTH) |
785 | { | |
786 | yyerror("parser stack overflow"); | |
787 | return 2; | |
788 | } | |
789 | yystacksize *= 2; | |
790 | if (yystacksize > YYMAXDEPTH) | |
791 | yystacksize = YYMAXDEPTH; | |
792 | yyss = (short *) alloca (yystacksize * sizeof (*yyssp)); | |
793 | __yy_bcopy ((char *)yyss1, (char *)yyss, size * sizeof (*yyssp)); | |
794 | yyvs = (YYSTYPE *) alloca (yystacksize * sizeof (*yyvsp)); | |
795 | __yy_bcopy ((char *)yyvs1, (char *)yyvs, size * sizeof (*yyvsp)); | |
dd3b648e | 796 | #ifdef YYLSP_NEEDED |
beff312e RP |
797 | yyls = (YYLTYPE *) alloca (yystacksize * sizeof (*yylsp)); |
798 | __yy_bcopy ((char *)yyls1, (char *)yyls, size * sizeof (*yylsp)); | |
dd3b648e RP |
799 | #endif |
800 | #endif /* no yyoverflow */ | |
801 | ||
802 | yyssp = yyss + size - 1; | |
803 | yyvsp = yyvs + size - 1; | |
804 | #ifdef YYLSP_NEEDED | |
805 | yylsp = yyls + size - 1; | |
806 | #endif | |
807 | ||
808 | #if YYDEBUG != 0 | |
809 | if (yydebug) | |
beff312e | 810 | fprintf(stderr, "Stack size increased to %d\n", yystacksize); |
dd3b648e RP |
811 | #endif |
812 | ||
beff312e | 813 | if (yyssp >= yyss + yystacksize - 1) |
dd3b648e RP |
814 | YYABORT; |
815 | } | |
816 | ||
817 | #if YYDEBUG != 0 | |
818 | if (yydebug) | |
819 | fprintf(stderr, "Entering state %d\n", yystate); | |
820 | #endif | |
821 | ||
beff312e RP |
822 | yybackup: |
823 | ||
dd3b648e RP |
824 | /* Do appropriate processing given the current state. */ |
825 | /* Read a lookahead token if we need one and don't already have one. */ | |
beff312e | 826 | /* yyresume: */ |
dd3b648e RP |
827 | |
828 | /* First try to decide what to do without reference to lookahead token. */ | |
829 | ||
830 | yyn = yypact[yystate]; | |
831 | if (yyn == YYFLAG) | |
832 | goto yydefault; | |
833 | ||
834 | /* Not known => get a lookahead token if don't already have one. */ | |
835 | ||
836 | /* yychar is either YYEMPTY or YYEOF | |
837 | or a valid token in external form. */ | |
838 | ||
839 | if (yychar == YYEMPTY) | |
840 | { | |
841 | #if YYDEBUG != 0 | |
842 | if (yydebug) | |
843 | fprintf(stderr, "Reading a token: "); | |
844 | #endif | |
845 | yychar = YYLEX; | |
846 | } | |
847 | ||
848 | /* Convert token to internal form (in yychar1) for indexing tables with */ | |
849 | ||
850 | if (yychar <= 0) /* This means end of input. */ | |
851 | { | |
852 | yychar1 = 0; | |
853 | yychar = YYEOF; /* Don't call YYLEX any more */ | |
854 | ||
855 | #if YYDEBUG != 0 | |
856 | if (yydebug) | |
857 | fprintf(stderr, "Now at end of input.\n"); | |
858 | #endif | |
859 | } | |
860 | else | |
861 | { | |
862 | yychar1 = YYTRANSLATE(yychar); | |
863 | ||
864 | #if YYDEBUG != 0 | |
865 | if (yydebug) | |
866 | fprintf(stderr, "Next token is %d (%s)\n", yychar, yytname[yychar1]); | |
867 | #endif | |
868 | } | |
869 | ||
870 | yyn += yychar1; | |
871 | if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != yychar1) | |
872 | goto yydefault; | |
873 | ||
874 | yyn = yytable[yyn]; | |
875 | ||
876 | /* yyn is what to do for this token type in this state. | |
877 | Negative => reduce, -yyn is rule number. | |
878 | Positive => shift, yyn is new state. | |
879 | New state is final state => don't bother to shift, | |
880 | just return success. | |
881 | 0, or most negative number => error. */ | |
882 | ||
883 | if (yyn < 0) | |
884 | { | |
885 | if (yyn == YYFLAG) | |
886 | goto yyerrlab; | |
887 | yyn = -yyn; | |
888 | goto yyreduce; | |
889 | } | |
890 | else if (yyn == 0) | |
891 | goto yyerrlab; | |
892 | ||
893 | if (yyn == YYFINAL) | |
894 | YYACCEPT; | |
895 | ||
896 | /* Shift the lookahead token. */ | |
897 | ||
898 | #if YYDEBUG != 0 | |
899 | if (yydebug) | |
900 | fprintf(stderr, "Shifting token %d (%s), ", yychar, yytname[yychar1]); | |
901 | #endif | |
902 | ||
903 | /* Discard the token being shifted unless it is eof. */ | |
904 | if (yychar != YYEOF) | |
905 | yychar = YYEMPTY; | |
906 | ||
907 | *++yyvsp = yylval; | |
908 | #ifdef YYLSP_NEEDED | |
909 | *++yylsp = yylloc; | |
910 | #endif | |
911 | ||
912 | /* count tokens shifted since error; after three, turn off error status. */ | |
913 | if (yyerrstatus) yyerrstatus--; | |
914 | ||
915 | yystate = yyn; | |
916 | goto yynewstate; | |
917 | ||
918 | /* Do the default action for the current state. */ | |
919 | yydefault: | |
920 | ||
921 | yyn = yydefact[yystate]; | |
922 | if (yyn == 0) | |
923 | goto yyerrlab; | |
924 | ||
925 | /* Do a reduction. yyn is the number of a rule to reduce with. */ | |
926 | yyreduce: | |
927 | yylen = yyr2[yyn]; | |
928 | yyval = yyvsp[1-yylen]; /* implement default value of the action */ | |
929 | ||
930 | #if YYDEBUG != 0 | |
931 | if (yydebug) | |
932 | { | |
beff312e RP |
933 | int i; |
934 | ||
935 | fprintf (stderr, "Reducing via rule %d (line %d), ", | |
936 | yyn, yyrline[yyn]); | |
937 | ||
938 | /* Print the symboles being reduced, and their result. */ | |
939 | for (i = yyprhs[yyn]; yyrhs[i] > 0; i++) | |
940 | fprintf (stderr, "%s ", yytname[yyrhs[i]]); | |
941 | fprintf (stderr, " -> %s\n", yytname[yyr1[yyn]]); | |
dd3b648e RP |
942 | } |
943 | #endif | |
944 | ||
945 | ||
946 | switch (yyn) { | |
947 | ||
948 | case 3: | |
65c93482 | 949 | #line 231 "./expread.y" |
dd3b648e RP |
950 | { write_exp_elt_opcode (BINOP_COMMA); ; |
951 | break;} | |
952 | case 4: | |
65c93482 | 953 | #line 236 "./expread.y" |
dd3b648e RP |
954 | { write_exp_elt_opcode (UNOP_IND); ; |
955 | break;} | |
956 | case 5: | |
65c93482 | 957 | #line 239 "./expread.y" |
dd3b648e RP |
958 | { write_exp_elt_opcode (UNOP_ADDR); ; |
959 | break;} | |
960 | case 6: | |
65c93482 | 961 | #line 242 "./expread.y" |
dd3b648e RP |
962 | { write_exp_elt_opcode (UNOP_NEG); ; |
963 | break;} | |
964 | case 7: | |
65c93482 | 965 | #line 246 "./expread.y" |
dd3b648e RP |
966 | { write_exp_elt_opcode (UNOP_ZEROP); ; |
967 | break;} | |
968 | case 8: | |
65c93482 | 969 | #line 250 "./expread.y" |
dd3b648e RP |
970 | { write_exp_elt_opcode (UNOP_LOGNOT); ; |
971 | break;} | |
972 | case 9: | |
65c93482 | 973 | #line 254 "./expread.y" |
dd3b648e RP |
974 | { write_exp_elt_opcode (UNOP_PREINCREMENT); ; |
975 | break;} | |
976 | case 10: | |
65c93482 | 977 | #line 258 "./expread.y" |
dd3b648e RP |
978 | { write_exp_elt_opcode (UNOP_PREDECREMENT); ; |
979 | break;} | |
980 | case 11: | |
65c93482 | 981 | #line 262 "./expread.y" |
dd3b648e RP |
982 | { write_exp_elt_opcode (UNOP_POSTINCREMENT); ; |
983 | break;} | |
984 | case 12: | |
65c93482 | 985 | #line 266 "./expread.y" |
dd3b648e RP |
986 | { write_exp_elt_opcode (UNOP_POSTDECREMENT); ; |
987 | break;} | |
988 | case 13: | |
65c93482 | 989 | #line 270 "./expread.y" |
dd3b648e RP |
990 | { write_exp_elt_opcode (UNOP_SIZEOF); ; |
991 | break;} | |
992 | case 14: | |
65c93482 | 993 | #line 274 "./expread.y" |
dd3b648e RP |
994 | { write_exp_elt_opcode (STRUCTOP_PTR); |
995 | write_exp_string (yyvsp[0].sval); | |
996 | write_exp_elt_opcode (STRUCTOP_PTR); ; | |
997 | break;} | |
998 | case 15: | |
65c93482 | 999 | #line 280 "./expread.y" |
dd3b648e RP |
1000 | { write_exp_elt_opcode (STRUCTOP_MPTR); ; |
1001 | break;} | |
1002 | case 16: | |
65c93482 | 1003 | #line 284 "./expread.y" |
dd3b648e RP |
1004 | { write_exp_elt_opcode (STRUCTOP_STRUCT); |
1005 | write_exp_string (yyvsp[0].sval); | |
1006 | write_exp_elt_opcode (STRUCTOP_STRUCT); ; | |
1007 | break;} | |
1008 | case 17: | |
65c93482 | 1009 | #line 290 "./expread.y" |
dd3b648e RP |
1010 | { write_exp_elt_opcode (STRUCTOP_MEMBER); ; |
1011 | break;} | |
1012 | case 18: | |
65c93482 | 1013 | #line 294 "./expread.y" |
dd3b648e RP |
1014 | { write_exp_elt_opcode (BINOP_SUBSCRIPT); ; |
1015 | break;} | |
1016 | case 19: | |
65c93482 | 1017 | #line 300 "./expread.y" |
dd3b648e RP |
1018 | { start_arglist (); ; |
1019 | break;} | |
1020 | case 20: | |
65c93482 | 1021 | #line 302 "./expread.y" |
dd3b648e RP |
1022 | { write_exp_elt_opcode (OP_FUNCALL); |
1023 | write_exp_elt_longcst ((LONGEST) end_arglist ()); | |
1024 | write_exp_elt_opcode (OP_FUNCALL); ; | |
1025 | break;} | |
1026 | case 22: | |
65c93482 | 1027 | #line 311 "./expread.y" |
dd3b648e RP |
1028 | { arglist_len = 1; ; |
1029 | break;} | |
1030 | case 23: | |
65c93482 | 1031 | #line 315 "./expread.y" |
dd3b648e RP |
1032 | { arglist_len++; ; |
1033 | break;} | |
1034 | case 24: | |
65c93482 | 1035 | #line 319 "./expread.y" |
dd3b648e RP |
1036 | { write_exp_elt_opcode (UNOP_MEMVAL); |
1037 | write_exp_elt_type (yyvsp[-2].tval); | |
1038 | write_exp_elt_opcode (UNOP_MEMVAL); ; | |
1039 | break;} | |
1040 | case 25: | |
65c93482 | 1041 | #line 325 "./expread.y" |
dd3b648e RP |
1042 | { write_exp_elt_opcode (UNOP_CAST); |
1043 | write_exp_elt_type (yyvsp[-2].tval); | |
1044 | write_exp_elt_opcode (UNOP_CAST); ; | |
1045 | break;} | |
1046 | case 26: | |
65c93482 | 1047 | #line 331 "./expread.y" |
dd3b648e RP |
1048 | { ; |
1049 | break;} | |
1050 | case 27: | |
65c93482 | 1051 | #line 337 "./expread.y" |
dd3b648e RP |
1052 | { write_exp_elt_opcode (BINOP_REPEAT); ; |
1053 | break;} | |
1054 | case 28: | |
65c93482 | 1055 | #line 341 "./expread.y" |
dd3b648e RP |
1056 | { write_exp_elt_opcode (BINOP_MUL); ; |
1057 | break;} | |
1058 | case 29: | |
65c93482 | 1059 | #line 345 "./expread.y" |
dd3b648e RP |
1060 | { write_exp_elt_opcode (BINOP_DIV); ; |
1061 | break;} | |
1062 | case 30: | |
65c93482 | 1063 | #line 349 "./expread.y" |
dd3b648e RP |
1064 | { write_exp_elt_opcode (BINOP_REM); ; |
1065 | break;} | |
1066 | case 31: | |
65c93482 | 1067 | #line 353 "./expread.y" |
dd3b648e RP |
1068 | { write_exp_elt_opcode (BINOP_ADD); ; |
1069 | break;} | |
1070 | case 32: | |
65c93482 | 1071 | #line 357 "./expread.y" |
dd3b648e RP |
1072 | { write_exp_elt_opcode (BINOP_SUB); ; |
1073 | break;} | |
1074 | case 33: | |
65c93482 | 1075 | #line 361 "./expread.y" |
dd3b648e RP |
1076 | { write_exp_elt_opcode (BINOP_LSH); ; |
1077 | break;} | |
1078 | case 34: | |
65c93482 | 1079 | #line 365 "./expread.y" |
dd3b648e RP |
1080 | { write_exp_elt_opcode (BINOP_RSH); ; |
1081 | break;} | |
1082 | case 35: | |
65c93482 | 1083 | #line 369 "./expread.y" |
dd3b648e RP |
1084 | { write_exp_elt_opcode (BINOP_EQUAL); ; |
1085 | break;} | |
1086 | case 36: | |
65c93482 | 1087 | #line 373 "./expread.y" |
dd3b648e RP |
1088 | { write_exp_elt_opcode (BINOP_NOTEQUAL); ; |
1089 | break;} | |
1090 | case 37: | |
65c93482 | 1091 | #line 377 "./expread.y" |
dd3b648e RP |
1092 | { write_exp_elt_opcode (BINOP_LEQ); ; |
1093 | break;} | |
1094 | case 38: | |
65c93482 | 1095 | #line 381 "./expread.y" |
dd3b648e RP |
1096 | { write_exp_elt_opcode (BINOP_GEQ); ; |
1097 | break;} | |
1098 | case 39: | |
65c93482 | 1099 | #line 385 "./expread.y" |
dd3b648e RP |
1100 | { write_exp_elt_opcode (BINOP_LESS); ; |
1101 | break;} | |
1102 | case 40: | |
65c93482 | 1103 | #line 389 "./expread.y" |
dd3b648e RP |
1104 | { write_exp_elt_opcode (BINOP_GTR); ; |
1105 | break;} | |
1106 | case 41: | |
65c93482 | 1107 | #line 393 "./expread.y" |
dd3b648e RP |
1108 | { write_exp_elt_opcode (BINOP_LOGAND); ; |
1109 | break;} | |
1110 | case 42: | |
65c93482 | 1111 | #line 397 "./expread.y" |
dd3b648e RP |
1112 | { write_exp_elt_opcode (BINOP_LOGXOR); ; |
1113 | break;} | |
1114 | case 43: | |
65c93482 | 1115 | #line 401 "./expread.y" |
dd3b648e RP |
1116 | { write_exp_elt_opcode (BINOP_LOGIOR); ; |
1117 | break;} | |
1118 | case 44: | |
65c93482 | 1119 | #line 405 "./expread.y" |
dd3b648e RP |
1120 | { write_exp_elt_opcode (BINOP_AND); ; |
1121 | break;} | |
1122 | case 45: | |
65c93482 | 1123 | #line 409 "./expread.y" |
dd3b648e RP |
1124 | { write_exp_elt_opcode (BINOP_OR); ; |
1125 | break;} | |
1126 | case 46: | |
65c93482 | 1127 | #line 413 "./expread.y" |
dd3b648e RP |
1128 | { write_exp_elt_opcode (TERNOP_COND); ; |
1129 | break;} | |
1130 | case 47: | |
65c93482 | 1131 | #line 417 "./expread.y" |
dd3b648e RP |
1132 | { write_exp_elt_opcode (BINOP_ASSIGN); ; |
1133 | break;} | |
1134 | case 48: | |
65c93482 | 1135 | #line 421 "./expread.y" |
dd3b648e RP |
1136 | { write_exp_elt_opcode (BINOP_ASSIGN_MODIFY); |
1137 | write_exp_elt_opcode (yyvsp[-1].opcode); | |
1138 | write_exp_elt_opcode (BINOP_ASSIGN_MODIFY); ; | |
1139 | break;} | |
1140 | case 49: | |
65c93482 | 1141 | #line 427 "./expread.y" |
dd3b648e RP |
1142 | { write_exp_elt_opcode (OP_LONG); |
1143 | if (yyvsp[0].lval == (int) yyvsp[0].lval || yyvsp[0].lval == (unsigned int) yyvsp[0].lval) | |
1144 | write_exp_elt_type (builtin_type_int); | |
1145 | else | |
1146 | write_exp_elt_type (BUILTIN_TYPE_LONGEST); | |
1147 | write_exp_elt_longcst ((LONGEST) yyvsp[0].lval); | |
1148 | write_exp_elt_opcode (OP_LONG); ; | |
1149 | break;} | |
1150 | case 50: | |
65c93482 | 1151 | #line 437 "./expread.y" |
dd3b648e RP |
1152 | { YYSTYPE val; |
1153 | parse_number (yyvsp[0].ssym.stoken.ptr, yyvsp[0].ssym.stoken.length, 0, &val); | |
1154 | write_exp_elt_opcode (OP_LONG); | |
1155 | if (val.lval == (int) val.lval || | |
1156 | val.lval == (unsigned int) val.lval) | |
1157 | write_exp_elt_type (builtin_type_int); | |
1158 | else | |
1159 | write_exp_elt_type (BUILTIN_TYPE_LONGEST); | |
1160 | write_exp_elt_longcst (val.lval); | |
1161 | write_exp_elt_opcode (OP_LONG); ; | |
1162 | break;} | |
1163 | case 51: | |
65c93482 | 1164 | #line 450 "./expread.y" |
dd3b648e RP |
1165 | { |
1166 | write_exp_elt_opcode (OP_LONG); | |
1167 | if (yyvsp[0].ulval == (unsigned int) yyvsp[0].ulval) | |
1168 | write_exp_elt_type (builtin_type_unsigned_int); | |
1169 | else | |
1170 | write_exp_elt_type (BUILTIN_TYPE_UNSIGNED_LONGEST); | |
1171 | write_exp_elt_longcst ((LONGEST) yyvsp[0].ulval); | |
1172 | write_exp_elt_opcode (OP_LONG); | |
1173 | ; | |
1174 | break;} | |
1175 | case 52: | |
65c93482 | 1176 | #line 462 "./expread.y" |
dd3b648e RP |
1177 | { YYSTYPE val; |
1178 | parse_number (yyvsp[0].ssym.stoken.ptr, yyvsp[0].ssym.stoken.length, 0, &val); | |
1179 | write_exp_elt_opcode (OP_LONG); | |
1180 | if (val.ulval == (unsigned int) val.ulval) | |
1181 | write_exp_elt_type (builtin_type_unsigned_int); | |
1182 | else | |
1183 | write_exp_elt_type (BUILTIN_TYPE_UNSIGNED_LONGEST); | |
1184 | write_exp_elt_longcst ((LONGEST)val.ulval); | |
1185 | write_exp_elt_opcode (OP_LONG); | |
1186 | ; | |
1187 | break;} | |
1188 | case 53: | |
65c93482 | 1189 | #line 475 "./expread.y" |
dd3b648e RP |
1190 | { write_exp_elt_opcode (OP_LONG); |
1191 | write_exp_elt_type (builtin_type_char); | |
1192 | write_exp_elt_longcst ((LONGEST) yyvsp[0].lval); | |
1193 | write_exp_elt_opcode (OP_LONG); ; | |
1194 | break;} | |
1195 | case 54: | |
65c93482 | 1196 | #line 482 "./expread.y" |
dd3b648e RP |
1197 | { write_exp_elt_opcode (OP_DOUBLE); |
1198 | write_exp_elt_type (builtin_type_double); | |
1199 | write_exp_elt_dblcst (yyvsp[0].dval); | |
1200 | write_exp_elt_opcode (OP_DOUBLE); ; | |
1201 | break;} | |
1202 | case 56: | |
65c93482 | 1203 | #line 492 "./expread.y" |
dd3b648e RP |
1204 | { write_exp_elt_opcode (OP_LAST); |
1205 | write_exp_elt_longcst ((LONGEST) yyvsp[0].lval); | |
1206 | write_exp_elt_opcode (OP_LAST); ; | |
1207 | break;} | |
1208 | case 57: | |
65c93482 | 1209 | #line 498 "./expread.y" |
dd3b648e RP |
1210 | { write_exp_elt_opcode (OP_REGISTER); |
1211 | write_exp_elt_longcst ((LONGEST) yyvsp[0].lval); | |
1212 | write_exp_elt_opcode (OP_REGISTER); ; | |
1213 | break;} | |
1214 | case 58: | |
65c93482 | 1215 | #line 504 "./expread.y" |
dd3b648e RP |
1216 | { write_exp_elt_opcode (OP_INTERNALVAR); |
1217 | write_exp_elt_intern (yyvsp[0].ivar); | |
1218 | write_exp_elt_opcode (OP_INTERNALVAR); ; | |
1219 | break;} | |
1220 | case 59: | |
65c93482 | 1221 | #line 510 "./expread.y" |
dd3b648e RP |
1222 | { write_exp_elt_opcode (OP_LONG); |
1223 | write_exp_elt_type (builtin_type_int); | |
1224 | write_exp_elt_longcst ((LONGEST) TYPE_LENGTH (yyvsp[-1].tval)); | |
1225 | write_exp_elt_opcode (OP_LONG); ; | |
1226 | break;} | |
1227 | case 60: | |
65c93482 | 1228 | #line 517 "./expread.y" |
dd3b648e RP |
1229 | { write_exp_elt_opcode (OP_STRING); |
1230 | write_exp_string (yyvsp[0].sval); | |
1231 | write_exp_elt_opcode (OP_STRING); ; | |
1232 | break;} | |
1233 | case 61: | |
65c93482 | 1234 | #line 524 "./expread.y" |
dd3b648e RP |
1235 | { write_exp_elt_opcode (OP_THIS); |
1236 | write_exp_elt_opcode (OP_THIS); ; | |
1237 | break;} | |
1238 | case 62: | |
65c93482 | 1239 | #line 531 "./expread.y" |
dd3b648e RP |
1240 | { |
1241 | if (yyvsp[0].ssym.sym != 0) | |
1242 | yyval.bval = SYMBOL_BLOCK_VALUE (yyvsp[0].ssym.sym); | |
1243 | else | |
1244 | { | |
1245 | struct symtab *tem = | |
1246 | lookup_symtab (copy_name (yyvsp[0].ssym.stoken)); | |
1247 | if (tem) | |
689f801a JK |
1248 | yyval.bval = BLOCKVECTOR_BLOCK |
1249 | (BLOCKVECTOR (tem), STATIC_BLOCK); | |
dd3b648e RP |
1250 | else |
1251 | error ("No file or function \"%s\".", | |
1252 | copy_name (yyvsp[0].ssym.stoken)); | |
1253 | } | |
1254 | ; | |
1255 | break;} | |
1256 | case 63: | |
65c93482 | 1257 | #line 549 "./expread.y" |
dd3b648e RP |
1258 | { struct symbol *tem |
1259 | = lookup_symbol (copy_name (yyvsp[0].sval), yyvsp[-2].bval, | |
1260 | VAR_NAMESPACE, 0, NULL); | |
1261 | if (!tem || SYMBOL_CLASS (tem) != LOC_BLOCK) | |
1262 | error ("No function \"%s\" in specified context.", | |
1263 | copy_name (yyvsp[0].sval)); | |
1264 | yyval.bval = SYMBOL_BLOCK_VALUE (tem); ; | |
1265 | break;} | |
1266 | case 64: | |
65c93482 | 1267 | #line 559 "./expread.y" |
dd3b648e RP |
1268 | { struct symbol *sym; |
1269 | sym = lookup_symbol (copy_name (yyvsp[0].sval), yyvsp[-2].bval, | |
1270 | VAR_NAMESPACE, 0, NULL); | |
1271 | if (sym == 0) | |
1272 | error ("No symbol \"%s\" in specified context.", | |
1273 | copy_name (yyvsp[0].sval)); | |
1274 | write_exp_elt_opcode (OP_VAR_VALUE); | |
1275 | write_exp_elt_sym (sym); | |
1276 | write_exp_elt_opcode (OP_VAR_VALUE); ; | |
1277 | break;} | |
1278 | case 65: | |
65c93482 | 1279 | #line 571 "./expread.y" |
dd3b648e RP |
1280 | { |
1281 | struct type *type = yyvsp[-2].tval; | |
1282 | if (TYPE_CODE (type) != TYPE_CODE_STRUCT | |
1283 | && TYPE_CODE (type) != TYPE_CODE_UNION) | |
1284 | error ("`%s' is not defined as an aggregate type.", | |
1285 | TYPE_NAME (type)); | |
1286 | ||
1287 | write_exp_elt_opcode (OP_SCOPE); | |
1288 | write_exp_elt_type (type); | |
1289 | write_exp_string (yyvsp[0].sval); | |
1290 | write_exp_elt_opcode (OP_SCOPE); | |
1291 | ; | |
1292 | break;} | |
1293 | case 66: | |
65c93482 | 1294 | #line 584 "./expread.y" |
689f801a JK |
1295 | { |
1296 | struct type *type = yyvsp[-3].tval; | |
1297 | if (TYPE_CODE (type) != TYPE_CODE_STRUCT | |
1298 | && TYPE_CODE (type) != TYPE_CODE_UNION) | |
1299 | error ("`%s' is not defined as an aggregate type.", | |
1300 | TYPE_NAME (type)); | |
1301 | ||
1302 | if (strcmp (type_name_no_tag (type), yyvsp[0].sval.ptr)) | |
1303 | error ("invalid destructor `%s::~%s'", | |
1304 | type_name_no_tag (type), yyvsp[0].sval.ptr); | |
1305 | ||
1306 | write_exp_elt_opcode (OP_SCOPE); | |
1307 | write_exp_elt_type (type); | |
1308 | write_exp_string (yyvsp[0].sval); | |
1309 | write_exp_elt_opcode (OP_SCOPE); | |
1310 | write_exp_elt_opcode (UNOP_LOGNOT); | |
1311 | ; | |
1312 | break;} | |
1313 | case 67: | |
65c93482 | 1314 | #line 602 "./expread.y" |
dd3b648e RP |
1315 | { |
1316 | char *name = copy_name (yyvsp[0].sval); | |
1317 | struct symbol *sym; | |
1318 | int i; | |
1319 | ||
1320 | sym = | |
1321 | lookup_symbol (name, 0, VAR_NAMESPACE, 0, NULL); | |
1322 | if (sym) | |
1323 | { | |
1324 | write_exp_elt_opcode (OP_VAR_VALUE); | |
1325 | write_exp_elt_sym (sym); | |
1326 | write_exp_elt_opcode (OP_VAR_VALUE); | |
1327 | break; | |
1328 | } | |
1329 | for (i = 0; i < misc_function_count; i++) | |
1330 | if (!strcmp (misc_function_vector[i].name, name)) | |
1331 | break; | |
1332 | ||
1333 | if (i < misc_function_count) | |
1334 | { | |
1335 | enum misc_function_type mft = | |
1336 | misc_function_vector[i].type; | |
1337 | ||
1338 | write_exp_elt_opcode (OP_LONG); | |
1339 | write_exp_elt_type (builtin_type_int); | |
1340 | write_exp_elt_longcst ((LONGEST) misc_function_vector[i].address); | |
1341 | write_exp_elt_opcode (OP_LONG); | |
1342 | write_exp_elt_opcode (UNOP_MEMVAL); | |
1343 | if (mft == mf_data || mft == mf_bss) | |
1344 | write_exp_elt_type (builtin_type_int); | |
1345 | else if (mft == mf_text) | |
1346 | write_exp_elt_type (lookup_function_type (builtin_type_int)); | |
1347 | else | |
1348 | write_exp_elt_type (builtin_type_char); | |
1349 | write_exp_elt_opcode (UNOP_MEMVAL); | |
1350 | } | |
1351 | else | |
1352 | if (symtab_list == 0 | |
1353 | && partial_symtab_list == 0) | |
1354 | error ("No symbol table is loaded. Use the \"file\" command."); | |
1355 | else | |
1356 | error ("No symbol \"%s\" in current context.", name); | |
1357 | ; | |
1358 | break;} | |
689f801a | 1359 | case 68: |
65c93482 | 1360 | #line 648 "./expread.y" |
dd3b648e RP |
1361 | { struct symbol *sym = yyvsp[0].ssym.sym; |
1362 | ||
1363 | if (sym) | |
1364 | { | |
1365 | switch (sym->class) | |
1366 | { | |
1367 | case LOC_REGISTER: | |
1368 | case LOC_ARG: | |
65c93482 JK |
1369 | case LOC_REF_ARG: |
1370 | case LOC_REGPARM: | |
dd3b648e RP |
1371 | case LOC_LOCAL: |
1372 | case LOC_LOCAL_ARG: | |
1373 | if (innermost_block == 0 || | |
1374 | contained_in (block_found, | |
1375 | innermost_block)) | |
1376 | innermost_block = block_found; | |
65c93482 JK |
1377 | case LOC_UNDEF: |
1378 | case LOC_CONST: | |
1379 | case LOC_STATIC: | |
1380 | case LOC_TYPEDEF: | |
1381 | case LOC_LABEL: | |
1382 | case LOC_BLOCK: | |
65c93482 JK |
1383 | case LOC_CONST_BYTES: |
1384 | ||
1385 | /* In this case the expression can | |
1386 | be evaluated regardless of what | |
1387 | frame we are in, so there is no | |
1388 | need to check for the | |
1389 | innermost_block. These cases are | |
1390 | listed so that gcc -Wall will | |
1391 | report types that may not have | |
1392 | been considered. */ | |
1393 | ||
1394 | break; | |
dd3b648e RP |
1395 | } |
1396 | write_exp_elt_opcode (OP_VAR_VALUE); | |
1397 | write_exp_elt_sym (sym); | |
1398 | write_exp_elt_opcode (OP_VAR_VALUE); | |
1399 | } | |
1400 | else if (yyvsp[0].ssym.is_a_field_of_this) | |
1401 | { | |
1402 | /* C++: it hangs off of `this'. Must | |
1403 | not inadvertently convert from a method call | |
1404 | to data ref. */ | |
1405 | if (innermost_block == 0 || | |
1406 | contained_in (block_found, innermost_block)) | |
1407 | innermost_block = block_found; | |
1408 | write_exp_elt_opcode (OP_THIS); | |
1409 | write_exp_elt_opcode (OP_THIS); | |
1410 | write_exp_elt_opcode (STRUCTOP_PTR); | |
1411 | write_exp_string (yyvsp[0].ssym.stoken); | |
1412 | write_exp_elt_opcode (STRUCTOP_PTR); | |
1413 | } | |
1414 | else | |
1415 | { | |
1416 | register int i; | |
1417 | register char *arg = copy_name (yyvsp[0].ssym.stoken); | |
1418 | ||
1419 | /* FIXME, this search is linear! At least | |
1420 | optimize the strcmp with a 1-char cmp... */ | |
1421 | for (i = 0; i < misc_function_count; i++) | |
1422 | if (!strcmp (misc_function_vector[i].name, arg)) | |
1423 | break; | |
1424 | ||
1425 | if (i < misc_function_count) | |
1426 | { | |
1427 | enum misc_function_type mft = | |
1428 | misc_function_vector[i].type; | |
1429 | ||
1430 | write_exp_elt_opcode (OP_LONG); | |
1431 | write_exp_elt_type (builtin_type_int); | |
1432 | write_exp_elt_longcst ((LONGEST) misc_function_vector[i].address); | |
1433 | write_exp_elt_opcode (OP_LONG); | |
1434 | write_exp_elt_opcode (UNOP_MEMVAL); | |
1435 | if (mft == mf_data || mft == mf_bss) | |
1436 | write_exp_elt_type (builtin_type_int); | |
1437 | else if (mft == mf_text) | |
1438 | write_exp_elt_type (lookup_function_type (builtin_type_int)); | |
1439 | else | |
1440 | write_exp_elt_type (builtin_type_char); | |
1441 | write_exp_elt_opcode (UNOP_MEMVAL); | |
1442 | } | |
1443 | else if (symtab_list == 0 | |
1444 | && partial_symtab_list == 0) | |
1445 | error ("No symbol table is loaded. Use the \"file\" command."); | |
1446 | else | |
1447 | error ("No symbol \"%s\" in current context.", | |
1448 | copy_name (yyvsp[0].ssym.stoken)); | |
1449 | } | |
1450 | ; | |
1451 | break;} | |
689f801a | 1452 | case 70: |
55b32c02 | 1453 | #line 743 "./expread.y" |
dd3b648e RP |
1454 | { |
1455 | /* This is where the interesting stuff happens. */ | |
1456 | int done = 0; | |
1457 | int array_size; | |
1458 | struct type *follow_type = yyvsp[-1].tval; | |
1459 | ||
1460 | while (!done) | |
1461 | switch (pop_type ()) | |
1462 | { | |
1463 | case tp_end: | |
1464 | done = 1; | |
1465 | break; | |
1466 | case tp_pointer: | |
1467 | follow_type = lookup_pointer_type (follow_type); | |
1468 | break; | |
1469 | case tp_reference: | |
1470 | follow_type = lookup_reference_type (follow_type); | |
1471 | break; | |
1472 | case tp_array: | |
65c93482 | 1473 | array_size = pop_type_int (); |
dd3b648e RP |
1474 | if (array_size != -1) |
1475 | follow_type = create_array_type (follow_type, | |
1476 | array_size); | |
1477 | else | |
1478 | follow_type = lookup_pointer_type (follow_type); | |
1479 | break; | |
1480 | case tp_function: | |
1481 | follow_type = lookup_function_type (follow_type); | |
1482 | break; | |
1483 | } | |
1484 | yyval.tval = follow_type; | |
1485 | ; | |
1486 | break;} | |
689f801a | 1487 | case 71: |
55b32c02 | 1488 | #line 778 "./expread.y" |
dd3b648e RP |
1489 | { push_type (tp_pointer); yyval.voidval = 0; ; |
1490 | break;} | |
689f801a | 1491 | case 72: |
55b32c02 | 1492 | #line 780 "./expread.y" |
dd3b648e RP |
1493 | { push_type (tp_pointer); yyval.voidval = yyvsp[0].voidval; ; |
1494 | break;} | |
1495 | case 73: | |
55b32c02 | 1496 | #line 782 "./expread.y" |
689f801a | 1497 | { push_type (tp_reference); yyval.voidval = 0; ; |
dd3b648e RP |
1498 | break;} |
1499 | case 74: | |
55b32c02 | 1500 | #line 784 "./expread.y" |
689f801a JK |
1501 | { push_type (tp_reference); yyval.voidval = yyvsp[0].voidval; ; |
1502 | break;} | |
1503 | case 76: | |
55b32c02 | 1504 | #line 789 "./expread.y" |
689f801a JK |
1505 | { yyval.voidval = yyvsp[-1].voidval; ; |
1506 | break;} | |
1507 | case 77: | |
55b32c02 | 1508 | #line 791 "./expread.y" |
dd3b648e | 1509 | { |
65c93482 | 1510 | push_type_int (yyvsp[0].lval); |
dd3b648e RP |
1511 | push_type (tp_array); |
1512 | ; | |
1513 | break;} | |
689f801a | 1514 | case 78: |
55b32c02 | 1515 | #line 796 "./expread.y" |
dd3b648e | 1516 | { |
65c93482 | 1517 | push_type_int (yyvsp[0].lval); |
dd3b648e RP |
1518 | push_type (tp_array); |
1519 | yyval.voidval = 0; | |
1520 | ; | |
1521 | break;} | |
689f801a | 1522 | case 79: |
55b32c02 | 1523 | #line 802 "./expread.y" |
dd3b648e RP |
1524 | { push_type (tp_function); ; |
1525 | break;} | |
689f801a | 1526 | case 80: |
55b32c02 | 1527 | #line 804 "./expread.y" |
dd3b648e RP |
1528 | { push_type (tp_function); ; |
1529 | break;} | |
689f801a | 1530 | case 81: |
55b32c02 | 1531 | #line 808 "./expread.y" |
dd3b648e RP |
1532 | { yyval.lval = -1; ; |
1533 | break;} | |
689f801a | 1534 | case 82: |
55b32c02 | 1535 | #line 810 "./expread.y" |
dd3b648e RP |
1536 | { yyval.lval = yyvsp[-1].lval; ; |
1537 | break;} | |
689f801a | 1538 | case 83: |
55b32c02 | 1539 | #line 814 "./expread.y" |
dd3b648e RP |
1540 | { yyval.voidval = 0; ; |
1541 | break;} | |
689f801a | 1542 | case 85: |
55b32c02 | 1543 | #line 819 "./expread.y" |
dd3b648e RP |
1544 | { yyval.tval = lookup_member_type (builtin_type_int, yyvsp[-2].tval); ; |
1545 | break;} | |
689f801a | 1546 | case 86: |
55b32c02 | 1547 | #line 821 "./expread.y" |
dd3b648e RP |
1548 | { yyval.tval = lookup_member_type (yyvsp[-5].tval, yyvsp[-3].tval); ; |
1549 | break;} | |
689f801a | 1550 | case 87: |
55b32c02 | 1551 | #line 823 "./expread.y" |
dd3b648e RP |
1552 | { yyval.tval = lookup_member_type |
1553 | (lookup_function_type (yyvsp[-7].tval), yyvsp[-5].tval); ; | |
1554 | break;} | |
689f801a | 1555 | case 88: |
55b32c02 | 1556 | #line 826 "./expread.y" |
dd3b648e RP |
1557 | { yyval.tval = lookup_member_type |
1558 | (lookup_function_type (yyvsp[-8].tval), yyvsp[-6].tval); | |
1559 | free (yyvsp[-1].tvec); ; | |
1560 | break;} | |
689f801a | 1561 | case 89: |
55b32c02 | 1562 | #line 833 "./expread.y" |
dd3b648e RP |
1563 | { yyval.tval = yyvsp[0].tsym.type; ; |
1564 | break;} | |
689f801a | 1565 | case 90: |
55b32c02 | 1566 | #line 835 "./expread.y" |
dd3b648e RP |
1567 | { yyval.tval = builtin_type_int; ; |
1568 | break;} | |
689f801a | 1569 | case 91: |
55b32c02 | 1570 | #line 837 "./expread.y" |
dd3b648e RP |
1571 | { yyval.tval = builtin_type_long; ; |
1572 | break;} | |
689f801a | 1573 | case 92: |
55b32c02 | 1574 | #line 839 "./expread.y" |
dd3b648e RP |
1575 | { yyval.tval = builtin_type_short; ; |
1576 | break;} | |
689f801a | 1577 | case 93: |
55b32c02 | 1578 | #line 841 "./expread.y" |
dd3b648e RP |
1579 | { yyval.tval = builtin_type_long; ; |
1580 | break;} | |
689f801a | 1581 | case 94: |
55b32c02 | 1582 | #line 843 "./expread.y" |
dd3b648e RP |
1583 | { yyval.tval = builtin_type_unsigned_long; ; |
1584 | break;} | |
689f801a | 1585 | case 95: |
55b32c02 | 1586 | #line 845 "./expread.y" |
689f801a JK |
1587 | { yyval.tval = builtin_type_long_long; ; |
1588 | break;} | |
1589 | case 96: | |
55b32c02 | 1590 | #line 847 "./expread.y" |
689f801a JK |
1591 | { yyval.tval = builtin_type_long_long; ; |
1592 | break;} | |
1593 | case 97: | |
55b32c02 | 1594 | #line 849 "./expread.y" |
689f801a JK |
1595 | { yyval.tval = builtin_type_unsigned_long_long; ; |
1596 | break;} | |
1597 | case 98: | |
55b32c02 | 1598 | #line 851 "./expread.y" |
689f801a JK |
1599 | { yyval.tval = builtin_type_unsigned_long_long; ; |
1600 | break;} | |
1601 | case 99: | |
55b32c02 | 1602 | #line 853 "./expread.y" |
dd3b648e RP |
1603 | { yyval.tval = builtin_type_short; ; |
1604 | break;} | |
689f801a | 1605 | case 100: |
55b32c02 | 1606 | #line 855 "./expread.y" |
dd3b648e RP |
1607 | { yyval.tval = builtin_type_unsigned_short; ; |
1608 | break;} | |
689f801a | 1609 | case 101: |
55b32c02 | 1610 | #line 857 "./expread.y" |
dd3b648e RP |
1611 | { yyval.tval = lookup_struct (copy_name (yyvsp[0].sval), |
1612 | expression_context_block); ; | |
1613 | break;} | |
689f801a | 1614 | case 102: |
55b32c02 | 1615 | #line 860 "./expread.y" |
dd3b648e RP |
1616 | { yyval.tval = lookup_union (copy_name (yyvsp[0].sval), |
1617 | expression_context_block); ; | |
1618 | break;} | |
689f801a | 1619 | case 103: |
55b32c02 | 1620 | #line 863 "./expread.y" |
dd3b648e RP |
1621 | { yyval.tval = lookup_enum (copy_name (yyvsp[0].sval), |
1622 | expression_context_block); ; | |
1623 | break;} | |
689f801a | 1624 | case 104: |
55b32c02 | 1625 | #line 866 "./expread.y" |
dd3b648e RP |
1626 | { yyval.tval = lookup_unsigned_typename (TYPE_NAME(yyvsp[0].tsym.type)); ; |
1627 | break;} | |
689f801a | 1628 | case 105: |
55b32c02 | 1629 | #line 868 "./expread.y" |
dd3b648e RP |
1630 | { yyval.tval = builtin_type_unsigned_int; ; |
1631 | break;} | |
689f801a | 1632 | case 106: |
55b32c02 | 1633 | #line 870 "./expread.y" |
dd3b648e RP |
1634 | { yyval.tval = yyvsp[0].tsym.type; ; |
1635 | break;} | |
689f801a | 1636 | case 107: |
55b32c02 | 1637 | #line 872 "./expread.y" |
dd3b648e RP |
1638 | { yyval.tval = builtin_type_int; ; |
1639 | break;} | |
689f801a | 1640 | case 109: |
55b32c02 | 1641 | #line 877 "./expread.y" |
dd3b648e RP |
1642 | { |
1643 | yyval.tsym.stoken.ptr = "int"; | |
1644 | yyval.tsym.stoken.length = 3; | |
1645 | yyval.tsym.type = builtin_type_int; | |
1646 | ; | |
1647 | break;} | |
689f801a | 1648 | case 110: |
55b32c02 | 1649 | #line 883 "./expread.y" |
dd3b648e RP |
1650 | { |
1651 | yyval.tsym.stoken.ptr = "long"; | |
1652 | yyval.tsym.stoken.length = 4; | |
1653 | yyval.tsym.type = builtin_type_long; | |
1654 | ; | |
1655 | break;} | |
689f801a | 1656 | case 111: |
55b32c02 | 1657 | #line 889 "./expread.y" |
dd3b648e RP |
1658 | { |
1659 | yyval.tsym.stoken.ptr = "short"; | |
1660 | yyval.tsym.stoken.length = 5; | |
1661 | yyval.tsym.type = builtin_type_short; | |
1662 | ; | |
1663 | break;} | |
689f801a | 1664 | case 112: |
55b32c02 | 1665 | #line 898 "./expread.y" |
dd3b648e RP |
1666 | { yyval.tvec = (struct type **)xmalloc (sizeof (struct type *) * 2); |
1667 | yyval.tvec[0] = (struct type *)0; | |
1668 | yyval.tvec[1] = yyvsp[0].tval; | |
1669 | ; | |
1670 | break;} | |
689f801a | 1671 | case 113: |
55b32c02 | 1672 | #line 903 "./expread.y" |
dd3b648e RP |
1673 | { int len = sizeof (struct type *) * ++(yyvsp[-2].ivec[0]); |
1674 | yyval.tvec = (struct type **)xrealloc (yyvsp[-2].tvec, len); | |
1675 | yyval.tvec[yyval.ivec[0]] = yyvsp[0].tval; | |
1676 | ; | |
1677 | break;} | |
689f801a | 1678 | case 114: |
55b32c02 | 1679 | #line 909 "./expread.y" |
dd3b648e RP |
1680 | { yyval.sval = yyvsp[0].ssym.stoken; ; |
1681 | break;} | |
689f801a | 1682 | case 115: |
55b32c02 | 1683 | #line 910 "./expread.y" |
dd3b648e RP |
1684 | { yyval.sval = yyvsp[0].ssym.stoken; ; |
1685 | break;} | |
689f801a | 1686 | case 116: |
55b32c02 | 1687 | #line 911 "./expread.y" |
dd3b648e RP |
1688 | { yyval.sval = yyvsp[0].tsym.stoken; ; |
1689 | break;} | |
689f801a | 1690 | case 117: |
55b32c02 | 1691 | #line 912 "./expread.y" |
dd3b648e RP |
1692 | { yyval.sval = yyvsp[0].ssym.stoken; ; |
1693 | break;} | |
689f801a | 1694 | case 118: |
55b32c02 | 1695 | #line 913 "./expread.y" |
dd3b648e RP |
1696 | { yyval.sval = yyvsp[0].ssym.stoken; ; |
1697 | break;} | |
1698 | } | |
1699 | /* the action file gets copied in in place of this dollarsign */ | |
55b32c02 | 1700 | #line 423 "/usr/latest/lib/bison.simple" |
dd3b648e RP |
1701 | \f |
1702 | yyvsp -= yylen; | |
1703 | yyssp -= yylen; | |
1704 | #ifdef YYLSP_NEEDED | |
1705 | yylsp -= yylen; | |
1706 | #endif | |
1707 | ||
1708 | #if YYDEBUG != 0 | |
1709 | if (yydebug) | |
1710 | { | |
1711 | short *ssp1 = yyss - 1; | |
1712 | fprintf (stderr, "state stack now"); | |
1713 | while (ssp1 != yyssp) | |
1714 | fprintf (stderr, " %d", *++ssp1); | |
1715 | fprintf (stderr, "\n"); | |
1716 | } | |
1717 | #endif | |
1718 | ||
1719 | *++yyvsp = yyval; | |
1720 | ||
1721 | #ifdef YYLSP_NEEDED | |
1722 | yylsp++; | |
1723 | if (yylen == 0) | |
1724 | { | |
1725 | yylsp->first_line = yylloc.first_line; | |
1726 | yylsp->first_column = yylloc.first_column; | |
1727 | yylsp->last_line = (yylsp-1)->last_line; | |
1728 | yylsp->last_column = (yylsp-1)->last_column; | |
1729 | yylsp->text = 0; | |
1730 | } | |
1731 | else | |
1732 | { | |
1733 | yylsp->last_line = (yylsp+yylen-1)->last_line; | |
1734 | yylsp->last_column = (yylsp+yylen-1)->last_column; | |
1735 | } | |
1736 | #endif | |
1737 | ||
1738 | /* Now "shift" the result of the reduction. | |
1739 | Determine what state that goes to, | |
1740 | based on the state we popped back to | |
1741 | and the rule number reduced by. */ | |
1742 | ||
1743 | yyn = yyr1[yyn]; | |
1744 | ||
1745 | yystate = yypgoto[yyn - YYNTBASE] + *yyssp; | |
1746 | if (yystate >= 0 && yystate <= YYLAST && yycheck[yystate] == *yyssp) | |
1747 | yystate = yytable[yystate]; | |
1748 | else | |
1749 | yystate = yydefgoto[yyn - YYNTBASE]; | |
1750 | ||
1751 | goto yynewstate; | |
1752 | ||
1753 | yyerrlab: /* here on detecting error */ | |
1754 | ||
1755 | if (! yyerrstatus) | |
1756 | /* If not already recovering from an error, report this error. */ | |
1757 | { | |
1758 | ++yynerrs; | |
beff312e RP |
1759 | |
1760 | #ifdef YYERROR_VERBOSE | |
1761 | yyn = yypact[yystate]; | |
1762 | ||
1763 | if (yyn > YYFLAG && yyn < YYLAST) | |
1764 | { | |
1765 | int size = 0; | |
1766 | char *msg; | |
1767 | int x, count; | |
1768 | ||
1769 | count = 0; | |
1770 | for (x = 0; x < (sizeof(yytname) / sizeof(char *)); x++) | |
1771 | if (yycheck[x + yyn] == x) | |
1772 | size += strlen(yytname[x]) + 15, count++; | |
1773 | msg = (char *) xmalloc(size + 15); | |
1774 | strcpy(msg, "parse error"); | |
1775 | ||
1776 | if (count < 5) | |
1777 | { | |
1778 | count = 0; | |
1779 | for (x = 0; x < (sizeof(yytname) / sizeof(char *)); x++) | |
1780 | if (yycheck[x + yyn] == x) | |
1781 | { | |
1782 | strcat(msg, count == 0 ? ", expecting `" : " or `"); | |
1783 | strcat(msg, yytname[x]); | |
1784 | strcat(msg, "'"); | |
1785 | count++; | |
1786 | } | |
1787 | } | |
1788 | yyerror(msg); | |
1789 | free(msg); | |
1790 | } | |
1791 | else | |
1792 | #endif /* YYERROR_VERBOSE */ | |
1793 | yyerror("parse error"); | |
dd3b648e RP |
1794 | } |
1795 | ||
beff312e RP |
1796 | yyerrlab1: /* here on error raised explicitly by an action */ |
1797 | ||
dd3b648e RP |
1798 | if (yyerrstatus == 3) |
1799 | { | |
1800 | /* if just tried and failed to reuse lookahead token after an error, discard it. */ | |
1801 | ||
1802 | /* return failure if at end of input */ | |
1803 | if (yychar == YYEOF) | |
1804 | YYABORT; | |
1805 | ||
1806 | #if YYDEBUG != 0 | |
1807 | if (yydebug) | |
1808 | fprintf(stderr, "Discarding token %d (%s).\n", yychar, yytname[yychar1]); | |
1809 | #endif | |
1810 | ||
1811 | yychar = YYEMPTY; | |
1812 | } | |
1813 | ||
1814 | /* Else will try to reuse lookahead token | |
1815 | after shifting the error token. */ | |
1816 | ||
1817 | yyerrstatus = 3; /* Each real token shifted decrements this */ | |
1818 | ||
1819 | goto yyerrhandle; | |
1820 | ||
1821 | yyerrdefault: /* current state does not do anything special for the error token. */ | |
1822 | ||
1823 | #if 0 | |
1824 | /* This is wrong; only states that explicitly want error tokens | |
1825 | should shift them. */ | |
1826 | yyn = yydefact[yystate]; /* If its default is to accept any token, ok. Otherwise pop it.*/ | |
1827 | if (yyn) goto yydefault; | |
1828 | #endif | |
1829 | ||
1830 | yyerrpop: /* pop the current state because it cannot handle the error token */ | |
1831 | ||
1832 | if (yyssp == yyss) YYABORT; | |
1833 | yyvsp--; | |
1834 | yystate = *--yyssp; | |
1835 | #ifdef YYLSP_NEEDED | |
1836 | yylsp--; | |
1837 | #endif | |
1838 | ||
1839 | #if YYDEBUG != 0 | |
1840 | if (yydebug) | |
1841 | { | |
1842 | short *ssp1 = yyss - 1; | |
1843 | fprintf (stderr, "Error: state stack now"); | |
1844 | while (ssp1 != yyssp) | |
1845 | fprintf (stderr, " %d", *++ssp1); | |
1846 | fprintf (stderr, "\n"); | |
1847 | } | |
1848 | #endif | |
1849 | ||
1850 | yyerrhandle: | |
1851 | ||
1852 | yyn = yypact[yystate]; | |
1853 | if (yyn == YYFLAG) | |
1854 | goto yyerrdefault; | |
1855 | ||
1856 | yyn += YYTERROR; | |
1857 | if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != YYTERROR) | |
1858 | goto yyerrdefault; | |
1859 | ||
1860 | yyn = yytable[yyn]; | |
1861 | if (yyn < 0) | |
1862 | { | |
1863 | if (yyn == YYFLAG) | |
1864 | goto yyerrpop; | |
1865 | yyn = -yyn; | |
1866 | goto yyreduce; | |
1867 | } | |
1868 | else if (yyn == 0) | |
1869 | goto yyerrpop; | |
1870 | ||
1871 | if (yyn == YYFINAL) | |
1872 | YYACCEPT; | |
1873 | ||
1874 | #if YYDEBUG != 0 | |
1875 | if (yydebug) | |
1876 | fprintf(stderr, "Shifting error token, "); | |
1877 | #endif | |
1878 | ||
1879 | *++yyvsp = yylval; | |
1880 | #ifdef YYLSP_NEEDED | |
1881 | *++yylsp = yylloc; | |
1882 | #endif | |
1883 | ||
1884 | yystate = yyn; | |
1885 | goto yynewstate; | |
1886 | } | |
55b32c02 | 1887 | #line 928 "./expread.y" |
dd3b648e RP |
1888 | |
1889 | \f | |
1890 | /* Begin counting arguments for a function call, | |
1891 | saving the data about any containing call. */ | |
1892 | ||
1893 | static void | |
1894 | start_arglist () | |
1895 | { | |
1896 | register struct funcall *new = (struct funcall *) xmalloc (sizeof (struct funcall)); | |
1897 | ||
1898 | new->next = funcall_chain; | |
1899 | new->arglist_len = arglist_len; | |
1900 | arglist_len = 0; | |
1901 | funcall_chain = new; | |
1902 | } | |
1903 | ||
1904 | /* Return the number of arguments in a function call just terminated, | |
1905 | and restore the data for the containing function call. */ | |
1906 | ||
1907 | static int | |
1908 | end_arglist () | |
1909 | { | |
1910 | register int val = arglist_len; | |
1911 | register struct funcall *call = funcall_chain; | |
1912 | funcall_chain = call->next; | |
1913 | arglist_len = call->arglist_len; | |
1914 | free (call); | |
1915 | return val; | |
1916 | } | |
1917 | ||
1918 | /* Free everything in the funcall chain. | |
1919 | Used when there is an error inside parsing. */ | |
1920 | ||
1921 | static void | |
1922 | free_funcalls () | |
1923 | { | |
1924 | register struct funcall *call, *next; | |
1925 | ||
1926 | for (call = funcall_chain; call; call = next) | |
1927 | { | |
1928 | next = call->next; | |
1929 | free (call); | |
1930 | } | |
1931 | } | |
1932 | \f | |
1933 | /* This page contains the functions for adding data to the struct expression | |
1934 | being constructed. */ | |
1935 | ||
1936 | /* Add one element to the end of the expression. */ | |
1937 | ||
1938 | /* To avoid a bug in the Sun 4 compiler, we pass things that can fit into | |
1939 | a register through here */ | |
1940 | ||
1941 | static void | |
1942 | write_exp_elt (expelt) | |
1943 | union exp_element expelt; | |
1944 | { | |
1945 | if (expout_ptr >= expout_size) | |
1946 | { | |
1947 | expout_size *= 2; | |
1948 | expout = (struct expression *) xrealloc (expout, | |
1949 | sizeof (struct expression) | |
1950 | + expout_size * sizeof (union exp_element)); | |
1951 | } | |
1952 | expout->elts[expout_ptr++] = expelt; | |
1953 | } | |
1954 | ||
1955 | static void | |
1956 | write_exp_elt_opcode (expelt) | |
1957 | enum exp_opcode expelt; | |
1958 | { | |
1959 | union exp_element tmp; | |
1960 | ||
1961 | tmp.opcode = expelt; | |
1962 | ||
1963 | write_exp_elt (tmp); | |
1964 | } | |
1965 | ||
1966 | static void | |
1967 | write_exp_elt_sym (expelt) | |
1968 | struct symbol *expelt; | |
1969 | { | |
1970 | union exp_element tmp; | |
1971 | ||
1972 | tmp.symbol = expelt; | |
1973 | ||
1974 | write_exp_elt (tmp); | |
1975 | } | |
1976 | ||
1977 | static void | |
1978 | write_exp_elt_longcst (expelt) | |
1979 | LONGEST expelt; | |
1980 | { | |
1981 | union exp_element tmp; | |
1982 | ||
1983 | tmp.longconst = expelt; | |
1984 | ||
1985 | write_exp_elt (tmp); | |
1986 | } | |
1987 | ||
1988 | static void | |
1989 | write_exp_elt_dblcst (expelt) | |
1990 | double expelt; | |
1991 | { | |
1992 | union exp_element tmp; | |
1993 | ||
1994 | tmp.doubleconst = expelt; | |
1995 | ||
1996 | write_exp_elt (tmp); | |
1997 | } | |
1998 | ||
1999 | static void | |
2000 | write_exp_elt_type (expelt) | |
2001 | struct type *expelt; | |
2002 | { | |
2003 | union exp_element tmp; | |
2004 | ||
2005 | tmp.type = expelt; | |
2006 | ||
2007 | write_exp_elt (tmp); | |
2008 | } | |
2009 | ||
2010 | static void | |
2011 | write_exp_elt_intern (expelt) | |
2012 | struct internalvar *expelt; | |
2013 | { | |
2014 | union exp_element tmp; | |
2015 | ||
2016 | tmp.internalvar = expelt; | |
2017 | ||
2018 | write_exp_elt (tmp); | |
2019 | } | |
2020 | ||
2021 | /* Add a string constant to the end of the expression. | |
2022 | Follow it by its length in bytes, as a separate exp_element. */ | |
2023 | ||
2024 | static void | |
2025 | write_exp_string (str) | |
2026 | struct stoken str; | |
2027 | { | |
2028 | register int len = str.length; | |
2029 | register int lenelt | |
2030 | = (len + sizeof (union exp_element)) / sizeof (union exp_element); | |
2031 | ||
2032 | expout_ptr += lenelt; | |
2033 | ||
2034 | if (expout_ptr >= expout_size) | |
2035 | { | |
2036 | expout_size = max (expout_size * 2, expout_ptr + 10); | |
2037 | expout = (struct expression *) | |
2038 | xrealloc (expout, (sizeof (struct expression) | |
2039 | + (expout_size * sizeof (union exp_element)))); | |
2040 | } | |
2041 | bcopy (str.ptr, (char *) &expout->elts[expout_ptr - lenelt], len); | |
2042 | ((char *) &expout->elts[expout_ptr - lenelt])[len] = 0; | |
2043 | write_exp_elt_longcst ((LONGEST) len); | |
2044 | } | |
2045 | \f | |
2046 | /* During parsing of a C expression, the pointer to the next character | |
2047 | is in this variable. */ | |
2048 | ||
2049 | static char *lexptr; | |
2050 | ||
2051 | /* Tokens that refer to names do so with explicit pointer and length, | |
2052 | so they can share the storage that lexptr is parsing. | |
2053 | ||
2054 | When it is necessary to pass a name to a function that expects | |
2055 | a null-terminated string, the substring is copied out | |
2056 | into a block of storage that namecopy points to. | |
2057 | ||
2058 | namecopy is allocated once, guaranteed big enough, for each parsing. */ | |
2059 | ||
2060 | static char *namecopy; | |
2061 | ||
2062 | /* Current depth in parentheses within the expression. */ | |
2063 | ||
2064 | static int paren_depth; | |
2065 | ||
2066 | /* Nonzero means stop parsing on first comma (if not within parentheses). */ | |
2067 | ||
2068 | static int comma_terminates; | |
2069 | ||
2070 | /* Take care of parsing a number (anything that starts with a digit). | |
2071 | Set yylval and return the token type; update lexptr. | |
2072 | LEN is the number of characters in it. */ | |
2073 | ||
2074 | /*** Needs some error checking for the float case ***/ | |
2075 | ||
2076 | static int | |
2077 | parse_number (p, len, parsed_float, putithere) | |
2078 | register char *p; | |
2079 | register int len; | |
2080 | int parsed_float; | |
2081 | YYSTYPE *putithere; | |
2082 | { | |
2083 | register LONGEST n = 0; | |
2084 | register int i; | |
2085 | register int c; | |
2086 | register int base = input_radix; | |
2087 | int unsigned_p = 0; | |
2088 | ||
2089 | extern double atof (); | |
2090 | ||
2091 | if (parsed_float) | |
2092 | { | |
2093 | /* It's a float since it contains a point or an exponent. */ | |
2094 | putithere->dval = atof (p); | |
2095 | return FLOAT; | |
2096 | } | |
2097 | ||
2098 | /* Handle base-switching prefixes 0x, 0t, 0d, 0 */ | |
2099 | if (p[0] == '0') | |
2100 | switch (p[1]) | |
2101 | { | |
2102 | case 'x': | |
2103 | case 'X': | |
2104 | if (len >= 3) | |
2105 | { | |
2106 | p += 2; | |
2107 | base = 16; | |
2108 | len -= 2; | |
2109 | } | |
2110 | break; | |
2111 | ||
2112 | case 't': | |
2113 | case 'T': | |
2114 | case 'd': | |
2115 | case 'D': | |
2116 | if (len >= 3) | |
2117 | { | |
2118 | p += 2; | |
2119 | base = 10; | |
2120 | len -= 2; | |
2121 | } | |
2122 | break; | |
2123 | ||
2124 | default: | |
2125 | base = 8; | |
2126 | break; | |
2127 | } | |
2128 | ||
2129 | while (len-- > 0) | |
2130 | { | |
2131 | c = *p++; | |
2132 | if (c >= 'A' && c <= 'Z') | |
2133 | c += 'a' - 'A'; | |
2134 | if (c != 'l' && c != 'u') | |
2135 | n *= base; | |
2136 | if (c >= '0' && c <= '9') | |
2137 | n += i = c - '0'; | |
2138 | else | |
2139 | { | |
2140 | if (base > 10 && c >= 'a' && c <= 'f') | |
2141 | n += i = c - 'a' + 10; | |
2142 | else if (len == 0 && c == 'l') | |
2143 | ; | |
2144 | else if (len == 0 && c == 'u') | |
2145 | unsigned_p = 1; | |
2146 | else | |
2147 | return ERROR; /* Char not a digit */ | |
2148 | } | |
2149 | if (i >= base) | |
2150 | return ERROR; /* Invalid digit in this base */ | |
2151 | } | |
2152 | ||
2153 | if (unsigned_p) | |
2154 | { | |
2155 | putithere->ulval = n; | |
2156 | return UINT; | |
2157 | } | |
2158 | else | |
2159 | { | |
2160 | putithere->lval = n; | |
2161 | return INT; | |
2162 | } | |
2163 | } | |
2164 | ||
2165 | struct token | |
2166 | { | |
2167 | char *operator; | |
2168 | int token; | |
2169 | enum exp_opcode opcode; | |
2170 | }; | |
2171 | ||
689f801a | 2172 | const static struct token tokentab3[] = |
dd3b648e RP |
2173 | { |
2174 | {">>=", ASSIGN_MODIFY, BINOP_RSH}, | |
2175 | {"<<=", ASSIGN_MODIFY, BINOP_LSH} | |
2176 | }; | |
2177 | ||
689f801a | 2178 | const static struct token tokentab2[] = |
dd3b648e RP |
2179 | { |
2180 | {"+=", ASSIGN_MODIFY, BINOP_ADD}, | |
2181 | {"-=", ASSIGN_MODIFY, BINOP_SUB}, | |
2182 | {"*=", ASSIGN_MODIFY, BINOP_MUL}, | |
2183 | {"/=", ASSIGN_MODIFY, BINOP_DIV}, | |
2184 | {"%=", ASSIGN_MODIFY, BINOP_REM}, | |
2185 | {"|=", ASSIGN_MODIFY, BINOP_LOGIOR}, | |
2186 | {"&=", ASSIGN_MODIFY, BINOP_LOGAND}, | |
2187 | {"^=", ASSIGN_MODIFY, BINOP_LOGXOR}, | |
2188 | {"++", INCREMENT, BINOP_END}, | |
2189 | {"--", DECREMENT, BINOP_END}, | |
2190 | {"->", ARROW, BINOP_END}, | |
2191 | {"&&", AND, BINOP_END}, | |
2192 | {"||", OR, BINOP_END}, | |
2193 | {"::", COLONCOLON, BINOP_END}, | |
2194 | {"<<", LSH, BINOP_END}, | |
2195 | {">>", RSH, BINOP_END}, | |
2196 | {"==", EQUAL, BINOP_END}, | |
2197 | {"!=", NOTEQUAL, BINOP_END}, | |
2198 | {"<=", LEQ, BINOP_END}, | |
2199 | {">=", GEQ, BINOP_END} | |
2200 | }; | |
2201 | ||
2202 | /* assign machine-independent names to certain registers | |
2203 | * (unless overridden by the REGISTER_NAMES table) | |
2204 | */ | |
2205 | struct std_regs { | |
2206 | char *name; | |
2207 | int regnum; | |
2208 | } std_regs[] = { | |
2209 | #ifdef PC_REGNUM | |
2210 | { "pc", PC_REGNUM }, | |
2211 | #endif | |
2212 | #ifdef FP_REGNUM | |
2213 | { "fp", FP_REGNUM }, | |
2214 | #endif | |
2215 | #ifdef SP_REGNUM | |
2216 | { "sp", SP_REGNUM }, | |
2217 | #endif | |
2218 | #ifdef PS_REGNUM | |
2219 | { "ps", PS_REGNUM }, | |
2220 | #endif | |
2221 | }; | |
2222 | ||
2223 | #define NUM_STD_REGS (sizeof std_regs / sizeof std_regs[0]) | |
2224 | ||
2225 | /* Read one token, getting characters through lexptr. */ | |
2226 | ||
2227 | static int | |
2228 | yylex () | |
2229 | { | |
2230 | register int c; | |
2231 | register int namelen; | |
2232 | register unsigned i; | |
2233 | register char *tokstart; | |
2234 | ||
2235 | retry: | |
2236 | ||
2237 | tokstart = lexptr; | |
2238 | /* See if it is a special token of length 3. */ | |
2239 | for (i = 0; i < sizeof tokentab3 / sizeof tokentab3[0]; i++) | |
2240 | if (!strncmp (tokstart, tokentab3[i].operator, 3)) | |
2241 | { | |
2242 | lexptr += 3; | |
2243 | yylval.opcode = tokentab3[i].opcode; | |
2244 | return tokentab3[i].token; | |
2245 | } | |
2246 | ||
2247 | /* See if it is a special token of length 2. */ | |
2248 | for (i = 0; i < sizeof tokentab2 / sizeof tokentab2[0]; i++) | |
2249 | if (!strncmp (tokstart, tokentab2[i].operator, 2)) | |
2250 | { | |
2251 | lexptr += 2; | |
2252 | yylval.opcode = tokentab2[i].opcode; | |
2253 | return tokentab2[i].token; | |
2254 | } | |
2255 | ||
2256 | switch (c = *tokstart) | |
2257 | { | |
2258 | case 0: | |
2259 | return 0; | |
2260 | ||
2261 | case ' ': | |
2262 | case '\t': | |
2263 | case '\n': | |
2264 | lexptr++; | |
2265 | goto retry; | |
2266 | ||
2267 | case '\'': | |
2268 | lexptr++; | |
2269 | c = *lexptr++; | |
2270 | if (c == '\\') | |
2271 | c = parse_escape (&lexptr); | |
2272 | yylval.lval = c; | |
2273 | c = *lexptr++; | |
2274 | if (c != '\'') | |
2275 | error ("Invalid character constant."); | |
2276 | return CHAR; | |
2277 | ||
2278 | case '(': | |
2279 | paren_depth++; | |
2280 | lexptr++; | |
2281 | return c; | |
2282 | ||
2283 | case ')': | |
2284 | if (paren_depth == 0) | |
2285 | return 0; | |
2286 | paren_depth--; | |
2287 | lexptr++; | |
2288 | return c; | |
2289 | ||
2290 | case ',': | |
2291 | if (comma_terminates && paren_depth == 0) | |
2292 | return 0; | |
2293 | lexptr++; | |
2294 | return c; | |
2295 | ||
2296 | case '.': | |
2297 | /* Might be a floating point number. */ | |
2298 | if (lexptr[1] < '0' || lexptr[1] > '9') | |
2299 | goto symbol; /* Nope, must be a symbol. */ | |
2300 | /* FALL THRU into number case. */ | |
2301 | ||
2302 | case '0': | |
2303 | case '1': | |
2304 | case '2': | |
2305 | case '3': | |
2306 | case '4': | |
2307 | case '5': | |
2308 | case '6': | |
2309 | case '7': | |
2310 | case '8': | |
2311 | case '9': | |
2312 | { | |
2313 | /* It's a number. */ | |
2314 | int got_dot = 0, got_e = 0, toktype; | |
2315 | register char *p = tokstart; | |
2316 | int hex = input_radix > 10; | |
2317 | ||
2318 | if (c == '0' && (p[1] == 'x' || p[1] == 'X')) | |
2319 | { | |
2320 | p += 2; | |
2321 | hex = 1; | |
2322 | } | |
2323 | else if (c == '0' && (p[1]=='t' || p[1]=='T' || p[1]=='d' || p[1]=='D')) | |
2324 | { | |
2325 | p += 2; | |
2326 | hex = 0; | |
2327 | } | |
2328 | ||
2329 | for (;; ++p) | |
2330 | { | |
2331 | if (!hex && !got_e && (*p == 'e' || *p == 'E')) | |
2332 | got_dot = got_e = 1; | |
2333 | else if (!hex && !got_dot && *p == '.') | |
2334 | got_dot = 1; | |
2335 | else if (got_e && (p[-1] == 'e' || p[-1] == 'E') | |
2336 | && (*p == '-' || *p == '+')) | |
2337 | /* This is the sign of the exponent, not the end of the | |
2338 | number. */ | |
2339 | continue; | |
2340 | /* We will take any letters or digits. parse_number will | |
2341 | complain if past the radix, or if L or U are not final. */ | |
2342 | else if ((*p < '0' || *p > '9') | |
2343 | && ((*p < 'a' || *p > 'z') | |
2344 | && (*p < 'A' || *p > 'Z'))) | |
2345 | break; | |
2346 | } | |
2347 | toktype = parse_number (tokstart, p - tokstart, got_dot|got_e, &yylval); | |
2348 | if (toktype == ERROR) | |
2349 | { | |
2350 | char *err_copy = (char *) alloca (p - tokstart + 1); | |
2351 | ||
2352 | bcopy (tokstart, err_copy, p - tokstart); | |
2353 | err_copy[p - tokstart] = 0; | |
2354 | error ("Invalid number \"%s\".", err_copy); | |
2355 | } | |
2356 | lexptr = p; | |
2357 | return toktype; | |
2358 | } | |
2359 | ||
2360 | case '+': | |
2361 | case '-': | |
2362 | case '*': | |
2363 | case '/': | |
2364 | case '%': | |
2365 | case '|': | |
2366 | case '&': | |
2367 | case '^': | |
2368 | case '~': | |
2369 | case '!': | |
2370 | case '@': | |
2371 | case '<': | |
2372 | case '>': | |
2373 | case '[': | |
2374 | case ']': | |
2375 | case '?': | |
2376 | case ':': | |
2377 | case '=': | |
2378 | case '{': | |
2379 | case '}': | |
2380 | symbol: | |
2381 | lexptr++; | |
2382 | return c; | |
2383 | ||
2384 | case '"': | |
2385 | for (namelen = 1; (c = tokstart[namelen]) != '"'; namelen++) | |
2386 | if (c == '\\') | |
2387 | { | |
2388 | c = tokstart[++namelen]; | |
2389 | if (c >= '0' && c <= '9') | |
2390 | { | |
2391 | c = tokstart[++namelen]; | |
2392 | if (c >= '0' && c <= '9') | |
2393 | c = tokstart[++namelen]; | |
2394 | } | |
2395 | } | |
2396 | yylval.sval.ptr = tokstart + 1; | |
2397 | yylval.sval.length = namelen - 1; | |
2398 | lexptr += namelen + 1; | |
2399 | return STRING; | |
2400 | } | |
2401 | ||
2402 | if (!(c == '_' || c == '$' | |
2403 | || (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z'))) | |
2404 | /* We must have come across a bad character (e.g. ';'). */ | |
2405 | error ("Invalid character '%c' in expression.", c); | |
2406 | ||
2407 | /* It's a name. See how long it is. */ | |
2408 | namelen = 0; | |
2409 | for (c = tokstart[namelen]; | |
2410 | (c == '_' || c == '$' || (c >= '0' && c <= '9') | |
2411 | || (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')); | |
2412 | c = tokstart[++namelen]) | |
2413 | ; | |
2414 | ||
2415 | /* The token "if" terminates the expression and is NOT | |
2416 | removed from the input stream. */ | |
2417 | if (namelen == 2 && tokstart[0] == 'i' && tokstart[1] == 'f') | |
2418 | { | |
2419 | return 0; | |
2420 | } | |
2421 | ||
2422 | lexptr += namelen; | |
2423 | ||
2424 | /* Handle the tokens $digits; also $ (short for $0) and $$ (short for $$1) | |
2425 | and $$digits (equivalent to $<-digits> if you could type that). | |
2426 | Make token type LAST, and put the number (the digits) in yylval. */ | |
2427 | ||
2428 | if (*tokstart == '$') | |
2429 | { | |
2430 | register int negate = 0; | |
2431 | c = 1; | |
2432 | /* Double dollar means negate the number and add -1 as well. | |
2433 | Thus $$ alone means -1. */ | |
2434 | if (namelen >= 2 && tokstart[1] == '$') | |
2435 | { | |
2436 | negate = 1; | |
2437 | c = 2; | |
2438 | } | |
2439 | if (c == namelen) | |
2440 | { | |
2441 | /* Just dollars (one or two) */ | |
2442 | yylval.lval = - negate; | |
2443 | return LAST; | |
2444 | } | |
2445 | /* Is the rest of the token digits? */ | |
2446 | for (; c < namelen; c++) | |
2447 | if (!(tokstart[c] >= '0' && tokstart[c] <= '9')) | |
2448 | break; | |
2449 | if (c == namelen) | |
2450 | { | |
2451 | yylval.lval = atoi (tokstart + 1 + negate); | |
2452 | if (negate) | |
2453 | yylval.lval = - yylval.lval; | |
2454 | return LAST; | |
2455 | } | |
2456 | } | |
2457 | ||
2458 | /* Handle tokens that refer to machine registers: | |
2459 | $ followed by a register name. */ | |
2460 | ||
2461 | if (*tokstart == '$') { | |
2462 | for (c = 0; c < NUM_REGS; c++) | |
2463 | if (namelen - 1 == strlen (reg_names[c]) | |
2464 | && !strncmp (tokstart + 1, reg_names[c], namelen - 1)) | |
2465 | { | |
2466 | yylval.lval = c; | |
2467 | return REGNAME; | |
2468 | } | |
2469 | for (c = 0; c < NUM_STD_REGS; c++) | |
2470 | if (namelen - 1 == strlen (std_regs[c].name) | |
2471 | && !strncmp (tokstart + 1, std_regs[c].name, namelen - 1)) | |
2472 | { | |
2473 | yylval.lval = std_regs[c].regnum; | |
2474 | return REGNAME; | |
2475 | } | |
2476 | } | |
2477 | /* Catch specific keywords. Should be done with a data structure. */ | |
2478 | switch (namelen) | |
2479 | { | |
2480 | case 8: | |
2481 | if (!strncmp (tokstart, "unsigned", 8)) | |
2482 | return UNSIGNED; | |
2483 | break; | |
2484 | case 6: | |
2485 | if (!strncmp (tokstart, "struct", 6)) | |
2486 | return STRUCT; | |
2487 | if (!strncmp (tokstart, "signed", 6)) | |
2488 | return SIGNED; | |
2489 | if (!strncmp (tokstart, "sizeof", 6)) | |
2490 | return SIZEOF; | |
2491 | break; | |
2492 | case 5: | |
2493 | if (!strncmp (tokstart, "union", 5)) | |
2494 | return UNION; | |
2495 | if (!strncmp (tokstart, "short", 5)) | |
2496 | return SHORT; | |
2497 | break; | |
2498 | case 4: | |
2499 | if (!strncmp (tokstart, "enum", 4)) | |
2500 | return ENUM; | |
2501 | if (!strncmp (tokstart, "long", 4)) | |
2502 | return LONG; | |
2503 | if (!strncmp (tokstart, "this", 4)) | |
2504 | { | |
2505 | static const char this_name[] = | |
2506 | { CPLUS_MARKER, 't', 'h', 'i', 's', '\0' }; | |
2507 | ||
2508 | if (lookup_symbol (this_name, expression_context_block, | |
2509 | VAR_NAMESPACE, 0, NULL)) | |
2510 | return THIS; | |
2511 | } | |
2512 | break; | |
2513 | case 3: | |
2514 | if (!strncmp (tokstart, "int", 3)) | |
2515 | return INT_KEYWORD; | |
2516 | break; | |
2517 | default: | |
2518 | break; | |
2519 | } | |
2520 | ||
2521 | yylval.sval.ptr = tokstart; | |
2522 | yylval.sval.length = namelen; | |
2523 | ||
2524 | /* Any other names starting in $ are debugger internal variables. */ | |
2525 | ||
2526 | if (*tokstart == '$') | |
2527 | { | |
2528 | yylval.ivar = lookup_internalvar (copy_name (yylval.sval) + 1); | |
2529 | return VARIABLE; | |
2530 | } | |
2531 | ||
2532 | /* Use token-type BLOCKNAME for symbols that happen to be defined as | |
2533 | functions or symtabs. If this is not so, then ... | |
2534 | Use token-type TYPENAME for symbols that happen to be defined | |
2535 | currently as names of types; NAME for other symbols. | |
2536 | The caller is not constrained to care about the distinction. */ | |
2537 | { | |
2538 | char *tmp = copy_name (yylval.sval); | |
2539 | struct symbol *sym; | |
2540 | int is_a_field_of_this = 0; | |
2541 | int hextype; | |
2542 | ||
2543 | sym = lookup_symbol (tmp, expression_context_block, | |
2544 | VAR_NAMESPACE, &is_a_field_of_this, NULL); | |
2545 | if ((sym && SYMBOL_CLASS (sym) == LOC_BLOCK) || | |
2546 | lookup_partial_symtab (tmp)) | |
2547 | { | |
2548 | yylval.ssym.sym = sym; | |
2549 | yylval.ssym.is_a_field_of_this = is_a_field_of_this; | |
2550 | return BLOCKNAME; | |
2551 | } | |
2552 | if (sym && SYMBOL_CLASS (sym) == LOC_TYPEDEF) | |
2553 | { | |
2554 | yylval.tsym.type = SYMBOL_TYPE (sym); | |
2555 | return TYPENAME; | |
2556 | } | |
2557 | if ((yylval.tsym.type = lookup_primitive_typename (tmp)) != 0) | |
2558 | return TYPENAME; | |
2559 | ||
2560 | /* Input names that aren't symbols but ARE valid hex numbers, | |
2561 | when the input radix permits them, can be names or numbers | |
2562 | depending on the parse. Note we support radixes > 16 here. */ | |
2563 | if (!sym && | |
2564 | ((tokstart[0] >= 'a' && tokstart[0] < 'a' + input_radix - 10) || | |
2565 | (tokstart[0] >= 'A' && tokstart[0] < 'A' + input_radix - 10))) | |
2566 | { | |
2567 | YYSTYPE newlval; /* Its value is ignored. */ | |
2568 | hextype = parse_number (tokstart, namelen, 0, &newlval); | |
2569 | if (hextype == INT) | |
2570 | { | |
2571 | yylval.ssym.sym = sym; | |
2572 | yylval.ssym.is_a_field_of_this = is_a_field_of_this; | |
2573 | return NAME_OR_INT; | |
2574 | } | |
2575 | if (hextype == UINT) | |
2576 | { | |
2577 | yylval.ssym.sym = sym; | |
2578 | yylval.ssym.is_a_field_of_this = is_a_field_of_this; | |
2579 | return NAME_OR_UINT; | |
2580 | } | |
2581 | } | |
2582 | ||
2583 | /* Any other kind of symbol */ | |
2584 | yylval.ssym.sym = sym; | |
2585 | yylval.ssym.is_a_field_of_this = is_a_field_of_this; | |
2586 | return NAME; | |
2587 | } | |
2588 | } | |
2589 | ||
2590 | static void | |
2591 | yyerror (msg) | |
2592 | char *msg; | |
2593 | { | |
2594 | error ("Invalid syntax in expression."); | |
2595 | } | |
2596 | ||
2597 | /* Return a null-terminated temporary copy of the name | |
2598 | of a string token. */ | |
2599 | ||
2600 | static char * | |
2601 | copy_name (token) | |
2602 | struct stoken token; | |
2603 | { | |
2604 | bcopy (token.ptr, namecopy, token.length); | |
2605 | namecopy[token.length] = 0; | |
2606 | return namecopy; | |
2607 | } | |
2608 | \f | |
2609 | /* Reverse an expression from suffix form (in which it is constructed) | |
2610 | to prefix form (in which we can conveniently print or execute it). */ | |
2611 | ||
2612 | static void prefixify_subexp (); | |
2613 | ||
2614 | static void | |
2615 | prefixify_expression (expr) | |
2616 | register struct expression *expr; | |
2617 | { | |
2618 | register int len = sizeof (struct expression) + | |
2619 | expr->nelts * sizeof (union exp_element); | |
2620 | register struct expression *temp; | |
2621 | register int inpos = expr->nelts, outpos = 0; | |
2622 | ||
2623 | temp = (struct expression *) alloca (len); | |
2624 | ||
2625 | /* Copy the original expression into temp. */ | |
2626 | bcopy (expr, temp, len); | |
2627 | ||
2628 | prefixify_subexp (temp, expr, inpos, outpos); | |
2629 | } | |
2630 | ||
2631 | /* Return the number of exp_elements in the subexpression of EXPR | |
2632 | whose last exp_element is at index ENDPOS - 1 in EXPR. */ | |
2633 | ||
2634 | static int | |
2635 | length_of_subexp (expr, endpos) | |
2636 | register struct expression *expr; | |
2637 | register int endpos; | |
2638 | { | |
2639 | register int oplen = 1; | |
2640 | register int args = 0; | |
2641 | register int i; | |
2642 | ||
2643 | if (endpos < 0) | |
2644 | error ("?error in length_of_subexp"); | |
2645 | ||
2646 | i = (int) expr->elts[endpos - 1].opcode; | |
2647 | ||
2648 | switch (i) | |
2649 | { | |
2650 | /* C++ */ | |
2651 | case OP_SCOPE: | |
2652 | oplen = 4 + ((expr->elts[endpos - 2].longconst | |
2653 | + sizeof (union exp_element)) | |
2654 | / sizeof (union exp_element)); | |
2655 | break; | |
2656 | ||
2657 | case OP_LONG: | |
2658 | case OP_DOUBLE: | |
2659 | oplen = 4; | |
2660 | break; | |
2661 | ||
2662 | case OP_VAR_VALUE: | |
2663 | case OP_LAST: | |
2664 | case OP_REGISTER: | |
2665 | case OP_INTERNALVAR: | |
2666 | oplen = 3; | |
2667 | break; | |
2668 | ||
2669 | case OP_FUNCALL: | |
2670 | oplen = 3; | |
2671 | args = 1 + expr->elts[endpos - 2].longconst; | |
2672 | break; | |
2673 | ||
2674 | case UNOP_CAST: | |
2675 | case UNOP_MEMVAL: | |
2676 | oplen = 3; | |
2677 | args = 1; | |
2678 | break; | |
2679 | ||
2680 | case STRUCTOP_STRUCT: | |
2681 | case STRUCTOP_PTR: | |
2682 | args = 1; | |
2683 | case OP_STRING: | |
2684 | oplen = 3 + ((expr->elts[endpos - 2].longconst | |
2685 | + sizeof (union exp_element)) | |
2686 | / sizeof (union exp_element)); | |
2687 | break; | |
2688 | ||
2689 | case TERNOP_COND: | |
2690 | args = 3; | |
2691 | break; | |
2692 | ||
2693 | case BINOP_ASSIGN_MODIFY: | |
2694 | oplen = 3; | |
2695 | args = 2; | |
2696 | break; | |
2697 | ||
2698 | /* C++ */ | |
2699 | case OP_THIS: | |
2700 | oplen = 2; | |
2701 | break; | |
2702 | ||
2703 | default: | |
2704 | args = 1 + (i < (int) BINOP_END); | |
2705 | } | |
2706 | ||
2707 | while (args > 0) | |
2708 | { | |
2709 | oplen += length_of_subexp (expr, endpos - oplen); | |
2710 | args--; | |
2711 | } | |
2712 | ||
2713 | return oplen; | |
2714 | } | |
2715 | ||
2716 | /* Copy the subexpression ending just before index INEND in INEXPR | |
2717 | into OUTEXPR, starting at index OUTBEG. | |
2718 | In the process, convert it from suffix to prefix form. */ | |
2719 | ||
2720 | static void | |
2721 | prefixify_subexp (inexpr, outexpr, inend, outbeg) | |
2722 | register struct expression *inexpr; | |
2723 | struct expression *outexpr; | |
2724 | register int inend; | |
2725 | int outbeg; | |
2726 | { | |
2727 | register int oplen = 1; | |
2728 | register int args = 0; | |
2729 | register int i; | |
2730 | int *arglens; | |
2731 | enum exp_opcode opcode; | |
2732 | ||
2733 | /* Compute how long the last operation is (in OPLEN), | |
2734 | and also how many preceding subexpressions serve as | |
2735 | arguments for it (in ARGS). */ | |
2736 | ||
2737 | opcode = inexpr->elts[inend - 1].opcode; | |
2738 | switch (opcode) | |
2739 | { | |
2740 | /* C++ */ | |
2741 | case OP_SCOPE: | |
2742 | oplen = 4 + ((inexpr->elts[inend - 2].longconst | |
2743 | + sizeof (union exp_element)) | |
2744 | / sizeof (union exp_element)); | |
2745 | break; | |
2746 | ||
2747 | case OP_LONG: | |
2748 | case OP_DOUBLE: | |
2749 | oplen = 4; | |
2750 | break; | |
2751 | ||
2752 | case OP_VAR_VALUE: | |
2753 | case OP_LAST: | |
2754 | case OP_REGISTER: | |
2755 | case OP_INTERNALVAR: | |
2756 | oplen = 3; | |
2757 | break; | |
2758 | ||
2759 | case OP_FUNCALL: | |
2760 | oplen = 3; | |
2761 | args = 1 + inexpr->elts[inend - 2].longconst; | |
2762 | break; | |
2763 | ||
2764 | case UNOP_CAST: | |
2765 | case UNOP_MEMVAL: | |
2766 | oplen = 3; | |
2767 | args = 1; | |
2768 | break; | |
2769 | ||
2770 | case STRUCTOP_STRUCT: | |
2771 | case STRUCTOP_PTR: | |
2772 | args = 1; | |
2773 | case OP_STRING: | |
2774 | oplen = 3 + ((inexpr->elts[inend - 2].longconst | |
2775 | + sizeof (union exp_element)) | |
2776 | / sizeof (union exp_element)); | |
2777 | ||
2778 | break; | |
2779 | ||
2780 | case TERNOP_COND: | |
2781 | args = 3; | |
2782 | break; | |
2783 | ||
2784 | case BINOP_ASSIGN_MODIFY: | |
2785 | oplen = 3; | |
2786 | args = 2; | |
2787 | break; | |
2788 | ||
2789 | /* C++ */ | |
2790 | case OP_THIS: | |
2791 | oplen = 2; | |
2792 | break; | |
2793 | ||
2794 | default: | |
2795 | args = 1 + ((int) opcode < (int) BINOP_END); | |
2796 | } | |
2797 | ||
2798 | /* Copy the final operator itself, from the end of the input | |
2799 | to the beginning of the output. */ | |
2800 | inend -= oplen; | |
2801 | bcopy (&inexpr->elts[inend], &outexpr->elts[outbeg], | |
2802 | oplen * sizeof (union exp_element)); | |
2803 | outbeg += oplen; | |
2804 | ||
2805 | /* Find the lengths of the arg subexpressions. */ | |
2806 | arglens = (int *) alloca (args * sizeof (int)); | |
2807 | for (i = args - 1; i >= 0; i--) | |
2808 | { | |
2809 | oplen = length_of_subexp (inexpr, inend); | |
2810 | arglens[i] = oplen; | |
2811 | inend -= oplen; | |
2812 | } | |
2813 | ||
2814 | /* Now copy each subexpression, preserving the order of | |
2815 | the subexpressions, but prefixifying each one. | |
2816 | In this loop, inend starts at the beginning of | |
2817 | the expression this level is working on | |
2818 | and marches forward over the arguments. | |
2819 | outbeg does similarly in the output. */ | |
2820 | for (i = 0; i < args; i++) | |
2821 | { | |
2822 | oplen = arglens[i]; | |
2823 | inend += oplen; | |
2824 | prefixify_subexp (inexpr, outexpr, inend, outbeg); | |
2825 | outbeg += oplen; | |
2826 | } | |
2827 | } | |
2828 | \f | |
2829 | /* This page contains the two entry points to this file. */ | |
2830 | ||
2831 | /* Read a C expression from the string *STRINGPTR points to, | |
2832 | parse it, and return a pointer to a struct expression that we malloc. | |
2833 | Use block BLOCK as the lexical context for variable names; | |
2834 | if BLOCK is zero, use the block of the selected stack frame. | |
2835 | Meanwhile, advance *STRINGPTR to point after the expression, | |
2836 | at the first nonwhite character that is not part of the expression | |
2837 | (possibly a null character). | |
2838 | ||
2839 | If COMMA is nonzero, stop if a comma is reached. */ | |
2840 | ||
2841 | struct expression * | |
2842 | parse_c_1 (stringptr, block, comma) | |
2843 | char **stringptr; | |
2844 | struct block *block; | |
2845 | int comma; | |
2846 | { | |
2847 | struct cleanup *old_chain; | |
2848 | ||
2849 | lexptr = *stringptr; | |
2850 | ||
2851 | paren_depth = 0; | |
2852 | type_stack_depth = 0; | |
2853 | ||
2854 | comma_terminates = comma; | |
2855 | ||
2856 | if (lexptr == 0 || *lexptr == 0) | |
2857 | error_no_arg ("expression to compute"); | |
2858 | ||
2859 | old_chain = make_cleanup (free_funcalls, 0); | |
2860 | funcall_chain = 0; | |
2861 | ||
2862 | expression_context_block = block ? block : get_selected_block (); | |
2863 | ||
2864 | namecopy = (char *) alloca (strlen (lexptr) + 1); | |
2865 | expout_size = 10; | |
2866 | expout_ptr = 0; | |
2867 | expout = (struct expression *) | |
2868 | xmalloc (sizeof (struct expression) | |
2869 | + expout_size * sizeof (union exp_element)); | |
2870 | make_cleanup (free_current_contents, &expout); | |
2871 | if (yyparse ()) | |
2872 | yyerror (NULL); | |
2873 | discard_cleanups (old_chain); | |
2874 | expout->nelts = expout_ptr; | |
2875 | expout = (struct expression *) | |
2876 | xrealloc (expout, | |
2877 | sizeof (struct expression) | |
2878 | + expout_ptr * sizeof (union exp_element)); | |
2879 | prefixify_expression (expout); | |
2880 | *stringptr = lexptr; | |
2881 | return expout; | |
2882 | } | |
2883 | ||
2884 | /* Parse STRING as an expression, and complain if this fails | |
2885 | to use up all of the contents of STRING. */ | |
2886 | ||
2887 | struct expression * | |
2888 | parse_c_expression (string) | |
2889 | char *string; | |
2890 | { | |
2891 | register struct expression *exp; | |
2892 | exp = parse_c_1 (&string, 0, 0); | |
2893 | if (*string) | |
2894 | error ("Junk after end of expression."); | |
2895 | return exp; | |
2896 | } | |
2897 | ||
2898 | static void | |
2899 | push_type (tp) | |
2900 | enum type_pieces tp; | |
2901 | { | |
2902 | if (type_stack_depth == type_stack_size) | |
2903 | { | |
2904 | type_stack_size *= 2; | |
65c93482 JK |
2905 | type_stack = (union type_stack_elt *) |
2906 | xrealloc (type_stack, type_stack_size * sizeof (*type_stack)); | |
2907 | } | |
2908 | type_stack[type_stack_depth++].piece = tp; | |
2909 | } | |
2910 | ||
2911 | static void | |
2912 | push_type_int (n) | |
2913 | int n; | |
2914 | { | |
2915 | if (type_stack_depth == type_stack_size) | |
2916 | { | |
2917 | type_stack_size *= 2; | |
2918 | type_stack = (union type_stack_elt *) | |
2919 | xrealloc (type_stack, type_stack_size * sizeof (*type_stack)); | |
dd3b648e | 2920 | } |
65c93482 | 2921 | type_stack[type_stack_depth++].int_val = n; |
dd3b648e RP |
2922 | } |
2923 | ||
2924 | static enum type_pieces | |
2925 | pop_type () | |
2926 | { | |
2927 | if (type_stack_depth) | |
65c93482 | 2928 | return type_stack[--type_stack_depth].piece; |
dd3b648e RP |
2929 | return tp_end; |
2930 | } | |
2931 | ||
65c93482 JK |
2932 | static int |
2933 | pop_type_int () | |
2934 | { | |
2935 | if (type_stack_depth) | |
2936 | return type_stack[--type_stack_depth].int_val; | |
2937 | /* "Can't happen". */ | |
2938 | return 0; | |
2939 | } | |
2940 | ||
dd3b648e RP |
2941 | void |
2942 | _initialize_expread () | |
2943 | { | |
2944 | type_stack_size = 80; | |
2945 | type_stack_depth = 0; | |
65c93482 JK |
2946 | type_stack = (union type_stack_elt *) |
2947 | xmalloc (type_stack_size * sizeof (*type_stack)); | |
dd3b648e | 2948 | } |