xref: /netbsd-src/external/gpl3/gdb/dist/gdb/cp-name-parser.y (revision d909946ca08dceb44d7d0f22ec9488679695d976)
1 /* YACC parser for C++ names, for GDB.
2 
3    Copyright (C) 2003-2015 Free Software Foundation, Inc.
4 
5    Parts of the lexer are based on c-exp.y from GDB.
6 
7    This file is part of GDB.
8 
9    This program is free software; you can redistribute it and/or modify
10    it under the terms of the GNU General Public License as published by
11    the Free Software Foundation; either version 3 of the License, or
12    (at your option) any later version.
13 
14    This program is distributed in the hope that it will be useful,
15    but WITHOUT ANY WARRANTY; without even the implied warranty of
16    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17    GNU General Public License for more details.
18 
19    You should have received a copy of the GNU General Public License
20    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
21 
22 /* Note that malloc's and realloc's in this file are transformed to
23    xmalloc and xrealloc respectively by the same sed command in the
24    makefile that remaps any other malloc/realloc inserted by the parser
25    generator.  Doing this with #defines and trying to control the interaction
26    with include files (<malloc.h> and <stdlib.h> for example) just became
27    too messy, particularly when such includes can be inserted at random
28    times by the parser generator.  */
29 
30 %{
31 
32 #include "defs.h"
33 
34 #include <unistd.h>
35 #include "safe-ctype.h"
36 #include "demangle.h"
37 #include "cp-support.h"
38 
39 /* Bison does not make it easy to create a parser without global
40    state, unfortunately.  Here are all the global variables used
41    in this parser.  */
42 
43 /* LEXPTR is the current pointer into our lex buffer.  PREV_LEXPTR
44    is the start of the last token lexed, only used for diagnostics.
45    ERROR_LEXPTR is the first place an error occurred.  GLOBAL_ERRMSG
46    is the first error message encountered.  */
47 
48 static const char *lexptr, *prev_lexptr, *error_lexptr, *global_errmsg;
49 
50 /* The components built by the parser are allocated ahead of time,
51    and cached in this structure.  */
52 
53 #define ALLOC_CHUNK 100
54 
55 struct demangle_info {
56   int used;
57   struct demangle_info *next;
58   struct demangle_component comps[ALLOC_CHUNK];
59 };
60 
61 static struct demangle_info *demangle_info;
62 
63 static struct demangle_component *
64 d_grab (void)
65 {
66   struct demangle_info *more;
67 
68   if (demangle_info->used >= ALLOC_CHUNK)
69     {
70       if (demangle_info->next == NULL)
71 	{
72 	  more = malloc (sizeof (struct demangle_info));
73 	  more->next = NULL;
74 	  demangle_info->next = more;
75 	}
76       else
77 	more = demangle_info->next;
78 
79       more->used = 0;
80       demangle_info = more;
81     }
82   return &demangle_info->comps[demangle_info->used++];
83 }
84 
85 /* The parse tree created by the parser is stored here after a successful
86    parse.  */
87 
88 static struct demangle_component *global_result;
89 
90 /* Prototypes for helper functions used when constructing the parse
91    tree.  */
92 
93 static struct demangle_component *d_qualify (struct demangle_component *, int,
94 					     int);
95 
96 static struct demangle_component *d_int_type (int);
97 
98 static struct demangle_component *d_unary (const char *,
99 					   struct demangle_component *);
100 static struct demangle_component *d_binary (const char *,
101 					    struct demangle_component *,
102 					    struct demangle_component *);
103 
104 /* Flags passed to d_qualify.  */
105 
106 #define QUAL_CONST 1
107 #define QUAL_RESTRICT 2
108 #define QUAL_VOLATILE 4
109 
110 /* Flags passed to d_int_type.  */
111 
112 #define INT_CHAR	(1 << 0)
113 #define INT_SHORT	(1 << 1)
114 #define INT_LONG	(1 << 2)
115 #define INT_LLONG	(1 << 3)
116 
117 #define INT_SIGNED	(1 << 4)
118 #define INT_UNSIGNED	(1 << 5)
119 
120 /* Remap normal yacc parser interface names (yyparse, yylex, yyerror, etc),
121    as well as gratuitiously global symbol names, so we can have multiple
122    yacc generated parsers in gdb.  Note that these are only the variables
123    produced by yacc.  If other parser generators (bison, byacc, etc) produce
124    additional global names that conflict at link time, then those parser
125    generators need to be fixed instead of adding those names to this list. */
126 
127 #define	yymaxdepth cpname_maxdepth
128 #define	yyparse	cpname_parse
129 #define	yylex	cpname_lex
130 #define	yyerror	cpname_error
131 #define	yylval	cpname_lval
132 #define	yychar	cpname_char
133 #define	yydebug	cpname_debug
134 #define	yypact	cpname_pact
135 #define	yyr1	cpname_r1
136 #define	yyr2	cpname_r2
137 #define	yydef	cpname_def
138 #define	yychk	cpname_chk
139 #define	yypgo	cpname_pgo
140 #define	yyact	cpname_act
141 #define	yyexca	cpname_exca
142 #define yyerrflag cpname_errflag
143 #define yynerrs	cpname_nerrs
144 #define	yyps	cpname_ps
145 #define	yypv	cpname_pv
146 #define	yys	cpname_s
147 #define	yy_yys	cpname_yys
148 #define	yystate	cpname_state
149 #define	yytmp	cpname_tmp
150 #define	yyv	cpname_v
151 #define	yy_yyv	cpname_yyv
152 #define	yyval	cpname_val
153 #define	yylloc	cpname_lloc
154 #define yyreds	cpname_reds		/* With YYDEBUG defined */
155 #define yytoks	cpname_toks		/* With YYDEBUG defined */
156 #define yyname	cpname_name		/* With YYDEBUG defined */
157 #define yyrule	cpname_rule		/* With YYDEBUG defined */
158 #define yylhs	cpname_yylhs
159 #define yylen	cpname_yylen
160 #define yydefred cpname_yydefred
161 #define yydgoto	cpname_yydgoto
162 #define yysindex cpname_yysindex
163 #define yyrindex cpname_yyrindex
164 #define yygindex cpname_yygindex
165 #define yytable	 cpname_yytable
166 #define yycheck	 cpname_yycheck
167 #define yyss	cpname_yyss
168 #define yysslim	cpname_yysslim
169 #define yyssp	cpname_yyssp
170 #define yystacksize cpname_yystacksize
171 #define yyvs	cpname_yyvs
172 #define yyvsp	cpname_yyvsp
173 
174 int yyparse (void);
175 static int yylex (void);
176 static void yyerror (char *);
177 
178 /* Enable yydebug for the stand-alone parser.  */
179 #ifdef TEST_CPNAMES
180 # define YYDEBUG	1
181 #endif
182 
183 /* Helper functions.  These wrap the demangler tree interface, handle
184    allocation from our global store, and return the allocated component.  */
185 
186 static struct demangle_component *
187 fill_comp (enum demangle_component_type d_type, struct demangle_component *lhs,
188 	   struct demangle_component *rhs)
189 {
190   struct demangle_component *ret = d_grab ();
191   int i;
192 
193   i = cplus_demangle_fill_component (ret, d_type, lhs, rhs);
194   gdb_assert (i);
195 
196   return ret;
197 }
198 
199 static struct demangle_component *
200 make_empty (enum demangle_component_type d_type)
201 {
202   struct demangle_component *ret = d_grab ();
203   ret->type = d_type;
204   return ret;
205 }
206 
207 static struct demangle_component *
208 make_operator (const char *name, int args)
209 {
210   struct demangle_component *ret = d_grab ();
211   int i;
212 
213   i = cplus_demangle_fill_operator (ret, name, args);
214   gdb_assert (i);
215 
216   return ret;
217 }
218 
219 static struct demangle_component *
220 make_dtor (enum gnu_v3_dtor_kinds kind, struct demangle_component *name)
221 {
222   struct demangle_component *ret = d_grab ();
223   int i;
224 
225   i = cplus_demangle_fill_dtor (ret, kind, name);
226   gdb_assert (i);
227 
228   return ret;
229 }
230 
231 static struct demangle_component *
232 make_builtin_type (const char *name)
233 {
234   struct demangle_component *ret = d_grab ();
235   int i;
236 
237   i = cplus_demangle_fill_builtin_type (ret, name);
238   gdb_assert (i);
239 
240   return ret;
241 }
242 
243 static struct demangle_component *
244 make_name (const char *name, int len)
245 {
246   struct demangle_component *ret = d_grab ();
247   int i;
248 
249   i = cplus_demangle_fill_name (ret, name, len);
250   gdb_assert (i);
251 
252   return ret;
253 }
254 
255 #define d_left(dc) (dc)->u.s_binary.left
256 #define d_right(dc) (dc)->u.s_binary.right
257 
258 %}
259 
260 %union
261   {
262     struct demangle_component *comp;
263     struct nested {
264       struct demangle_component *comp;
265       struct demangle_component **last;
266     } nested;
267     struct {
268       struct demangle_component *comp, *last;
269     } nested1;
270     struct {
271       struct demangle_component *comp, **last;
272       struct nested fn;
273       struct demangle_component *start;
274       int fold_flag;
275     } abstract;
276     int lval;
277     const char *opname;
278   }
279 
280 %type <comp> exp exp1 type start start_opt oper colon_name
281 %type <comp> unqualified_name colon_ext_name
282 %type <comp> templ template_arg
283 %type <comp> builtin_type
284 %type <comp> typespec_2 array_indicator
285 %type <comp> colon_ext_only ext_only_name
286 
287 %type <comp> demangler_special function conversion_op
288 %type <nested> conversion_op_name
289 
290 %type <abstract> abstract_declarator direct_abstract_declarator
291 %type <abstract> abstract_declarator_fn
292 %type <nested> declarator direct_declarator function_arglist
293 
294 %type <nested> declarator_1 direct_declarator_1
295 
296 %type <nested> template_params function_args
297 %type <nested> ptr_operator
298 
299 %type <nested1> nested_name
300 
301 %type <lval> qualifier qualifiers qualifiers_opt
302 
303 %type <lval> int_part int_seq
304 
305 %token <comp> INT
306 %token <comp> FLOAT
307 
308 %token <comp> NAME
309 %type <comp> name
310 
311 %token STRUCT CLASS UNION ENUM SIZEOF UNSIGNED COLONCOLON
312 %token TEMPLATE
313 %token ERROR
314 %token NEW DELETE OPERATOR
315 %token STATIC_CAST REINTERPRET_CAST DYNAMIC_CAST
316 
317 /* Special type cases, put in to allow the parser to distinguish different
318    legal basetypes.  */
319 %token SIGNED_KEYWORD LONG SHORT INT_KEYWORD CONST_KEYWORD VOLATILE_KEYWORD DOUBLE_KEYWORD BOOL
320 %token ELLIPSIS RESTRICT VOID FLOAT_KEYWORD CHAR WCHAR_T
321 
322 %token <opname> ASSIGN_MODIFY
323 
324 /* C++ */
325 %token TRUEKEYWORD
326 %token FALSEKEYWORD
327 
328 /* Non-C++ things we get from the demangler.  */
329 %token <lval> DEMANGLER_SPECIAL
330 %token CONSTRUCTION_VTABLE CONSTRUCTION_IN
331 
332 /* Precedence declarations.  */
333 
334 /* Give NAME lower precedence than COLONCOLON, so that nested_name will
335    associate greedily.  */
336 %nonassoc NAME
337 
338 /* Give NEW and DELETE lower precedence than ']', because we can not
339    have an array of type operator new.  This causes NEW '[' to be
340    parsed as operator new[].  */
341 %nonassoc NEW DELETE
342 
343 /* Give VOID higher precedence than NAME.  Then we can use %prec NAME
344    to prefer (VOID) to (function_args).  */
345 %nonassoc VOID
346 
347 /* Give VOID lower precedence than ')' for similar reasons.  */
348 %nonassoc ')'
349 
350 %left ','
351 %right '=' ASSIGN_MODIFY
352 %right '?'
353 %left OROR
354 %left ANDAND
355 %left '|'
356 %left '^'
357 %left '&'
358 %left EQUAL NOTEQUAL
359 %left '<' '>' LEQ GEQ
360 %left LSH RSH
361 %left '@'
362 %left '+' '-'
363 %left '*' '/' '%'
364 %right UNARY INCREMENT DECREMENT
365 
366 /* We don't need a precedence for '(' in this reduced grammar, and it
367    can mask some unpleasant bugs, so disable it for now.  */
368 
369 %right ARROW '.' '[' /* '(' */
370 %left COLONCOLON
371 
372 
373 %%
374 
375 result		:	start
376 			{ global_result = $1; }
377 		;
378 
379 start		:	type
380 
381 		|	demangler_special
382 
383 		|	function
384 
385 		;
386 
387 start_opt	:	/* */
388 			{ $$ = NULL; }
389 		|	COLONCOLON start
390 			{ $$ = $2; }
391 		;
392 
393 function
394 		/* Function with a return type.  declarator_1 is used to prevent
395 		   ambiguity with the next rule.  */
396 		:	typespec_2 declarator_1
397 			{ $$ = $2.comp;
398 			  *$2.last = $1;
399 			}
400 
401 		/* Function without a return type.  We need to use typespec_2
402 		   to prevent conflicts from qualifiers_opt - harmless.  The
403 		   start_opt is used to handle "function-local" variables and
404 		   types.  */
405 		|	typespec_2 function_arglist start_opt
406 			{ $$ = fill_comp (DEMANGLE_COMPONENT_TYPED_NAME, $1, $2.comp);
407 			  if ($3) $$ = fill_comp (DEMANGLE_COMPONENT_LOCAL_NAME, $$, $3); }
408 		|	colon_ext_only function_arglist start_opt
409 			{ $$ = fill_comp (DEMANGLE_COMPONENT_TYPED_NAME, $1, $2.comp);
410 			  if ($3) $$ = fill_comp (DEMANGLE_COMPONENT_LOCAL_NAME, $$, $3); }
411 
412 		|	conversion_op_name start_opt
413 			{ $$ = $1.comp;
414 			  if ($2) $$ = fill_comp (DEMANGLE_COMPONENT_LOCAL_NAME, $$, $2); }
415 		|	conversion_op_name abstract_declarator_fn
416 			{ if ($2.last)
417 			    {
418 			       /* First complete the abstract_declarator's type using
419 				  the typespec from the conversion_op_name.  */
420 			      *$2.last = *$1.last;
421 			      /* Then complete the conversion_op_name with the type.  */
422 			      *$1.last = $2.comp;
423 			    }
424 			  /* If we have an arglist, build a function type.  */
425 			  if ($2.fn.comp)
426 			    $$ = fill_comp (DEMANGLE_COMPONENT_TYPED_NAME, $1.comp, $2.fn.comp);
427 			  else
428 			    $$ = $1.comp;
429 			  if ($2.start) $$ = fill_comp (DEMANGLE_COMPONENT_LOCAL_NAME, $$, $2.start);
430 			}
431 		;
432 
433 demangler_special
434 		:	DEMANGLER_SPECIAL start
435 			{ $$ = make_empty ($1);
436 			  d_left ($$) = $2;
437 			  d_right ($$) = NULL; }
438 		|	CONSTRUCTION_VTABLE start CONSTRUCTION_IN start
439 			{ $$ = fill_comp (DEMANGLE_COMPONENT_CONSTRUCTION_VTABLE, $2, $4); }
440 		;
441 
442 oper	:	OPERATOR NEW
443 			{
444 			  /* Match the whitespacing of cplus_demangle_operators.
445 			     It would abort on unrecognized string otherwise.  */
446 			  $$ = make_operator ("new", 3);
447 			}
448 		|	OPERATOR DELETE
449 			{
450 			  /* Match the whitespacing of cplus_demangle_operators.
451 			     It would abort on unrecognized string otherwise.  */
452 			  $$ = make_operator ("delete ", 1);
453 			}
454 		|	OPERATOR NEW '[' ']'
455 			{
456 			  /* Match the whitespacing of cplus_demangle_operators.
457 			     It would abort on unrecognized string otherwise.  */
458 			  $$ = make_operator ("new[]", 3);
459 			}
460 		|	OPERATOR DELETE '[' ']'
461 			{
462 			  /* Match the whitespacing of cplus_demangle_operators.
463 			     It would abort on unrecognized string otherwise.  */
464 			  $$ = make_operator ("delete[] ", 1);
465 			}
466 		|	OPERATOR '+'
467 			{ $$ = make_operator ("+", 2); }
468 		|	OPERATOR '-'
469 			{ $$ = make_operator ("-", 2); }
470 		|	OPERATOR '*'
471 			{ $$ = make_operator ("*", 2); }
472 		|	OPERATOR '/'
473 			{ $$ = make_operator ("/", 2); }
474 		|	OPERATOR '%'
475 			{ $$ = make_operator ("%", 2); }
476 		|	OPERATOR '^'
477 			{ $$ = make_operator ("^", 2); }
478 		|	OPERATOR '&'
479 			{ $$ = make_operator ("&", 2); }
480 		|	OPERATOR '|'
481 			{ $$ = make_operator ("|", 2); }
482 		|	OPERATOR '~'
483 			{ $$ = make_operator ("~", 1); }
484 		|	OPERATOR '!'
485 			{ $$ = make_operator ("!", 1); }
486 		|	OPERATOR '='
487 			{ $$ = make_operator ("=", 2); }
488 		|	OPERATOR '<'
489 			{ $$ = make_operator ("<", 2); }
490 		|	OPERATOR '>'
491 			{ $$ = make_operator (">", 2); }
492 		|	OPERATOR ASSIGN_MODIFY
493 			{ $$ = make_operator ($2, 2); }
494 		|	OPERATOR LSH
495 			{ $$ = make_operator ("<<", 2); }
496 		|	OPERATOR RSH
497 			{ $$ = make_operator (">>", 2); }
498 		|	OPERATOR EQUAL
499 			{ $$ = make_operator ("==", 2); }
500 		|	OPERATOR NOTEQUAL
501 			{ $$ = make_operator ("!=", 2); }
502 		|	OPERATOR LEQ
503 			{ $$ = make_operator ("<=", 2); }
504 		|	OPERATOR GEQ
505 			{ $$ = make_operator (">=", 2); }
506 		|	OPERATOR ANDAND
507 			{ $$ = make_operator ("&&", 2); }
508 		|	OPERATOR OROR
509 			{ $$ = make_operator ("||", 2); }
510 		|	OPERATOR INCREMENT
511 			{ $$ = make_operator ("++", 1); }
512 		|	OPERATOR DECREMENT
513 			{ $$ = make_operator ("--", 1); }
514 		|	OPERATOR ','
515 			{ $$ = make_operator (",", 2); }
516 		|	OPERATOR ARROW '*'
517 			{ $$ = make_operator ("->*", 2); }
518 		|	OPERATOR ARROW
519 			{ $$ = make_operator ("->", 2); }
520 		|	OPERATOR '(' ')'
521 			{ $$ = make_operator ("()", 2); }
522 		|	OPERATOR '[' ']'
523 			{ $$ = make_operator ("[]", 2); }
524 		;
525 
526 		/* Conversion operators.  We don't try to handle some of
527 		   the wackier demangler output for function pointers,
528 		   since it's not clear that it's parseable.  */
529 conversion_op
530 		:	OPERATOR typespec_2
531 			{ $$ = fill_comp (DEMANGLE_COMPONENT_CONVERSION, $2, NULL); }
532 		;
533 
534 conversion_op_name
535 		:	nested_name conversion_op
536 			{ $$.comp = $1.comp;
537 			  d_right ($1.last) = $2;
538 			  $$.last = &d_left ($2);
539 			}
540 		|	conversion_op
541 			{ $$.comp = $1;
542 			  $$.last = &d_left ($1);
543 			}
544 		|	COLONCOLON nested_name conversion_op
545 			{ $$.comp = $2.comp;
546 			  d_right ($2.last) = $3;
547 			  $$.last = &d_left ($3);
548 			}
549 		|	COLONCOLON conversion_op
550 			{ $$.comp = $2;
551 			  $$.last = &d_left ($2);
552 			}
553 		;
554 
555 /* DEMANGLE_COMPONENT_NAME */
556 /* This accepts certain invalid placements of '~'.  */
557 unqualified_name:	oper
558 		|	oper '<' template_params '>'
559 			{ $$ = fill_comp (DEMANGLE_COMPONENT_TEMPLATE, $1, $3.comp); }
560 		|	'~' NAME
561 			{ $$ = make_dtor (gnu_v3_complete_object_dtor, $2); }
562 		;
563 
564 /* This rule is used in name and nested_name, and expanded inline there
565    for efficiency.  */
566 /*
567 scope_id	:	NAME
568 		|	template
569 		;
570 */
571 
572 colon_name	:	name
573 		|	COLONCOLON name
574 			{ $$ = $2; }
575 		;
576 
577 /* DEMANGLE_COMPONENT_QUAL_NAME */
578 /* DEMANGLE_COMPONENT_CTOR / DEMANGLE_COMPONENT_DTOR ? */
579 name		:	nested_name NAME %prec NAME
580 			{ $$ = $1.comp; d_right ($1.last) = $2; }
581 		|	NAME %prec NAME
582 		|	nested_name templ %prec NAME
583 			{ $$ = $1.comp; d_right ($1.last) = $2; }
584 		|	templ %prec NAME
585 		;
586 
587 colon_ext_name	:	colon_name
588 		|	colon_ext_only
589 		;
590 
591 colon_ext_only	:	ext_only_name
592 		|	COLONCOLON ext_only_name
593 			{ $$ = $2; }
594 		;
595 
596 ext_only_name	:	nested_name unqualified_name
597 			{ $$ = $1.comp; d_right ($1.last) = $2; }
598 		|	unqualified_name
599 		;
600 
601 nested_name	:	NAME COLONCOLON
602 			{ $$.comp = make_empty (DEMANGLE_COMPONENT_QUAL_NAME);
603 			  d_left ($$.comp) = $1;
604 			  d_right ($$.comp) = NULL;
605 			  $$.last = $$.comp;
606 			}
607 		|	nested_name NAME COLONCOLON
608 			{ $$.comp = $1.comp;
609 			  d_right ($1.last) = make_empty (DEMANGLE_COMPONENT_QUAL_NAME);
610 			  $$.last = d_right ($1.last);
611 			  d_left ($$.last) = $2;
612 			  d_right ($$.last) = NULL;
613 			}
614 		|	templ COLONCOLON
615 			{ $$.comp = make_empty (DEMANGLE_COMPONENT_QUAL_NAME);
616 			  d_left ($$.comp) = $1;
617 			  d_right ($$.comp) = NULL;
618 			  $$.last = $$.comp;
619 			}
620 		|	nested_name templ COLONCOLON
621 			{ $$.comp = $1.comp;
622 			  d_right ($1.last) = make_empty (DEMANGLE_COMPONENT_QUAL_NAME);
623 			  $$.last = d_right ($1.last);
624 			  d_left ($$.last) = $2;
625 			  d_right ($$.last) = NULL;
626 			}
627 		;
628 
629 /* DEMANGLE_COMPONENT_TEMPLATE */
630 /* DEMANGLE_COMPONENT_TEMPLATE_ARGLIST */
631 templ	:	NAME '<' template_params '>'
632 			{ $$ = fill_comp (DEMANGLE_COMPONENT_TEMPLATE, $1, $3.comp); }
633 		;
634 
635 template_params	:	template_arg
636 			{ $$.comp = fill_comp (DEMANGLE_COMPONENT_TEMPLATE_ARGLIST, $1, NULL);
637 			$$.last = &d_right ($$.comp); }
638 		|	template_params ',' template_arg
639 			{ $$.comp = $1.comp;
640 			  *$1.last = fill_comp (DEMANGLE_COMPONENT_TEMPLATE_ARGLIST, $3, NULL);
641 			  $$.last = &d_right (*$1.last);
642 			}
643 		;
644 
645 /* "type" is inlined into template_arg and function_args.  */
646 
647 /* Also an integral constant-expression of integral type, and a
648    pointer to member (?) */
649 template_arg	:	typespec_2
650 		|	typespec_2 abstract_declarator
651 			{ $$ = $2.comp;
652 			  *$2.last = $1;
653 			}
654 		|	'&' start
655 			{ $$ = fill_comp (DEMANGLE_COMPONENT_UNARY, make_operator ("&", 1), $2); }
656 		|	'&' '(' start ')'
657 			{ $$ = fill_comp (DEMANGLE_COMPONENT_UNARY, make_operator ("&", 1), $3); }
658 		|	exp
659 		;
660 
661 function_args	:	typespec_2
662 			{ $$.comp = fill_comp (DEMANGLE_COMPONENT_ARGLIST, $1, NULL);
663 			  $$.last = &d_right ($$.comp);
664 			}
665 		|	typespec_2 abstract_declarator
666 			{ *$2.last = $1;
667 			  $$.comp = fill_comp (DEMANGLE_COMPONENT_ARGLIST, $2.comp, NULL);
668 			  $$.last = &d_right ($$.comp);
669 			}
670 		|	function_args ',' typespec_2
671 			{ *$1.last = fill_comp (DEMANGLE_COMPONENT_ARGLIST, $3, NULL);
672 			  $$.comp = $1.comp;
673 			  $$.last = &d_right (*$1.last);
674 			}
675 		|	function_args ',' typespec_2 abstract_declarator
676 			{ *$4.last = $3;
677 			  *$1.last = fill_comp (DEMANGLE_COMPONENT_ARGLIST, $4.comp, NULL);
678 			  $$.comp = $1.comp;
679 			  $$.last = &d_right (*$1.last);
680 			}
681 		|	function_args ',' ELLIPSIS
682 			{ *$1.last
683 			    = fill_comp (DEMANGLE_COMPONENT_ARGLIST,
684 					   make_builtin_type ("..."),
685 					   NULL);
686 			  $$.comp = $1.comp;
687 			  $$.last = &d_right (*$1.last);
688 			}
689 		;
690 
691 function_arglist:	'(' function_args ')' qualifiers_opt %prec NAME
692 			{ $$.comp = fill_comp (DEMANGLE_COMPONENT_FUNCTION_TYPE, NULL, $2.comp);
693 			  $$.last = &d_left ($$.comp);
694 			  $$.comp = d_qualify ($$.comp, $4, 1); }
695 		|	'(' VOID ')' qualifiers_opt
696 			{ $$.comp = fill_comp (DEMANGLE_COMPONENT_FUNCTION_TYPE, NULL, NULL);
697 			  $$.last = &d_left ($$.comp);
698 			  $$.comp = d_qualify ($$.comp, $4, 1); }
699 		|	'(' ')' qualifiers_opt
700 			{ $$.comp = fill_comp (DEMANGLE_COMPONENT_FUNCTION_TYPE, NULL, NULL);
701 			  $$.last = &d_left ($$.comp);
702 			  $$.comp = d_qualify ($$.comp, $3, 1); }
703 		;
704 
705 /* Should do something about DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL */
706 qualifiers_opt	:	/* epsilon */
707 			{ $$ = 0; }
708 		|	qualifiers
709 		;
710 
711 qualifier	:	RESTRICT
712 			{ $$ = QUAL_RESTRICT; }
713 		|	VOLATILE_KEYWORD
714 			{ $$ = QUAL_VOLATILE; }
715 		|	CONST_KEYWORD
716 			{ $$ = QUAL_CONST; }
717 		;
718 
719 qualifiers	:	qualifier
720 		|	qualifier qualifiers
721 			{ $$ = $1 | $2; }
722 		;
723 
724 /* This accepts all sorts of invalid constructions and produces
725    invalid output for them - an error would be better.  */
726 
727 int_part	:	INT_KEYWORD
728 			{ $$ = 0; }
729 		|	SIGNED_KEYWORD
730 			{ $$ = INT_SIGNED; }
731 		|	UNSIGNED
732 			{ $$ = INT_UNSIGNED; }
733 		|	CHAR
734 			{ $$ = INT_CHAR; }
735 		|	LONG
736 			{ $$ = INT_LONG; }
737 		|	SHORT
738 			{ $$ = INT_SHORT; }
739 		;
740 
741 int_seq		:	int_part
742 		|	int_seq int_part
743 			{ $$ = $1 | $2; if ($1 & $2 & INT_LONG) $$ = $1 | INT_LLONG; }
744 		;
745 
746 builtin_type	:	int_seq
747 			{ $$ = d_int_type ($1); }
748 		|	FLOAT_KEYWORD
749 			{ $$ = make_builtin_type ("float"); }
750 		|	DOUBLE_KEYWORD
751 			{ $$ = make_builtin_type ("double"); }
752 		|	LONG DOUBLE_KEYWORD
753 			{ $$ = make_builtin_type ("long double"); }
754 		|	BOOL
755 			{ $$ = make_builtin_type ("bool"); }
756 		|	WCHAR_T
757 			{ $$ = make_builtin_type ("wchar_t"); }
758 		|	VOID
759 			{ $$ = make_builtin_type ("void"); }
760 		;
761 
762 ptr_operator	:	'*' qualifiers_opt
763 			{ $$.comp = make_empty (DEMANGLE_COMPONENT_POINTER);
764 			  $$.comp->u.s_binary.left = $$.comp->u.s_binary.right = NULL;
765 			  $$.last = &d_left ($$.comp);
766 			  $$.comp = d_qualify ($$.comp, $2, 0); }
767 		/* g++ seems to allow qualifiers after the reference?  */
768 		|	'&'
769 			{ $$.comp = make_empty (DEMANGLE_COMPONENT_REFERENCE);
770 			  $$.comp->u.s_binary.left = $$.comp->u.s_binary.right = NULL;
771 			  $$.last = &d_left ($$.comp); }
772 		|	nested_name '*' qualifiers_opt
773 			{ $$.comp = make_empty (DEMANGLE_COMPONENT_PTRMEM_TYPE);
774 			  $$.comp->u.s_binary.left = $1.comp;
775 			  /* Convert the innermost DEMANGLE_COMPONENT_QUAL_NAME to a DEMANGLE_COMPONENT_NAME.  */
776 			  *$1.last = *d_left ($1.last);
777 			  $$.comp->u.s_binary.right = NULL;
778 			  $$.last = &d_right ($$.comp);
779 			  $$.comp = d_qualify ($$.comp, $3, 0); }
780 		|	COLONCOLON nested_name '*' qualifiers_opt
781 			{ $$.comp = make_empty (DEMANGLE_COMPONENT_PTRMEM_TYPE);
782 			  $$.comp->u.s_binary.left = $2.comp;
783 			  /* Convert the innermost DEMANGLE_COMPONENT_QUAL_NAME to a DEMANGLE_COMPONENT_NAME.  */
784 			  *$2.last = *d_left ($2.last);
785 			  $$.comp->u.s_binary.right = NULL;
786 			  $$.last = &d_right ($$.comp);
787 			  $$.comp = d_qualify ($$.comp, $4, 0); }
788 		;
789 
790 array_indicator	:	'[' ']'
791 			{ $$ = make_empty (DEMANGLE_COMPONENT_ARRAY_TYPE);
792 			  d_left ($$) = NULL;
793 			}
794 		|	'[' INT ']'
795 			{ $$ = make_empty (DEMANGLE_COMPONENT_ARRAY_TYPE);
796 			  d_left ($$) = $2;
797 			}
798 		;
799 
800 /* Details of this approach inspired by the G++ < 3.4 parser.  */
801 
802 /* This rule is only used in typespec_2, and expanded inline there for
803    efficiency.  */
804 /*
805 typespec	:	builtin_type
806 		|	colon_name
807 		;
808 */
809 
810 typespec_2	:	builtin_type qualifiers
811 			{ $$ = d_qualify ($1, $2, 0); }
812 		|	builtin_type
813 		|	qualifiers builtin_type qualifiers
814 			{ $$ = d_qualify ($2, $1 | $3, 0); }
815 		|	qualifiers builtin_type
816 			{ $$ = d_qualify ($2, $1, 0); }
817 
818 		|	name qualifiers
819 			{ $$ = d_qualify ($1, $2, 0); }
820 		|	name
821 		|	qualifiers name qualifiers
822 			{ $$ = d_qualify ($2, $1 | $3, 0); }
823 		|	qualifiers name
824 			{ $$ = d_qualify ($2, $1, 0); }
825 
826 		|	COLONCOLON name qualifiers
827 			{ $$ = d_qualify ($2, $3, 0); }
828 		|	COLONCOLON name
829 			{ $$ = $2; }
830 		|	qualifiers COLONCOLON name qualifiers
831 			{ $$ = d_qualify ($3, $1 | $4, 0); }
832 		|	qualifiers COLONCOLON name
833 			{ $$ = d_qualify ($3, $1, 0); }
834 		;
835 
836 abstract_declarator
837 		:	ptr_operator
838 			{ $$.comp = $1.comp; $$.last = $1.last;
839 			  $$.fn.comp = NULL; $$.fn.last = NULL; }
840 		|	ptr_operator abstract_declarator
841 			{ $$ = $2; $$.fn.comp = NULL; $$.fn.last = NULL;
842 			  if ($2.fn.comp) { $$.last = $2.fn.last; *$2.last = $2.fn.comp; }
843 			  *$$.last = $1.comp;
844 			  $$.last = $1.last; }
845 		|	direct_abstract_declarator
846 			{ $$.fn.comp = NULL; $$.fn.last = NULL;
847 			  if ($1.fn.comp) { $$.last = $1.fn.last; *$1.last = $1.fn.comp; }
848 			}
849 		;
850 
851 direct_abstract_declarator
852 		:	'(' abstract_declarator ')'
853 			{ $$ = $2; $$.fn.comp = NULL; $$.fn.last = NULL; $$.fold_flag = 1;
854 			  if ($2.fn.comp) { $$.last = $2.fn.last; *$2.last = $2.fn.comp; }
855 			}
856 		|	direct_abstract_declarator function_arglist
857 			{ $$.fold_flag = 0;
858 			  if ($1.fn.comp) { $$.last = $1.fn.last; *$1.last = $1.fn.comp; }
859 			  if ($1.fold_flag)
860 			    {
861 			      *$$.last = $2.comp;
862 			      $$.last = $2.last;
863 			    }
864 			  else
865 			    $$.fn = $2;
866 			}
867 		|	direct_abstract_declarator array_indicator
868 			{ $$.fn.comp = NULL; $$.fn.last = NULL; $$.fold_flag = 0;
869 			  if ($1.fn.comp) { $$.last = $1.fn.last; *$1.last = $1.fn.comp; }
870 			  *$1.last = $2;
871 			  $$.last = &d_right ($2);
872 			}
873 		|	array_indicator
874 			{ $$.fn.comp = NULL; $$.fn.last = NULL; $$.fold_flag = 0;
875 			  $$.comp = $1;
876 			  $$.last = &d_right ($1);
877 			}
878 		/* G++ has the following except for () and (type).  Then
879 		   (type) is handled in regcast_or_absdcl and () is handled
880 		   in fcast_or_absdcl.
881 
882 		   However, this is only useful for function types, and
883 		   generates reduce/reduce conflicts with direct_declarator.
884 		   We're interested in pointer-to-function types, and in
885 		   functions, but not in function types - so leave this
886 		   out.  */
887 		/* |	function_arglist */
888 		;
889 
890 abstract_declarator_fn
891 		:	ptr_operator
892 			{ $$.comp = $1.comp; $$.last = $1.last;
893 			  $$.fn.comp = NULL; $$.fn.last = NULL; $$.start = NULL; }
894 		|	ptr_operator abstract_declarator_fn
895 			{ $$ = $2;
896 			  if ($2.last)
897 			    *$$.last = $1.comp;
898 			  else
899 			    $$.comp = $1.comp;
900 			  $$.last = $1.last;
901 			}
902 		|	direct_abstract_declarator
903 			{ $$.comp = $1.comp; $$.last = $1.last; $$.fn = $1.fn; $$.start = NULL; }
904 		|	direct_abstract_declarator function_arglist COLONCOLON start
905 			{ $$.start = $4;
906 			  if ($1.fn.comp) { $$.last = $1.fn.last; *$1.last = $1.fn.comp; }
907 			  if ($1.fold_flag)
908 			    {
909 			      *$$.last = $2.comp;
910 			      $$.last = $2.last;
911 			    }
912 			  else
913 			    $$.fn = $2;
914 			}
915 		|	function_arglist start_opt
916 			{ $$.fn = $1;
917 			  $$.start = $2;
918 			  $$.comp = NULL; $$.last = NULL;
919 			}
920 		;
921 
922 type		:	typespec_2
923 		|	typespec_2 abstract_declarator
924 			{ $$ = $2.comp;
925 			  *$2.last = $1;
926 			}
927 		;
928 
929 declarator	:	ptr_operator declarator
930 			{ $$.comp = $2.comp;
931 			  $$.last = $1.last;
932 			  *$2.last = $1.comp; }
933 		|	direct_declarator
934 		;
935 
936 direct_declarator
937 		:	'(' declarator ')'
938 			{ $$ = $2; }
939 		|	direct_declarator function_arglist
940 			{ $$.comp = $1.comp;
941 			  *$1.last = $2.comp;
942 			  $$.last = $2.last;
943 			}
944 		|	direct_declarator array_indicator
945 			{ $$.comp = $1.comp;
946 			  *$1.last = $2;
947 			  $$.last = &d_right ($2);
948 			}
949 		|	colon_ext_name
950 			{ $$.comp = make_empty (DEMANGLE_COMPONENT_TYPED_NAME);
951 			  d_left ($$.comp) = $1;
952 			  $$.last = &d_right ($$.comp);
953 			}
954 		;
955 
956 /* These are similar to declarator and direct_declarator except that they
957    do not permit ( colon_ext_name ), which is ambiguous with a function
958    argument list.  They also don't permit a few other forms with redundant
959    parentheses around the colon_ext_name; any colon_ext_name in parentheses
960    must be followed by an argument list or an array indicator, or preceded
961    by a pointer.  */
962 declarator_1	:	ptr_operator declarator_1
963 			{ $$.comp = $2.comp;
964 			  $$.last = $1.last;
965 			  *$2.last = $1.comp; }
966 		|	colon_ext_name
967 			{ $$.comp = make_empty (DEMANGLE_COMPONENT_TYPED_NAME);
968 			  d_left ($$.comp) = $1;
969 			  $$.last = &d_right ($$.comp);
970 			}
971 		|	direct_declarator_1
972 
973 			/* Function local variable or type.  The typespec to
974 			   our left is the type of the containing function.
975 			   This should be OK, because function local types
976 			   can not be templates, so the return types of their
977 			   members will not be mangled.  If they are hopefully
978 			   they'll end up to the right of the ::.  */
979 		|	colon_ext_name function_arglist COLONCOLON start
980 			{ $$.comp = fill_comp (DEMANGLE_COMPONENT_TYPED_NAME, $1, $2.comp);
981 			  $$.last = $2.last;
982 			  $$.comp = fill_comp (DEMANGLE_COMPONENT_LOCAL_NAME, $$.comp, $4);
983 			}
984 		|	direct_declarator_1 function_arglist COLONCOLON start
985 			{ $$.comp = $1.comp;
986 			  *$1.last = $2.comp;
987 			  $$.last = $2.last;
988 			  $$.comp = fill_comp (DEMANGLE_COMPONENT_LOCAL_NAME, $$.comp, $4);
989 			}
990 		;
991 
992 direct_declarator_1
993 		:	'(' ptr_operator declarator ')'
994 			{ $$.comp = $3.comp;
995 			  $$.last = $2.last;
996 			  *$3.last = $2.comp; }
997 		|	direct_declarator_1 function_arglist
998 			{ $$.comp = $1.comp;
999 			  *$1.last = $2.comp;
1000 			  $$.last = $2.last;
1001 			}
1002 		|	direct_declarator_1 array_indicator
1003 			{ $$.comp = $1.comp;
1004 			  *$1.last = $2;
1005 			  $$.last = &d_right ($2);
1006 			}
1007 		|	colon_ext_name function_arglist
1008 			{ $$.comp = fill_comp (DEMANGLE_COMPONENT_TYPED_NAME, $1, $2.comp);
1009 			  $$.last = $2.last;
1010 			}
1011 		|	colon_ext_name array_indicator
1012 			{ $$.comp = fill_comp (DEMANGLE_COMPONENT_TYPED_NAME, $1, $2);
1013 			  $$.last = &d_right ($2);
1014 			}
1015 		;
1016 
1017 exp	:	'(' exp1 ')'
1018 		{ $$ = $2; }
1019 	;
1020 
1021 /* Silly trick.  Only allow '>' when parenthesized, in order to
1022    handle conflict with templates.  */
1023 exp1	:	exp
1024 	;
1025 
1026 exp1	:	exp '>' exp
1027 		{ $$ = d_binary (">", $1, $3); }
1028 	;
1029 
1030 /* References.  Not allowed everywhere in template parameters, only
1031    at the top level, but treat them as expressions in case they are wrapped
1032    in parentheses.  */
1033 exp1	:	'&' start
1034 		{ $$ = fill_comp (DEMANGLE_COMPONENT_UNARY, make_operator ("&", 1), $2); }
1035 	|	'&' '(' start ')'
1036 		{ $$ = fill_comp (DEMANGLE_COMPONENT_UNARY, make_operator ("&", 1), $3); }
1037 	;
1038 
1039 /* Expressions, not including the comma operator.  */
1040 exp	:	'-' exp    %prec UNARY
1041 		{ $$ = d_unary ("-", $2); }
1042 	;
1043 
1044 exp	:	'!' exp    %prec UNARY
1045 		{ $$ = d_unary ("!", $2); }
1046 	;
1047 
1048 exp	:	'~' exp    %prec UNARY
1049 		{ $$ = d_unary ("~", $2); }
1050 	;
1051 
1052 /* Casts.  First your normal C-style cast.  If exp is a LITERAL, just change
1053    its type.  */
1054 
1055 exp	:	'(' type ')' exp  %prec UNARY
1056 		{ if ($4->type == DEMANGLE_COMPONENT_LITERAL
1057 		      || $4->type == DEMANGLE_COMPONENT_LITERAL_NEG)
1058 		    {
1059 		      $$ = $4;
1060 		      d_left ($4) = $2;
1061 		    }
1062 		  else
1063 		    $$ = fill_comp (DEMANGLE_COMPONENT_UNARY,
1064 				      fill_comp (DEMANGLE_COMPONENT_CAST, $2, NULL),
1065 				      $4);
1066 		}
1067 	;
1068 
1069 /* Mangling does not differentiate between these, so we don't need to
1070    either.  */
1071 exp	:	STATIC_CAST '<' type '>' '(' exp1 ')' %prec UNARY
1072 		{ $$ = fill_comp (DEMANGLE_COMPONENT_UNARY,
1073 				    fill_comp (DEMANGLE_COMPONENT_CAST, $3, NULL),
1074 				    $6);
1075 		}
1076 	;
1077 
1078 exp	:	DYNAMIC_CAST '<' type '>' '(' exp1 ')' %prec UNARY
1079 		{ $$ = fill_comp (DEMANGLE_COMPONENT_UNARY,
1080 				    fill_comp (DEMANGLE_COMPONENT_CAST, $3, NULL),
1081 				    $6);
1082 		}
1083 	;
1084 
1085 exp	:	REINTERPRET_CAST '<' type '>' '(' exp1 ')' %prec UNARY
1086 		{ $$ = fill_comp (DEMANGLE_COMPONENT_UNARY,
1087 				    fill_comp (DEMANGLE_COMPONENT_CAST, $3, NULL),
1088 				    $6);
1089 		}
1090 	;
1091 
1092 /* Another form of C++-style cast is "type ( exp1 )".  This creates too many
1093    conflicts to support.  For a while we supported the simpler
1094    "typespec_2 ( exp1 )", but that conflicts with "& ( start )" as a
1095    reference, deep within the wilderness of abstract declarators:
1096    Qux<int(&(*))> vs Qux<int(&(var))>, a shift-reduce conflict at the
1097    innermost left parenthesis.  So we do not support function-like casts.
1098    Fortunately they never appear in demangler output.  */
1099 
1100 /* TO INVESTIGATE: ._0 style anonymous names; anonymous namespaces */
1101 
1102 /* Binary operators in order of decreasing precedence.  */
1103 
1104 exp	:	exp '*' exp
1105 		{ $$ = d_binary ("*", $1, $3); }
1106 	;
1107 
1108 exp	:	exp '/' exp
1109 		{ $$ = d_binary ("/", $1, $3); }
1110 	;
1111 
1112 exp	:	exp '%' exp
1113 		{ $$ = d_binary ("%", $1, $3); }
1114 	;
1115 
1116 exp	:	exp '+' exp
1117 		{ $$ = d_binary ("+", $1, $3); }
1118 	;
1119 
1120 exp	:	exp '-' exp
1121 		{ $$ = d_binary ("-", $1, $3); }
1122 	;
1123 
1124 exp	:	exp LSH exp
1125 		{ $$ = d_binary ("<<", $1, $3); }
1126 	;
1127 
1128 exp	:	exp RSH exp
1129 		{ $$ = d_binary (">>", $1, $3); }
1130 	;
1131 
1132 exp	:	exp EQUAL exp
1133 		{ $$ = d_binary ("==", $1, $3); }
1134 	;
1135 
1136 exp	:	exp NOTEQUAL exp
1137 		{ $$ = d_binary ("!=", $1, $3); }
1138 	;
1139 
1140 exp	:	exp LEQ exp
1141 		{ $$ = d_binary ("<=", $1, $3); }
1142 	;
1143 
1144 exp	:	exp GEQ exp
1145 		{ $$ = d_binary (">=", $1, $3); }
1146 	;
1147 
1148 exp	:	exp '<' exp
1149 		{ $$ = d_binary ("<", $1, $3); }
1150 	;
1151 
1152 exp	:	exp '&' exp
1153 		{ $$ = d_binary ("&", $1, $3); }
1154 	;
1155 
1156 exp	:	exp '^' exp
1157 		{ $$ = d_binary ("^", $1, $3); }
1158 	;
1159 
1160 exp	:	exp '|' exp
1161 		{ $$ = d_binary ("|", $1, $3); }
1162 	;
1163 
1164 exp	:	exp ANDAND exp
1165 		{ $$ = d_binary ("&&", $1, $3); }
1166 	;
1167 
1168 exp	:	exp OROR exp
1169 		{ $$ = d_binary ("||", $1, $3); }
1170 	;
1171 
1172 /* Not 100% sure these are necessary, but they're harmless.  */
1173 exp	:	exp ARROW NAME
1174 		{ $$ = d_binary ("->", $1, $3); }
1175 	;
1176 
1177 exp	:	exp '.' NAME
1178 		{ $$ = d_binary (".", $1, $3); }
1179 	;
1180 
1181 exp	:	exp '?' exp ':' exp	%prec '?'
1182 		{ $$ = fill_comp (DEMANGLE_COMPONENT_TRINARY, make_operator ("?", 3),
1183 				    fill_comp (DEMANGLE_COMPONENT_TRINARY_ARG1, $1,
1184 						 fill_comp (DEMANGLE_COMPONENT_TRINARY_ARG2, $3, $5)));
1185 		}
1186 	;
1187 
1188 exp	:	INT
1189 	;
1190 
1191 /* Not generally allowed.  */
1192 exp	:	FLOAT
1193 	;
1194 
1195 exp	:	SIZEOF '(' type ')'	%prec UNARY
1196 		{
1197 		  /* Match the whitespacing of cplus_demangle_operators.
1198 		     It would abort on unrecognized string otherwise.  */
1199 		  $$ = d_unary ("sizeof ", $3);
1200 		}
1201 	;
1202 
1203 /* C++.  */
1204 exp     :       TRUEKEYWORD
1205 		{ struct demangle_component *i;
1206 		  i = make_name ("1", 1);
1207 		  $$ = fill_comp (DEMANGLE_COMPONENT_LITERAL,
1208 				    make_builtin_type ("bool"),
1209 				    i);
1210 		}
1211 	;
1212 
1213 exp     :       FALSEKEYWORD
1214 		{ struct demangle_component *i;
1215 		  i = make_name ("0", 1);
1216 		  $$ = fill_comp (DEMANGLE_COMPONENT_LITERAL,
1217 				    make_builtin_type ("bool"),
1218 				    i);
1219 		}
1220 	;
1221 
1222 /* end of C++.  */
1223 
1224 %%
1225 
1226 /* Apply QUALIFIERS to LHS and return a qualified component.  IS_METHOD
1227    is set if LHS is a method, in which case the qualifiers are logically
1228    applied to "this".  We apply qualifiers in a consistent order; LHS
1229    may already be qualified; duplicate qualifiers are not created.  */
1230 
1231 struct demangle_component *
1232 d_qualify (struct demangle_component *lhs, int qualifiers, int is_method)
1233 {
1234   struct demangle_component **inner_p;
1235   enum demangle_component_type type;
1236 
1237   /* For now the order is CONST (innermost), VOLATILE, RESTRICT.  */
1238 
1239 #define HANDLE_QUAL(TYPE, MTYPE, QUAL)				\
1240   if ((qualifiers & QUAL) && (type != TYPE) && (type != MTYPE))	\
1241     {								\
1242       *inner_p = fill_comp (is_method ? MTYPE : TYPE,	\
1243 			      *inner_p, NULL);			\
1244       inner_p = &d_left (*inner_p);				\
1245       type = (*inner_p)->type;					\
1246     }								\
1247   else if (type == TYPE || type == MTYPE)			\
1248     {								\
1249       inner_p = &d_left (*inner_p);				\
1250       type = (*inner_p)->type;					\
1251     }
1252 
1253   inner_p = &lhs;
1254 
1255   type = (*inner_p)->type;
1256 
1257   HANDLE_QUAL (DEMANGLE_COMPONENT_RESTRICT, DEMANGLE_COMPONENT_RESTRICT_THIS, QUAL_RESTRICT);
1258   HANDLE_QUAL (DEMANGLE_COMPONENT_VOLATILE, DEMANGLE_COMPONENT_VOLATILE_THIS, QUAL_VOLATILE);
1259   HANDLE_QUAL (DEMANGLE_COMPONENT_CONST, DEMANGLE_COMPONENT_CONST_THIS, QUAL_CONST);
1260 
1261   return lhs;
1262 }
1263 
1264 /* Return a builtin type corresponding to FLAGS.  */
1265 
1266 static struct demangle_component *
1267 d_int_type (int flags)
1268 {
1269   const char *name;
1270 
1271   switch (flags)
1272     {
1273     case INT_SIGNED | INT_CHAR:
1274       name = "signed char";
1275       break;
1276     case INT_CHAR:
1277       name = "char";
1278       break;
1279     case INT_UNSIGNED | INT_CHAR:
1280       name = "unsigned char";
1281       break;
1282     case 0:
1283     case INT_SIGNED:
1284       name = "int";
1285       break;
1286     case INT_UNSIGNED:
1287       name = "unsigned int";
1288       break;
1289     case INT_LONG:
1290     case INT_SIGNED | INT_LONG:
1291       name = "long";
1292       break;
1293     case INT_UNSIGNED | INT_LONG:
1294       name = "unsigned long";
1295       break;
1296     case INT_SHORT:
1297     case INT_SIGNED | INT_SHORT:
1298       name = "short";
1299       break;
1300     case INT_UNSIGNED | INT_SHORT:
1301       name = "unsigned short";
1302       break;
1303     case INT_LLONG | INT_LONG:
1304     case INT_SIGNED | INT_LLONG | INT_LONG:
1305       name = "long long";
1306       break;
1307     case INT_UNSIGNED | INT_LLONG | INT_LONG:
1308       name = "unsigned long long";
1309       break;
1310     default:
1311       return NULL;
1312     }
1313 
1314   return make_builtin_type (name);
1315 }
1316 
1317 /* Wrapper to create a unary operation.  */
1318 
1319 static struct demangle_component *
1320 d_unary (const char *name, struct demangle_component *lhs)
1321 {
1322   return fill_comp (DEMANGLE_COMPONENT_UNARY, make_operator (name, 1), lhs);
1323 }
1324 
1325 /* Wrapper to create a binary operation.  */
1326 
1327 static struct demangle_component *
1328 d_binary (const char *name, struct demangle_component *lhs, struct demangle_component *rhs)
1329 {
1330   return fill_comp (DEMANGLE_COMPONENT_BINARY, make_operator (name, 2),
1331 		      fill_comp (DEMANGLE_COMPONENT_BINARY_ARGS, lhs, rhs));
1332 }
1333 
1334 /* Find the end of a symbol name starting at LEXPTR.  */
1335 
1336 static const char *
1337 symbol_end (const char *lexptr)
1338 {
1339   const char *p = lexptr;
1340 
1341   while (*p && (ISALNUM (*p) || *p == '_' || *p == '$' || *p == '.'))
1342     p++;
1343 
1344   return p;
1345 }
1346 
1347 /* Take care of parsing a number (anything that starts with a digit).
1348    The number starts at P and contains LEN characters.  Store the result in
1349    YYLVAL.  */
1350 
1351 static int
1352 parse_number (const char *p, int len, int parsed_float)
1353 {
1354   int unsigned_p = 0;
1355 
1356   /* Number of "L" suffixes encountered.  */
1357   int long_p = 0;
1358 
1359   struct demangle_component *signed_type;
1360   struct demangle_component *unsigned_type;
1361   struct demangle_component *type, *name;
1362   enum demangle_component_type literal_type;
1363 
1364   if (p[0] == '-')
1365     {
1366       literal_type = DEMANGLE_COMPONENT_LITERAL_NEG;
1367       p++;
1368       len--;
1369     }
1370   else
1371     literal_type = DEMANGLE_COMPONENT_LITERAL;
1372 
1373   if (parsed_float)
1374     {
1375       /* It's a float since it contains a point or an exponent.  */
1376       char c;
1377 
1378       /* The GDB lexer checks the result of scanf at this point.  Not doing
1379          this leaves our error checking slightly weaker but only for invalid
1380          data.  */
1381 
1382       /* See if it has `f' or `l' suffix (float or long double).  */
1383 
1384       c = TOLOWER (p[len - 1]);
1385 
1386       if (c == 'f')
1387       	{
1388       	  len--;
1389       	  type = make_builtin_type ("float");
1390       	}
1391       else if (c == 'l')
1392 	{
1393 	  len--;
1394 	  type = make_builtin_type ("long double");
1395 	}
1396       else if (ISDIGIT (c) || c == '.')
1397 	type = make_builtin_type ("double");
1398       else
1399 	return ERROR;
1400 
1401       name = make_name (p, len);
1402       yylval.comp = fill_comp (literal_type, type, name);
1403 
1404       return FLOAT;
1405     }
1406 
1407   /* This treats 0x1 and 1 as different literals.  We also do not
1408      automatically generate unsigned types.  */
1409 
1410   long_p = 0;
1411   unsigned_p = 0;
1412   while (len > 0)
1413     {
1414       if (p[len - 1] == 'l' || p[len - 1] == 'L')
1415 	{
1416 	  len--;
1417 	  long_p++;
1418 	  continue;
1419 	}
1420       if (p[len - 1] == 'u' || p[len - 1] == 'U')
1421 	{
1422 	  len--;
1423 	  unsigned_p++;
1424 	  continue;
1425 	}
1426       break;
1427     }
1428 
1429   if (long_p == 0)
1430     {
1431       unsigned_type = make_builtin_type ("unsigned int");
1432       signed_type = make_builtin_type ("int");
1433     }
1434   else if (long_p == 1)
1435     {
1436       unsigned_type = make_builtin_type ("unsigned long");
1437       signed_type = make_builtin_type ("long");
1438     }
1439   else
1440     {
1441       unsigned_type = make_builtin_type ("unsigned long long");
1442       signed_type = make_builtin_type ("long long");
1443     }
1444 
1445    if (unsigned_p)
1446      type = unsigned_type;
1447    else
1448      type = signed_type;
1449 
1450    name = make_name (p, len);
1451    yylval.comp = fill_comp (literal_type, type, name);
1452 
1453    return INT;
1454 }
1455 
1456 static char backslashable[] = "abefnrtv";
1457 static char represented[] = "\a\b\e\f\n\r\t\v";
1458 
1459 /* Translate the backslash the way we would in the host character set.  */
1460 static int
1461 c_parse_backslash (int host_char, int *target_char)
1462 {
1463   const char *ix;
1464   ix = strchr (backslashable, host_char);
1465   if (! ix)
1466     return 0;
1467   else
1468     *target_char = represented[ix - backslashable];
1469   return 1;
1470 }
1471 
1472 /* Parse a C escape sequence.  STRING_PTR points to a variable
1473    containing a pointer to the string to parse.  That pointer
1474    should point to the character after the \.  That pointer
1475    is updated past the characters we use.  The value of the
1476    escape sequence is returned.
1477 
1478    A negative value means the sequence \ newline was seen,
1479    which is supposed to be equivalent to nothing at all.
1480 
1481    If \ is followed by a null character, we return a negative
1482    value and leave the string pointer pointing at the null character.
1483 
1484    If \ is followed by 000, we return 0 and leave the string pointer
1485    after the zeros.  A value of 0 does not mean end of string.  */
1486 
1487 static int
1488 cp_parse_escape (const char **string_ptr)
1489 {
1490   int target_char;
1491   int c = *(*string_ptr)++;
1492   if (c_parse_backslash (c, &target_char))
1493     return target_char;
1494   else
1495     switch (c)
1496       {
1497       case '\n':
1498 	return -2;
1499       case 0:
1500 	(*string_ptr)--;
1501 	return 0;
1502       case '^':
1503 	{
1504 	  c = *(*string_ptr)++;
1505 
1506 	  if (c == '?')
1507 	    return 0177;
1508 	  else if (c == '\\')
1509 	    target_char = cp_parse_escape (string_ptr);
1510 	  else
1511 	    target_char = c;
1512 
1513 	  /* Now target_char is something like `c', and we want to find
1514 	     its control-character equivalent.  */
1515 	  target_char = target_char & 037;
1516 
1517 	  return target_char;
1518 	}
1519 
1520       case '0':
1521       case '1':
1522       case '2':
1523       case '3':
1524       case '4':
1525       case '5':
1526       case '6':
1527       case '7':
1528 	{
1529 	  int i = c - '0';
1530 	  int count = 0;
1531 	  while (++count < 3)
1532 	    {
1533 	      c = (**string_ptr);
1534 	      if (c >= '0' && c <= '7')
1535 		{
1536 		  (*string_ptr)++;
1537 		  i *= 8;
1538 		  i += c - '0';
1539 		}
1540 	      else
1541 		{
1542 		  break;
1543 		}
1544 	    }
1545 	  return i;
1546 	}
1547       default:
1548 	return c;
1549       }
1550 }
1551 
1552 #define HANDLE_SPECIAL(string, comp)				\
1553   if (strncmp (tokstart, string, sizeof (string) - 1) == 0)	\
1554     {								\
1555       lexptr = tokstart + sizeof (string) - 1;			\
1556       yylval.lval = comp;					\
1557       return DEMANGLER_SPECIAL;					\
1558     }
1559 
1560 #define HANDLE_TOKEN2(string, token)			\
1561   if (lexptr[1] == string[1])				\
1562     {							\
1563       lexptr += 2;					\
1564       yylval.opname = string;				\
1565       return token;					\
1566     }
1567 
1568 #define HANDLE_TOKEN3(string, token)			\
1569   if (lexptr[1] == string[1] && lexptr[2] == string[2])	\
1570     {							\
1571       lexptr += 3;					\
1572       yylval.opname = string;				\
1573       return token;					\
1574     }
1575 
1576 /* Read one token, getting characters through LEXPTR.  */
1577 
1578 static int
1579 yylex (void)
1580 {
1581   int c;
1582   int namelen;
1583   const char *tokstart;
1584 
1585  retry:
1586   prev_lexptr = lexptr;
1587   tokstart = lexptr;
1588 
1589   switch (c = *tokstart)
1590     {
1591     case 0:
1592       return 0;
1593 
1594     case ' ':
1595     case '\t':
1596     case '\n':
1597       lexptr++;
1598       goto retry;
1599 
1600     case '\'':
1601       /* We either have a character constant ('0' or '\177' for example)
1602 	 or we have a quoted symbol reference ('foo(int,int)' in C++
1603 	 for example). */
1604       lexptr++;
1605       c = *lexptr++;
1606       if (c == '\\')
1607 	c = cp_parse_escape (&lexptr);
1608       else if (c == '\'')
1609 	{
1610 	  yyerror (_("empty character constant"));
1611 	  return ERROR;
1612 	}
1613 
1614       c = *lexptr++;
1615       if (c != '\'')
1616 	{
1617 	  yyerror (_("invalid character constant"));
1618 	  return ERROR;
1619 	}
1620 
1621       /* FIXME: We should refer to a canonical form of the character,
1622 	 presumably the same one that appears in manglings - the decimal
1623 	 representation.  But if that isn't in our input then we have to
1624 	 allocate memory for it somewhere.  */
1625       yylval.comp = fill_comp (DEMANGLE_COMPONENT_LITERAL,
1626 				 make_builtin_type ("char"),
1627 				 make_name (tokstart, lexptr - tokstart));
1628 
1629       return INT;
1630 
1631     case '(':
1632       if (strncmp (tokstart, "(anonymous namespace)", 21) == 0)
1633 	{
1634 	  lexptr += 21;
1635 	  yylval.comp = make_name ("(anonymous namespace)",
1636 				     sizeof "(anonymous namespace)" - 1);
1637 	  return NAME;
1638 	}
1639 	/* FALL THROUGH */
1640 
1641     case ')':
1642     case ',':
1643       lexptr++;
1644       return c;
1645 
1646     case '.':
1647       if (lexptr[1] == '.' && lexptr[2] == '.')
1648 	{
1649 	  lexptr += 3;
1650 	  return ELLIPSIS;
1651 	}
1652 
1653       /* Might be a floating point number.  */
1654       if (lexptr[1] < '0' || lexptr[1] > '9')
1655 	goto symbol;		/* Nope, must be a symbol. */
1656 
1657       goto try_number;
1658 
1659     case '-':
1660       HANDLE_TOKEN2 ("-=", ASSIGN_MODIFY);
1661       HANDLE_TOKEN2 ("--", DECREMENT);
1662       HANDLE_TOKEN2 ("->", ARROW);
1663 
1664       /* For construction vtables.  This is kind of hokey.  */
1665       if (strncmp (tokstart, "-in-", 4) == 0)
1666 	{
1667 	  lexptr += 4;
1668 	  return CONSTRUCTION_IN;
1669 	}
1670 
1671       if (lexptr[1] < '0' || lexptr[1] > '9')
1672 	{
1673 	  lexptr++;
1674 	  return '-';
1675 	}
1676       /* FALL THRU into number case.  */
1677 
1678     try_number:
1679     case '0':
1680     case '1':
1681     case '2':
1682     case '3':
1683     case '4':
1684     case '5':
1685     case '6':
1686     case '7':
1687     case '8':
1688     case '9':
1689       {
1690 	/* It's a number.  */
1691 	int got_dot = 0, got_e = 0, toktype;
1692 	const char *p = tokstart;
1693 	int hex = 0;
1694 
1695 	if (c == '-')
1696 	  p++;
1697 
1698 	if (c == '0' && (p[1] == 'x' || p[1] == 'X'))
1699 	  {
1700 	    p += 2;
1701 	    hex = 1;
1702 	  }
1703 	else if (c == '0' && (p[1]=='t' || p[1]=='T' || p[1]=='d' || p[1]=='D'))
1704 	  {
1705 	    p += 2;
1706 	    hex = 0;
1707 	  }
1708 
1709 	for (;; ++p)
1710 	  {
1711 	    /* This test includes !hex because 'e' is a valid hex digit
1712 	       and thus does not indicate a floating point number when
1713 	       the radix is hex.  */
1714 	    if (!hex && !got_e && (*p == 'e' || *p == 'E'))
1715 	      got_dot = got_e = 1;
1716 	    /* This test does not include !hex, because a '.' always indicates
1717 	       a decimal floating point number regardless of the radix.
1718 
1719 	       NOTE drow/2005-03-09: This comment is not accurate in C99;
1720 	       however, it's not clear that all the floating point support
1721 	       in this file is doing any good here.  */
1722 	    else if (!got_dot && *p == '.')
1723 	      got_dot = 1;
1724 	    else if (got_e && (p[-1] == 'e' || p[-1] == 'E')
1725 		     && (*p == '-' || *p == '+'))
1726 	      /* This is the sign of the exponent, not the end of the
1727 		 number.  */
1728 	      continue;
1729 	    /* We will take any letters or digits.  parse_number will
1730 	       complain if past the radix, or if L or U are not final.  */
1731 	    else if (! ISALNUM (*p))
1732 	      break;
1733 	  }
1734 	toktype = parse_number (tokstart, p - tokstart, got_dot|got_e);
1735         if (toktype == ERROR)
1736 	  {
1737 	    char *err_copy = (char *) alloca (p - tokstart + 1);
1738 
1739 	    memcpy (err_copy, tokstart, p - tokstart);
1740 	    err_copy[p - tokstart] = 0;
1741 	    yyerror (_("invalid number"));
1742 	    return ERROR;
1743 	  }
1744 	lexptr = p;
1745 	return toktype;
1746       }
1747 
1748     case '+':
1749       HANDLE_TOKEN2 ("+=", ASSIGN_MODIFY);
1750       HANDLE_TOKEN2 ("++", INCREMENT);
1751       lexptr++;
1752       return c;
1753     case '*':
1754       HANDLE_TOKEN2 ("*=", ASSIGN_MODIFY);
1755       lexptr++;
1756       return c;
1757     case '/':
1758       HANDLE_TOKEN2 ("/=", ASSIGN_MODIFY);
1759       lexptr++;
1760       return c;
1761     case '%':
1762       HANDLE_TOKEN2 ("%=", ASSIGN_MODIFY);
1763       lexptr++;
1764       return c;
1765     case '|':
1766       HANDLE_TOKEN2 ("|=", ASSIGN_MODIFY);
1767       HANDLE_TOKEN2 ("||", OROR);
1768       lexptr++;
1769       return c;
1770     case '&':
1771       HANDLE_TOKEN2 ("&=", ASSIGN_MODIFY);
1772       HANDLE_TOKEN2 ("&&", ANDAND);
1773       lexptr++;
1774       return c;
1775     case '^':
1776       HANDLE_TOKEN2 ("^=", ASSIGN_MODIFY);
1777       lexptr++;
1778       return c;
1779     case '!':
1780       HANDLE_TOKEN2 ("!=", NOTEQUAL);
1781       lexptr++;
1782       return c;
1783     case '<':
1784       HANDLE_TOKEN3 ("<<=", ASSIGN_MODIFY);
1785       HANDLE_TOKEN2 ("<=", LEQ);
1786       HANDLE_TOKEN2 ("<<", LSH);
1787       lexptr++;
1788       return c;
1789     case '>':
1790       HANDLE_TOKEN3 (">>=", ASSIGN_MODIFY);
1791       HANDLE_TOKEN2 (">=", GEQ);
1792       HANDLE_TOKEN2 (">>", RSH);
1793       lexptr++;
1794       return c;
1795     case '=':
1796       HANDLE_TOKEN2 ("==", EQUAL);
1797       lexptr++;
1798       return c;
1799     case ':':
1800       HANDLE_TOKEN2 ("::", COLONCOLON);
1801       lexptr++;
1802       return c;
1803 
1804     case '[':
1805     case ']':
1806     case '?':
1807     case '@':
1808     case '~':
1809     case '{':
1810     case '}':
1811     symbol:
1812       lexptr++;
1813       return c;
1814 
1815     case '"':
1816       /* These can't occur in C++ names.  */
1817       yyerror (_("unexpected string literal"));
1818       return ERROR;
1819     }
1820 
1821   if (!(c == '_' || c == '$' || ISALPHA (c)))
1822     {
1823       /* We must have come across a bad character (e.g. ';').  */
1824       yyerror (_("invalid character"));
1825       return ERROR;
1826     }
1827 
1828   /* It's a name.  See how long it is.  */
1829   namelen = 0;
1830   do
1831     c = tokstart[++namelen];
1832   while (ISALNUM (c) || c == '_' || c == '$');
1833 
1834   lexptr += namelen;
1835 
1836   /* Catch specific keywords.  Notice that some of the keywords contain
1837      spaces, and are sorted by the length of the first word.  They must
1838      all include a trailing space in the string comparison.  */
1839   switch (namelen)
1840     {
1841     case 16:
1842       if (strncmp (tokstart, "reinterpret_cast", 16) == 0)
1843         return REINTERPRET_CAST;
1844       break;
1845     case 12:
1846       if (strncmp (tokstart, "construction vtable for ", 24) == 0)
1847 	{
1848 	  lexptr = tokstart + 24;
1849 	  return CONSTRUCTION_VTABLE;
1850 	}
1851       if (strncmp (tokstart, "dynamic_cast", 12) == 0)
1852         return DYNAMIC_CAST;
1853       break;
1854     case 11:
1855       if (strncmp (tokstart, "static_cast", 11) == 0)
1856         return STATIC_CAST;
1857       break;
1858     case 9:
1859       HANDLE_SPECIAL ("covariant return thunk to ", DEMANGLE_COMPONENT_COVARIANT_THUNK);
1860       HANDLE_SPECIAL ("reference temporary for ", DEMANGLE_COMPONENT_REFTEMP);
1861       break;
1862     case 8:
1863       HANDLE_SPECIAL ("typeinfo for ", DEMANGLE_COMPONENT_TYPEINFO);
1864       HANDLE_SPECIAL ("typeinfo fn for ", DEMANGLE_COMPONENT_TYPEINFO_FN);
1865       HANDLE_SPECIAL ("typeinfo name for ", DEMANGLE_COMPONENT_TYPEINFO_NAME);
1866       if (strncmp (tokstart, "operator", 8) == 0)
1867 	return OPERATOR;
1868       if (strncmp (tokstart, "restrict", 8) == 0)
1869 	return RESTRICT;
1870       if (strncmp (tokstart, "unsigned", 8) == 0)
1871 	return UNSIGNED;
1872       if (strncmp (tokstart, "template", 8) == 0)
1873 	return TEMPLATE;
1874       if (strncmp (tokstart, "volatile", 8) == 0)
1875 	return VOLATILE_KEYWORD;
1876       break;
1877     case 7:
1878       HANDLE_SPECIAL ("virtual thunk to ", DEMANGLE_COMPONENT_VIRTUAL_THUNK);
1879       if (strncmp (tokstart, "wchar_t", 7) == 0)
1880 	return WCHAR_T;
1881       break;
1882     case 6:
1883       if (strncmp (tokstart, "global constructors keyed to ", 29) == 0)
1884 	{
1885 	  const char *p;
1886 	  lexptr = tokstart + 29;
1887 	  yylval.lval = DEMANGLE_COMPONENT_GLOBAL_CONSTRUCTORS;
1888 	  /* Find the end of the symbol.  */
1889 	  p = symbol_end (lexptr);
1890 	  yylval.comp = make_name (lexptr, p - lexptr);
1891 	  lexptr = p;
1892 	  return DEMANGLER_SPECIAL;
1893 	}
1894       if (strncmp (tokstart, "global destructors keyed to ", 28) == 0)
1895 	{
1896 	  const char *p;
1897 	  lexptr = tokstart + 28;
1898 	  yylval.lval = DEMANGLE_COMPONENT_GLOBAL_DESTRUCTORS;
1899 	  /* Find the end of the symbol.  */
1900 	  p = symbol_end (lexptr);
1901 	  yylval.comp = make_name (lexptr, p - lexptr);
1902 	  lexptr = p;
1903 	  return DEMANGLER_SPECIAL;
1904 	}
1905 
1906       HANDLE_SPECIAL ("vtable for ", DEMANGLE_COMPONENT_VTABLE);
1907       if (strncmp (tokstart, "delete", 6) == 0)
1908 	return DELETE;
1909       if (strncmp (tokstart, "struct", 6) == 0)
1910 	return STRUCT;
1911       if (strncmp (tokstart, "signed", 6) == 0)
1912 	return SIGNED_KEYWORD;
1913       if (strncmp (tokstart, "sizeof", 6) == 0)
1914 	return SIZEOF;
1915       if (strncmp (tokstart, "double", 6) == 0)
1916 	return DOUBLE_KEYWORD;
1917       break;
1918     case 5:
1919       HANDLE_SPECIAL ("guard variable for ", DEMANGLE_COMPONENT_GUARD);
1920       if (strncmp (tokstart, "false", 5) == 0)
1921 	return FALSEKEYWORD;
1922       if (strncmp (tokstart, "class", 5) == 0)
1923 	return CLASS;
1924       if (strncmp (tokstart, "union", 5) == 0)
1925 	return UNION;
1926       if (strncmp (tokstart, "float", 5) == 0)
1927 	return FLOAT_KEYWORD;
1928       if (strncmp (tokstart, "short", 5) == 0)
1929 	return SHORT;
1930       if (strncmp (tokstart, "const", 5) == 0)
1931 	return CONST_KEYWORD;
1932       break;
1933     case 4:
1934       if (strncmp (tokstart, "void", 4) == 0)
1935 	return VOID;
1936       if (strncmp (tokstart, "bool", 4) == 0)
1937 	return BOOL;
1938       if (strncmp (tokstart, "char", 4) == 0)
1939 	return CHAR;
1940       if (strncmp (tokstart, "enum", 4) == 0)
1941 	return ENUM;
1942       if (strncmp (tokstart, "long", 4) == 0)
1943 	return LONG;
1944       if (strncmp (tokstart, "true", 4) == 0)
1945 	return TRUEKEYWORD;
1946       break;
1947     case 3:
1948       HANDLE_SPECIAL ("VTT for ", DEMANGLE_COMPONENT_VTT);
1949       HANDLE_SPECIAL ("non-virtual thunk to ", DEMANGLE_COMPONENT_THUNK);
1950       if (strncmp (tokstart, "new", 3) == 0)
1951 	return NEW;
1952       if (strncmp (tokstart, "int", 3) == 0)
1953 	return INT_KEYWORD;
1954       break;
1955     default:
1956       break;
1957     }
1958 
1959   yylval.comp = make_name (tokstart, namelen);
1960   return NAME;
1961 }
1962 
1963 static void
1964 yyerror (char *msg)
1965 {
1966   if (global_errmsg)
1967     return;
1968 
1969   error_lexptr = prev_lexptr;
1970   global_errmsg = msg ? msg : "parse error";
1971 }
1972 
1973 /* Allocate a chunk of the components we'll need to build a tree.  We
1974    generally allocate too many components, but the extra memory usage
1975    doesn't hurt because the trees are temporary and the storage is
1976    reused.  More may be allocated later, by d_grab.  */
1977 static struct demangle_info *
1978 allocate_info (void)
1979 {
1980   struct demangle_info *info = malloc (sizeof (struct demangle_info));
1981 
1982   info->next = NULL;
1983   info->used = 0;
1984   return info;
1985 }
1986 
1987 /* Convert RESULT to a string.  The return value is allocated
1988    using xmalloc.  ESTIMATED_LEN is used only as a guide to the
1989    length of the result.  This functions handles a few cases that
1990    cplus_demangle_print does not, specifically the global destructor
1991    and constructor labels.  */
1992 
1993 char *
1994 cp_comp_to_string (struct demangle_component *result, int estimated_len)
1995 {
1996   size_t err;
1997 
1998   return cplus_demangle_print (DMGL_PARAMS | DMGL_ANSI, result, estimated_len,
1999 			       &err);
2000 }
2001 
2002 /* A convenience function to allocate and initialize a new struct
2003    demangled_parse_info.  */
2004 
2005 struct demangle_parse_info *
2006 cp_new_demangle_parse_info (void)
2007 {
2008   struct demangle_parse_info *info;
2009 
2010   info = malloc (sizeof (struct demangle_parse_info));
2011   info->info = NULL;
2012   info->tree = NULL;
2013   obstack_init (&info->obstack);
2014 
2015   return info;
2016 }
2017 
2018 /* Free any memory associated with the given PARSE_INFO.  */
2019 
2020 void
2021 cp_demangled_name_parse_free (struct demangle_parse_info *parse_info)
2022 {
2023   struct demangle_info *info = parse_info->info;
2024 
2025   /* Free any allocated chunks of memory for the parse.  */
2026   while (info != NULL)
2027     {
2028       struct demangle_info *next = info->next;
2029 
2030       free (info);
2031       info = next;
2032     }
2033 
2034   /* Free any memory allocated during typedef replacement.  */
2035   obstack_free (&parse_info->obstack, NULL);
2036 
2037   /* Free the parser info.  */
2038   free (parse_info);
2039 }
2040 
2041 /* Merge the two parse trees given by DEST and SRC.  The parse tree
2042    in SRC is attached to DEST at the node represented by TARGET.
2043    SRC is then freed.
2044 
2045    NOTE 1: Since there is no API to merge obstacks, this function does
2046    even attempt to try it.  Fortunately, we do not (yet?) need this ability.
2047    The code will assert if SRC->obstack is not empty.
2048 
2049    NOTE 2: The string from which SRC was parsed must not be freed, since
2050    this function will place pointers to that string into DEST.  */
2051 
2052 void
2053 cp_merge_demangle_parse_infos (struct demangle_parse_info *dest,
2054 			       struct demangle_component *target,
2055 			       struct demangle_parse_info *src)
2056 
2057 {
2058   struct demangle_info *di;
2059 
2060   /* Copy the SRC's parse data into DEST.  */
2061   *target = *src->tree;
2062   di = dest->info;
2063   while (di->next != NULL)
2064     di = di->next;
2065   di->next = src->info;
2066 
2067   /* Clear the (pointer to) SRC's parse data so that it is not freed when
2068      cp_demangled_parse_info_free is called.  */
2069   src->info = NULL;
2070 
2071   /* Free SRC.  */
2072   cp_demangled_name_parse_free (src);
2073 }
2074 
2075 /* Convert a demangled name to a demangle_component tree.  On success,
2076    a structure containing the root of the new tree is returned; it must
2077    be freed by calling cp_demangled_name_parse_free. On error, NULL is
2078    returned, and an error message will be set in *ERRMSG (which does
2079    not need to be freed).  */
2080 
2081 struct demangle_parse_info *
2082 cp_demangled_name_to_comp (const char *demangled_name, const char **errmsg)
2083 {
2084   static char errbuf[60];
2085   struct demangle_parse_info *result;
2086 
2087   prev_lexptr = lexptr = demangled_name;
2088   error_lexptr = NULL;
2089   global_errmsg = NULL;
2090 
2091   demangle_info = allocate_info ();
2092 
2093   result = cp_new_demangle_parse_info ();
2094   result->info = demangle_info;
2095 
2096   if (yyparse ())
2097     {
2098       if (global_errmsg && errmsg)
2099 	{
2100 	  snprintf (errbuf, sizeof (errbuf) - 2, "%s, near `%s",
2101 		    global_errmsg, error_lexptr);
2102 	  strcat (errbuf, "'");
2103 	  *errmsg = errbuf;
2104 	}
2105       cp_demangled_name_parse_free (result);
2106       return NULL;
2107     }
2108 
2109   result->tree = global_result;
2110   global_result = NULL;
2111 
2112   return result;
2113 }
2114 
2115 #ifdef TEST_CPNAMES
2116 
2117 static void
2118 cp_print (struct demangle_component *result)
2119 {
2120   char *str;
2121   size_t err = 0;
2122 
2123   str = cplus_demangle_print (DMGL_PARAMS | DMGL_ANSI, result, 64, &err);
2124   if (str == NULL)
2125     return;
2126 
2127   fputs (str, stdout);
2128 
2129   free (str);
2130 }
2131 
2132 static char
2133 trim_chars (char *lexptr, char **extra_chars)
2134 {
2135   char *p = (char *) symbol_end (lexptr);
2136   char c = 0;
2137 
2138   if (*p)
2139     {
2140       c = *p;
2141       *p = 0;
2142       *extra_chars = p + 1;
2143     }
2144 
2145   return c;
2146 }
2147 
2148 /* When this file is built as a standalone program, xmalloc comes from
2149    libiberty --- in which case we have to provide xfree ourselves.  */
2150 
2151 void
2152 xfree (void *ptr)
2153 {
2154   if (ptr != NULL)
2155     {
2156       /* Literal `free' would get translated back to xfree again.  */
2157       CONCAT2 (fr,ee) (ptr);
2158     }
2159 }
2160 
2161 /* GDB normally defines internal_error itself, but when this file is built
2162    as a standalone program, we must also provide an implementation.  */
2163 
2164 void
2165 internal_error (const char *file, int line, const char *fmt, ...)
2166 {
2167   va_list ap;
2168 
2169   va_start (ap, fmt);
2170   fprintf (stderr, "%s:%d: internal error: ", file, line);
2171   vfprintf (stderr, fmt, ap);
2172   exit (1);
2173 }
2174 
2175 int
2176 main (int argc, char **argv)
2177 {
2178   char *str2, *extra_chars = "", c;
2179   char buf[65536];
2180   int arg;
2181   const char *errmsg;
2182   struct demangle_parse_info *result;
2183 
2184   arg = 1;
2185   if (argv[arg] && strcmp (argv[arg], "--debug") == 0)
2186     {
2187       yydebug = 1;
2188       arg++;
2189     }
2190 
2191   if (argv[arg] == NULL)
2192     while (fgets (buf, 65536, stdin) != NULL)
2193       {
2194 	int len;
2195 	buf[strlen (buf) - 1] = 0;
2196 	/* Use DMGL_VERBOSE to get expanded standard substitutions.  */
2197 	c = trim_chars (buf, &extra_chars);
2198 	str2 = cplus_demangle (buf, DMGL_PARAMS | DMGL_ANSI | DMGL_VERBOSE);
2199 	if (str2 == NULL)
2200 	  {
2201 	    printf ("Demangling error\n");
2202 	    if (c)
2203 	      printf ("%s%c%s\n", buf, c, extra_chars);
2204 	    else
2205 	      printf ("%s\n", buf);
2206 	    continue;
2207 	  }
2208 	result = cp_demangled_name_to_comp (str2, &errmsg);
2209 	if (result == NULL)
2210 	  {
2211 	    fputs (errmsg, stderr);
2212 	    fputc ('\n', stderr);
2213 	    continue;
2214 	  }
2215 
2216 	cp_print (result->tree);
2217 	cp_demangled_name_parse_free (result);
2218 
2219 	free (str2);
2220 	if (c)
2221 	  {
2222 	    putchar (c);
2223 	    fputs (extra_chars, stdout);
2224 	  }
2225 	putchar ('\n');
2226       }
2227   else
2228     {
2229       result = cp_demangled_name_to_comp (argv[arg], &errmsg);
2230       if (result == NULL)
2231 	{
2232 	  fputs (errmsg, stderr);
2233 	  fputc ('\n', stderr);
2234 	  return 0;
2235 	}
2236       cp_print (result->tree);
2237       cp_demangled_name_parse_free (result);
2238       putchar ('\n');
2239     }
2240   return 0;
2241 }
2242 
2243 #endif
2244