OSDN Git Service

2010-02-10 Tobias Burnus <burnus@net-b.de>
[pf3gnuchains/gcc-fork.git] / gcc / gengtype-parse.c
1 /* Process source files and output type information.
2    Copyright (C) 2006, 2007 Free Software Foundation, Inc.
3
4 This file is part of GCC.
5
6 GCC is free software; you can redistribute it and/or modify it under
7 the terms of the GNU General Public License as published by the Free
8 Software Foundation; either version 3, or (at your option) any later
9 version.
10
11 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
12 WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
14 for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with GCC; see the file COPYING3.  If not see
18 <http://www.gnu.org/licenses/>.  */
19
20 #include "bconfig.h"
21 #include "system.h"
22 #include "gengtype.h"
23
24 /* This is a simple recursive-descent parser which understands a subset of
25    the C type grammar.
26
27    Rule functions are suffixed _seq if they scan a sequence of items;
28    _opt if they may consume zero tokens; _seqopt if both are true.  The
29    "consume_" prefix indicates that a sequence of tokens is parsed for
30    syntactic correctness and then thrown away.  */
31
32 /* Simple one-token lookahead mechanism.  */
33
34 struct token
35 {
36   const char *value;
37   int code;
38   bool valid;
39 };
40 static struct token T;
41
42 /* Retrieve the code of the current token; if there is no current token,
43    get the next one from the lexer.  */
44 static inline int
45 token (void)
46 {
47   if (!T.valid)
48     {
49       T.code = yylex (&T.value);
50       T.valid = true;
51     }
52   return T.code;
53 }
54
55 /* Retrieve the value of the current token (if any) and mark it consumed.
56    The next call to token() will get another token from the lexer.  */
57 static inline const char *
58 advance (void)
59 {
60   T.valid = false;
61   return T.value;
62 }
63
64 /* Diagnostics.  */
65
66 /* This array is indexed by the token code minus CHAR_TOKEN_OFFSET.  */
67 static const char *const token_names[] = {
68   "GTY",
69   "typedef",
70   "extern",
71   "static",
72   "union",
73   "struct",
74   "enum",
75   "VEC",
76   "DEF_VEC_[OP]",
77   "DEF_VEC_I",
78   "DEF_VEC_ALLOC_[IOP]",
79   "...",
80   "ptr_alias",
81   "nested_ptr",
82   "a param<N>_is option",
83   "a number",
84   "a scalar type",
85   "an identifier",
86   "a string constant",
87   "a character constant",
88   "an array declarator",
89 };
90
91 /* This array is indexed by token code minus FIRST_TOKEN_WITH_VALUE.  */
92 static const char *const token_value_format[] = {
93   "%s",
94   "'%s'",
95   "'%s'",
96   "'%s'",
97   "'\"%s\"'",
98   "\"'%s'\"",
99   "'[%s]'",
100 };
101
102 /* Produce a printable representation for a token defined by CODE and
103    VALUE.  This sometimes returns pointers into malloc memory and
104    sometimes not, therefore it is unsafe to free the pointer it
105    returns, so that memory is leaked.  This does not matter, as this
106    function is only used for diagnostics, and in a successful run of
107    the program there will be none.  */
108 static const char *
109 print_token (int code, const char *value)
110 {
111   if (code < CHAR_TOKEN_OFFSET)
112     return xasprintf ("'%c'", code);
113   else if (code < FIRST_TOKEN_WITH_VALUE)
114     return xasprintf ("'%s'", token_names[code - CHAR_TOKEN_OFFSET]);
115   else if (!value)
116     return token_names[code - CHAR_TOKEN_OFFSET]; /* don't quote these */
117   else
118     return xasprintf (token_value_format[code - FIRST_TOKEN_WITH_VALUE],
119                       value);
120 }
121
122 /* Convenience wrapper around print_token which produces the printable
123    representation of the current token.  */
124 static inline const char *
125 print_cur_token (void)
126 {
127   return print_token (T.code, T.value);
128 }
129
130 /* Report a parse error on the current line, with diagnostic MSG.
131    Behaves as standard printf with respect to additional arguments and
132    format escapes.  */
133 static void ATTRIBUTE_PRINTF_1
134 parse_error (const char *msg, ...)
135 {
136   va_list ap;
137
138   fprintf (stderr, "%s:%d: parse error: ", lexer_line.file, lexer_line.line);
139
140   va_start (ap, msg);
141   vfprintf (stderr, msg, ap);
142   va_end (ap);
143
144   fputc ('\n', stderr);
145
146   hit_error = true;
147 }
148
149 /* If the next token does not have code T, report a parse error; otherwise
150    return the token's value.  */
151 static const char *
152 require (int t)
153 {
154   int u = token ();
155   const char *v = advance ();
156   if (u != t)
157     {
158       parse_error ("expected %s, have %s",
159                    print_token (t, 0), print_token (u, v));
160       return 0;
161     }
162   return v;
163 }
164
165 /* If the next token does not have one of the codes T1 or T2, report a
166    parse error; otherwise return the token's value.  */
167 static const char *
168 require2 (int t1, int t2)
169 {
170   int u = token ();
171   const char *v = advance ();
172   if (u != t1 && u != t2)
173     {
174       parse_error ("expected %s or %s, have %s",
175                    print_token (t1, 0), print_token (t2, 0),
176                    print_token (u, v));
177       return 0;
178     }
179   return v;
180 }
181
182 /* Near-terminals.  */
183
184 /* C-style string constant concatenation: STRING+
185    Bare STRING should appear nowhere else in this file.  */
186 static const char *
187 string_seq (void)
188 {
189   const char *s1, *s2;
190   size_t l1, l2;
191   char *buf;
192
193   s1 = require (STRING);
194   if (s1 == 0)
195     return "";
196   while (token () == STRING)
197     {
198       s2 = advance ();
199
200       l1 = strlen (s1);
201       l2 = strlen (s2);
202       buf = XRESIZEVEC (char, CONST_CAST(char *, s1), l1 + l2 + 1);
203       memcpy (buf + l1, s2, l2 + 1);
204       XDELETE (CONST_CAST (char *, s2));
205       s1 = buf;
206     }
207   return s1;
208 }
209
210 /* typedef_name: either an ID, or VEC(x,y) which is translated to VEC_x_y.
211    Use only where VEC(x,y) is legitimate, i.e. in positions where a
212    typedef name may appear.  */
213 static const char *
214 typedef_name (void)
215 {
216   if (token () == VEC_TOKEN)
217     {
218       const char *c1, *c2, *r;
219       advance ();
220       require ('(');
221       c1 = require2 (ID, SCALAR);
222       require (',');
223       c2 = require (ID);
224       require (')');
225       r = concat ("VEC_", c1, "_", c2, (char *)0);
226       free (CONST_CAST (char *, c1));
227       free (CONST_CAST (char *, c2));
228       return r;
229     }
230   else
231     return require (ID);
232 }
233
234 /* Absorb a sequence of tokens delimited by balanced ()[]{}.  */
235 static void
236 consume_balanced (int opener, int closer)
237 {
238   require (opener);
239   for (;;)
240     switch (token ())
241       {
242       default: advance (); break;
243       case '(': consume_balanced ('(',')'); break;
244       case '[': consume_balanced ('[',']'); break;
245       case '{': consume_balanced ('{','}'); break;
246
247       case '}':
248       case ']':
249       case ')':
250         if (token () != closer)
251           parse_error ("unbalanced delimiters - expected '%c', have '%c'",
252                        closer, token ());
253         advance ();
254         return;
255
256       case EOF_TOKEN:
257         parse_error ("unexpected end of file within %c%c-delimited construct",
258                      opener, closer);
259         return;
260       }
261 }
262
263 /* Absorb a sequence of tokens, possibly including ()[]{}-delimited
264    expressions, until we encounter a semicolon outside any such
265    delimiters; absorb that too.  If IMMEDIATE is true, it is an error
266    if the semicolon is not the first token encountered.  */
267 static void
268 consume_until_semi (bool immediate)
269 {
270   if (immediate && token () != ';')
271     require (';');
272   for (;;)
273     switch (token ())
274       {
275       case ';': advance (); return;
276       default:  advance (); break;
277
278       case '(': consume_balanced ('(',')'); break;
279       case '[': consume_balanced ('[',']'); break;
280       case '{': consume_balanced ('{','}'); break;
281
282       case '}':
283       case ']':
284       case ')':
285         parse_error ("unmatched '%c' while scanning for ';'", token ());
286         return;
287
288       case EOF_TOKEN:
289         parse_error ("unexpected end of file while scanning for ';'");
290         return;
291       }
292 }
293
294 /* Absorb a sequence of tokens, possibly including ()[]{}-delimited
295    expressions, until we encounter a comma or semicolon outside any
296    such delimiters; absorb that too.  If IMMEDIATE is true, it is an
297    error if the comma or semicolon is not the first token encountered.
298    Returns true if the loop ended with a comma.  */
299 static bool
300 consume_until_comma_or_semi (bool immediate)
301 {
302   if (immediate && token () != ',' && token () != ';')
303     require2 (',', ';');
304   for (;;)
305     switch (token ())
306       {
307       case ',': advance (); return true;
308       case ';': advance (); return false;
309       default:  advance (); break;
310
311       case '(': consume_balanced ('(',')'); break;
312       case '[': consume_balanced ('[',']'); break;
313       case '{': consume_balanced ('{','}'); break;
314
315       case '}':
316       case ']':
317       case ')':
318         parse_error ("unmatched '%s' while scanning for ',' or ';'",
319                      print_cur_token ());
320         return false;
321
322       case EOF_TOKEN:
323         parse_error ("unexpected end of file while scanning for ',' or ';'");
324         return false;
325       }
326 }
327
328 \f
329 /* GTY(()) option handling.  */
330 static type_p type (options_p *optsp, bool nested);
331
332 /* Optional parenthesized string: ('(' string_seq ')')? */
333 static options_p
334 str_optvalue_opt (options_p prev)
335 {
336   const char *name = advance ();
337   const char *value = "";
338   if (token () == '(')
339     {
340       advance ();
341       value = string_seq ();
342       require (')');
343     }
344   return create_option (prev, name, value);
345 }
346
347 /* absdecl: type '*'*
348    -- a vague approximation to what the C standard calls an abstract
349    declarator.  The only kinds that are actually used are those that
350    are just a bare type and those that have trailing pointer-stars.
351    Further kinds should be implemented if and when they become
352    necessary.  Used only within GTY(()) option values, therefore
353    further GTY(()) tags within the type are invalid.  Note that the
354    return value has already been run through adjust_field_type.  */
355 static type_p
356 absdecl (void)
357 {
358   type_p ty;
359   options_p opts;
360
361   ty = type (&opts, true);
362   while (token () == '*')
363     {
364       ty = create_pointer (ty);
365       advance ();
366     }
367
368   if (opts)
369     parse_error ("nested GTY(()) options are invalid");
370
371   return adjust_field_type (ty, 0);
372 }
373
374 /* Type-option: '(' absdecl ')' */
375 static options_p
376 type_optvalue (options_p prev, const char *name)
377 {
378   type_p ty;
379   require ('(');
380   ty = absdecl ();
381   require (')');
382   return create_option (prev, name, ty);
383 }
384
385 /* Nested pointer data: '(' type '*'* ',' string_seq ',' string_seq ')' */
386 static options_p
387 nestedptr_optvalue (options_p prev)
388 {
389   type_p ty;
390   const char *from, *to;
391
392   require ('(');
393   ty = absdecl ();
394   require (',');
395   to = string_seq ();
396   require (',');
397   from = string_seq ();
398   require (')');
399
400   return create_nested_ptr_option (prev, ty, to, from);
401 }
402
403 /* One GTY(()) option:
404          ID str_optvalue_opt
405        | PTR_ALIAS type_optvalue
406        | PARAM_IS type_optvalue
407        | NESTED_PTR nestedptr_optvalue
408  */
409 static options_p
410 option (options_p prev)
411 {
412   switch (token ())
413     {
414     case ID:
415       return str_optvalue_opt (prev);
416
417     case PTR_ALIAS:
418       advance ();
419       return type_optvalue (prev, "ptr_alias");
420
421     case PARAM_IS:
422       return type_optvalue (prev, advance ());
423
424     case NESTED_PTR:
425       advance ();
426       return nestedptr_optvalue (prev);
427
428     default:
429       parse_error ("expected an option keyword, have %s",
430                    print_cur_token ());
431       advance ();
432       return create_option (prev, "", "");
433     }
434 }
435
436 /* One comma-separated list of options.  */
437 static options_p
438 option_seq (void)
439 {
440   options_p o;
441
442   o = option (0);
443   while (token () == ',')
444     {
445       advance ();
446       o = option (o);
447     }
448   return o;
449 }
450
451 /* GTY marker: 'GTY' '(' '(' option_seq? ')' ')' */
452 static options_p
453 gtymarker (void)
454 {
455   options_p result = 0;
456   require (GTY_TOKEN);
457   require ('(');
458   require ('(');
459   if (token () != ')')
460     result = option_seq ();
461   require (')');
462   require (')');
463   return result;
464 }
465
466 /* Optional GTY marker.  */
467 static options_p
468 gtymarker_opt (void)
469 {
470   if (token () != GTY_TOKEN)
471     return 0;
472   return gtymarker ();
473 }
474 \f
475 /* Declarators. The logic here is largely lifted from c-parser.c.
476    Note that we do not have to process abstract declarators, which can
477    appear only in parameter type lists or casts (but see absdecl,
478    above).  Also, type qualifiers are thrown out in gengtype-lex.l so
479    we don't have to do it.  */
480
481 /* array_and_function_declarators_opt:
482       \epsilon
483       array_and_function_declarators_opt ARRAY
484       array_and_function_declarators_opt '(' ... ')'
485
486    where '...' indicates stuff we ignore except insofar as grouping
487    symbols ()[]{} must balance.
488
489    Subroutine of direct_declarator - do not use elsewhere. */
490
491 static type_p
492 array_and_function_declarators_opt (type_p ty)
493 {
494   if (token () == ARRAY)
495     {
496       const char *array = advance ();
497       return create_array (array_and_function_declarators_opt (ty), array);
498     }
499   else if (token () == '(')
500     {
501       /* We don't need exact types for functions.  */
502       consume_balanced ('(', ')');
503       array_and_function_declarators_opt (ty);
504       return create_scalar_type ("function type");
505     }
506   else
507     return ty;
508 }
509
510 static type_p inner_declarator (type_p, const char **, options_p *);
511
512 /* direct_declarator:
513       '(' inner_declarator ')'
514       gtymarker_opt ID array_and_function_declarators_opt
515
516    Subroutine of declarator, mutually recursive with inner_declarator;
517    do not use elsewhere.  */
518 static type_p
519 direct_declarator (type_p ty, const char **namep, options_p *optsp)
520 {
521   /* The first token in a direct-declarator must be an ID, a
522      GTY marker, or an open parenthesis.  */
523   switch (token ())
524     {
525     case GTY_TOKEN:
526       *optsp = gtymarker ();
527       /* fall through */
528     case ID:
529       *namep = require (ID);
530       break;
531
532     case '(':
533       advance ();
534       ty = inner_declarator (ty, namep, optsp);
535       require (')');
536       break;
537
538     default:
539       parse_error ("expected '(', 'GTY', or an identifier, have %s",
540                    print_cur_token ());
541       /* Do _not_ advance if what we have is a close squiggle brace, as
542          we will get much better error recovery that way.  */
543       if (token () != '}')
544         advance ();
545       return 0;
546     }
547   return array_and_function_declarators_opt (ty);
548 }
549
550 /* The difference between inner_declarator and declarator is in the
551    handling of stars.  Consider this declaration:
552
553       char * (*pfc) (void)
554
555    It declares a pointer to a function that takes no arguments and
556    returns a char*.  To construct the correct type for this
557    declaration, the star outside the parentheses must be processed
558    _before_ the function type, the star inside the parentheses must
559    be processed _after_ the function type.  To accomplish this,
560    declarator() creates pointers before recursing (it is actually
561    coded as a while loop), whereas inner_declarator() recurses before
562    creating pointers.  */
563
564 /* inner_declarator:
565      '*' inner_declarator
566      direct_declarator
567
568    Mutually recursive subroutine of direct_declarator; do not use
569    elsewhere.  */
570
571 static type_p
572 inner_declarator (type_p ty, const char **namep, options_p *optsp)
573 {
574   if (token () == '*')
575     {
576       type_p inner;
577       advance ();
578       inner = inner_declarator (ty, namep, optsp);
579       if (inner == 0)
580         return 0;
581       else
582         return create_pointer (ty);
583     }
584   else
585     return direct_declarator (ty, namep, optsp);
586 }
587
588 /* declarator: '*'+ direct_declarator
589
590    This is the sole public interface to this part of the grammar.
591    Arguments are the type known so far, a pointer to where the name
592    may be stored, and a pointer to where GTY options may be stored.
593    Returns the final type. */
594
595 static type_p
596 declarator (type_p ty, const char **namep, options_p *optsp)
597 {
598   *namep = 0;
599   *optsp = 0;
600   while (token () == '*')
601     {
602       advance ();
603       ty = create_pointer (ty);
604     }
605   return direct_declarator (ty, namep, optsp);
606 }
607 \f
608 /* Types and declarations.  */
609
610 /* Structure field(s) declaration:
611    (
612        type bitfield ';'
613      | type declarator bitfield? ( ',' declarator bitfield? )+ ';'
614    )+
615
616    Knows that such declarations must end with a close brace (or,
617    erroneously, at EOF).
618  */
619 static pair_p
620 struct_field_seq (void)
621 {
622   pair_p f = 0;
623   type_p ty, dty;
624   options_p opts, dopts;
625   const char *name;
626   bool another;
627
628   do
629     {
630       ty = type (&opts, true);
631       /* Another piece of the IFCVT_EXTRA_FIELDS special case, see type().  */
632       if (!ty && token () == '}')
633         break;
634
635       if (!ty || token () == ':')
636         {
637           consume_until_semi (false);
638           continue;
639         }
640
641       do
642         {
643           dty = declarator (ty, &name, &dopts);
644           /* There could be any number of weird things after the declarator,
645              notably bitfield declarations and __attribute__s.  If this
646              function returns true, the last thing was a comma, so we have
647              more than one declarator paired with the current type.  */
648           another = consume_until_comma_or_semi (false);
649
650           if (!dty)
651             continue;
652
653           if (opts && dopts)
654             parse_error ("two GTY(()) options for field %s", name);
655           if (opts && !dopts)
656             dopts = opts;
657
658           f = create_field_at (f, dty, name, dopts, &lexer_line);
659         }
660       while (another);
661     }
662   while (token () != '}' && token () != EOF_TOKEN);
663   return nreverse_pairs (f);
664 }
665
666 /* This is called type(), but what it parses (sort of) is what C calls
667    declaration-specifiers and specifier-qualifier-list:
668
669      SCALAR
670    | ID     // typedef
671    | (STRUCT|UNION) ID? gtymarker? ( '{' gtymarker? struct_field_seq '}' )?
672    | ENUM ID ( '{' ... '}' )?
673
674    Returns a partial type; under some conditions (notably
675    "struct foo GTY((...)) thing;") it may write an options
676    structure to *OPTSP.
677  */
678 static type_p
679 type (options_p *optsp, bool nested)
680 {
681   const char *s;
682   *optsp = 0;
683   switch (token ())
684     {
685     case SCALAR:
686       s = advance ();
687       return create_scalar_type (s);
688
689     case ID:
690     case VEC_TOKEN:
691       s = typedef_name ();
692       return resolve_typedef (s, &lexer_line);
693
694     case STRUCT:
695     case UNION:
696       {
697         options_p opts = 0;
698     /* GTY annotations follow attribute syntax
699        GTY_BEFORE_ID is for union/struct declarations
700        GTY_AFTER_ID is for variable declarations.  */
701     enum {
702         NO_GTY,
703         GTY_BEFORE_ID,
704         GTY_AFTER_ID
705     } is_gty = NO_GTY;
706     bool is_union = (token () == UNION);
707         advance ();
708
709         /* Top-level structures that are not explicitly tagged GTY(())
710            are treated as mere forward declarations.  This is because
711            there are a lot of structures that we don't need to know
712            about, and some of those have weird macro stuff in them
713            that we can't handle.  */
714         if (nested || token () == GTY_TOKEN)
715           {
716         is_gty = GTY_BEFORE_ID;
717         opts = gtymarker_opt ();
718           }
719
720         if (token () == ID)
721           s = advance ();
722         else
723           s = xasprintf ("anonymous:%s:%d", lexer_line.file, lexer_line.line);
724
725         /* Unfortunately above GTY_TOKEN check does not capture the
726            typedef struct_type GTY case.  */
727         if (token () == GTY_TOKEN)
728           {
729         is_gty = GTY_AFTER_ID;
730         opts = gtymarker_opt ();
731           }
732
733     if (is_gty)
734       {
735         if (token () == '{')
736           {
737             pair_p fields;
738
739             if (is_gty == GTY_AFTER_ID)
740                 parse_error ("GTY must be specified before identifier");
741
742             advance ();
743             fields = struct_field_seq ();
744             require ('}');
745             return new_structure (s, is_union, &lexer_line, fields, opts);
746           }
747       }
748     else if (token () == '{')
749       consume_balanced ('{', '}');
750         if (opts)
751           *optsp = opts;
752         return find_structure (s, is_union);
753       }
754
755     case ENUM:
756       advance ();
757         if (token () == ID)
758           s = advance ();
759         else
760           s = xasprintf ("anonymous:%s:%d", lexer_line.file, lexer_line.line);
761
762       if (token () == '{')
763         consume_balanced ('{','}');
764       return create_scalar_type (s);
765
766     default:
767       parse_error ("expected a type specifier, have %s", print_cur_token ());
768       advance ();
769       return create_scalar_type ("erroneous type");
770     }
771 }
772 \f
773 /* Top level constructs.  */
774
775 /* Dispatch declarations beginning with 'typedef'.  */
776
777 static void
778 typedef_decl (void)
779 {
780   type_p ty, dty;
781   const char *name;
782   options_p opts;
783   bool another;
784
785   gcc_assert (token () == TYPEDEF);
786   advance ();
787
788   ty = type (&opts, false);
789   if (!ty)
790     return;
791   if (opts)
792     parse_error ("GTY((...)) cannot be applied to a typedef");
793   do
794     {
795       dty = declarator (ty, &name, &opts);
796       if (opts)
797         parse_error ("GTY((...)) cannot be applied to a typedef");
798
799       /* Yet another place where we could have junk (notably attributes)
800          after the declarator.  */
801       another = consume_until_comma_or_semi (false);
802       if (dty)
803         do_typedef (name, dty, &lexer_line);
804     }
805   while (another);
806 }
807
808 /* Structure definition: type() does all the work.  */
809
810 static void
811 struct_or_union (void)
812 {
813   options_p dummy;
814   type (&dummy, false);
815   /* There may be junk after the type: notably, we cannot currently
816      distinguish 'struct foo *function(prototype);' from 'struct foo;'
817      ...  we could call declarator(), but it's a waste of time at
818      present.  Instead, just eat whatever token is currently lookahead
819      and go back to lexical skipping mode. */
820   advance ();
821 }
822
823 /* GC root declaration:
824      (extern|static) gtymarker? type ID array_declarators_opt (';'|'=')
825    If the gtymarker is not present, we ignore the rest of the declaration.  */
826 static void
827 extern_or_static (void)
828 {
829   options_p opts, opts2, dopts;
830   type_p ty, dty;
831   const char *name;
832   require2 (EXTERN, STATIC);
833
834   if (token () != GTY_TOKEN)
835     {
836       advance ();
837       return;
838     }
839
840   opts = gtymarker ();
841   ty   = type (&opts2, true);  /* if we get here, it's got a GTY(()) */
842   dty  = declarator (ty, &name, &dopts);
843
844   if ((opts && dopts) || (opts && opts2) || (opts2 && dopts))
845     parse_error ("GTY((...)) specified more than once for %s", name);
846   else if (opts2)
847     opts = opts2;
848   else if (dopts)
849     opts = dopts;
850
851   if (dty)
852     {
853       note_variable (name, adjust_field_type (dty, opts), opts, &lexer_line);
854       require2 (';', '=');
855     }
856 }
857
858 /* Definition of a generic VEC structure:
859
860    'DEF_VEC_[IPO]' '(' id ')' ';'
861
862    Scalar VECs require slightly different treatment than otherwise -
863    that's handled in note_def_vec, we just pass it along.*/
864 static void
865 def_vec (void)
866 {
867   bool is_scalar = (token() == DEFVEC_I);
868   const char *type;
869
870   require2 (DEFVEC_OP, DEFVEC_I);
871   require ('(');
872   type = require2 (ID, SCALAR);
873   require (')');
874   require (';');
875
876   if (!type)
877     return;
878
879   note_def_vec (type, is_scalar, &lexer_line);
880   note_def_vec_alloc (type, "none", &lexer_line);
881 }
882
883 /* Definition of an allocation strategy for a VEC structure:
884
885    'DEF_VEC_ALLOC_[IPO]' '(' id ',' id ')' ';'
886
887    For purposes of gengtype, this just declares a wrapper structure.  */
888 static void
889 def_vec_alloc (void)
890 {
891   const char *type, *astrat;
892
893   require (DEFVEC_ALLOC);
894   require ('(');
895   type = require2 (ID, SCALAR);
896   require (',');
897   astrat = require (ID);
898   require (')');
899   require (';');
900
901   if (!type || !astrat)
902     return;
903
904   note_def_vec_alloc (type, astrat, &lexer_line);
905 }
906
907 /* Parse the file FNAME for GC-relevant declarations and definitions.
908    This is the only entry point to this file.  */
909 void
910 parse_file (const char *fname)
911 {
912   yybegin (fname);
913   for (;;)
914     {
915       switch (token ())
916         {
917         case EXTERN:
918         case STATIC:
919           extern_or_static ();
920           break;
921
922         case STRUCT:
923         case UNION:
924           struct_or_union ();
925           break;
926
927         case TYPEDEF:
928           typedef_decl ();
929           break;
930
931         case DEFVEC_OP:
932         case DEFVEC_I:
933           def_vec ();
934           break;
935
936         case DEFVEC_ALLOC:
937           def_vec_alloc ();
938           break;
939
940         case EOF_TOKEN:
941           goto eof;
942
943         default:
944           parse_error ("unexpected top level token, %s", print_cur_token ());
945           goto eof;
946         }
947       lexer_toplevel_done = 1;
948     }
949
950  eof:
951   advance ();
952   yyend ();
953 }