Change GDB over to GNU General Public License version 2.
[external/binutils.git] / gdb / expread.tab.c
1
2 /*  A Bison parser, made from ./expread.y  */
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
44 #line 29 "./expread.y"
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};
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;
133 static int type_stack_depth, type_stack_size;
134
135 static void push_type ();
136 static void push_type_int ();
137 static enum type_pieces pop_type ();
138 static int pop_type_int ();
139
140 /* Allow debugging of parsing.  */
141 #define YYDEBUG 1
142
143 #line 132 "./expread.y"
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
187 #define YYFINAL         197
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
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,
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,
291    523,   530,   548,   558,   570,   583,   601,   647,   742,   743,
292    778,   780,   782,   784,   786,   789,   791,   796,   802,   804,
293    808,   810,   814,   818,   819,   821,   823,   826,   833,   835,
294    837,   839,   841,   843,   845,   847,   849,   851,   853,   855,
295    857,   860,   863,   866,   868,   870,   872,   876,   877,   883,
296    889,   898,   903,   910,   911,   912,   913,   914,   917,   918
297 };
298
299 static const char * const yytname[] = {   "$",
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","'.'","'['","'('","'!'","'~'",
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",""
309 };
310 #endif
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,
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,
322     79,    79,    79,    79,    79,    79,    79,    79,    79,    79,
323     79,    79,    79,    79,    79,    79,    79,    80,    80,    80,
324     80,    81,    81,    82,    82,    82,    82,    82,    83,    83
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,
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
340 };
341
342 static const short yydefact[] = {     0,
343     49,    53,    51,    54,    60,   119,   120,    89,    50,    52,
344      0,     0,     0,     0,   105,     0,   107,    91,    92,    90,
345     56,    57,    58,    61,     0,     0,     0,     0,     0,     0,
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,
351      0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
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
363 };
364
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
368 };
369
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
391 };
392
393 static const short yypgoto[] = {-32768,
394      1,   -14,-32768,-32768,-32768,-32768,-32768,    36,-32768,    83,
395     85,   -29,   -28,   200,-32768,    10,-32768
396 };
397
398
399 #define YYLAST          587
400
401
402 static const short yytable[] = {    49,
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,
447     85,    86,    87,    88,    89,    90,    91,    92,    93,    94,
448     95,    96,    97,     0,    98,    99,   100,   101,   102,   103,
449     83,    84,    85,    86,    87,    88,    89,    90,    91,    92,
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
462 };
463
464 static const short yycheck[] = {    14,
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,
471     75,    76,    77,    78,    79,    80,    81,    82,    83,    84,
472     85,    86,    87,    88,    89,    90,    91,    92,    93,    94,
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,
499     38,    39,    40,    41,    42,    43,    44,    45,    46,    47,
500     48,    49,    50,    51,    -1,    53,    54,    55,    56,    57,
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,
504     36,    37,    38,    39,    40,    41,    42,    43,    44,    45,
505     46,    47,    48,    49,    50,    51,    -1,    53,    54,    55,
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,
510     49,    50,    51,    -1,    53,    54,    55,    56,    57,    58,
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
524 };
525 /* -*-C-*-  Note some compilers choke on comments on `#line' lines.  */
526 #line 3 "/usr/unsupported/lib/bison.simple"
527
528 /* Skeleton output parser for bison,
529    Copyright (C) 1984, 1989, 1990 Bob Corbett and Richard Stallman
530
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 2 of the License, or
534 (at your option) any later version.
535
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.
540
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.  */
544
545
546 #ifndef alloca
547 #ifdef __GNUC__
548 #define alloca __builtin_alloca
549 #else /* Not GNU C.  */
550 #if (!defined (__STDC__) && defined (sparc)) || defined (__sparc__)
551 #include <alloca.h>
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.  */
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
573 #define YYACCEPT        return(0)
574 #define YYABORT         return(1)
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)
593
594 #define YYTERROR        1
595 #define YYERRCODE       256
596
597 #ifndef YYPURE
598 #define YYLEX           yylex()
599 #endif
600
601 #ifdef YYPURE
602 #ifdef YYLSP_NEEDED
603 #define YYLEX           yylex(&yylval, &yylloc)
604 #else
605 #define YYLEX           yylex(&yylval)
606 #endif
607 #endif
608
609 /* If nonreentrant, generate the variables here */
610
611 #ifndef YYPURE
612
613 int     yychar;                 /*  the lookahead symbol                */
614 YYSTYPE yylval;                 /*  the semantic value of the           */
615                                 /*  lookahead symbol                    */
616
617 #ifdef YYLSP_NEEDED
618 YYLTYPE yylloc;                 /*  location data for the lookahead     */
619                                 /*  symbol                              */
620 #endif
621
622 int yynerrs;                    /*  number of parse errors so far       */
623 #endif  /* not YYPURE */
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
631 /*  YYINITDEPTH indicates the initial size of the parser's stacks       */
632
633 #ifndef YYINITDEPTH
634 #define YYINITDEPTH 200
635 #endif
636
637 /*  YYMAXDEPTH is the maximum size the stacks can grow to
638     (effective only if the built-in stack extension method is used).  */
639
640 #if YYMAXDEPTH == 0
641 #undef YYMAXDEPTH
642 #endif
643
644 #ifndef YYMAXDEPTH
645 #define YYMAXDEPTH 10000
646 #endif
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 }
665
666 #else /* __cplusplus */
667
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
683 #line 160 "/usr/unsupported/lib/bison.simple"
684 int
685 yyparse()
686 {
687   register int yystate;
688   register int yyn;
689   register short *yyssp;
690   register YYSTYPE *yyvsp;
691   int yyerrstatus;      /*  number of tokens to shift before error messages enabled */
692   int yychar1;          /*  lookahead token as an internal (translated) token number */
693
694   short yyssa[YYINITDEPTH];     /*  the state stack                     */
695   YYSTYPE yyvsa[YYINITDEPTH];   /*  the semantic value stack            */
696
697   short *yyss = yyssa;          /*  refer to the stacks thru separate pointers */
698   YYSTYPE *yyvs = yyvsa;        /*  to allow yyoverflow to reallocate them elsewhere */
699
700 #ifdef YYLSP_NEEDED
701   YYLTYPE *yyls = yylsa;
702   YYLTYPE *yylsp;
703   YYLTYPE yylsa[YYINITDEPTH];   /*  the location stack                  */
704
705 #define YYPOPSTACK   (yyvsp--, yysp--, yylsp--)
706 #else
707 #define YYPOPSTACK   (yyvsp--, yysp--)
708 #endif
709
710   int yystacksize = YYINITDEPTH;
711
712 #ifdef YYPURE
713   int yychar;
714   YYSTYPE yylval;
715   int yynerrs;
716 #ifdef YYLSP_NEEDED
717   YYLTYPE yylloc;
718 #endif
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;
743 #ifdef YYLSP_NEEDED
744   yylsp = yyls;
745 #endif
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
754   if (yyssp >= yyss + yystacksize - 1)
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;
759       short *yyss1 = yyss;
760 #ifdef YYLSP_NEEDED
761       YYLTYPE *yyls1 = yyls;
762 #endif
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),
773 #ifdef YYLSP_NEEDED
774                  &yyls1, size * sizeof (*yylsp),
775 #endif
776                  &yystacksize);
777
778       yyss = yyss1; yyvs = yyvs1;
779 #ifdef YYLSP_NEEDED
780       yyls = yyls1;
781 #endif
782 #else /* no yyoverflow */
783       /* Extend the stack our own way.  */
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));
796 #ifdef YYLSP_NEEDED
797       yyls = (YYLTYPE *) alloca (yystacksize * sizeof (*yylsp));
798       __yy_bcopy ((char *)yyls1, (char *)yyls, size * sizeof (*yylsp));
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)
810         fprintf(stderr, "Stack size increased to %d\n", yystacksize);
811 #endif
812
813       if (yyssp >= yyss + yystacksize - 1)
814         YYABORT;
815     }
816
817 #if YYDEBUG != 0
818   if (yydebug)
819     fprintf(stderr, "Entering state %d\n", yystate);
820 #endif
821
822  yybackup:
823
824 /* Do appropriate processing given the current state.  */
825 /* Read a lookahead token if we need one and don't already have one.  */
826 /* yyresume: */
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     {
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]]);
942     }
943 #endif
944
945
946   switch (yyn) {
947
948 case 3:
949 #line 231 "./expread.y"
950 { write_exp_elt_opcode (BINOP_COMMA); ;
951     break;}
952 case 4:
953 #line 236 "./expread.y"
954 { write_exp_elt_opcode (UNOP_IND); ;
955     break;}
956 case 5:
957 #line 239 "./expread.y"
958 { write_exp_elt_opcode (UNOP_ADDR); ;
959     break;}
960 case 6:
961 #line 242 "./expread.y"
962 { write_exp_elt_opcode (UNOP_NEG); ;
963     break;}
964 case 7:
965 #line 246 "./expread.y"
966 { write_exp_elt_opcode (UNOP_ZEROP); ;
967     break;}
968 case 8:
969 #line 250 "./expread.y"
970 { write_exp_elt_opcode (UNOP_LOGNOT); ;
971     break;}
972 case 9:
973 #line 254 "./expread.y"
974 { write_exp_elt_opcode (UNOP_PREINCREMENT); ;
975     break;}
976 case 10:
977 #line 258 "./expread.y"
978 { write_exp_elt_opcode (UNOP_PREDECREMENT); ;
979     break;}
980 case 11:
981 #line 262 "./expread.y"
982 { write_exp_elt_opcode (UNOP_POSTINCREMENT); ;
983     break;}
984 case 12:
985 #line 266 "./expread.y"
986 { write_exp_elt_opcode (UNOP_POSTDECREMENT); ;
987     break;}
988 case 13:
989 #line 270 "./expread.y"
990 { write_exp_elt_opcode (UNOP_SIZEOF); ;
991     break;}
992 case 14:
993 #line 274 "./expread.y"
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:
999 #line 280 "./expread.y"
1000 { write_exp_elt_opcode (STRUCTOP_MPTR); ;
1001     break;}
1002 case 16:
1003 #line 284 "./expread.y"
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:
1009 #line 290 "./expread.y"
1010 { write_exp_elt_opcode (STRUCTOP_MEMBER); ;
1011     break;}
1012 case 18:
1013 #line 294 "./expread.y"
1014 { write_exp_elt_opcode (BINOP_SUBSCRIPT); ;
1015     break;}
1016 case 19:
1017 #line 300 "./expread.y"
1018 { start_arglist (); ;
1019     break;}
1020 case 20:
1021 #line 302 "./expread.y"
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:
1027 #line 311 "./expread.y"
1028 { arglist_len = 1; ;
1029     break;}
1030 case 23:
1031 #line 315 "./expread.y"
1032 { arglist_len++; ;
1033     break;}
1034 case 24:
1035 #line 319 "./expread.y"
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:
1041 #line 325 "./expread.y"
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:
1047 #line 331 "./expread.y"
1048 { ;
1049     break;}
1050 case 27:
1051 #line 337 "./expread.y"
1052 { write_exp_elt_opcode (BINOP_REPEAT); ;
1053     break;}
1054 case 28:
1055 #line 341 "./expread.y"
1056 { write_exp_elt_opcode (BINOP_MUL); ;
1057     break;}
1058 case 29:
1059 #line 345 "./expread.y"
1060 { write_exp_elt_opcode (BINOP_DIV); ;
1061     break;}
1062 case 30:
1063 #line 349 "./expread.y"
1064 { write_exp_elt_opcode (BINOP_REM); ;
1065     break;}
1066 case 31:
1067 #line 353 "./expread.y"
1068 { write_exp_elt_opcode (BINOP_ADD); ;
1069     break;}
1070 case 32:
1071 #line 357 "./expread.y"
1072 { write_exp_elt_opcode (BINOP_SUB); ;
1073     break;}
1074 case 33:
1075 #line 361 "./expread.y"
1076 { write_exp_elt_opcode (BINOP_LSH); ;
1077     break;}
1078 case 34:
1079 #line 365 "./expread.y"
1080 { write_exp_elt_opcode (BINOP_RSH); ;
1081     break;}
1082 case 35:
1083 #line 369 "./expread.y"
1084 { write_exp_elt_opcode (BINOP_EQUAL); ;
1085     break;}
1086 case 36:
1087 #line 373 "./expread.y"
1088 { write_exp_elt_opcode (BINOP_NOTEQUAL); ;
1089     break;}
1090 case 37:
1091 #line 377 "./expread.y"
1092 { write_exp_elt_opcode (BINOP_LEQ); ;
1093     break;}
1094 case 38:
1095 #line 381 "./expread.y"
1096 { write_exp_elt_opcode (BINOP_GEQ); ;
1097     break;}
1098 case 39:
1099 #line 385 "./expread.y"
1100 { write_exp_elt_opcode (BINOP_LESS); ;
1101     break;}
1102 case 40:
1103 #line 389 "./expread.y"
1104 { write_exp_elt_opcode (BINOP_GTR); ;
1105     break;}
1106 case 41:
1107 #line 393 "./expread.y"
1108 { write_exp_elt_opcode (BINOP_LOGAND); ;
1109     break;}
1110 case 42:
1111 #line 397 "./expread.y"
1112 { write_exp_elt_opcode (BINOP_LOGXOR); ;
1113     break;}
1114 case 43:
1115 #line 401 "./expread.y"
1116 { write_exp_elt_opcode (BINOP_LOGIOR); ;
1117     break;}
1118 case 44:
1119 #line 405 "./expread.y"
1120 { write_exp_elt_opcode (BINOP_AND); ;
1121     break;}
1122 case 45:
1123 #line 409 "./expread.y"
1124 { write_exp_elt_opcode (BINOP_OR); ;
1125     break;}
1126 case 46:
1127 #line 413 "./expread.y"
1128 { write_exp_elt_opcode (TERNOP_COND); ;
1129     break;}
1130 case 47:
1131 #line 417 "./expread.y"
1132 { write_exp_elt_opcode (BINOP_ASSIGN); ;
1133     break;}
1134 case 48:
1135 #line 421 "./expread.y"
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:
1141 #line 427 "./expread.y"
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:
1151 #line 437 "./expread.y"
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:
1164 #line 450 "./expread.y"
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:
1176 #line 462 "./expread.y"
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:
1189 #line 475 "./expread.y"
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:
1196 #line 482 "./expread.y"
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:
1203 #line 492 "./expread.y"
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:
1209 #line 498 "./expread.y"
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:
1215 #line 504 "./expread.y"
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:
1221 #line 510 "./expread.y"
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:
1228 #line 517 "./expread.y"
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:
1234 #line 524 "./expread.y"
1235 { write_exp_elt_opcode (OP_THIS);
1236                           write_exp_elt_opcode (OP_THIS); ;
1237     break;}
1238 case 62:
1239 #line 531 "./expread.y"
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)
1248                                 yyval.bval = BLOCKVECTOR_BLOCK
1249                                          (BLOCKVECTOR (tem), STATIC_BLOCK);
1250                               else
1251                                 error ("No file or function \"%s\".",
1252                                        copy_name (yyvsp[0].ssym.stoken));
1253                             }
1254                         ;
1255     break;}
1256 case 63:
1257 #line 549 "./expread.y"
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:
1267 #line 559 "./expread.y"
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:
1279 #line 571 "./expread.y"
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:
1294 #line 584 "./expread.y"
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:
1314 #line 602 "./expread.y"
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;}
1359 case 68:
1360 #line 648 "./expread.y"
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:
1369                                 case LOC_REF_ARG:
1370                                 case LOC_REGPARM:
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;
1377                                 case LOC_UNDEF:
1378                                 case LOC_CONST:
1379                                 case LOC_STATIC:
1380                                 case LOC_TYPEDEF:
1381                                 case LOC_LABEL:
1382                                 case LOC_BLOCK:
1383                                 case LOC_EXTERNAL:
1384                                 case LOC_CONST_BYTES:
1385
1386                                   /* In this case the expression can
1387                                      be evaluated regardless of what
1388                                      frame we are in, so there is no
1389                                      need to check for the
1390                                      innermost_block.  These cases are
1391                                      listed so that gcc -Wall will
1392                                      report types that may not have
1393                                      been considered.  */
1394
1395                                   break;
1396                                 }
1397                               write_exp_elt_opcode (OP_VAR_VALUE);
1398                               write_exp_elt_sym (sym);
1399                               write_exp_elt_opcode (OP_VAR_VALUE);
1400                             }
1401                           else if (yyvsp[0].ssym.is_a_field_of_this)
1402                             {
1403                               /* C++: it hangs off of `this'.  Must
1404                                  not inadvertently convert from a method call
1405                                  to data ref.  */
1406                               if (innermost_block == 0 || 
1407                                   contained_in (block_found, innermost_block))
1408                                 innermost_block = block_found;
1409                               write_exp_elt_opcode (OP_THIS);
1410                               write_exp_elt_opcode (OP_THIS);
1411                               write_exp_elt_opcode (STRUCTOP_PTR);
1412                               write_exp_string (yyvsp[0].ssym.stoken);
1413                               write_exp_elt_opcode (STRUCTOP_PTR);
1414                             }
1415                           else
1416                             {
1417                               register int i;
1418                               register char *arg = copy_name (yyvsp[0].ssym.stoken);
1419
1420                                 /* FIXME, this search is linear!  At least
1421                                    optimize the strcmp with a 1-char cmp... */
1422                               for (i = 0; i < misc_function_count; i++)
1423                                 if (!strcmp (misc_function_vector[i].name, arg))
1424                                   break;
1425
1426                               if (i < misc_function_count)
1427                                 {
1428                                   enum misc_function_type mft =
1429                                       misc_function_vector[i].type;
1430                                   
1431                                   write_exp_elt_opcode (OP_LONG);
1432                                   write_exp_elt_type (builtin_type_int);
1433                                   write_exp_elt_longcst ((LONGEST) misc_function_vector[i].address);
1434                                   write_exp_elt_opcode (OP_LONG);
1435                                   write_exp_elt_opcode (UNOP_MEMVAL);
1436                                   if (mft == mf_data || mft == mf_bss)
1437                                     write_exp_elt_type (builtin_type_int);
1438                                   else if (mft == mf_text)
1439                                     write_exp_elt_type (lookup_function_type (builtin_type_int));
1440                                   else
1441                                     write_exp_elt_type (builtin_type_char);
1442                                   write_exp_elt_opcode (UNOP_MEMVAL);
1443                                 }
1444                               else if (symtab_list == 0
1445                                        && partial_symtab_list == 0)
1446                                 error ("No symbol table is loaded.  Use the \"file\" command.");
1447                               else
1448                                 error ("No symbol \"%s\" in current context.",
1449                                        copy_name (yyvsp[0].ssym.stoken));
1450                             }
1451                         ;
1452     break;}
1453 case 70:
1454 #line 744 "./expread.y"
1455 {
1456                   /* This is where the interesting stuff happens.  */
1457                   int done = 0;
1458                   int array_size;
1459                   struct type *follow_type = yyvsp[-1].tval;
1460                   
1461                   while (!done)
1462                     switch (pop_type ())
1463                       {
1464                       case tp_end:
1465                         done = 1;
1466                         break;
1467                       case tp_pointer:
1468                         follow_type = lookup_pointer_type (follow_type);
1469                         break;
1470                       case tp_reference:
1471                         follow_type = lookup_reference_type (follow_type);
1472                         break;
1473                       case tp_array:
1474                         array_size = pop_type_int ();
1475                         if (array_size != -1)
1476                           follow_type = create_array_type (follow_type,
1477                                                            array_size);
1478                         else
1479                           follow_type = lookup_pointer_type (follow_type);
1480                         break;
1481                       case tp_function:
1482                         follow_type = lookup_function_type (follow_type);
1483                         break;
1484                       }
1485                   yyval.tval = follow_type;
1486                 ;
1487     break;}
1488 case 71:
1489 #line 779 "./expread.y"
1490 { push_type (tp_pointer); yyval.voidval = 0; ;
1491     break;}
1492 case 72:
1493 #line 781 "./expread.y"
1494 { push_type (tp_pointer); yyval.voidval = yyvsp[0].voidval; ;
1495     break;}
1496 case 73:
1497 #line 783 "./expread.y"
1498 { push_type (tp_reference); yyval.voidval = 0; ;
1499     break;}
1500 case 74:
1501 #line 785 "./expread.y"
1502 { push_type (tp_reference); yyval.voidval = yyvsp[0].voidval; ;
1503     break;}
1504 case 76:
1505 #line 790 "./expread.y"
1506 { yyval.voidval = yyvsp[-1].voidval; ;
1507     break;}
1508 case 77:
1509 #line 792 "./expread.y"
1510 {
1511                           push_type_int (yyvsp[0].lval);
1512                           push_type (tp_array);
1513                         ;
1514     break;}
1515 case 78:
1516 #line 797 "./expread.y"
1517 {
1518                           push_type_int (yyvsp[0].lval);
1519                           push_type (tp_array);
1520                           yyval.voidval = 0;
1521                         ;
1522     break;}
1523 case 79:
1524 #line 803 "./expread.y"
1525 { push_type (tp_function); ;
1526     break;}
1527 case 80:
1528 #line 805 "./expread.y"
1529 { push_type (tp_function); ;
1530     break;}
1531 case 81:
1532 #line 809 "./expread.y"
1533 { yyval.lval = -1; ;
1534     break;}
1535 case 82:
1536 #line 811 "./expread.y"
1537 { yyval.lval = yyvsp[-1].lval; ;
1538     break;}
1539 case 83:
1540 #line 815 "./expread.y"
1541 { yyval.voidval = 0; ;
1542     break;}
1543 case 85:
1544 #line 820 "./expread.y"
1545 { yyval.tval = lookup_member_type (builtin_type_int, yyvsp[-2].tval); ;
1546     break;}
1547 case 86:
1548 #line 822 "./expread.y"
1549 { yyval.tval = lookup_member_type (yyvsp[-5].tval, yyvsp[-3].tval); ;
1550     break;}
1551 case 87:
1552 #line 824 "./expread.y"
1553 { yyval.tval = lookup_member_type
1554                             (lookup_function_type (yyvsp[-7].tval), yyvsp[-5].tval); ;
1555     break;}
1556 case 88:
1557 #line 827 "./expread.y"
1558 { yyval.tval = lookup_member_type
1559                             (lookup_function_type (yyvsp[-8].tval), yyvsp[-6].tval);
1560                           free (yyvsp[-1].tvec); ;
1561     break;}
1562 case 89:
1563 #line 834 "./expread.y"
1564 { yyval.tval = yyvsp[0].tsym.type; ;
1565     break;}
1566 case 90:
1567 #line 836 "./expread.y"
1568 { yyval.tval = builtin_type_int; ;
1569     break;}
1570 case 91:
1571 #line 838 "./expread.y"
1572 { yyval.tval = builtin_type_long; ;
1573     break;}
1574 case 92:
1575 #line 840 "./expread.y"
1576 { yyval.tval = builtin_type_short; ;
1577     break;}
1578 case 93:
1579 #line 842 "./expread.y"
1580 { yyval.tval = builtin_type_long; ;
1581     break;}
1582 case 94:
1583 #line 844 "./expread.y"
1584 { yyval.tval = builtin_type_unsigned_long; ;
1585     break;}
1586 case 95:
1587 #line 846 "./expread.y"
1588 { yyval.tval = builtin_type_long_long; ;
1589     break;}
1590 case 96:
1591 #line 848 "./expread.y"
1592 { yyval.tval = builtin_type_long_long; ;
1593     break;}
1594 case 97:
1595 #line 850 "./expread.y"
1596 { yyval.tval = builtin_type_unsigned_long_long; ;
1597     break;}
1598 case 98:
1599 #line 852 "./expread.y"
1600 { yyval.tval = builtin_type_unsigned_long_long; ;
1601     break;}
1602 case 99:
1603 #line 854 "./expread.y"
1604 { yyval.tval = builtin_type_short; ;
1605     break;}
1606 case 100:
1607 #line 856 "./expread.y"
1608 { yyval.tval = builtin_type_unsigned_short; ;
1609     break;}
1610 case 101:
1611 #line 858 "./expread.y"
1612 { yyval.tval = lookup_struct (copy_name (yyvsp[0].sval),
1613                                               expression_context_block); ;
1614     break;}
1615 case 102:
1616 #line 861 "./expread.y"
1617 { yyval.tval = lookup_union (copy_name (yyvsp[0].sval),
1618                                              expression_context_block); ;
1619     break;}
1620 case 103:
1621 #line 864 "./expread.y"
1622 { yyval.tval = lookup_enum (copy_name (yyvsp[0].sval),
1623                                             expression_context_block); ;
1624     break;}
1625 case 104:
1626 #line 867 "./expread.y"
1627 { yyval.tval = lookup_unsigned_typename (TYPE_NAME(yyvsp[0].tsym.type)); ;
1628     break;}
1629 case 105:
1630 #line 869 "./expread.y"
1631 { yyval.tval = builtin_type_unsigned_int; ;
1632     break;}
1633 case 106:
1634 #line 871 "./expread.y"
1635 { yyval.tval = yyvsp[0].tsym.type; ;
1636     break;}
1637 case 107:
1638 #line 873 "./expread.y"
1639 { yyval.tval = builtin_type_int; ;
1640     break;}
1641 case 109:
1642 #line 878 "./expread.y"
1643 {
1644                   yyval.tsym.stoken.ptr = "int";
1645                   yyval.tsym.stoken.length = 3;
1646                   yyval.tsym.type = builtin_type_int;
1647                 ;
1648     break;}
1649 case 110:
1650 #line 884 "./expread.y"
1651 {
1652                   yyval.tsym.stoken.ptr = "long";
1653                   yyval.tsym.stoken.length = 4;
1654                   yyval.tsym.type = builtin_type_long;
1655                 ;
1656     break;}
1657 case 111:
1658 #line 890 "./expread.y"
1659 {
1660                   yyval.tsym.stoken.ptr = "short";
1661                   yyval.tsym.stoken.length = 5;
1662                   yyval.tsym.type = builtin_type_short;
1663                 ;
1664     break;}
1665 case 112:
1666 #line 899 "./expread.y"
1667 { yyval.tvec = (struct type **)xmalloc (sizeof (struct type *) * 2);
1668                   yyval.tvec[0] = (struct type *)0;
1669                   yyval.tvec[1] = yyvsp[0].tval;
1670                 ;
1671     break;}
1672 case 113:
1673 #line 904 "./expread.y"
1674 { int len = sizeof (struct type *) * ++(yyvsp[-2].ivec[0]);
1675                   yyval.tvec = (struct type **)xrealloc (yyvsp[-2].tvec, len);
1676                   yyval.tvec[yyval.ivec[0]] = yyvsp[0].tval;
1677                 ;
1678     break;}
1679 case 114:
1680 #line 910 "./expread.y"
1681 { yyval.sval = yyvsp[0].ssym.stoken; ;
1682     break;}
1683 case 115:
1684 #line 911 "./expread.y"
1685 { yyval.sval = yyvsp[0].ssym.stoken; ;
1686     break;}
1687 case 116:
1688 #line 912 "./expread.y"
1689 { yyval.sval = yyvsp[0].tsym.stoken; ;
1690     break;}
1691 case 117:
1692 #line 913 "./expread.y"
1693 { yyval.sval = yyvsp[0].ssym.stoken; ;
1694     break;}
1695 case 118:
1696 #line 914 "./expread.y"
1697 { yyval.sval = yyvsp[0].ssym.stoken; ;
1698     break;}
1699 }
1700    /* the action file gets copied in in place of this dollarsign */
1701 #line 423 "/usr/unsupported/lib/bison.simple"
1702 \f
1703   yyvsp -= yylen;
1704   yyssp -= yylen;
1705 #ifdef YYLSP_NEEDED
1706   yylsp -= yylen;
1707 #endif
1708
1709 #if YYDEBUG != 0
1710   if (yydebug)
1711     {
1712       short *ssp1 = yyss - 1;
1713       fprintf (stderr, "state stack now");
1714       while (ssp1 != yyssp)
1715         fprintf (stderr, " %d", *++ssp1);
1716       fprintf (stderr, "\n");
1717     }
1718 #endif
1719
1720   *++yyvsp = yyval;
1721
1722 #ifdef YYLSP_NEEDED
1723   yylsp++;
1724   if (yylen == 0)
1725     {
1726       yylsp->first_line = yylloc.first_line;
1727       yylsp->first_column = yylloc.first_column;
1728       yylsp->last_line = (yylsp-1)->last_line;
1729       yylsp->last_column = (yylsp-1)->last_column;
1730       yylsp->text = 0;
1731     }
1732   else
1733     {
1734       yylsp->last_line = (yylsp+yylen-1)->last_line;
1735       yylsp->last_column = (yylsp+yylen-1)->last_column;
1736     }
1737 #endif
1738
1739   /* Now "shift" the result of the reduction.
1740      Determine what state that goes to,
1741      based on the state we popped back to
1742      and the rule number reduced by.  */
1743
1744   yyn = yyr1[yyn];
1745
1746   yystate = yypgoto[yyn - YYNTBASE] + *yyssp;
1747   if (yystate >= 0 && yystate <= YYLAST && yycheck[yystate] == *yyssp)
1748     yystate = yytable[yystate];
1749   else
1750     yystate = yydefgoto[yyn - YYNTBASE];
1751
1752   goto yynewstate;
1753
1754 yyerrlab:   /* here on detecting error */
1755
1756   if (! yyerrstatus)
1757     /* If not already recovering from an error, report this error.  */
1758     {
1759       ++yynerrs;
1760
1761 #ifdef YYERROR_VERBOSE
1762       yyn = yypact[yystate];
1763
1764       if (yyn > YYFLAG && yyn < YYLAST)
1765         {
1766           int size = 0;
1767           char *msg;
1768           int x, count;
1769
1770           count = 0;
1771           for (x = 0; x < (sizeof(yytname) / sizeof(char *)); x++)
1772             if (yycheck[x + yyn] == x)
1773               size += strlen(yytname[x]) + 15, count++;
1774           msg = (char *) xmalloc(size + 15);
1775           strcpy(msg, "parse error");
1776
1777           if (count < 5)
1778             {
1779               count = 0;
1780               for (x = 0; x < (sizeof(yytname) / sizeof(char *)); x++)
1781                 if (yycheck[x + yyn] == x)
1782                   {
1783                     strcat(msg, count == 0 ? ", expecting `" : " or `");
1784                     strcat(msg, yytname[x]);
1785                     strcat(msg, "'");
1786                     count++;
1787                   }
1788             }
1789           yyerror(msg);
1790           free(msg);
1791         }
1792       else
1793 #endif /* YYERROR_VERBOSE */
1794         yyerror("parse error");
1795     }
1796
1797 yyerrlab1:   /* here on error raised explicitly by an action */
1798
1799   if (yyerrstatus == 3)
1800     {
1801       /* if just tried and failed to reuse lookahead token after an error, discard it.  */
1802
1803       /* return failure if at end of input */
1804       if (yychar == YYEOF)
1805         YYABORT;
1806
1807 #if YYDEBUG != 0
1808       if (yydebug)
1809         fprintf(stderr, "Discarding token %d (%s).\n", yychar, yytname[yychar1]);
1810 #endif
1811
1812       yychar = YYEMPTY;
1813     }
1814
1815   /* Else will try to reuse lookahead token
1816      after shifting the error token.  */
1817
1818   yyerrstatus = 3;              /* Each real token shifted decrements this */
1819
1820   goto yyerrhandle;
1821
1822 yyerrdefault:  /* current state does not do anything special for the error token. */
1823
1824 #if 0
1825   /* This is wrong; only states that explicitly want error tokens
1826      should shift them.  */
1827   yyn = yydefact[yystate];  /* If its default is to accept any token, ok.  Otherwise pop it.*/
1828   if (yyn) goto yydefault;
1829 #endif
1830
1831 yyerrpop:   /* pop the current state because it cannot handle the error token */
1832
1833   if (yyssp == yyss) YYABORT;
1834   yyvsp--;
1835   yystate = *--yyssp;
1836 #ifdef YYLSP_NEEDED
1837   yylsp--;
1838 #endif
1839
1840 #if YYDEBUG != 0
1841   if (yydebug)
1842     {
1843       short *ssp1 = yyss - 1;
1844       fprintf (stderr, "Error: state stack now");
1845       while (ssp1 != yyssp)
1846         fprintf (stderr, " %d", *++ssp1);
1847       fprintf (stderr, "\n");
1848     }
1849 #endif
1850
1851 yyerrhandle:
1852
1853   yyn = yypact[yystate];
1854   if (yyn == YYFLAG)
1855     goto yyerrdefault;
1856
1857   yyn += YYTERROR;
1858   if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != YYTERROR)
1859     goto yyerrdefault;
1860
1861   yyn = yytable[yyn];
1862   if (yyn < 0)
1863     {
1864       if (yyn == YYFLAG)
1865         goto yyerrpop;
1866       yyn = -yyn;
1867       goto yyreduce;
1868     }
1869   else if (yyn == 0)
1870     goto yyerrpop;
1871
1872   if (yyn == YYFINAL)
1873     YYACCEPT;
1874
1875 #if YYDEBUG != 0
1876   if (yydebug)
1877     fprintf(stderr, "Shifting error token, ");
1878 #endif
1879
1880   *++yyvsp = yylval;
1881 #ifdef YYLSP_NEEDED
1882   *++yylsp = yylloc;
1883 #endif
1884
1885   yystate = yyn;
1886   goto yynewstate;
1887 }
1888 #line 929 "./expread.y"
1889
1890 \f
1891 /* Begin counting arguments for a function call,
1892    saving the data about any containing call.  */
1893
1894 static void
1895 start_arglist ()
1896 {
1897   register struct funcall *new = (struct funcall *) xmalloc (sizeof (struct funcall));
1898
1899   new->next = funcall_chain;
1900   new->arglist_len = arglist_len;
1901   arglist_len = 0;
1902   funcall_chain = new;
1903 }
1904
1905 /* Return the number of arguments in a function call just terminated,
1906    and restore the data for the containing function call.  */
1907
1908 static int
1909 end_arglist ()
1910 {
1911   register int val = arglist_len;
1912   register struct funcall *call = funcall_chain;
1913   funcall_chain = call->next;
1914   arglist_len = call->arglist_len;
1915   free (call);
1916   return val;
1917 }
1918
1919 /* Free everything in the funcall chain.
1920    Used when there is an error inside parsing.  */
1921
1922 static void
1923 free_funcalls ()
1924 {
1925   register struct funcall *call, *next;
1926
1927   for (call = funcall_chain; call; call = next)
1928     {
1929       next = call->next;
1930       free (call);
1931     }
1932 }
1933 \f
1934 /* This page contains the functions for adding data to the  struct expression
1935    being constructed.  */
1936
1937 /* Add one element to the end of the expression.  */
1938
1939 /* To avoid a bug in the Sun 4 compiler, we pass things that can fit into
1940    a register through here */
1941
1942 static void
1943 write_exp_elt (expelt)
1944      union exp_element expelt;
1945 {
1946   if (expout_ptr >= expout_size)
1947     {
1948       expout_size *= 2;
1949       expout = (struct expression *) xrealloc (expout,
1950                                                sizeof (struct expression)
1951                                                + expout_size * sizeof (union exp_element));
1952     }
1953   expout->elts[expout_ptr++] = expelt;
1954 }
1955
1956 static void
1957 write_exp_elt_opcode (expelt)
1958      enum exp_opcode expelt;
1959 {
1960   union exp_element tmp;
1961
1962   tmp.opcode = expelt;
1963
1964   write_exp_elt (tmp);
1965 }
1966
1967 static void
1968 write_exp_elt_sym (expelt)
1969      struct symbol *expelt;
1970 {
1971   union exp_element tmp;
1972
1973   tmp.symbol = expelt;
1974
1975   write_exp_elt (tmp);
1976 }
1977
1978 static void
1979 write_exp_elt_longcst (expelt)
1980      LONGEST expelt;
1981 {
1982   union exp_element tmp;
1983
1984   tmp.longconst = expelt;
1985
1986   write_exp_elt (tmp);
1987 }
1988
1989 static void
1990 write_exp_elt_dblcst (expelt)
1991      double expelt;
1992 {
1993   union exp_element tmp;
1994
1995   tmp.doubleconst = expelt;
1996
1997   write_exp_elt (tmp);
1998 }
1999
2000 static void
2001 write_exp_elt_type (expelt)
2002      struct type *expelt;
2003 {
2004   union exp_element tmp;
2005
2006   tmp.type = expelt;
2007
2008   write_exp_elt (tmp);
2009 }
2010
2011 static void
2012 write_exp_elt_intern (expelt)
2013      struct internalvar *expelt;
2014 {
2015   union exp_element tmp;
2016
2017   tmp.internalvar = expelt;
2018
2019   write_exp_elt (tmp);
2020 }
2021
2022 /* Add a string constant to the end of the expression.
2023    Follow it by its length in bytes, as a separate exp_element.  */
2024
2025 static void
2026 write_exp_string (str)
2027      struct stoken str;
2028 {
2029   register int len = str.length;
2030   register int lenelt
2031     = (len + sizeof (union exp_element)) / sizeof (union exp_element);
2032
2033   expout_ptr += lenelt;
2034
2035   if (expout_ptr >= expout_size)
2036     {
2037       expout_size = max (expout_size * 2, expout_ptr + 10);
2038       expout = (struct expression *)
2039         xrealloc (expout, (sizeof (struct expression)
2040                            + (expout_size * sizeof (union exp_element))));
2041     }
2042   bcopy (str.ptr, (char *) &expout->elts[expout_ptr - lenelt], len);
2043   ((char *) &expout->elts[expout_ptr - lenelt])[len] = 0;
2044   write_exp_elt_longcst ((LONGEST) len);
2045 }
2046 \f
2047 /* During parsing of a C expression, the pointer to the next character
2048    is in this variable.  */
2049
2050 static char *lexptr;
2051
2052 /* Tokens that refer to names do so with explicit pointer and length,
2053    so they can share the storage that lexptr is parsing.
2054
2055    When it is necessary to pass a name to a function that expects
2056    a null-terminated string, the substring is copied out
2057    into a block of storage that namecopy points to.
2058
2059    namecopy is allocated once, guaranteed big enough, for each parsing.  */
2060
2061 static char *namecopy;
2062
2063 /* Current depth in parentheses within the expression.  */
2064
2065 static int paren_depth;
2066
2067 /* Nonzero means stop parsing on first comma (if not within parentheses).  */
2068
2069 static int comma_terminates;
2070
2071 /* Take care of parsing a number (anything that starts with a digit).
2072    Set yylval and return the token type; update lexptr.
2073    LEN is the number of characters in it.  */
2074
2075 /*** Needs some error checking for the float case ***/
2076
2077 static int
2078 parse_number (p, len, parsed_float, putithere)
2079      register char *p;
2080      register int len;
2081      int parsed_float;
2082      YYSTYPE *putithere;
2083 {
2084   register LONGEST n = 0;
2085   register int i;
2086   register int c;
2087   register int base = input_radix;
2088   int unsigned_p = 0;
2089
2090   extern double atof ();
2091
2092   if (parsed_float)
2093     {
2094       /* It's a float since it contains a point or an exponent.  */
2095       putithere->dval = atof (p);
2096       return FLOAT;
2097     }
2098
2099   /* Handle base-switching prefixes 0x, 0t, 0d, 0 */
2100   if (p[0] == '0')
2101     switch (p[1])
2102       {
2103       case 'x':
2104       case 'X':
2105         if (len >= 3)
2106           {
2107             p += 2;
2108             base = 16;
2109             len -= 2;
2110           }
2111         break;
2112
2113       case 't':
2114       case 'T':
2115       case 'd':
2116       case 'D':
2117         if (len >= 3)
2118           {
2119             p += 2;
2120             base = 10;
2121             len -= 2;
2122           }
2123         break;
2124
2125       default:
2126         base = 8;
2127         break;
2128       }
2129
2130   while (len-- > 0)
2131     {
2132       c = *p++;
2133       if (c >= 'A' && c <= 'Z')
2134         c += 'a' - 'A';
2135       if (c != 'l' && c != 'u')
2136         n *= base;
2137       if (c >= '0' && c <= '9')
2138         n += i = c - '0';
2139       else
2140         {
2141           if (base > 10 && c >= 'a' && c <= 'f')
2142             n += i = c - 'a' + 10;
2143           else if (len == 0 && c == 'l')
2144             ;
2145           else if (len == 0 && c == 'u')
2146             unsigned_p = 1;
2147           else
2148             return ERROR;       /* Char not a digit */
2149         }
2150       if (i >= base)
2151         return ERROR;           /* Invalid digit in this base */
2152     }
2153
2154   if (unsigned_p)
2155     {
2156       putithere->ulval = n;
2157       return UINT;
2158     }
2159   else
2160     {
2161       putithere->lval = n;
2162       return INT;
2163     }
2164 }
2165
2166 struct token
2167 {
2168   char *operator;
2169   int token;
2170   enum exp_opcode opcode;
2171 };
2172
2173 const static struct token tokentab3[] =
2174   {
2175     {">>=", ASSIGN_MODIFY, BINOP_RSH},
2176     {"<<=", ASSIGN_MODIFY, BINOP_LSH}
2177   };
2178
2179 const static struct token tokentab2[] =
2180   {
2181     {"+=", ASSIGN_MODIFY, BINOP_ADD},
2182     {"-=", ASSIGN_MODIFY, BINOP_SUB},
2183     {"*=", ASSIGN_MODIFY, BINOP_MUL},
2184     {"/=", ASSIGN_MODIFY, BINOP_DIV},
2185     {"%=", ASSIGN_MODIFY, BINOP_REM},
2186     {"|=", ASSIGN_MODIFY, BINOP_LOGIOR},
2187     {"&=", ASSIGN_MODIFY, BINOP_LOGAND},
2188     {"^=", ASSIGN_MODIFY, BINOP_LOGXOR},
2189     {"++", INCREMENT, BINOP_END},
2190     {"--", DECREMENT, BINOP_END},
2191     {"->", ARROW, BINOP_END},
2192     {"&&", AND, BINOP_END},
2193     {"||", OR, BINOP_END},
2194     {"::", COLONCOLON, BINOP_END},
2195     {"<<", LSH, BINOP_END},
2196     {">>", RSH, BINOP_END},
2197     {"==", EQUAL, BINOP_END},
2198     {"!=", NOTEQUAL, BINOP_END},
2199     {"<=", LEQ, BINOP_END},
2200     {">=", GEQ, BINOP_END}
2201   };
2202
2203 /* assign machine-independent names to certain registers 
2204  * (unless overridden by the REGISTER_NAMES table)
2205  */
2206 struct std_regs {
2207         char *name;
2208         int regnum;
2209 } std_regs[] = {
2210 #ifdef PC_REGNUM
2211         { "pc", PC_REGNUM },
2212 #endif
2213 #ifdef FP_REGNUM
2214         { "fp", FP_REGNUM },
2215 #endif
2216 #ifdef SP_REGNUM
2217         { "sp", SP_REGNUM },
2218 #endif
2219 #ifdef PS_REGNUM
2220         { "ps", PS_REGNUM },
2221 #endif
2222 };
2223
2224 #define NUM_STD_REGS (sizeof std_regs / sizeof std_regs[0])
2225
2226 /* Read one token, getting characters through lexptr.  */
2227
2228 static int
2229 yylex ()
2230 {
2231   register int c;
2232   register int namelen;
2233   register unsigned i;
2234   register char *tokstart;
2235
2236  retry:
2237
2238   tokstart = lexptr;
2239   /* See if it is a special token of length 3.  */
2240   for (i = 0; i < sizeof tokentab3 / sizeof tokentab3[0]; i++)
2241     if (!strncmp (tokstart, tokentab3[i].operator, 3))
2242       {
2243         lexptr += 3;
2244         yylval.opcode = tokentab3[i].opcode;
2245         return tokentab3[i].token;
2246       }
2247
2248   /* See if it is a special token of length 2.  */
2249   for (i = 0; i < sizeof tokentab2 / sizeof tokentab2[0]; i++)
2250     if (!strncmp (tokstart, tokentab2[i].operator, 2))
2251       {
2252         lexptr += 2;
2253         yylval.opcode = tokentab2[i].opcode;
2254         return tokentab2[i].token;
2255       }
2256
2257   switch (c = *tokstart)
2258     {
2259     case 0:
2260       return 0;
2261
2262     case ' ':
2263     case '\t':
2264     case '\n':
2265       lexptr++;
2266       goto retry;
2267
2268     case '\'':
2269       lexptr++;
2270       c = *lexptr++;
2271       if (c == '\\')
2272         c = parse_escape (&lexptr);
2273       yylval.lval = c;
2274       c = *lexptr++;
2275       if (c != '\'')
2276         error ("Invalid character constant.");
2277       return CHAR;
2278
2279     case '(':
2280       paren_depth++;
2281       lexptr++;
2282       return c;
2283
2284     case ')':
2285       if (paren_depth == 0)
2286         return 0;
2287       paren_depth--;
2288       lexptr++;
2289       return c;
2290
2291     case ',':
2292       if (comma_terminates && paren_depth == 0)
2293         return 0;
2294       lexptr++;
2295       return c;
2296
2297     case '.':
2298       /* Might be a floating point number.  */
2299       if (lexptr[1] < '0' || lexptr[1] > '9')
2300         goto symbol;            /* Nope, must be a symbol. */
2301       /* FALL THRU into number case.  */
2302
2303     case '0':
2304     case '1':
2305     case '2':
2306     case '3':
2307     case '4':
2308     case '5':
2309     case '6':
2310     case '7':
2311     case '8':
2312     case '9':
2313       {
2314         /* It's a number.  */
2315         int got_dot = 0, got_e = 0, toktype;
2316         register char *p = tokstart;
2317         int hex = input_radix > 10;
2318
2319         if (c == '0' && (p[1] == 'x' || p[1] == 'X'))
2320           {
2321             p += 2;
2322             hex = 1;
2323           }
2324         else if (c == '0' && (p[1]=='t' || p[1]=='T' || p[1]=='d' || p[1]=='D'))
2325           {
2326             p += 2;
2327             hex = 0;
2328           }
2329
2330         for (;; ++p)
2331           {
2332             if (!hex && !got_e && (*p == 'e' || *p == 'E'))
2333               got_dot = got_e = 1;
2334             else if (!hex && !got_dot && *p == '.')
2335               got_dot = 1;
2336             else if (got_e && (p[-1] == 'e' || p[-1] == 'E')
2337                      && (*p == '-' || *p == '+'))
2338               /* This is the sign of the exponent, not the end of the
2339                  number.  */
2340               continue;
2341             /* We will take any letters or digits.  parse_number will
2342                complain if past the radix, or if L or U are not final.  */
2343             else if ((*p < '0' || *p > '9')
2344                      && ((*p < 'a' || *p > 'z')
2345                                   && (*p < 'A' || *p > 'Z')))
2346               break;
2347           }
2348         toktype = parse_number (tokstart, p - tokstart, got_dot|got_e, &yylval);
2349         if (toktype == ERROR)
2350           {
2351             char *err_copy = (char *) alloca (p - tokstart + 1);
2352
2353             bcopy (tokstart, err_copy, p - tokstart);
2354             err_copy[p - tokstart] = 0;
2355             error ("Invalid number \"%s\".", err_copy);
2356           }
2357         lexptr = p;
2358         return toktype;
2359       }
2360
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     case '}':
2381     symbol:
2382       lexptr++;
2383       return c;
2384
2385     case '"':
2386       for (namelen = 1; (c = tokstart[namelen]) != '"'; namelen++)
2387         if (c == '\\')
2388           {
2389             c = tokstart[++namelen];
2390             if (c >= '0' && c <= '9')
2391               {
2392                 c = tokstart[++namelen];
2393                 if (c >= '0' && c <= '9')
2394                   c = tokstart[++namelen];
2395               }
2396           }
2397       yylval.sval.ptr = tokstart + 1;
2398       yylval.sval.length = namelen - 1;
2399       lexptr += namelen + 1;
2400       return STRING;
2401     }
2402
2403   if (!(c == '_' || c == '$'
2404         || (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')))
2405     /* We must have come across a bad character (e.g. ';').  */
2406     error ("Invalid character '%c' in expression.", c);
2407
2408   /* It's a name.  See how long it is.  */
2409   namelen = 0;
2410   for (c = tokstart[namelen];
2411        (c == '_' || c == '$' || (c >= '0' && c <= '9')
2412         || (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z'));
2413        c = tokstart[++namelen])
2414     ;
2415
2416   /* The token "if" terminates the expression and is NOT 
2417      removed from the input stream.  */
2418   if (namelen == 2 && tokstart[0] == 'i' && tokstart[1] == 'f')
2419     {
2420       return 0;
2421     }
2422
2423   lexptr += namelen;
2424
2425   /* Handle the tokens $digits; also $ (short for $0) and $$ (short for $$1)
2426      and $$digits (equivalent to $<-digits> if you could type that).
2427      Make token type LAST, and put the number (the digits) in yylval.  */
2428
2429   if (*tokstart == '$')
2430     {
2431       register int negate = 0;
2432       c = 1;
2433       /* Double dollar means negate the number and add -1 as well.
2434          Thus $$ alone means -1.  */
2435       if (namelen >= 2 && tokstart[1] == '$')
2436         {
2437           negate = 1;
2438           c = 2;
2439         }
2440       if (c == namelen)
2441         {
2442           /* Just dollars (one or two) */
2443           yylval.lval = - negate;
2444           return LAST;
2445         }
2446       /* Is the rest of the token digits?  */
2447       for (; c < namelen; c++)
2448         if (!(tokstart[c] >= '0' && tokstart[c] <= '9'))
2449           break;
2450       if (c == namelen)
2451         {
2452           yylval.lval = atoi (tokstart + 1 + negate);
2453           if (negate)
2454             yylval.lval = - yylval.lval;
2455           return LAST;
2456         }
2457     }
2458
2459   /* Handle tokens that refer to machine registers:
2460      $ followed by a register name.  */
2461
2462   if (*tokstart == '$') {
2463     for (c = 0; c < NUM_REGS; c++)
2464       if (namelen - 1 == strlen (reg_names[c])
2465           && !strncmp (tokstart + 1, reg_names[c], namelen - 1))
2466         {
2467           yylval.lval = c;
2468           return REGNAME;
2469         }
2470     for (c = 0; c < NUM_STD_REGS; c++)
2471      if (namelen - 1 == strlen (std_regs[c].name)
2472          && !strncmp (tokstart + 1, std_regs[c].name, namelen - 1))
2473        {
2474          yylval.lval = std_regs[c].regnum;
2475          return REGNAME;
2476        }
2477   }
2478   /* Catch specific keywords.  Should be done with a data structure.  */
2479   switch (namelen)
2480     {
2481     case 8:
2482       if (!strncmp (tokstart, "unsigned", 8))
2483         return UNSIGNED;
2484       break;
2485     case 6:
2486       if (!strncmp (tokstart, "struct", 6))
2487         return STRUCT;
2488       if (!strncmp (tokstart, "signed", 6))
2489         return SIGNED;
2490       if (!strncmp (tokstart, "sizeof", 6))      
2491         return SIZEOF;
2492       break;
2493     case 5:
2494       if (!strncmp (tokstart, "union", 5))
2495         return UNION;
2496       if (!strncmp (tokstart, "short", 5))
2497         return SHORT;
2498       break;
2499     case 4:
2500       if (!strncmp (tokstart, "enum", 4))
2501         return ENUM;
2502       if (!strncmp (tokstart, "long", 4))
2503         return LONG;
2504       if (!strncmp (tokstart, "this", 4))
2505         {
2506           static const char this_name[] =
2507                                  { CPLUS_MARKER, 't', 'h', 'i', 's', '\0' };
2508
2509           if (lookup_symbol (this_name, expression_context_block,
2510                              VAR_NAMESPACE, 0, NULL))
2511             return THIS;
2512         }
2513       break;
2514     case 3:
2515       if (!strncmp (tokstart, "int", 3))
2516         return INT_KEYWORD;
2517       break;
2518     default:
2519       break;
2520     }
2521
2522   yylval.sval.ptr = tokstart;
2523   yylval.sval.length = namelen;
2524
2525   /* Any other names starting in $ are debugger internal variables.  */
2526
2527   if (*tokstart == '$')
2528     {
2529       yylval.ivar =  lookup_internalvar (copy_name (yylval.sval) + 1);
2530       return VARIABLE;
2531     }
2532
2533   /* Use token-type BLOCKNAME for symbols that happen to be defined as
2534      functions or symtabs.  If this is not so, then ...
2535      Use token-type TYPENAME for symbols that happen to be defined
2536      currently as names of types; NAME for other symbols.
2537      The caller is not constrained to care about the distinction.  */
2538   {
2539     char *tmp = copy_name (yylval.sval);
2540     struct symbol *sym;
2541     int is_a_field_of_this = 0;
2542     int hextype;
2543
2544     sym = lookup_symbol (tmp, expression_context_block,
2545                          VAR_NAMESPACE, &is_a_field_of_this, NULL);
2546     if ((sym && SYMBOL_CLASS (sym) == LOC_BLOCK) ||
2547         lookup_partial_symtab (tmp))
2548       {
2549         yylval.ssym.sym = sym;
2550         yylval.ssym.is_a_field_of_this = is_a_field_of_this;
2551         return BLOCKNAME;
2552       }
2553     if (sym && SYMBOL_CLASS (sym) == LOC_TYPEDEF)
2554         {
2555           yylval.tsym.type = SYMBOL_TYPE (sym);
2556           return TYPENAME;
2557         }
2558     if ((yylval.tsym.type = lookup_primitive_typename (tmp)) != 0)
2559         return TYPENAME;
2560
2561     /* Input names that aren't symbols but ARE valid hex numbers,
2562        when the input radix permits them, can be names or numbers
2563        depending on the parse.  Note we support radixes > 16 here.  */
2564     if (!sym && 
2565         ((tokstart[0] >= 'a' && tokstart[0] < 'a' + input_radix - 10) ||
2566          (tokstart[0] >= 'A' && tokstart[0] < 'A' + input_radix - 10)))
2567       {
2568         YYSTYPE newlval;        /* Its value is ignored.  */
2569         hextype = parse_number (tokstart, namelen, 0, &newlval);
2570         if (hextype == INT)
2571           {
2572             yylval.ssym.sym = sym;
2573             yylval.ssym.is_a_field_of_this = is_a_field_of_this;
2574             return NAME_OR_INT;
2575           }
2576         if (hextype == UINT)
2577           {
2578             yylval.ssym.sym = sym;
2579             yylval.ssym.is_a_field_of_this = is_a_field_of_this;
2580             return NAME_OR_UINT;
2581           }
2582       }
2583
2584     /* Any other kind of symbol */
2585     yylval.ssym.sym = sym;
2586     yylval.ssym.is_a_field_of_this = is_a_field_of_this;
2587     return NAME;
2588   }
2589 }
2590
2591 static void
2592 yyerror (msg)
2593      char *msg;
2594 {
2595   error ("Invalid syntax in expression.");
2596 }
2597
2598 /* Return a null-terminated temporary copy of the name
2599    of a string token.  */
2600
2601 static char *
2602 copy_name (token)
2603      struct stoken token;
2604 {
2605   bcopy (token.ptr, namecopy, token.length);
2606   namecopy[token.length] = 0;
2607   return namecopy;
2608 }
2609 \f
2610 /* Reverse an expression from suffix form (in which it is constructed)
2611    to prefix form (in which we can conveniently print or execute it).  */
2612
2613 static void prefixify_subexp ();
2614
2615 static void
2616 prefixify_expression (expr)
2617      register struct expression *expr;
2618 {
2619   register int len = sizeof (struct expression) +
2620                                     expr->nelts * sizeof (union exp_element);
2621   register struct expression *temp;
2622   register int inpos = expr->nelts, outpos = 0;
2623
2624   temp = (struct expression *) alloca (len);
2625
2626   /* Copy the original expression into temp.  */
2627   bcopy (expr, temp, len);
2628
2629   prefixify_subexp (temp, expr, inpos, outpos);
2630 }
2631
2632 /* Return the number of exp_elements in the subexpression of EXPR
2633    whose last exp_element is at index ENDPOS - 1 in EXPR.  */
2634
2635 static int
2636 length_of_subexp (expr, endpos)
2637      register struct expression *expr;
2638      register int endpos;
2639 {
2640   register int oplen = 1;
2641   register int args = 0;
2642   register int i;
2643
2644   if (endpos < 0)
2645     error ("?error in length_of_subexp");
2646
2647   i = (int) expr->elts[endpos - 1].opcode;
2648
2649   switch (i)
2650     {
2651       /* C++  */
2652     case OP_SCOPE:
2653       oplen = 4 + ((expr->elts[endpos - 2].longconst
2654                     + sizeof (union exp_element))
2655                    / sizeof (union exp_element));
2656       break;
2657
2658     case OP_LONG:
2659     case OP_DOUBLE:
2660       oplen = 4;
2661       break;
2662
2663     case OP_VAR_VALUE:
2664     case OP_LAST:
2665     case OP_REGISTER:
2666     case OP_INTERNALVAR:
2667       oplen = 3;
2668       break;
2669
2670     case OP_FUNCALL:
2671       oplen = 3;
2672       args = 1 + expr->elts[endpos - 2].longconst;
2673       break;
2674
2675     case UNOP_CAST:
2676     case UNOP_MEMVAL:
2677       oplen = 3;
2678       args = 1;
2679       break;
2680
2681     case STRUCTOP_STRUCT:
2682     case STRUCTOP_PTR:
2683       args = 1;
2684     case OP_STRING:
2685       oplen = 3 + ((expr->elts[endpos - 2].longconst
2686                     + sizeof (union exp_element))
2687                    / sizeof (union exp_element));
2688       break;
2689
2690     case TERNOP_COND:
2691       args = 3;
2692       break;
2693
2694     case BINOP_ASSIGN_MODIFY:
2695       oplen = 3;
2696       args = 2;
2697       break;
2698
2699       /* C++ */
2700     case OP_THIS:
2701       oplen = 2;
2702       break;
2703
2704     default:
2705       args = 1 + (i < (int) BINOP_END);
2706     }
2707
2708   while (args > 0)
2709     {
2710       oplen += length_of_subexp (expr, endpos - oplen);
2711       args--;
2712     }
2713
2714   return oplen;
2715 }
2716
2717 /* Copy the subexpression ending just before index INEND in INEXPR
2718    into OUTEXPR, starting at index OUTBEG.
2719    In the process, convert it from suffix to prefix form.  */
2720
2721 static void
2722 prefixify_subexp (inexpr, outexpr, inend, outbeg)
2723      register struct expression *inexpr;
2724      struct expression *outexpr;
2725      register int inend;
2726      int outbeg;
2727 {
2728   register int oplen = 1;
2729   register int args = 0;
2730   register int i;
2731   int *arglens;
2732   enum exp_opcode opcode;
2733
2734   /* Compute how long the last operation is (in OPLEN),
2735      and also how many preceding subexpressions serve as
2736      arguments for it (in ARGS).  */
2737
2738   opcode = inexpr->elts[inend - 1].opcode;
2739   switch (opcode)
2740     {
2741       /* C++  */
2742     case OP_SCOPE:
2743       oplen = 4 + ((inexpr->elts[inend - 2].longconst
2744                     + sizeof (union exp_element))
2745                    / sizeof (union exp_element));
2746       break;
2747
2748     case OP_LONG:
2749     case OP_DOUBLE:
2750       oplen = 4;
2751       break;
2752
2753     case OP_VAR_VALUE:
2754     case OP_LAST:
2755     case OP_REGISTER:
2756     case OP_INTERNALVAR:
2757       oplen = 3;
2758       break;
2759
2760     case OP_FUNCALL:
2761       oplen = 3;
2762       args = 1 + inexpr->elts[inend - 2].longconst;
2763       break;
2764
2765     case UNOP_CAST:
2766     case UNOP_MEMVAL:
2767       oplen = 3;
2768       args = 1;
2769       break;
2770
2771     case STRUCTOP_STRUCT:
2772     case STRUCTOP_PTR:
2773       args = 1;
2774     case OP_STRING:
2775       oplen = 3 + ((inexpr->elts[inend - 2].longconst
2776                     + sizeof (union exp_element))
2777                    / sizeof (union exp_element));
2778                    
2779       break;
2780
2781     case TERNOP_COND:
2782       args = 3;
2783       break;
2784
2785     case BINOP_ASSIGN_MODIFY:
2786       oplen = 3;
2787       args = 2;
2788       break;
2789
2790       /* C++ */
2791     case OP_THIS:
2792       oplen = 2;
2793       break;
2794
2795     default:
2796       args = 1 + ((int) opcode < (int) BINOP_END);
2797     }
2798
2799   /* Copy the final operator itself, from the end of the input
2800      to the beginning of the output.  */
2801   inend -= oplen;
2802   bcopy (&inexpr->elts[inend], &outexpr->elts[outbeg],
2803          oplen * sizeof (union exp_element));
2804   outbeg += oplen;
2805
2806   /* Find the lengths of the arg subexpressions.  */
2807   arglens = (int *) alloca (args * sizeof (int));
2808   for (i = args - 1; i >= 0; i--)
2809     {
2810       oplen = length_of_subexp (inexpr, inend);
2811       arglens[i] = oplen;
2812       inend -= oplen;
2813     }
2814
2815   /* Now copy each subexpression, preserving the order of
2816      the subexpressions, but prefixifying each one.
2817      In this loop, inend starts at the beginning of
2818      the expression this level is working on
2819      and marches forward over the arguments.
2820      outbeg does similarly in the output.  */
2821   for (i = 0; i < args; i++)
2822     {
2823       oplen = arglens[i];
2824       inend += oplen;
2825       prefixify_subexp (inexpr, outexpr, inend, outbeg);
2826       outbeg += oplen;
2827     }
2828 }
2829 \f
2830 /* This page contains the two entry points to this file.  */
2831
2832 /* Read a C expression from the string *STRINGPTR points to,
2833    parse it, and return a pointer to a  struct expression  that we malloc.
2834    Use block BLOCK as the lexical context for variable names;
2835    if BLOCK is zero, use the block of the selected stack frame.
2836    Meanwhile, advance *STRINGPTR to point after the expression,
2837    at the first nonwhite character that is not part of the expression
2838    (possibly a null character).
2839
2840    If COMMA is nonzero, stop if a comma is reached.  */
2841
2842 struct expression *
2843 parse_c_1 (stringptr, block, comma)
2844      char **stringptr;
2845      struct block *block;
2846      int comma;
2847 {
2848   struct cleanup *old_chain;
2849
2850   lexptr = *stringptr;
2851
2852   paren_depth = 0;
2853   type_stack_depth = 0;
2854
2855   comma_terminates = comma;
2856
2857   if (lexptr == 0 || *lexptr == 0)
2858     error_no_arg ("expression to compute");
2859
2860   old_chain = make_cleanup (free_funcalls, 0);
2861   funcall_chain = 0;
2862
2863   expression_context_block = block ? block : get_selected_block ();
2864
2865   namecopy = (char *) alloca (strlen (lexptr) + 1);
2866   expout_size = 10;
2867   expout_ptr = 0;
2868   expout = (struct expression *)
2869     xmalloc (sizeof (struct expression)
2870              + expout_size * sizeof (union exp_element));
2871   make_cleanup (free_current_contents, &expout);
2872   if (yyparse ())
2873     yyerror (NULL);
2874   discard_cleanups (old_chain);
2875   expout->nelts = expout_ptr;
2876   expout = (struct expression *)
2877     xrealloc (expout,
2878               sizeof (struct expression)
2879               + expout_ptr * sizeof (union exp_element));
2880   prefixify_expression (expout);
2881   *stringptr = lexptr;
2882   return expout;
2883 }
2884
2885 /* Parse STRING as an expression, and complain if this fails
2886    to use up all of the contents of STRING.  */
2887
2888 struct expression *
2889 parse_c_expression (string)
2890      char *string;
2891 {
2892   register struct expression *exp;
2893   exp = parse_c_1 (&string, 0, 0);
2894   if (*string)
2895     error ("Junk after end of expression.");
2896   return exp;
2897 }
2898
2899 static void 
2900 push_type (tp)
2901      enum type_pieces tp;
2902 {
2903   if (type_stack_depth == type_stack_size)
2904     {
2905       type_stack_size *= 2;
2906       type_stack = (union type_stack_elt *)
2907         xrealloc (type_stack, type_stack_size * sizeof (*type_stack));
2908     }
2909   type_stack[type_stack_depth++].piece = tp;
2910 }
2911
2912 static void
2913 push_type_int (n)
2914      int n;
2915 {
2916   if (type_stack_depth == type_stack_size)
2917     {
2918       type_stack_size *= 2;
2919       type_stack = (union type_stack_elt *)
2920         xrealloc (type_stack, type_stack_size * sizeof (*type_stack));
2921     }
2922   type_stack[type_stack_depth++].int_val = n;
2923 }
2924
2925 static enum type_pieces 
2926 pop_type ()
2927 {
2928   if (type_stack_depth)
2929     return type_stack[--type_stack_depth].piece;
2930   return tp_end;
2931 }
2932
2933 static int
2934 pop_type_int ()
2935 {
2936   if (type_stack_depth)
2937     return type_stack[--type_stack_depth].int_val;
2938   /* "Can't happen".  */
2939   return 0;
2940 }
2941
2942 void
2943 _initialize_expread ()
2944 {
2945   type_stack_size = 80;
2946   type_stack_depth = 0;
2947   type_stack = (union type_stack_elt *)
2948     xmalloc (type_stack_size * sizeof (*type_stack));
2949 }