OSDN Git Service

* alias.c (nonlocal_reference_p): Add static prototype.
[pf3gnuchains/gcc-fork.git] / gcc / c-lex.c
1 /* Lexical analyzer for C and Objective C.
2    Copyright (C) 1987, 88, 89, 92, 94-98, 1999 Free Software Foundation, Inc.
3
4 This file is part of GNU CC.
5
6 GNU CC is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2, or (at your option)
9 any later version.
10
11 GNU CC is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with GNU CC; see the file COPYING.  If not, write to
18 the Free Software Foundation, 59 Temple Place - Suite 330,
19 Boston, MA 02111-1307, USA.  */
20
21 #include "config.h"
22 #include "system.h"
23
24 #include "rtl.h"
25 #include "tree.h"
26 #include "input.h"
27 #include "output.h"
28 #include "c-lex.h"
29 #include "c-tree.h"
30 #include "flags.h"
31 #include "c-parse.h"
32 #include "c-pragma.h"
33 #include "toplev.h"
34 #include "intl.h"
35 #include "ggc.h"
36
37 /* MULTIBYTE_CHARS support only works for native compilers.
38    ??? Ideally what we want is to model widechar support after
39    the current floating point support.  */
40 #ifdef CROSS_COMPILE
41 #undef MULTIBYTE_CHARS
42 #endif
43
44 #ifdef MULTIBYTE_CHARS
45 #include "mbchar.h"
46 #include <locale.h>
47 #endif /* MULTIBYTE_CHARS */
48 #ifndef GET_ENVIRONMENT
49 #define GET_ENVIRONMENT(ENV_VALUE,ENV_NAME) ((ENV_VALUE) = getenv (ENV_NAME))
50 #endif
51
52 #if USE_CPPLIB
53 #include "cpplib.h"
54 extern cpp_reader  parse_in;
55 extern cpp_options parse_options;
56 #else
57 /* Stream for reading from the input file.  */
58 FILE *finput;
59 #endif
60
61 extern void yyprint                     PROTO((FILE *, int, YYSTYPE));
62
63 /* The elements of `ridpointers' are identifier nodes
64    for the reserved type names and storage classes.
65    It is indexed by a RID_... value.  */
66 tree ridpointers[(int) RID_MAX];
67
68 /* Cause the `yydebug' variable to be defined.  */
69 #define YYDEBUG 1
70
71 #if USE_CPPLIB
72 extern unsigned char *yy_cur, *yy_lim;
73 extern enum cpp_token cpp_token;
74
75 extern int yy_get_token ();
76
77 #define GETC() (yy_cur < yy_lim ? *yy_cur++ : yy_get_token ())
78 #define UNGETC(c) ((c) == EOF ? 0 : yy_cur--)
79
80 #else /* ! USE_CPPLIB */
81
82 #define GETC() getch ()
83 #define UNGETC(c) put_back (c)
84
85 struct putback_buffer {
86   char *buffer;
87   int   buffer_size;
88   int   index;
89 };
90
91 static struct putback_buffer putback = {NULL, 0, -1};
92
93 static inline int getch PROTO ((void));
94
95 static inline int
96 getch ()
97 {
98   if (putback.index != -1)
99     {
100       int ch = putback.buffer[putback.index];
101       --putback.index;
102       return ch;
103     }
104   return getc (finput);
105 }
106
107 static inline void put_back PROTO ((int));
108
109 static inline void
110 put_back (ch)
111      int ch;
112 {
113   if (ch != EOF)
114     {
115       if (putback.index == putback.buffer_size - 1)
116         {
117           putback.buffer_size += 16;
118           putback.buffer = xrealloc (putback.buffer, putback.buffer_size);
119         }
120       putback.buffer[++putback.index] = ch;
121     }
122 }
123 #endif /* ! USE_CPPLIB */
124
125 int linemode;
126
127 /* the declaration found for the last IDENTIFIER token read in.
128    yylex must look this up to detect typedefs, which get token type TYPENAME,
129    so it is left around in case the identifier is not a typedef but is
130    used in a context which makes it a reference to a variable.  */
131 tree lastiddecl;
132
133 /* Nonzero enables objc features.  */
134
135 int doing_objc_thang;
136
137 extern int yydebug;
138
139 /* File used for outputting assembler code.  */
140 extern FILE *asm_out_file;
141
142 #undef WCHAR_TYPE_SIZE
143 #define WCHAR_TYPE_SIZE TYPE_PRECISION (wchar_type_node)
144
145 /* Number of bytes in a wide character.  */
146 #define WCHAR_BYTES (WCHAR_TYPE_SIZE / BITS_PER_UNIT)
147
148 static int maxtoken;            /* Current nominal length of token buffer.  */
149 char *token_buffer;     /* Pointer to token buffer.
150                            Actual allocated length is maxtoken + 2.
151                            This is not static because objc-parse.y uses it.  */
152
153 static int indent_level;        /* Number of { minus number of }. */
154
155 /* Nonzero tells yylex to ignore \ in string constants.  */
156 static int ignore_escape_flag;
157
158 /* Nonzero if end-of-file has been seen on input.  */
159 static int end_of_file;
160
161 #ifdef HANDLE_GENERIC_PRAGMAS
162 static int handle_generic_pragma        PROTO((int));
163 #endif /* HANDLE_GENERIC_PRAGMAS */
164 static int whitespace_cr                PROTO((int));
165 static int skip_white_space             PROTO((int));
166 static char *extend_token_buffer        PROTO((const char *));
167 static int readescape                   PROTO((int *));
168 static void parse_float                 PROTO((PTR));
169 static void extend_token_buffer_to      PROTO((int));
170 static int read_line_number             PROTO((int *));
171 \f
172 /* Do not insert generated code into the source, instead, include it.
173    This allows us to build gcc automatically even for targets that
174    need to add or modify the reserved keyword lists.  */
175 #include "c-gperf.h"
176 \f
177 /* Return something to represent absolute declarators containing a *.
178    TARGET is the absolute declarator that the * contains.
179    TYPE_QUALS is a list of modifiers such as const or volatile
180    to apply to the pointer type, represented as identifiers.
181
182    We return an INDIRECT_REF whose "contents" are TARGET
183    and whose type is the modifier list.  */
184
185 tree
186 make_pointer_declarator (type_quals, target)
187      tree type_quals, target;
188 {
189   return build1 (INDIRECT_REF, type_quals, target);
190 }
191 \f
192 void
193 forget_protocol_qualifiers ()
194 {
195   int i, n = sizeof wordlist / sizeof (struct resword);
196
197   for (i = 0; i < n; i++)
198     if ((int) wordlist[i].rid >= (int) RID_IN
199         && (int) wordlist[i].rid <= (int) RID_ONEWAY)
200       wordlist[i].name = "";
201 }
202
203 void
204 remember_protocol_qualifiers ()
205 {
206   int i, n = sizeof wordlist / sizeof (struct resword);
207
208   for (i = 0; i < n; i++)
209     if (wordlist[i].rid == RID_IN)
210       wordlist[i].name = "in";
211     else if (wordlist[i].rid == RID_OUT)
212       wordlist[i].name = "out";
213     else if (wordlist[i].rid == RID_INOUT)
214       wordlist[i].name = "inout";
215     else if (wordlist[i].rid == RID_BYCOPY)
216       wordlist[i].name = "bycopy";
217     else if (wordlist[i].rid == RID_BYREF)
218       wordlist[i].name = "byref";
219     else if (wordlist[i].rid == RID_ONEWAY)
220       wordlist[i].name = "oneway";
221 }
222 \f
223 char *
224 init_parse (filename)
225      char *filename;
226 {
227 #if !USE_CPPLIB
228   /* Open input file.  */
229   if (filename == 0 || !strcmp (filename, "-"))
230     {
231       finput = stdin;
232       filename = "stdin";
233     }
234   else
235     finput = fopen (filename, "r");
236   if (finput == 0)
237     pfatal_with_name (filename);
238
239 #ifdef IO_BUFFER_SIZE
240   setvbuf (finput, (char *) xmalloc (IO_BUFFER_SIZE), _IOFBF, IO_BUFFER_SIZE);
241 #endif
242 #else /* !USE_CPPLIB */
243   parse_in.show_column = 1;
244   if (! cpp_start_read (&parse_in, filename))
245     abort ();
246
247   if (filename == 0 || !strcmp (filename, "-"))
248     filename = "stdin";
249
250   /* cpp_start_read always puts at least one line directive into the
251      token buffer.  We must arrange to read it out here. */
252   yy_cur = parse_in.token_buffer;
253   yy_lim = CPP_PWRITTEN (&parse_in);
254   cpp_token = CPP_DIRECTIVE;
255 #endif
256
257   init_lex ();
258   init_pragma ();
259
260   return filename;
261 }
262
263 void
264 finish_parse ()
265 {
266 #if USE_CPPLIB
267   cpp_finish (&parse_in);
268   errorcount += parse_in.errors;
269 #else
270   fclose (finput);
271 #endif
272 }
273
274 void
275 init_lex ()
276 {
277   /* Make identifier nodes long enough for the language-specific slots.  */
278   set_identifier_size (sizeof (struct lang_identifier));
279
280   /* Start it at 0, because check_newline is called at the very beginning
281      and will increment it to 1.  */
282   lineno = 0;
283
284 #ifdef MULTIBYTE_CHARS
285   /* Change to the native locale for multibyte conversions.  */
286   setlocale (LC_CTYPE, "");
287   GET_ENVIRONMENT (literal_codeset, "LANG");
288 #endif
289
290   maxtoken = 40;
291   token_buffer = (char *) xmalloc (maxtoken + 2);
292
293   ridpointers[(int) RID_INT] = get_identifier ("int");
294   ridpointers[(int) RID_CHAR] = get_identifier ("char");
295   ridpointers[(int) RID_VOID] = get_identifier ("void");
296   ridpointers[(int) RID_FLOAT] = get_identifier ("float");
297   ridpointers[(int) RID_DOUBLE] = get_identifier ("double");
298   ridpointers[(int) RID_SHORT] = get_identifier ("short");
299   ridpointers[(int) RID_LONG] = get_identifier ("long");
300   ridpointers[(int) RID_UNSIGNED] = get_identifier ("unsigned");
301   ridpointers[(int) RID_SIGNED] = get_identifier ("signed");
302   ridpointers[(int) RID_INLINE] = get_identifier ("inline");
303   ridpointers[(int) RID_CONST] = get_identifier ("const");
304   ridpointers[(int) RID_RESTRICT] = get_identifier ("restrict");
305   ridpointers[(int) RID_VOLATILE] = get_identifier ("volatile");
306   ridpointers[(int) RID_AUTO] = get_identifier ("auto");
307   ridpointers[(int) RID_STATIC] = get_identifier ("static");
308   ridpointers[(int) RID_EXTERN] = get_identifier ("extern");
309   ridpointers[(int) RID_TYPEDEF] = get_identifier ("typedef");
310   ridpointers[(int) RID_REGISTER] = get_identifier ("register");
311   ridpointers[(int) RID_ITERATOR] = get_identifier ("iterator");
312   ridpointers[(int) RID_COMPLEX] = get_identifier ("complex");
313   ridpointers[(int) RID_ID] = get_identifier ("id");
314   ridpointers[(int) RID_IN] = get_identifier ("in");
315   ridpointers[(int) RID_OUT] = get_identifier ("out");
316   ridpointers[(int) RID_INOUT] = get_identifier ("inout");
317   ridpointers[(int) RID_BYCOPY] = get_identifier ("bycopy");
318   ridpointers[(int) RID_BYREF] = get_identifier ("byref");
319   ridpointers[(int) RID_ONEWAY] = get_identifier ("oneway");
320   forget_protocol_qualifiers();
321
322   /* Some options inhibit certain reserved words.
323      Clear those words out of the hash table so they won't be recognized.  */
324 #define UNSET_RESERVED_WORD(STRING) \
325   do { struct resword *s = is_reserved_word (STRING, sizeof (STRING) - 1); \
326        if (s) s->name = ""; } while (0)
327
328   if (! doing_objc_thang)
329     UNSET_RESERVED_WORD ("id");
330
331   if (flag_traditional)
332     {
333       UNSET_RESERVED_WORD ("const");
334       UNSET_RESERVED_WORD ("restrict");
335       UNSET_RESERVED_WORD ("volatile");
336       UNSET_RESERVED_WORD ("typeof");
337       UNSET_RESERVED_WORD ("signed");
338       UNSET_RESERVED_WORD ("inline");
339       UNSET_RESERVED_WORD ("iterator");
340       UNSET_RESERVED_WORD ("complex");
341     }
342   else if (!flag_isoc9x)
343     UNSET_RESERVED_WORD ("restrict");
344
345   if (flag_no_asm)
346     {
347       UNSET_RESERVED_WORD ("asm");
348       UNSET_RESERVED_WORD ("typeof");
349       UNSET_RESERVED_WORD ("inline");
350       UNSET_RESERVED_WORD ("iterator");
351       UNSET_RESERVED_WORD ("complex");
352     }
353 }
354
355 void
356 reinit_parse_for_function ()
357 {
358 }
359 \f
360 /* Function used when yydebug is set, to print a token in more detail.  */
361
362 void
363 yyprint (file, yychar, yylval)
364      FILE *file;
365      int yychar;
366      YYSTYPE yylval;
367 {
368   tree t;
369   switch (yychar)
370     {
371     case IDENTIFIER:
372     case TYPENAME:
373     case OBJECTNAME:
374       t = yylval.ttype;
375       if (IDENTIFIER_POINTER (t))
376         fprintf (file, " `%s'", IDENTIFIER_POINTER (t));
377       break;
378
379     case CONSTANT:
380       t = yylval.ttype;
381       if (TREE_CODE (t) == INTEGER_CST)
382         fprintf (file,
383 #if HOST_BITS_PER_WIDE_INT == 64
384 #if HOST_BITS_PER_WIDE_INT == HOST_BITS_PER_INT
385                  " 0x%x%016x",
386 #else
387 #if HOST_BITS_PER_WIDE_INT == HOST_BITS_PER_LONG
388                  " 0x%lx%016lx",
389 #else
390                  " 0x%llx%016llx",
391 #endif
392 #endif
393 #else
394 #if HOST_BITS_PER_WIDE_INT != HOST_BITS_PER_INT
395                  " 0x%lx%08lx",
396 #else
397                  " 0x%x%08x",
398 #endif
399 #endif
400                  TREE_INT_CST_HIGH (t), TREE_INT_CST_LOW (t));
401       break;
402     }
403 }
404 \f
405 /* Iff C is a carriage return, warn about it - if appropriate -
406    and return nonzero.  */
407 static int
408 whitespace_cr (c)
409      int c;
410 {
411   static int newline_warning = 0;
412
413   if (c == '\r')
414     {
415       /* ANSI C says the effects of a carriage return in a source file
416          are undefined.  */
417       if (pedantic && !newline_warning)
418         {
419           warning ("carriage return in source file");
420           warning ("(we only warn about the first carriage return)");
421           newline_warning = 1;
422         }
423       return 1;
424     }
425   return 0;
426 }
427
428 /* If C is not whitespace, return C.
429    Otherwise skip whitespace and return first nonwhite char read.  */
430
431 static int
432 skip_white_space (c)
433      register int c;
434 {
435   for (;;)
436     {
437       switch (c)
438         {
439           /* We don't recognize comments here, because
440              cpp output can include / and * consecutively as operators.
441              Also, there's no need, since cpp removes all comments.  */
442
443         case '\n':
444           if (linemode)
445             {
446               UNGETC (c);
447               return EOF;
448             }
449           c = check_newline ();
450           break;
451
452         case ' ':
453         case '\t':
454         case '\f':
455         case '\v':
456         case '\b':
457 #if USE_CPPLIB
458           /* While processing a # directive we don't get CPP_HSPACE
459              tokens, so we also need to handle whitespace the normal way.  */
460           if (cpp_token == CPP_HSPACE)
461             c = yy_get_token ();
462           else
463 #endif
464             c = GETC();
465           break;
466
467         case '\r':
468           whitespace_cr (c);
469           c = GETC();
470           break;
471
472         case '\\':
473           c = GETC();
474           if (c == '\n')
475             lineno++;
476           else
477             error ("stray '\\' in program");
478           c = GETC();
479           break;
480
481         default:
482           return (c);
483         }
484     }
485 }
486
487 /* Skips all of the white space at the current location in the input file.  */
488
489 void
490 position_after_white_space ()
491 {
492   register int c;
493
494   c = GETC();
495
496   UNGETC (skip_white_space (c));
497 }
498
499 /* Make the token buffer longer, preserving the data in it.
500    P should point to just beyond the last valid character in the old buffer.
501    The value we return is a pointer to the new buffer
502    at a place corresponding to P.  */
503
504 static void
505 extend_token_buffer_to (size)
506      int size;
507 {
508   do
509     maxtoken = maxtoken * 2 + 10;
510   while (maxtoken < size);
511   token_buffer = (char *) xrealloc (token_buffer, maxtoken + 2);
512 }
513
514 static char *
515 extend_token_buffer (p)
516      const char *p;
517 {
518   int offset = p - token_buffer;
519   extend_token_buffer_to (offset);
520   return token_buffer + offset;
521 }
522 \f
523 #if defined HANDLE_PRAGMA
524 /* Local versions of these macros, that can be passed as function pointers.  */
525 static int
526 pragma_getc ()
527 {
528   return GETC();
529 }
530
531 static void
532 pragma_ungetc (arg)
533      int arg;
534 {
535   UNGETC (arg);
536 }
537 #endif
538
539 static int
540 read_line_number (num)
541      int *num;
542 {
543   register int token = yylex ();
544
545   if (token == CONSTANT
546       && TREE_CODE (yylval.ttype) == INTEGER_CST)
547     {
548       *num = TREE_INT_CST_LOW (yylval.ttype);
549       return 1;
550     }
551   else
552     {
553       if (token != END_OF_LINE)
554         error ("invalid #-line");
555       return 0;
556     }
557 }
558   
559 /* At the beginning of a line, increment the line number
560    and process any #-directive on this line.
561    If the line is a #-directive, read the entire line and return a newline.
562    Otherwise, return the line's first non-whitespace character.
563
564    Note that in the case of USE_CPPLIB, we get the whole line as one
565    CPP_DIRECTIVE token.  */
566
567 int
568 check_newline ()
569 {
570   register int c;
571   register int token;
572   int saw_line;
573   enum { act_none, act_push, act_pop } action;
574   int old_lineno, action_number, l;
575
576  restart:
577   /* Read first nonwhite char on the line.  */
578
579 #ifdef USE_CPPLIB
580   c = GETC ();
581   /* In some cases where we're leaving an include file, we can get multiple
582      CPP_HSPACE tokens in a row, so we need to loop.  */
583   while (cpp_token == CPP_HSPACE)
584     c = yy_get_token ();
585 #else
586   do
587     c = GETC ();
588   while (c == ' ' || c == '\t');
589 #endif
590
591   lineno++;
592
593   if (c != '#')
594     {
595       /* Sequences of multiple newlines are very common; optimize them.  */
596       if (c == '\n')
597         goto restart;
598
599       /* If not #, return it so caller will use it.  */
600       return c;
601     }
602
603   /* Don't read beyond this line.  */
604   saw_line = 0;
605   linemode = 1;
606   
607 #if USE_CPPLIB
608   if (cpp_token == CPP_VSPACE)
609     {
610       /* Format is "<space> <line number> <filename> <newline>".
611          Only the line number is interesting, and even that
612          we can get more efficiently than scanning the line.  */
613       yy_cur = yy_lim - 1;
614       lineno = parse_in.lineno - 1;
615       goto skipline;
616     }
617 #endif
618
619   token = yylex ();
620
621   if (token == IDENTIFIER)
622     {
623       /* If a letter follows, then if the word here is `line', skip
624          it and ignore it; otherwise, ignore the line, with an error
625          if the word isn't `pragma'.  */
626
627       const char *name = IDENTIFIER_POINTER (yylval.ttype);
628
629       if (!strcmp (name, "pragma"))
630         {
631           token = yylex ();
632           if (token != IDENTIFIER
633               || TREE_CODE (yylval.ttype) != IDENTIFIER_NODE)
634             goto skipline;
635
636 #ifdef HANDLE_PRAGMA
637           /* We invoke HANDLE_PRAGMA before HANDLE_GENERIC_PRAGMAS
638              (if both are defined), in order to give the back
639              end a chance to override the interpretation of
640              SYSV style pragmas.  */
641           if (HANDLE_PRAGMA (getch, put_back,
642                              IDENTIFIER_POINTER (yylval.ttype)))
643             goto skipline;
644 #endif /* HANDLE_PRAGMA */
645               
646 #ifdef HANDLE_GENERIC_PRAGMAS
647           if (handle_generic_pragma (token))
648             goto skipline;
649 #endif /* HANDLE_GENERIC_PRAGMAS */
650
651           /* Issue a warning message if we have been asked to do so.
652              Ignoring unknown pragmas in system header file unless
653              an explcit -Wunknown-pragmas has been given. */
654           if (warn_unknown_pragmas > 1
655               || (warn_unknown_pragmas && ! in_system_header))
656             warning ("ignoring pragma: %s", token_buffer);
657
658           goto skipline;
659         }
660       else if (!strcmp (name, "define"))
661         {
662           debug_define (lineno, GET_DIRECTIVE_LINE ());
663           goto skipline;
664         }
665       else if (!strcmp (name, "undef"))
666         {
667           debug_undef (lineno, GET_DIRECTIVE_LINE ());
668           goto skipline;
669         }
670       else if (!strcmp (name, "line"))
671         {
672           saw_line = 1;
673           token = yylex ();
674           goto linenum;
675         }
676       else if (!strcmp (name, "ident"))
677         {
678           /* #ident.  The pedantic warning is now in cccp.c.  */
679
680           /* Here we have just seen `#ident '.
681              A string constant should follow.  */
682
683           token = yylex ();
684           if (token == END_OF_LINE)
685             goto skipline;
686           if (token != STRING
687               || TREE_CODE (yylval.ttype) != STRING_CST)
688             {
689               error ("invalid #ident");
690               goto skipline;
691             }
692
693           if (! flag_no_ident)
694             {
695 #ifdef ASM_OUTPUT_IDENT
696               ASM_OUTPUT_IDENT (asm_out_file,
697                                 TREE_STRING_POINTER (yylval.ttype));
698 #endif
699             }
700
701           /* Skip the rest of this line.  */
702           goto skipline;
703         }
704
705       error ("undefined or invalid # directive `%s'", name);
706       goto skipline;
707     }
708
709   /* If the # is the only nonwhite char on the line,
710      just ignore it.  Check the new newline.  */
711   if (token == END_OF_LINE)
712     goto skipline;
713
714 linenum:
715   /* Here we have either `#line' or `# <nonletter>'.
716      In either case, it should be a line number; a digit should follow.  */
717
718   if (token != CONSTANT
719       || TREE_CODE (yylval.ttype) != INTEGER_CST)
720     {
721       error ("invalid #-line");
722       goto skipline;
723     }
724
725   /* subtract one, because it is the following line that
726      gets the specified number */
727
728   l = TREE_INT_CST_LOW (yylval.ttype) - 1;
729
730   /* More follows: it must be a string constant (filename).
731      It would be neat to use cpplib to quickly process the string, but
732      (1) we don't have a handy tokenization of the string, and
733      (2) I don't know how well that would work in the presense
734      of filenames that contain wide characters.  */
735
736   if (saw_line)
737     {
738       /* Don't treat \ as special if we are processing #line 1 "...".
739          If you want it to be treated specially, use # 1 "...".  */
740       ignore_escape_flag = 1;
741     }
742
743   /* Read the string constant.  */
744   token = yylex ();
745
746   ignore_escape_flag = 0;
747
748   if (token == END_OF_LINE)
749     {
750       /* No more: store the line number and check following line.  */
751       lineno = l;
752       goto skipline;
753     }
754
755   if (token != STRING || TREE_CODE (yylval.ttype) != STRING_CST)
756     {
757       error ("invalid #line");
758       goto skipline;
759     }
760
761   if (! ggc_p && !TREE_PERMANENT (yylval.ttype))
762     {
763       input_filename
764         = (char *) permalloc (TREE_STRING_LENGTH (yylval.ttype) + 1);
765       strcpy (input_filename, TREE_STRING_POINTER (yylval.ttype));
766     }
767   else
768     input_filename = TREE_STRING_POINTER (yylval.ttype);
769
770   if (main_input_filename == 0)
771     main_input_filename = input_filename;
772
773   old_lineno = lineno;
774   action = act_none;
775   action_number = 0;
776   lineno = l;
777
778   /* Each change of file name
779      reinitializes whether we are now in a system header.  */
780   in_system_header = 0;
781
782   if (!read_line_number (&action_number))
783     {
784       /* Update the name in the top element of input_file_stack.  */
785       if (input_file_stack)
786         input_file_stack->name = input_filename;
787     }
788
789   /* `1' after file name means entering new file.
790      `2' after file name means just left a file.  */
791
792   if (action_number == 1)
793     {
794       action = act_push;
795       read_line_number (&action_number);
796     }
797   else if (action_number == 2)
798     {
799       action = act_pop;
800       read_line_number (&action_number);
801     }
802   if (action_number == 3)
803     {
804       /* `3' after file name means this is a system header file.  */
805       in_system_header = 1;
806       read_line_number (&action_number);
807     }
808
809   /* Do the actions implied by the preceding numbers.  */
810
811   if (action == act_push)
812     {
813       /* Pushing to a new file.  */
814       struct file_stack *p
815         = (struct file_stack *) xmalloc (sizeof (struct file_stack));
816       input_file_stack->line = old_lineno;
817       p->next = input_file_stack;
818       p->name = input_filename;
819       p->indent_level = indent_level;
820       input_file_stack = p;
821       input_file_stack_tick++;
822       debug_start_source_file (input_filename);
823     }
824   else if (action == act_pop)
825     {
826       /* Popping out of a file.  */
827       if (input_file_stack->next)
828         {
829           struct file_stack *p = input_file_stack;
830           if (indent_level != p->indent_level)
831             {
832               warning_with_file_and_line
833                 (p->name, old_lineno,
834                  "This file contains more `%c's than `%c's.",
835                  indent_level > p->indent_level ? '{' : '}',
836                  indent_level > p->indent_level ? '}' : '{');
837             }
838           input_file_stack = p->next;
839           free (p);
840           input_file_stack_tick++;
841           debug_end_source_file (input_file_stack->line);
842         }
843       else
844         error ("#-lines for entering and leaving files don't match");
845     }
846
847   /* Now that we've pushed or popped the input stack,
848      update the name in the top element.  */
849   if (input_file_stack)
850     input_file_stack->name = input_filename;
851
852   /* skip the rest of this line.  */
853  skipline:
854   linemode = 0;
855   end_of_file = 0;
856
857   do
858     c = GETC();
859   while (c != '\n' && c != EOF);
860   return c;
861 }
862 \f
863 #ifdef HANDLE_GENERIC_PRAGMAS
864
865 /* Handle a #pragma directive.
866    TOKEN is the token we read after `#pragma'.  Processes the entire input
867    line and return non-zero iff the pragma has been successfully parsed.  */
868
869 /* This function has to be in this file, in order to get at
870    the token types.  */
871
872 static int
873 handle_generic_pragma (token)
874      register int token;
875 {
876   for (;;)
877     {
878       switch (token)
879         {
880         case IDENTIFIER:
881         case TYPENAME:
882         case STRING:
883         case CONSTANT:
884           handle_pragma_token (token_buffer, yylval.ttype);
885           break;
886
887         case END_OF_LINE:
888           return handle_pragma_token (NULL_PTR, NULL_TREE);
889
890         default:
891           handle_pragma_token (token_buffer, NULL);
892         }
893
894       token = yylex ();
895     }
896 }
897
898 #endif /* HANDLE_GENERIC_PRAGMAS */
899 \f
900 #define ENDFILE -1  /* token that represents end-of-file */
901
902 /* Read an escape sequence, returning its equivalent as a character,
903    or store 1 in *ignore_ptr if it is backslash-newline.  */
904
905 static int
906 readescape (ignore_ptr)
907      int *ignore_ptr;
908 {
909   register int c = GETC();
910   register int code;
911   register unsigned count;
912   unsigned firstdig = 0;
913   int nonnull;
914
915   switch (c)
916     {
917     case 'x':
918       if (warn_traditional)
919         warning ("the meaning of `\\x' varies with -traditional");
920
921       if (flag_traditional)
922         return c;
923
924       code = 0;
925       count = 0;
926       nonnull = 0;
927       while (1)
928         {
929           c = GETC();
930           if (! ISXDIGIT (c))
931             {
932               UNGETC (c);
933               break;
934             }
935           code *= 16;
936           if (c >= 'a' && c <= 'f')
937             code += c - 'a' + 10;
938           if (c >= 'A' && c <= 'F')
939             code += c - 'A' + 10;
940           if (c >= '0' && c <= '9')
941             code += c - '0';
942           if (code != 0 || count != 0)
943             {
944               if (count == 0)
945                 firstdig = code;
946               count++;
947             }
948           nonnull = 1;
949         }
950       if (! nonnull)
951         error ("\\x used with no following hex digits");
952       else if (count == 0)
953         /* Digits are all 0's.  Ok.  */
954         ;
955       else if ((count - 1) * 4 >= TYPE_PRECISION (integer_type_node)
956                || (count > 1
957                    && (((unsigned)1
958                         << (TYPE_PRECISION (integer_type_node)
959                             - (count - 1) * 4))
960                        <= firstdig)))
961         pedwarn ("hex escape out of range");
962       return code;
963
964     case '0':  case '1':  case '2':  case '3':  case '4':
965     case '5':  case '6':  case '7':
966       code = 0;
967       count = 0;
968       while ((c <= '7') && (c >= '0') && (count++ < 3))
969         {
970           code = (code * 8) + (c - '0');
971           c = GETC();
972         }
973       UNGETC (c);
974       return code;
975
976     case '\\': case '\'': case '"':
977       return c;
978
979     case '\n':
980       lineno++;
981       *ignore_ptr = 1;
982       return 0;
983
984     case 'n':
985       return TARGET_NEWLINE;
986
987     case 't':
988       return TARGET_TAB;
989
990     case 'r':
991       return TARGET_CR;
992
993     case 'f':
994       return TARGET_FF;
995
996     case 'b':
997       return TARGET_BS;
998
999     case 'a':
1000       if (warn_traditional)
1001         warning ("the meaning of `\\a' varies with -traditional");
1002
1003       if (flag_traditional)
1004         return c;
1005       return TARGET_BELL;
1006
1007     case 'v':
1008 #if 0 /* Vertical tab is present in common usage compilers.  */
1009       if (flag_traditional)
1010         return c;
1011 #endif
1012       return TARGET_VT;
1013
1014     case 'e':
1015     case 'E':
1016       if (pedantic)
1017         pedwarn ("non-ANSI-standard escape sequence, `\\%c'", c);
1018       return TARGET_ESC;
1019
1020     case '?':
1021       return c;
1022
1023       /* `\(', etc, are used at beginning of line to avoid confusing Emacs.  */
1024     case '(':
1025     case '{':
1026     case '[':
1027       /* `\%' is used to prevent SCCS from getting confused.  */
1028     case '%':
1029       if (pedantic)
1030         pedwarn ("unknown escape sequence `\\%c'", c);
1031       return c;
1032     }
1033   if (ISGRAPH (c))
1034     pedwarn ("unknown escape sequence `\\%c'", c);
1035   else
1036     pedwarn ("unknown escape sequence: `\\' followed by char code 0x%x", c);
1037   return c;
1038 }
1039 \f
1040 void
1041 yyerror (msgid)
1042      const char *msgid;
1043 {
1044   const char *string = _(msgid);
1045
1046   /* We can't print string and character constants well
1047      because the token_buffer contains the result of processing escapes.  */
1048   if (end_of_file)
1049     error ("%s at end of input", string);
1050   else if (token_buffer[0] == 0)
1051     error ("%s at null character", string);
1052   else if (token_buffer[0] == '"')
1053     error ("%s before string constant", string);
1054   else if (token_buffer[0] == '\'')
1055     error ("%s before character constant", string);
1056   else if (!ISGRAPH(token_buffer[0]))
1057     error ("%s before character 0%o", string, (unsigned char) token_buffer[0]);
1058   else
1059     error ("%s before `%s'", string, token_buffer);
1060 }
1061
1062 #if 0
1063
1064 struct try_type
1065 {
1066   tree *node_var;
1067   char unsigned_flag;
1068   char long_flag;
1069   char long_long_flag;
1070 };
1071
1072 struct try_type type_sequence[] =
1073 {
1074   { &integer_type_node, 0, 0, 0},
1075   { &unsigned_type_node, 1, 0, 0},
1076   { &long_integer_type_node, 0, 1, 0},
1077   { &long_unsigned_type_node, 1, 1, 0},
1078   { &long_long_integer_type_node, 0, 1, 1},
1079   { &long_long_unsigned_type_node, 1, 1, 1}
1080 };
1081 #endif /* 0 */
1082 \f
1083 struct pf_args
1084 {
1085   /* Input */
1086   int base;
1087   char * p;
1088   /* I/O */
1089   int c;
1090   /* Output */
1091   int imag;
1092   tree type;
1093   int conversion_errno;
1094   REAL_VALUE_TYPE value;
1095 };
1096  
1097 static void
1098 parse_float (data)
1099   PTR data;
1100 {
1101   struct pf_args * args = (struct pf_args *) data;
1102   int fflag = 0, lflag = 0;
1103   /* Copy token_buffer now, while it has just the number
1104      and not the suffixes; once we add `f' or `i',
1105      REAL_VALUE_ATOF may not work any more.  */
1106   char *copy = (char *) alloca (args->p - token_buffer + 1);
1107   bcopy (token_buffer, copy, args->p - token_buffer + 1);
1108   args->imag = 0;
1109   args->conversion_errno = 0;
1110   args->type = double_type_node;
1111
1112   while (1)
1113     {
1114       int lose = 0;
1115
1116       /* Read the suffixes to choose a data type.  */
1117       switch (args->c)
1118         {
1119         case 'f': case 'F':
1120           if (fflag)
1121             error ("more than one `f' in numeric constant");
1122           fflag = 1;
1123           break;
1124
1125         case 'l': case 'L':
1126           if (lflag)
1127             error ("more than one `l' in numeric constant");
1128           lflag = 1;
1129           break;
1130
1131         case 'i': case 'I':
1132           if (args->imag)
1133             error ("more than one `i' or `j' in numeric constant");
1134           else if (pedantic)
1135             pedwarn ("ANSI C forbids imaginary numeric constants");
1136           args->imag = 1;
1137           break;
1138
1139         default:
1140           lose = 1;
1141         }
1142
1143       if (lose)
1144         break;
1145
1146       if (args->p >= token_buffer + maxtoken - 3)
1147         args->p = extend_token_buffer (args->p);
1148       *(args->p++) = args->c;
1149       *(args->p) = 0;
1150       args->c = GETC();
1151     }
1152
1153   /* The second argument, machine_mode, of REAL_VALUE_ATOF
1154      tells the desired precision of the binary result
1155      of decimal-to-binary conversion.  */
1156
1157   if (fflag)
1158     {
1159       if (lflag)
1160         error ("both `f' and `l' in floating constant");
1161
1162       args->type = float_type_node;
1163       errno = 0;
1164       if (args->base == 16)
1165         args->value = REAL_VALUE_HTOF (copy, TYPE_MODE (args->type));
1166       else
1167         args->value = REAL_VALUE_ATOF (copy, TYPE_MODE (args->type));
1168       args->conversion_errno = errno;
1169       /* A diagnostic is required here by some ANSI C testsuites.
1170          This is not pedwarn, because some people don't want
1171          an error for this.  */
1172       if (REAL_VALUE_ISINF (args->value) && pedantic)
1173         warning ("floating point number exceeds range of `float'");
1174     }
1175   else if (lflag)
1176     {
1177       args->type = long_double_type_node;
1178       errno = 0;
1179       if (args->base == 16)
1180         args->value = REAL_VALUE_HTOF (copy, TYPE_MODE (args->type));
1181       else
1182         args->value = REAL_VALUE_ATOF (copy, TYPE_MODE (args->type));
1183       args->conversion_errno = errno;
1184       if (REAL_VALUE_ISINF (args->value) && pedantic)
1185         warning ("floating point number exceeds range of `long double'");
1186     }
1187   else
1188     {
1189       errno = 0;
1190       if (args->base == 16)
1191         args->value = REAL_VALUE_HTOF (copy, TYPE_MODE (args->type));
1192       else
1193         args->value = REAL_VALUE_ATOF (copy, TYPE_MODE (args->type));
1194       args->conversion_errno = errno;
1195       if (REAL_VALUE_ISINF (args->value) && pedantic)
1196         warning ("floating point number exceeds range of `double'");
1197     }
1198 }
1199  
1200 /* Get the next character, staying within the current token if possible.
1201    If we're lexing a token, we don't want to look beyond the end of the
1202    token cpplib has prepared for us; otherwise, we end up reading in the
1203    next token, which screws up feed_input.  So just return a null
1204    character.  */
1205
1206 static inline int token_getch PROTO ((void));
1207
1208 static inline int
1209 token_getch ()
1210 {
1211 #if USE_CPPLIB
1212   if (yy_cur == yy_lim)
1213     return '\0';
1214 #endif
1215   return GETC ();
1216 }
1217
1218 static inline void token_put_back PROTO ((int));
1219
1220 static inline void
1221 token_put_back (ch)
1222      int ch;
1223 {
1224 #if USE_CPPLIB
1225   if (ch == '\0')
1226     return;
1227 #endif
1228   UNGETC (ch);
1229 }
1230
1231 /* Read a single token from the input stream, and assign it lexical
1232    semantics.  */
1233
1234 int
1235 yylex ()
1236 {
1237   register int c;
1238   register char *p;
1239   register int value;
1240   int wide_flag = 0;
1241   int objc_flag = 0;
1242
1243   c = GETC();
1244
1245   /* Effectively do c = skip_white_space (c)
1246      but do it faster in the usual cases.  */
1247   while (1)
1248     switch (c)
1249       {
1250       case ' ':
1251       case '\t':
1252       case '\f':
1253       case '\v':
1254       case '\b':
1255 #if USE_CPPLIB
1256         if (cpp_token == CPP_HSPACE)
1257           c = yy_get_token ();
1258         else
1259 #endif
1260           c = GETC();
1261         break;
1262
1263       case '\r':
1264         /* Call skip_white_space so we can warn if appropriate.  */
1265
1266       case '\n':
1267       case '/':
1268       case '\\':
1269         c = skip_white_space (c);
1270       default:
1271         goto found_nonwhite;
1272       }
1273  found_nonwhite:
1274
1275   token_buffer[0] = c;
1276   token_buffer[1] = 0;
1277
1278 /*  yylloc.first_line = lineno; */
1279
1280   switch (c)
1281     {
1282     case EOF:
1283       end_of_file = 1;
1284       token_buffer[0] = 0;
1285       if (linemode)
1286         value = END_OF_LINE;
1287       else
1288         value = ENDFILE;
1289       break;
1290
1291     case 'L':
1292 #if USE_CPPLIB
1293       if (cpp_token == CPP_NAME)
1294         goto letter;
1295 #endif
1296       /* Capital L may start a wide-string or wide-character constant.  */
1297       {
1298         register int c = token_getch();
1299         if (c == '\'')
1300           {
1301             wide_flag = 1;
1302             goto char_constant;
1303           }
1304         if (c == '"')
1305           {
1306             wide_flag = 1;
1307             goto string_constant;
1308           }
1309         token_put_back (c);
1310       }
1311       goto letter;
1312
1313     case '@':
1314       if (!doing_objc_thang)
1315         {
1316           value = c;
1317           break;
1318         }
1319       else
1320         {
1321           /* '@' may start a constant string object.  */
1322           register int c = token_getch ();
1323           if (c == '"')
1324             {
1325               objc_flag = 1;
1326               goto string_constant;
1327             }
1328           token_put_back (c);
1329           /* Fall through to treat '@' as the start of an identifier.  */
1330         }
1331
1332     case 'A':  case 'B':  case 'C':  case 'D':  case 'E':
1333     case 'F':  case 'G':  case 'H':  case 'I':  case 'J':
1334     case 'K':             case 'M':  case 'N':  case 'O':
1335     case 'P':  case 'Q':  case 'R':  case 'S':  case 'T':
1336     case 'U':  case 'V':  case 'W':  case 'X':  case 'Y':
1337     case 'Z':
1338     case 'a':  case 'b':  case 'c':  case 'd':  case 'e':
1339     case 'f':  case 'g':  case 'h':  case 'i':  case 'j':
1340     case 'k':  case 'l':  case 'm':  case 'n':  case 'o':
1341     case 'p':  case 'q':  case 'r':  case 's':  case 't':
1342     case 'u':  case 'v':  case 'w':  case 'x':  case 'y':
1343     case 'z':
1344     case '_':
1345     case '$':
1346     letter:
1347 #if USE_CPPLIB
1348       if (cpp_token == CPP_NAME)
1349         {
1350           /* Note that one character has already been read from
1351              yy_cur into token_buffer.  Also, cpplib complains about
1352              $ in identifiers, so we don't have to.  */
1353
1354           int len = yy_lim - yy_cur + 1;
1355           if (len >= maxtoken)
1356             extend_token_buffer_to (len + 1);
1357           memcpy (token_buffer + 1, yy_cur, len);
1358           p = token_buffer + len;
1359           yy_cur = yy_lim;
1360         }
1361       else
1362 #endif
1363         {
1364           p = token_buffer;
1365           while (ISALNUM (c) || c == '_' || c == '$' || c == '@')
1366             {
1367               /* Make sure this char really belongs in an identifier.  */
1368               if (c == '$')
1369                 {
1370                   if (! dollars_in_ident)
1371                     error ("`$' in identifier");
1372                   else if (pedantic)
1373                     pedwarn ("`$' in identifier");
1374                 }
1375
1376               if (p >= token_buffer + maxtoken)
1377                 p = extend_token_buffer (p);
1378
1379               *p++ = c;
1380               c = token_getch();
1381             }
1382
1383           *p = 0;
1384           token_put_back (c);
1385         }
1386
1387       value = IDENTIFIER;
1388       yylval.itype = 0;
1389
1390       /* Try to recognize a keyword.  Uses minimum-perfect hash function */
1391
1392       {
1393         register struct resword *ptr;
1394
1395         if ((ptr = is_reserved_word (token_buffer, p - token_buffer)))
1396           {
1397             if (ptr->rid)
1398               yylval.ttype = ridpointers[(int) ptr->rid];
1399             value = (int) ptr->token;
1400
1401             /* Only return OBJECTNAME if it is a typedef.  */
1402             if (doing_objc_thang && value == OBJECTNAME)
1403               {
1404                 lastiddecl = lookup_name(yylval.ttype);
1405
1406                 if (lastiddecl == NULL_TREE
1407                     || TREE_CODE (lastiddecl) != TYPE_DECL)
1408                   value = IDENTIFIER;
1409               }
1410
1411             /* Even if we decided to recognize asm, still perhaps warn.  */
1412             if (pedantic
1413                 && (value == ASM_KEYWORD || value == TYPEOF
1414                     || ptr->rid == RID_INLINE)
1415                 && token_buffer[0] != '_')
1416               pedwarn ("ANSI does not permit the keyword `%s'",
1417                        token_buffer);
1418           }
1419       }
1420
1421       /* If we did not find a keyword, look for an identifier
1422          (or a typename).  */
1423
1424       if (value == IDENTIFIER)
1425         {
1426           if (token_buffer[0] == '@')
1427             error("invalid identifier `%s'", token_buffer);
1428
1429           yylval.ttype = get_identifier (token_buffer);
1430           lastiddecl = lookup_name (yylval.ttype);
1431
1432           if (lastiddecl != 0 && TREE_CODE (lastiddecl) == TYPE_DECL)
1433             value = TYPENAME;
1434           /* A user-invisible read-only initialized variable
1435              should be replaced by its value.
1436              We handle only strings since that's the only case used in C.  */
1437           else if (lastiddecl != 0 && TREE_CODE (lastiddecl) == VAR_DECL
1438                    && DECL_IGNORED_P (lastiddecl)
1439                    && TREE_READONLY (lastiddecl)
1440                    && DECL_INITIAL (lastiddecl) != 0
1441                    && TREE_CODE (DECL_INITIAL (lastiddecl)) == STRING_CST)
1442             {
1443               tree stringval = DECL_INITIAL (lastiddecl);
1444
1445               /* Copy the string value so that we won't clobber anything
1446                  if we put something in the TREE_CHAIN of this one.  */
1447               yylval.ttype = build_string (TREE_STRING_LENGTH (stringval),
1448                                            TREE_STRING_POINTER (stringval));
1449               value = STRING;
1450             }
1451           else if (doing_objc_thang)
1452             {
1453               tree objc_interface_decl = is_class_name (yylval.ttype);
1454
1455               if (objc_interface_decl)
1456                 {
1457                   value = CLASSNAME;
1458                   yylval.ttype = objc_interface_decl;
1459                 }
1460             }
1461         }
1462
1463       break;
1464
1465     case '.':
1466 #if USE_CPPLIB
1467       if (yy_cur < yy_lim)
1468 #endif
1469         {
1470           /* It's hard to preserve tokenization on '.' because
1471              it could be a symbol by itself, or it could be the
1472              start of a floating point number and cpp won't tell us.  */
1473           register int c1 = token_getch ();
1474           token_buffer[1] = c1;
1475           if (c1 == '.')
1476             {
1477               c1 = token_getch ();
1478               if (c1 == '.')
1479                 {
1480                   token_buffer[2] = c1;
1481                   token_buffer[3] = 0;
1482                   value = ELLIPSIS;
1483                   goto done;
1484                 }
1485               error ("parse error at `..'");
1486             }
1487           if (ISDIGIT (c1))
1488             {
1489               token_put_back (c1);
1490               goto number;
1491             }
1492           token_put_back (c1);
1493         }
1494       value = '.';
1495       token_buffer[1] = 0;
1496       break;
1497
1498     case '0':  case '1':
1499       /* Optimize for most frequent case.  */
1500       {
1501         register int cond;
1502
1503 #if USE_CPPLIB
1504         cond = (yy_cur == yy_lim);
1505 #else
1506         register int c1 = token_getch ();
1507         token_put_back (c1);
1508         cond = (! ISALNUM (c1) && c1 != '.');
1509 #endif
1510         if (cond)
1511           {
1512             yylval.ttype = (c == '0') ? integer_zero_node : integer_one_node;
1513             value = CONSTANT;
1514             break;
1515           }
1516         /*FALLTHRU*/
1517       }
1518     case '2':  case '3':  case '4':
1519     case '5':  case '6':  case '7':  case '8':  case '9':
1520     number:
1521       {
1522         int base = 10;
1523         int count = 0;
1524         int largest_digit = 0;
1525         int numdigits = 0;
1526         int overflow = 0;
1527
1528         /* We actually store only HOST_BITS_PER_CHAR bits in each part.
1529            The code below which fills the parts array assumes that a host
1530            int is at least twice as wide as a host char, and that 
1531            HOST_BITS_PER_WIDE_INT is an even multiple of HOST_BITS_PER_CHAR.
1532            Two HOST_WIDE_INTs is the largest int literal we can store.
1533            In order to detect overflow below, the number of parts (TOTAL_PARTS)
1534            must be exactly the number of parts needed to hold the bits
1535            of two HOST_WIDE_INTs. */
1536 #define TOTAL_PARTS ((HOST_BITS_PER_WIDE_INT / HOST_BITS_PER_CHAR) * 2)
1537         unsigned int parts[TOTAL_PARTS];
1538
1539         enum anon1 { NOT_FLOAT, AFTER_POINT, TOO_MANY_POINTS, AFTER_EXPON}
1540           floatflag = NOT_FLOAT;
1541
1542         for (count = 0; count < TOTAL_PARTS; count++)
1543           parts[count] = 0;
1544
1545         p = token_buffer;
1546         *p++ = c;
1547
1548         if (c == '0')
1549           {
1550             *p++ = (c = token_getch());
1551             if ((c == 'x') || (c == 'X'))
1552               {
1553                 base = 16;
1554                 *p++ = (c = token_getch());
1555               }
1556             /* Leading 0 forces octal unless the 0 is the only digit.  */
1557             else if (c >= '0' && c <= '9')
1558               {
1559                 base = 8;
1560                 numdigits++;
1561               }
1562             else
1563               numdigits++;
1564           }
1565
1566         /* Read all the digits-and-decimal-points.  */
1567
1568         while (c == '.'
1569                || (ISALNUM (c) && c != 'l' && c != 'L'
1570                    && c != 'u' && c != 'U'
1571                    && c != 'i' && c != 'I' && c != 'j' && c != 'J'
1572                    && (floatflag == NOT_FLOAT || ((c != 'f') && (c != 'F')))))
1573           {
1574             if (c == '.')
1575               {
1576                 if (base == 16 && pedantic)
1577                   pedwarn ("floating constant may not be in radix 16");
1578                 if (floatflag == TOO_MANY_POINTS)
1579                   /* We have already emitted an error.  Don't need another.  */
1580                   ;
1581                 else if (floatflag == AFTER_POINT || floatflag == AFTER_EXPON)
1582                   {
1583                     error ("malformed floating constant");
1584                     floatflag = TOO_MANY_POINTS;
1585                     /* Avoid another error from atof by forcing all characters
1586                        from here on to be ignored.  */
1587                     p[-1] = '\0';
1588                   }
1589                 else
1590                   floatflag = AFTER_POINT;
1591
1592                 if (base == 8)
1593                   base = 10;
1594                 *p++ = c = token_getch();
1595                 /* Accept '.' as the start of a floating-point number
1596                    only when it is followed by a digit.  */
1597                 if (p == token_buffer + 2 && !ISDIGIT (c))
1598                   abort ();
1599               }
1600             else
1601               {
1602                 /* It is not a decimal point.
1603                    It should be a digit (perhaps a hex digit).  */
1604
1605                 if (ISDIGIT (c))
1606                   {
1607                     c = c - '0';
1608                   }
1609                 else if (base <= 10)
1610                   {
1611                     if (c == 'e' || c == 'E')
1612                       {
1613                         base = 10;
1614                         floatflag = AFTER_EXPON;
1615                         break;   /* start of exponent */
1616                       }
1617                     error ("nondigits in number and not hexadecimal");
1618                     c = 0;
1619                   }
1620                 else if (base == 16 && (c == 'p' || c == 'P'))
1621                   {
1622                     floatflag = AFTER_EXPON;
1623                     break;   /* start of exponent */
1624                   }
1625                 else if (c >= 'a')
1626                   {
1627                     c = c - 'a' + 10;
1628                   }
1629                 else
1630                   {
1631                     c = c - 'A' + 10;
1632                   }
1633                 if (c >= largest_digit)
1634                   largest_digit = c;
1635                 numdigits++;
1636
1637                 for (count = 0; count < TOTAL_PARTS; count++)
1638                   {
1639                     parts[count] *= base;
1640                     if (count)
1641                       {
1642                         parts[count]
1643                           += (parts[count-1] >> HOST_BITS_PER_CHAR);
1644                         parts[count-1]
1645                           &= (1 << HOST_BITS_PER_CHAR) - 1;
1646                       }
1647                     else
1648                       parts[0] += c;
1649                   }
1650
1651                 /* If the highest-order part overflows (gets larger than
1652                    a host char will hold) then the whole number has 
1653                    overflowed.  Record this and truncate the highest-order
1654                    part. */
1655                 if (parts[TOTAL_PARTS - 1] >> HOST_BITS_PER_CHAR)
1656                   {
1657                     overflow = 1;
1658                     parts[TOTAL_PARTS - 1] &= (1 << HOST_BITS_PER_CHAR) - 1;
1659                   }
1660
1661                 if (p >= token_buffer + maxtoken - 3)
1662                   p = extend_token_buffer (p);
1663                 *p++ = (c = token_getch());
1664               }
1665           }
1666
1667         /* This can happen on input like `int i = 0x;' */
1668         if (numdigits == 0)
1669           error ("numeric constant with no digits");
1670
1671         if (largest_digit >= base)
1672           error ("numeric constant contains digits beyond the radix");
1673
1674         /* Remove terminating char from the token buffer and delimit the
1675            string.  */
1676         *--p = 0;
1677
1678         if (floatflag != NOT_FLOAT)
1679           {
1680             tree type;
1681             int imag, conversion_errno;
1682             REAL_VALUE_TYPE value;
1683             struct pf_args args;
1684
1685             /* Read explicit exponent if any, and put it in tokenbuf.  */
1686
1687             if ((base == 10 && ((c == 'e') || (c == 'E')))
1688                 || (base == 16 && (c == 'p' || c == 'P')))
1689               {
1690                 if (p >= token_buffer + maxtoken - 3)
1691                   p = extend_token_buffer (p);
1692                 *p++ = c;
1693                 c = token_getch();
1694                 if ((c == '+') || (c == '-'))
1695                   {
1696                     *p++ = c;
1697                     c = token_getch();
1698                   }
1699                 /* Exponent is decimal, even if string is a hex float.  */
1700                 if (! ISDIGIT (c))
1701                   error ("floating constant exponent has no digits");
1702                 while (ISDIGIT (c))
1703                   {
1704                     if (p >= token_buffer + maxtoken - 3)
1705                       p = extend_token_buffer (p);
1706                     *p++ = c;
1707                     c = token_getch ();
1708                   }
1709               }
1710             if (base == 16 && floatflag != AFTER_EXPON)
1711               error ("hexadecimal floating constant has no exponent");
1712
1713             *p = 0;
1714
1715             /* Setup input for parse_float() */
1716             args.base = base;
1717             args.p = p;
1718             args.c = c;
1719
1720             /* Convert string to a double, checking for overflow.  */
1721             if (do_float_handler (parse_float, (PTR) &args))
1722               {
1723                 /* Receive output from parse_float() */
1724                 value = args.value;
1725               }
1726             else
1727               {
1728                 /* We got an exception from parse_float() */
1729                 error ("floating constant out of range");
1730                 value = dconst0;
1731               }
1732
1733             /* Receive output from parse_float() */
1734             c = args.c;
1735             imag = args.imag;
1736             type = args.type;
1737             conversion_errno = args.conversion_errno;
1738             
1739 #ifdef ERANGE
1740             /* ERANGE is also reported for underflow,
1741                so test the value to distinguish overflow from that.  */
1742             if (conversion_errno == ERANGE && !flag_traditional && pedantic
1743                 && (REAL_VALUES_LESS (dconst1, value)
1744                     || REAL_VALUES_LESS (value, dconstm1)))
1745               warning ("floating point number exceeds range of `double'");
1746 #endif
1747
1748             /* If the result is not a number, assume it must have been
1749                due to some error message above, so silently convert
1750                it to a zero.  */
1751             if (REAL_VALUE_ISNAN (value))
1752               value = dconst0;
1753
1754             /* Create a node with determined type and value.  */
1755             if (imag)
1756               yylval.ttype = build_complex (NULL_TREE,
1757                                             convert (type, integer_zero_node),
1758                                             build_real (type, value));
1759             else
1760               yylval.ttype = build_real (type, value);
1761           }
1762         else
1763           {
1764             tree traditional_type, ansi_type, type;
1765             HOST_WIDE_INT high, low;
1766             int spec_unsigned = 0;
1767             int spec_long = 0;
1768             int spec_long_long = 0;
1769             int spec_imag = 0;
1770             int warn = 0, i;
1771
1772             traditional_type = ansi_type = type = NULL_TREE;
1773             while (1)
1774               {
1775                 if (c == 'u' || c == 'U')
1776                   {
1777                     if (spec_unsigned)
1778                       error ("two `u's in integer constant");
1779                     spec_unsigned = 1;
1780                   }
1781                 else if (c == 'l' || c == 'L')
1782                   {
1783                     if (spec_long)
1784                       {
1785                         if (spec_long_long)
1786                           error ("three `l's in integer constant");
1787                         else if (pedantic && ! in_system_header && warn_long_long)
1788                           pedwarn ("ANSI C forbids long long integer constants");
1789                         spec_long_long = 1;
1790                       }
1791                     spec_long = 1;
1792                   }
1793                 else if (c == 'i' || c == 'j' || c == 'I' || c == 'J')
1794                   {
1795                     if (spec_imag)
1796                       error ("more than one `i' or `j' in numeric constant");
1797                     else if (pedantic)
1798                       pedwarn ("ANSI C forbids imaginary numeric constants");
1799                     spec_imag = 1;
1800                   }
1801                 else
1802                   break;
1803                 if (p >= token_buffer + maxtoken - 3)
1804                   p = extend_token_buffer (p);
1805                 *p++ = c;
1806                 c = token_getch();
1807               }
1808
1809             /* If the literal overflowed, pedwarn about it now. */
1810             if (overflow)
1811               {
1812                 warn = 1;
1813                 pedwarn ("integer constant is too large for this configuration of the compiler - truncated to %d bits", HOST_BITS_PER_WIDE_INT * 2);
1814               }
1815
1816             /* This is simplified by the fact that our constant
1817                is always positive.  */
1818
1819             high = low = 0;
1820
1821             for (i = 0; i < HOST_BITS_PER_WIDE_INT / HOST_BITS_PER_CHAR; i++)
1822               {
1823                 high |= ((HOST_WIDE_INT) parts[i + (HOST_BITS_PER_WIDE_INT
1824                                                     / HOST_BITS_PER_CHAR)]
1825                          << (i * HOST_BITS_PER_CHAR));
1826                 low |= (HOST_WIDE_INT) parts[i] << (i * HOST_BITS_PER_CHAR);
1827               }
1828
1829             yylval.ttype = build_int_2 (low, high);
1830             TREE_TYPE (yylval.ttype) = long_long_unsigned_type_node;
1831
1832             /* If warn_traditional, calculate both the ANSI type and the
1833                traditional type, then see if they disagree.
1834                Otherwise, calculate only the type for the dialect in use.  */
1835             if (warn_traditional || flag_traditional)
1836               {
1837                 /* Calculate the traditional type.  */
1838                 /* Traditionally, any constant is signed;
1839                    but if unsigned is specified explicitly, obey that.
1840                    Use the smallest size with the right number of bits,
1841                    except for one special case with decimal constants.  */
1842                 if (! spec_long && base != 10
1843                     && int_fits_type_p (yylval.ttype, unsigned_type_node))
1844                   traditional_type = (spec_unsigned ? unsigned_type_node
1845                                       : integer_type_node);
1846                 /* A decimal constant must be long
1847                    if it does not fit in type int.
1848                    I think this is independent of whether
1849                    the constant is signed.  */
1850                 else if (! spec_long && base == 10
1851                          && int_fits_type_p (yylval.ttype, integer_type_node))
1852                   traditional_type = (spec_unsigned ? unsigned_type_node
1853                                       : integer_type_node);
1854                 else if (! spec_long_long)
1855                   traditional_type = (spec_unsigned ? long_unsigned_type_node
1856                                       : long_integer_type_node);
1857                 else if (int_fits_type_p (yylval.ttype,
1858                                           spec_unsigned 
1859                                           ? long_long_unsigned_type_node
1860                                           : long_long_integer_type_node)) 
1861                   traditional_type = (spec_unsigned
1862                                       ? long_long_unsigned_type_node
1863                                       : long_long_integer_type_node);
1864                 else
1865                   traditional_type = (spec_unsigned
1866                                       ? widest_unsigned_literal_type_node
1867                                       : widest_integer_literal_type_node);
1868               }
1869             if (warn_traditional || ! flag_traditional)
1870               {
1871                 /* Calculate the ANSI type.  */
1872                 if (! spec_long && ! spec_unsigned
1873                     && int_fits_type_p (yylval.ttype, integer_type_node))
1874                   ansi_type = integer_type_node;
1875                 else if (! spec_long && (base != 10 || spec_unsigned)
1876                          && int_fits_type_p (yylval.ttype, unsigned_type_node))
1877                   ansi_type = unsigned_type_node;
1878                 else if (! spec_unsigned && !spec_long_long
1879                          && int_fits_type_p (yylval.ttype, long_integer_type_node))
1880                   ansi_type = long_integer_type_node;
1881                 else if (! spec_long_long
1882                          && int_fits_type_p (yylval.ttype,
1883                                              long_unsigned_type_node))
1884                   ansi_type = long_unsigned_type_node;
1885                 else if (! spec_unsigned
1886                          && int_fits_type_p (yylval.ttype,
1887                                              long_long_integer_type_node))
1888                   ansi_type = long_long_integer_type_node;
1889                 else if (int_fits_type_p (yylval.ttype,
1890                                           long_long_unsigned_type_node))
1891                   ansi_type = long_long_unsigned_type_node;
1892                 else if (! spec_unsigned
1893                          && int_fits_type_p (yylval.ttype,
1894                                              widest_integer_literal_type_node))
1895                   ansi_type = widest_integer_literal_type_node;
1896                 else
1897                   ansi_type = widest_unsigned_literal_type_node;
1898               }
1899
1900             type = flag_traditional ? traditional_type : ansi_type;
1901
1902             if (warn_traditional && traditional_type != ansi_type)
1903               {
1904                 if (TYPE_PRECISION (traditional_type)
1905                     != TYPE_PRECISION (ansi_type))
1906                   warning ("width of integer constant changes with -traditional");
1907                 else if (TREE_UNSIGNED (traditional_type)
1908                          != TREE_UNSIGNED (ansi_type))
1909                   warning ("integer constant is unsigned in ANSI C, signed with -traditional");
1910                 else
1911                   warning ("width of integer constant may change on other systems with -traditional");
1912               }
1913
1914             if (pedantic && !flag_traditional && !spec_long_long && !warn
1915                 && (TYPE_PRECISION (long_integer_type_node)
1916                     < TYPE_PRECISION (type)))
1917               {
1918                 warn = 1;
1919                 pedwarn ("integer constant larger than the maximum value of an unsigned long int");
1920               }
1921
1922             if (base == 10 && ! spec_unsigned && TREE_UNSIGNED (type))
1923               warning ("decimal constant is so large that it is unsigned");
1924
1925             if (spec_imag)
1926               {
1927                 if (TYPE_PRECISION (type)
1928                     <= TYPE_PRECISION (integer_type_node))
1929                   yylval.ttype
1930                     = build_complex (NULL_TREE, integer_zero_node,
1931                                      convert (integer_type_node,
1932                                               yylval.ttype));
1933                 else
1934                   error ("complex integer constant is too wide for `complex int'");
1935               }
1936             else if (flag_traditional && !int_fits_type_p (yylval.ttype, type))
1937               /* The traditional constant 0x80000000 is signed
1938                  but doesn't fit in the range of int.
1939                  This will change it to -0x80000000, which does fit.  */
1940               {
1941                 TREE_TYPE (yylval.ttype) = unsigned_type (type);
1942                 yylval.ttype = convert (type, yylval.ttype);
1943                 TREE_OVERFLOW (yylval.ttype)
1944                   = TREE_CONSTANT_OVERFLOW (yylval.ttype) = 0;
1945               }
1946             else
1947               TREE_TYPE (yylval.ttype) = type;
1948
1949
1950             /* If it's still an integer (not a complex), and it doesn't
1951                fit in the type we choose for it, then pedwarn. */
1952
1953             if (! warn
1954                 && TREE_CODE (TREE_TYPE (yylval.ttype)) == INTEGER_TYPE
1955                 && ! int_fits_type_p (yylval.ttype, TREE_TYPE (yylval.ttype)))
1956               pedwarn ("integer constant is larger than the maximum value for its type");
1957           }
1958
1959         token_put_back (c);
1960         *p = 0;
1961
1962         if (ISALNUM (c) || c == '.' || c == '_' || c == '$'
1963             || (!flag_traditional && (c == '-' || c == '+')
1964                 && (p[-1] == 'e' || p[-1] == 'E')))
1965           error ("missing white space after number `%s'", token_buffer);
1966
1967         value = CONSTANT; break;
1968       }
1969
1970     case '\'':
1971     char_constant:
1972       {
1973         register int result = 0;
1974         register int num_chars = 0;
1975         int chars_seen = 0;
1976         unsigned width = TYPE_PRECISION (char_type_node);
1977         int max_chars;
1978 #ifdef MULTIBYTE_CHARS
1979         int longest_char = local_mb_cur_max ();
1980         (void) local_mbtowc (NULL_PTR, NULL_PTR, 0);
1981 #endif
1982
1983         max_chars = TYPE_PRECISION (integer_type_node) / width;
1984         if (wide_flag)
1985           width = WCHAR_TYPE_SIZE;
1986
1987         while (1)
1988           {
1989           tryagain:
1990             c = token_getch();
1991
1992             if (c == '\'' || c == EOF)
1993               break;
1994
1995             ++chars_seen;
1996             if (c == '\\')
1997               {
1998                 int ignore = 0;
1999                 c = readescape (&ignore);
2000                 if (ignore)
2001                   goto tryagain;
2002                 if (width < HOST_BITS_PER_INT
2003                     && (unsigned) c >= ((unsigned)1 << width))
2004                   pedwarn ("escape sequence out of range for character");
2005 #ifdef MAP_CHARACTER
2006                 if (ISPRINT (c))
2007                   c = MAP_CHARACTER (c);
2008 #endif
2009               }
2010             else if (c == '\n')
2011               {
2012                 if (pedantic)
2013                   pedwarn ("ANSI C forbids newline in character constant");
2014                 lineno++;
2015               }
2016             else
2017               {
2018 #ifdef MULTIBYTE_CHARS
2019                 wchar_t wc;
2020                 int i;
2021                 int char_len = -1;
2022                 for (i = 1; i <= longest_char; ++i)
2023                   {
2024                     if (i > maxtoken - 4)
2025                       extend_token_buffer (token_buffer);
2026
2027                     token_buffer[i] = c;
2028                     char_len = local_mbtowc (& wc,
2029                                              token_buffer + 1,
2030                                              i);
2031                     if (char_len != -1)
2032                       break;
2033                     c = token_getch ();
2034                   }
2035                 if (char_len > 1)
2036                   {
2037                     /* mbtowc sometimes needs an extra char before accepting */
2038                     if (char_len < i)
2039                       token_put_back (c);
2040                     if (! wide_flag)
2041                       {
2042                         /* Merge character into result; ignore excess chars.  */
2043                         for (i = 1; i <= char_len; ++i)
2044                           {
2045                             if (i > max_chars)
2046                               break;
2047                             if (width < HOST_BITS_PER_INT)
2048                               result = (result << width)
2049                                 | (token_buffer[i]
2050                                    & ((1 << width) - 1));
2051                             else
2052                               result = token_buffer[i];
2053                           }
2054                         num_chars += char_len;
2055                         goto tryagain;
2056                       }
2057                     c = wc;
2058                   }
2059                 else
2060                   {
2061                     if (char_len == -1)
2062                       {
2063                         warning ("Ignoring invalid multibyte character");
2064                         /* Replace all but the first byte.  */
2065                         for (--i; i > 1; --i)
2066                           token_put_back (token_buffer[i]);
2067                         wc = token_buffer[1];
2068                       }
2069 #ifdef MAP_CHARACTER
2070                       c = MAP_CHARACTER (wc);
2071 #else
2072                       c = wc;
2073 #endif
2074                   }
2075 #else /* ! MULTIBYTE_CHARS */
2076 #ifdef MAP_CHARACTER
2077                 c = MAP_CHARACTER (c);
2078 #endif
2079 #endif /* ! MULTIBYTE_CHARS */
2080               }
2081
2082             if (wide_flag)
2083               {
2084                 if (chars_seen == 1) /* only keep the first one */
2085                   result = c;
2086                 goto tryagain;
2087               }
2088
2089             /* Merge character into result; ignore excess chars.  */
2090             num_chars += (width / TYPE_PRECISION (char_type_node));
2091             if (num_chars < max_chars + 1)
2092               {
2093                 if (width < HOST_BITS_PER_INT)
2094                   result = (result << width) | (c & ((1 << width) - 1));
2095                 else
2096                   result = c;
2097               }
2098           }
2099
2100         if (c != '\'')
2101           error ("malformed character constant");
2102         else if (chars_seen == 0)
2103           error ("empty character constant");
2104         else if (num_chars > max_chars)
2105           {
2106             num_chars = max_chars;
2107             error ("character constant too long");
2108           }
2109         else if (chars_seen != 1 && ! flag_traditional && warn_multichar)
2110           warning ("multi-character character constant");
2111
2112         /* If char type is signed, sign-extend the constant.  */
2113         if (! wide_flag)
2114           {
2115             int num_bits = num_chars * width;
2116             if (num_bits == 0)
2117               /* We already got an error; avoid invalid shift.  */
2118               yylval.ttype = build_int_2 (0, 0);
2119             else if (TREE_UNSIGNED (char_type_node)
2120                      || ((result >> (num_bits - 1)) & 1) == 0)
2121               yylval.ttype
2122                 = build_int_2 (result & (~(unsigned HOST_WIDE_INT) 0
2123                                          >> (HOST_BITS_PER_WIDE_INT - num_bits)),
2124                                0);
2125             else
2126               yylval.ttype
2127                 = build_int_2 (result | ~(~(unsigned HOST_WIDE_INT) 0
2128                                           >> (HOST_BITS_PER_WIDE_INT - num_bits)),
2129                                -1);
2130             TREE_TYPE (yylval.ttype) = integer_type_node;
2131           }
2132         else
2133           {
2134             yylval.ttype = build_int_2 (result, 0);
2135             TREE_TYPE (yylval.ttype) = wchar_type_node;
2136           }
2137
2138         value = CONSTANT;
2139         break;
2140       }
2141
2142     case '"':
2143     string_constant:
2144       {
2145         unsigned width = wide_flag ? WCHAR_TYPE_SIZE
2146                                    : TYPE_PRECISION (char_type_node);
2147 #ifdef MULTIBYTE_CHARS
2148         int longest_char = local_mb_cur_max ();
2149         (void) local_mbtowc (NULL_PTR, NULL_PTR, 0);
2150 #endif
2151         c = token_getch ();
2152         p = token_buffer + 1;
2153
2154         while (c != '"' && c != EOF)
2155           {
2156             /* ignore_escape_flag is set for reading the filename in #line.  */
2157             if (!ignore_escape_flag && c == '\\')
2158               {
2159                 int ignore = 0;
2160                 c = readescape (&ignore);
2161                 if (ignore)
2162                   goto skipnewline;
2163                 if (width < HOST_BITS_PER_INT
2164                     && (unsigned) c >= ((unsigned)1 << width))
2165                   pedwarn ("escape sequence out of range for character");
2166               }
2167             else if (c == '\n')
2168               {
2169                 if (pedantic)
2170                   pedwarn ("ANSI C forbids newline in string constant");
2171                 lineno++;
2172               }
2173             else
2174               {
2175 #ifdef MULTIBYTE_CHARS
2176                 wchar_t wc;
2177                 int i;
2178                 int char_len = -1;
2179                 for (i = 0; i < longest_char; ++i)
2180                   {
2181                     if (p + i >= token_buffer + maxtoken)
2182                       p = extend_token_buffer (p);
2183                     p[i] = c;
2184
2185                     char_len = local_mbtowc (& wc, p, i + 1);
2186                     if (char_len != -1)
2187                       break;
2188                     c = token_getch ();
2189                   }
2190                 if (char_len == -1)
2191                   {
2192                     warning ("Ignoring invalid multibyte character");
2193                     /* Replace all except the first byte.  */
2194                     token_put_back (c);
2195                     for (--i; i > 0; --i)
2196                       token_put_back (p[i]);
2197                     char_len = 1;
2198                   }
2199                 /* mbtowc sometimes needs an extra char before accepting */
2200                 if (char_len <= i)
2201                   token_put_back (c);
2202                 if (! wide_flag)
2203                   {
2204                     p += (i + 1);
2205                     c = token_getch ();
2206                     continue;
2207                   }
2208                 c = wc;
2209 #endif /* MULTIBYTE_CHARS */
2210               }
2211
2212             /* Add this single character into the buffer either as a wchar_t
2213                or as a single byte.  */
2214             if (wide_flag)
2215               {
2216                 unsigned width = TYPE_PRECISION (char_type_node);
2217                 unsigned bytemask = (1 << width) - 1;
2218                 int byte;
2219
2220                 if (p + WCHAR_BYTES > token_buffer + maxtoken)
2221                   p = extend_token_buffer (p);
2222
2223                 for (byte = 0; byte < WCHAR_BYTES; ++byte)
2224                   {
2225                     int value;
2226                     if (byte >= (int) sizeof (c))
2227                       value = 0;
2228                     else
2229                       value = (c >> (byte * width)) & bytemask;
2230                     if (BYTES_BIG_ENDIAN)
2231                       p[WCHAR_BYTES - byte - 1] = value;
2232                     else
2233                       p[byte] = value;
2234                   }
2235                 p += WCHAR_BYTES;
2236               }
2237             else
2238               {
2239                 if (p >= token_buffer + maxtoken)
2240                   p = extend_token_buffer (p);
2241                 *p++ = c;
2242               }
2243
2244           skipnewline:
2245             c = token_getch ();
2246           }
2247
2248         /* Terminate the string value, either with a single byte zero
2249            or with a wide zero.  */
2250         if (wide_flag)
2251           {
2252             if (p + WCHAR_BYTES > token_buffer + maxtoken)
2253               p = extend_token_buffer (p);
2254             bzero (p, WCHAR_BYTES);
2255             p += WCHAR_BYTES;
2256           }
2257         else
2258           {
2259             if (p >= token_buffer + maxtoken)
2260               p = extend_token_buffer (p);
2261             *p++ = 0;
2262           }
2263
2264         if (c == EOF)
2265           error ("Unterminated string constant");
2266
2267         /* We have read the entire constant.
2268            Construct a STRING_CST for the result.  */
2269
2270         if (wide_flag)
2271           {
2272             yylval.ttype = build_string (p - (token_buffer + 1),
2273                                          token_buffer + 1);
2274             TREE_TYPE (yylval.ttype) = wchar_array_type_node;
2275             value = STRING;
2276           }
2277         else if (objc_flag)
2278           {
2279             /* Return an Objective-C @"..." constant string object.  */
2280             yylval.ttype = build_objc_string (p - (token_buffer + 1),
2281                                               token_buffer + 1);
2282             TREE_TYPE (yylval.ttype) = char_array_type_node;
2283             value = OBJC_STRING;
2284           }
2285         else
2286           {
2287             yylval.ttype = build_string (p - (token_buffer + 1),
2288                                          token_buffer + 1);
2289             TREE_TYPE (yylval.ttype) = char_array_type_node;
2290             value = STRING;
2291           }
2292
2293         break;
2294       }
2295
2296     case '+':
2297     case '-':
2298     case '&':
2299     case '|':
2300     case ':':
2301     case '<':
2302     case '>':
2303     case '*':
2304     case '/':
2305     case '%':
2306     case '^':
2307     case '!':
2308     case '=':
2309       {
2310         register int c1;
2311
2312       combine:
2313
2314         switch (c)
2315           {
2316           case '+':
2317             yylval.code = PLUS_EXPR; break;
2318           case '-':
2319             yylval.code = MINUS_EXPR; break;
2320           case '&':
2321             yylval.code = BIT_AND_EXPR; break;
2322           case '|':
2323             yylval.code = BIT_IOR_EXPR; break;
2324           case '*':
2325             yylval.code = MULT_EXPR; break;
2326           case '/':
2327             yylval.code = TRUNC_DIV_EXPR; break;
2328           case '%':
2329             yylval.code = TRUNC_MOD_EXPR; break;
2330           case '^':
2331             yylval.code = BIT_XOR_EXPR; break;
2332           case LSHIFT:
2333             yylval.code = LSHIFT_EXPR; break;
2334           case RSHIFT:
2335             yylval.code = RSHIFT_EXPR; break;
2336           case '<':
2337             yylval.code = LT_EXPR; break;
2338           case '>':
2339             yylval.code = GT_EXPR; break;
2340           }
2341
2342         token_buffer[1] = c1 = token_getch();
2343         token_buffer[2] = 0;
2344
2345         if (c1 == '=')
2346           {
2347             switch (c)
2348               {
2349               case '<':
2350                 value = ARITHCOMPARE; yylval.code = LE_EXPR; goto done;
2351               case '>':
2352                 value = ARITHCOMPARE; yylval.code = GE_EXPR; goto done;
2353               case '!':
2354                 value = EQCOMPARE; yylval.code = NE_EXPR; goto done;
2355               case '=':
2356                 value = EQCOMPARE; yylval.code = EQ_EXPR; goto done;
2357               }
2358             value = ASSIGN; goto done;
2359           }
2360         else if (c == c1)
2361           switch (c)
2362             {
2363             case '+':
2364               value = PLUSPLUS; goto done;
2365             case '-':
2366               value = MINUSMINUS; goto done;
2367             case '&':
2368               value = ANDAND; goto done;
2369             case '|':
2370               value = OROR; goto done;
2371             case '<':
2372               c = LSHIFT;
2373               goto combine;
2374             case '>':
2375               c = RSHIFT;
2376               goto combine;
2377             }
2378         else
2379           switch (c)
2380             {
2381             case '-':
2382               if (c1 == '>')
2383                 { value = POINTSAT; goto done; }
2384               break;
2385
2386               /* digraphs */
2387             case ':':
2388               if (c1 == '>')
2389                 { value = ']'; goto done; }
2390               break;
2391             case '<':
2392               if (c1 == '%')
2393                 { value = '{'; indent_level++; goto done; }
2394               if (c1 == ':')
2395                 { value = '['; goto done; }
2396               break;
2397             case '%':
2398               if (c1 == '>')
2399                 { value = '}'; indent_level--; goto done; }
2400               break;
2401             }
2402
2403         token_put_back (c1);
2404         token_buffer[1] = 0;
2405
2406         if ((c == '<') || (c == '>'))
2407           value = ARITHCOMPARE;
2408         else value = c;
2409         break;
2410       }
2411
2412     case 0:
2413       /* Don't make yyparse think this is eof.  */
2414       value = 1;
2415       break;
2416
2417     case '{':
2418       indent_level++;
2419       value = c;
2420       break;
2421
2422     case '}':
2423       indent_level--;
2424       value = c;
2425       break;
2426
2427     default:
2428       value = c;
2429     }
2430
2431 done:
2432 /*  yylloc.last_line = lineno; */
2433
2434   return value;
2435 }
2436
2437 /* Sets the value of the 'yydebug' variable to VALUE.
2438    This is a function so we don't have to have YYDEBUG defined
2439    in order to build the compiler.  */
2440
2441 void
2442 set_yydebug (value)
2443      int value;
2444 {
2445 #if YYDEBUG != 0
2446   yydebug = value;
2447 #else
2448   warning ("YYDEBUG not defined.");
2449 #endif
2450 }