1 /* Lexical analyzer for C and Objective C.
2 Copyright (C) 1987, 88, 89, 92, 94, 95, 1996 Free Software Foundation, Inc.
4 This file is part of GNU CC.
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)
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.
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. */
38 #ifdef MULTIBYTE_CHARS
47 /* The elements of `ridpointers' are identifier nodes
48 for the reserved type names and storage classes.
49 It is indexed by a RID_... value. */
50 tree ridpointers
[(int) RID_MAX
];
52 /* Cause the `yydebug' variable to be defined. */
55 /* the declaration found for the last IDENTIFIER token read in.
56 yylex must look this up to detect typedefs, which get token type TYPENAME,
57 so it is left around in case the identifier is not a typedef but is
58 used in a context which makes it a reference to a variable. */
61 /* Nonzero enables objc features. */
65 extern tree
is_class_name ();
69 /* File used for outputting assembler code. */
70 extern FILE *asm_out_file
;
72 #ifndef WCHAR_TYPE_SIZE
74 #define WCHAR_TYPE_SIZE INT_TYPE_SIZE
76 #define WCHAR_TYPE_SIZE BITS_PER_WORD
80 /* Number of bytes in a wide character. */
81 #define WCHAR_BYTES (WCHAR_TYPE_SIZE / BITS_PER_UNIT)
83 static int maxtoken
; /* Current nominal length of token buffer. */
84 char *token_buffer
; /* Pointer to token buffer.
85 Actual allocated length is maxtoken + 2.
86 This is not static because objc-parse.y uses it. */
88 /* Nonzero if end-of-file has been seen on input. */
89 static int end_of_file
;
91 /* Buffered-back input character; faster than using ungetc. */
92 static int nextchar
= -1;
96 /* Do not insert generated code into the source, instead, include it.
97 This allows us to build gcc automatically even for targets that
98 need to add or modify the reserved keyword lists. */
101 /* Return something to represent absolute declarators containing a *.
102 TARGET is the absolute declarator that the * contains.
103 TYPE_QUALS is a list of modifiers such as const or volatile
104 to apply to the pointer type, represented as identifiers.
106 We return an INDIRECT_REF whose "contents" are TARGET
107 and whose type is the modifier list. */
110 make_pointer_declarator (type_quals
, target
)
111 tree type_quals
, target
;
113 return build1 (INDIRECT_REF
, type_quals
, target
);
117 forget_protocol_qualifiers ()
119 int i
, n
= sizeof wordlist
/ sizeof (struct resword
);
121 for (i
= 0; i
< n
; i
++)
122 if ((int) wordlist
[i
].rid
>= (int) RID_IN
123 && (int) wordlist
[i
].rid
<= (int) RID_ONEWAY
)
124 wordlist
[i
].name
= "";
128 remember_protocol_qualifiers ()
130 int i
, n
= sizeof wordlist
/ sizeof (struct resword
);
132 for (i
= 0; i
< n
; i
++)
133 if (wordlist
[i
].rid
== RID_IN
)
134 wordlist
[i
].name
= "in";
135 else if (wordlist
[i
].rid
== RID_OUT
)
136 wordlist
[i
].name
= "out";
137 else if (wordlist
[i
].rid
== RID_INOUT
)
138 wordlist
[i
].name
= "inout";
139 else if (wordlist
[i
].rid
== RID_BYCOPY
)
140 wordlist
[i
].name
= "bycopy";
141 else if (wordlist
[i
].rid
== RID_ONEWAY
)
142 wordlist
[i
].name
= "oneway";
148 /* Make identifier nodes long enough for the language-specific slots. */
149 set_identifier_size (sizeof (struct lang_identifier
));
151 /* Start it at 0, because check_newline is called at the very beginning
152 and will increment it to 1. */
155 #ifdef MULTIBYTE_CHARS
156 /* Change to the native locale for multibyte conversions. */
157 setlocale (LC_CTYPE
, "");
161 token_buffer
= (char *) xmalloc (maxtoken
+ 2);
163 ridpointers
[(int) RID_INT
] = get_identifier ("int");
164 ridpointers
[(int) RID_CHAR
] = get_identifier ("char");
165 ridpointers
[(int) RID_VOID
] = get_identifier ("void");
166 ridpointers
[(int) RID_FLOAT
] = get_identifier ("float");
167 ridpointers
[(int) RID_DOUBLE
] = get_identifier ("double");
168 ridpointers
[(int) RID_SHORT
] = get_identifier ("short");
169 ridpointers
[(int) RID_LONG
] = get_identifier ("long");
170 ridpointers
[(int) RID_UNSIGNED
] = get_identifier ("unsigned");
171 ridpointers
[(int) RID_SIGNED
] = get_identifier ("signed");
172 ridpointers
[(int) RID_INLINE
] = get_identifier ("inline");
173 ridpointers
[(int) RID_CONST
] = get_identifier ("const");
174 ridpointers
[(int) RID_VOLATILE
] = get_identifier ("volatile");
175 ridpointers
[(int) RID_AUTO
] = get_identifier ("auto");
176 ridpointers
[(int) RID_STATIC
] = get_identifier ("static");
177 ridpointers
[(int) RID_EXTERN
] = get_identifier ("extern");
178 ridpointers
[(int) RID_TYPEDEF
] = get_identifier ("typedef");
179 ridpointers
[(int) RID_REGISTER
] = get_identifier ("register");
180 ridpointers
[(int) RID_ITERATOR
] = get_identifier ("iterator");
181 ridpointers
[(int) RID_COMPLEX
] = get_identifier ("complex");
182 ridpointers
[(int) RID_ID
] = get_identifier ("id");
183 ridpointers
[(int) RID_IN
] = get_identifier ("in");
184 ridpointers
[(int) RID_OUT
] = get_identifier ("out");
185 ridpointers
[(int) RID_INOUT
] = get_identifier ("inout");
186 ridpointers
[(int) RID_BYCOPY
] = get_identifier ("bycopy");
187 ridpointers
[(int) RID_ONEWAY
] = get_identifier ("oneway");
188 forget_protocol_qualifiers();
190 /* Some options inhibit certain reserved words.
191 Clear those words out of the hash table so they won't be recognized. */
192 #define UNSET_RESERVED_WORD(STRING) \
193 do { struct resword *s = is_reserved_word (STRING, sizeof (STRING) - 1); \
194 if (s) s->name = ""; } while (0)
196 if (! doing_objc_thang
)
197 UNSET_RESERVED_WORD ("id");
199 if (flag_traditional
)
201 UNSET_RESERVED_WORD ("const");
202 UNSET_RESERVED_WORD ("volatile");
203 UNSET_RESERVED_WORD ("typeof");
204 UNSET_RESERVED_WORD ("signed");
205 UNSET_RESERVED_WORD ("inline");
206 UNSET_RESERVED_WORD ("iterator");
207 UNSET_RESERVED_WORD ("complex");
211 UNSET_RESERVED_WORD ("asm");
212 UNSET_RESERVED_WORD ("typeof");
213 UNSET_RESERVED_WORD ("inline");
214 UNSET_RESERVED_WORD ("iterator");
215 UNSET_RESERVED_WORD ("complex");
220 reinit_parse_for_function ()
224 /* Function used when yydebug is set, to print a token in more detail. */
227 yyprint (file
, yychar
, yylval
)
239 if (IDENTIFIER_POINTER (t
))
240 fprintf (file
, " `%s'", IDENTIFIER_POINTER (t
));
245 if (TREE_CODE (t
) == INTEGER_CST
)
247 #if HOST_BITS_PER_WIDE_INT == 64
248 #if HOST_BITS_PER_WIDE_INT != HOST_BITS_PER_INT
254 #if HOST_BITS_PER_WIDE_INT != HOST_BITS_PER_INT
260 TREE_INT_CST_HIGH (t
), TREE_INT_CST_LOW (t
));
266 /* If C is not whitespace, return C.
267 Otherwise skip whitespace and return first nonwhite char read. */
273 static int newline_warning
= 0;
279 /* We don't recognize comments here, because
280 cpp output can include / and * consecutively as operators.
281 Also, there's no need, since cpp removes all comments. */
284 c
= check_newline ();
296 /* ANSI C says the effects of a carriage return in a source file
298 if (pedantic
&& !newline_warning
)
300 warning ("carriage return in source file");
301 warning ("(we only warn about the first carriage return)");
312 error ("stray '\\' in program");
322 /* Skips all of the white space at the current location in the input file.
323 Must use and reset nextchar if it has the next character. */
326 position_after_white_space ()
331 c
= nextchar
, nextchar
= -1;
335 ungetc (skip_white_space (c
), finput
);
338 /* Make the token buffer longer, preserving the data in it.
339 P should point to just beyond the last valid character in the old buffer.
340 The value we return is a pointer to the new buffer
341 at a place corresponding to P. */
344 extend_token_buffer (p
)
347 int offset
= p
- token_buffer
;
349 maxtoken
= maxtoken
* 2 + 10;
350 token_buffer
= (char *) xrealloc (token_buffer
, maxtoken
+ 2);
352 return token_buffer
+ offset
;
355 /* At the beginning of a line, increment the line number
356 and process any #-directive on this line.
357 If the line is a #-directive, read the entire line and return a newline.
358 Otherwise, return the line's first non-whitespace character. */
368 /* Read first nonwhite char on the line. */
371 while (c
== ' ' || c
== '\t')
376 /* If not #, return it so caller will use it. */
380 /* Read first nonwhite char after the `#'. */
383 while (c
== ' ' || c
== '\t')
386 /* If a letter follows, then if the word here is `line', skip
387 it and ignore it; otherwise, ignore the line, with an error
388 if the word isn't `pragma', `ident', `define', or `undef'. */
390 if ((c
>= 'a' && c
<= 'z') || (c
>= 'A' && c
<= 'Z'))
394 if (getc (finput
) == 'r'
395 && getc (finput
) == 'a'
396 && getc (finput
) == 'g'
397 && getc (finput
) == 'm'
398 && getc (finput
) == 'a'
399 && ((c
= getc (finput
)) == ' ' || c
== '\t' || c
== '\n'))
401 while (c
== ' ' || c
== '\t')
405 #ifdef HANDLE_SYSV_PRAGMA
408 if (token
!= IDENTIFIER
)
410 return handle_sysv_pragma (finput
, token
);
411 #else /* !HANDLE_SYSV_PRAGMA */
415 if (token
!= IDENTIFIER
)
417 if (HANDLE_PRAGMA (finput
, yylval
.ttype
))
422 #endif /* HANDLE_PRAGMA */
423 #endif /* !HANDLE_SYSV_PRAGMA */
430 if (getc (finput
) == 'e'
431 && getc (finput
) == 'f'
432 && getc (finput
) == 'i'
433 && getc (finput
) == 'n'
434 && getc (finput
) == 'e'
435 && ((c
= getc (finput
)) == ' ' || c
== '\t' || c
== '\n'))
438 debug_define (lineno
, get_directive_line (finput
));
444 if (getc (finput
) == 'n'
445 && getc (finput
) == 'd'
446 && getc (finput
) == 'e'
447 && getc (finput
) == 'f'
448 && ((c
= getc (finput
)) == ' ' || c
== '\t' || c
== '\n'))
451 debug_undef (lineno
, get_directive_line (finput
));
457 if (getc (finput
) == 'i'
458 && getc (finput
) == 'n'
459 && getc (finput
) == 'e'
460 && ((c
= getc (finput
)) == ' ' || c
== '\t'))
465 if (getc (finput
) == 'd'
466 && getc (finput
) == 'e'
467 && getc (finput
) == 'n'
468 && getc (finput
) == 't'
469 && ((c
= getc (finput
)) == ' ' || c
== '\t'))
471 /* #ident. The pedantic warning is now in cccp.c. */
473 /* Here we have just seen `#ident '.
474 A string constant should follow. */
476 while (c
== ' ' || c
== '\t')
479 /* If no argument, ignore the line. */
486 || TREE_CODE (yylval
.ttype
) != STRING_CST
)
488 error ("invalid #ident");
494 #ifdef ASM_OUTPUT_IDENT
495 ASM_OUTPUT_IDENT (asm_out_file
, TREE_STRING_POINTER (yylval
.ttype
));
499 /* Skip the rest of this line. */
504 error ("undefined or invalid # directive");
509 /* Here we have either `#line' or `# <nonletter>'.
510 In either case, it should be a line number; a digit should follow. */
512 while (c
== ' ' || c
== '\t')
515 /* If the # is the only nonwhite char on the line,
516 just ignore it. Check the new newline. */
520 /* Something follows the #; read a token. */
525 if (token
== CONSTANT
526 && TREE_CODE (yylval
.ttype
) == INTEGER_CST
)
528 int old_lineno
= lineno
;
530 /* subtract one, because it is the following line that
531 gets the specified number */
533 int l
= TREE_INT_CST_LOW (yylval
.ttype
) - 1;
535 /* Is this the last nonwhite stuff on the line? */
537 while (c
== ' ' || c
== '\t')
541 /* No more: store the line number and check following line. */
547 /* More follows: it must be a string constant (filename). */
549 /* Read the string constant. */
552 if (token
!= STRING
|| TREE_CODE (yylval
.ttype
) != STRING_CST
)
554 error ("invalid #line");
559 = (char *) permalloc (TREE_STRING_LENGTH (yylval
.ttype
) + 1);
560 strcpy (input_filename
, TREE_STRING_POINTER (yylval
.ttype
));
563 /* Each change of file name
564 reinitializes whether we are now in a system header. */
565 in_system_header
= 0;
567 if (main_input_filename
== 0)
568 main_input_filename
= input_filename
;
570 /* Is this the last nonwhite stuff on the line? */
572 while (c
== ' ' || c
== '\t')
576 /* Update the name in the top element of input_file_stack. */
577 if (input_file_stack
)
578 input_file_stack
->name
= input_filename
;
587 /* `1' after file name means entering new file.
588 `2' after file name means just left a file. */
590 if (token
== CONSTANT
591 && TREE_CODE (yylval
.ttype
) == INTEGER_CST
)
593 if (TREE_INT_CST_LOW (yylval
.ttype
) == 1)
595 /* Pushing to a new file. */
597 = (struct file_stack
*) xmalloc (sizeof (struct file_stack
));
598 input_file_stack
->line
= old_lineno
;
599 p
->next
= input_file_stack
;
600 p
->name
= input_filename
;
601 input_file_stack
= p
;
602 input_file_stack_tick
++;
603 debug_start_source_file (input_filename
);
606 else if (TREE_INT_CST_LOW (yylval
.ttype
) == 2)
608 /* Popping out of a file. */
609 if (input_file_stack
->next
)
611 struct file_stack
*p
= input_file_stack
;
612 input_file_stack
= p
->next
;
614 input_file_stack_tick
++;
615 debug_end_source_file (input_file_stack
->line
);
618 error ("#-lines for entering and leaving files don't match");
624 /* Now that we've pushed or popped the input stack,
625 update the name in the top element. */
626 if (input_file_stack
)
627 input_file_stack
->name
= input_filename
;
629 /* If we have handled a `1' or a `2',
630 see if there is another number to read. */
633 /* Is this the last nonwhite stuff on the line? */
635 while (c
== ' ' || c
== '\t')
645 /* `3' after file name means this is a system header file. */
647 if (token
== CONSTANT
648 && TREE_CODE (yylval
.ttype
) == INTEGER_CST
649 && TREE_INT_CST_LOW (yylval
.ttype
) == 3)
650 in_system_header
= 1, used_up
= 1;
654 /* Is this the last nonwhite stuff on the line? */
656 while (c
== ' ' || c
== '\t')
663 warning ("unrecognized text at end of #line");
666 error ("invalid #-line");
668 /* skip the rest of this line. */
670 while (c
!= '\n' && c
!= EOF
)
675 #ifdef HANDLE_SYSV_PRAGMA
677 /* Handle a #pragma directive. INPUT is the current input stream,
678 and TOKEN is the token we read after `#pragma'. Processes the entire input
679 line and returns a character for the caller to reread: either \n or EOF. */
681 /* This function has to be in this file, in order to get at
685 handle_sysv_pragma (input
, token
)
699 handle_pragma_token (token_buffer
, yylval
.ttype
);
702 handle_pragma_token (token_buffer
, 0);
706 c
= nextchar
, nextchar
= -1;
710 while (c
== ' ' || c
== '\t')
712 if (c
== '\n' || c
== EOF
)
714 handle_pragma_token (0, 0);
722 #endif /* HANDLE_SYSV_PRAGMA */
724 #define ENDFILE -1 /* token that represents end-of-file */
726 /* Read an escape sequence, returning its equivalent as a character,
727 or store 1 in *ignore_ptr if it is backslash-newline. */
730 readescape (ignore_ptr
)
733 register int c
= getc (finput
);
735 register unsigned count
;
736 unsigned firstdig
= 0;
742 if (warn_traditional
)
743 warning ("the meaning of `\\x' varies with -traditional");
745 if (flag_traditional
)
754 if (!(c
>= 'a' && c
<= 'f')
755 && !(c
>= 'A' && c
<= 'F')
756 && !(c
>= '0' && c
<= '9'))
762 if (c
>= 'a' && c
<= 'f')
763 code
+= c
- 'a' + 10;
764 if (c
>= 'A' && c
<= 'F')
765 code
+= c
- 'A' + 10;
766 if (c
>= '0' && c
<= '9')
768 if (code
!= 0 || count
!= 0)
777 error ("\\x used with no following hex digits");
779 /* Digits are all 0's. Ok. */
781 else if ((count
- 1) * 4 >= TYPE_PRECISION (integer_type_node
)
783 && ((1 << (TYPE_PRECISION (integer_type_node
) - (count
- 1) * 4))
785 pedwarn ("hex escape out of range");
788 case '0': case '1': case '2': case '3': case '4':
789 case '5': case '6': case '7':
792 while ((c
<= '7') && (c
>= '0') && (count
++ < 3))
794 code
= (code
* 8) + (c
- '0');
800 case '\\': case '\'': case '"':
809 return TARGET_NEWLINE
;
824 if (warn_traditional
)
825 warning ("the meaning of `\\a' varies with -traditional");
827 if (flag_traditional
)
832 #if 0 /* Vertical tab is present in common usage compilers. */
833 if (flag_traditional
)
841 pedwarn ("non-ANSI-standard escape sequence, `\\%c'", c
);
847 /* `\(', etc, are used at beginning of line to avoid confusing Emacs. */
851 /* `\%' is used to prevent SCCS from getting confused. */
854 pedwarn ("non-ANSI escape sequence `\\%c'", c
);
857 if (c
>= 040 && c
< 0177)
858 pedwarn ("unknown escape sequence `\\%c'", c
);
860 pedwarn ("unknown escape sequence: `\\' followed by char code 0x%x", c
);
870 strcpy (buf
, string
);
872 /* We can't print string and character constants well
873 because the token_buffer contains the result of processing escapes. */
875 strcat (buf
, " at end of input");
876 else if (token_buffer
[0] == 0)
877 strcat (buf
, " at null character");
878 else if (token_buffer
[0] == '"')
879 strcat (buf
, " before string constant");
880 else if (token_buffer
[0] == '\'')
881 strcat (buf
, " before character constant");
882 else if (token_buffer
[0] < 040 || (unsigned char) token_buffer
[0] >= 0177)
883 sprintf (buf
+ strlen (buf
), " before character 0%o",
884 (unsigned char) token_buffer
[0]);
886 strcat (buf
, " before `%s'");
888 error (buf
, token_buffer
);
901 struct try_type type_sequence
[] =
903 { &integer_type_node
, 0, 0, 0},
904 { &unsigned_type_node
, 1, 0, 0},
905 { &long_integer_type_node
, 0, 1, 0},
906 { &long_unsigned_type_node
, 1, 1, 0},
907 { &long_long_integer_type_node
, 0, 1, 1},
908 { &long_long_unsigned_type_node
, 1, 1, 1}
922 c
= nextchar
, nextchar
= -1;
926 /* Effectively do c = skip_white_space (c)
927 but do it faster in the usual cases. */
940 /* Call skip_white_space so we can warn if appropriate. */
945 c
= skip_white_space (c
);
954 /* yylloc.first_line = lineno; */
965 /* Capital L may start a wide-string or wide-character constant. */
967 register int c
= getc (finput
);
976 goto string_constant
;
983 if (!doing_objc_thang
)
990 /* '@' may start a constant string object. */
991 register int c
= getc(finput
);
995 goto string_constant
;
998 /* Fall through to treat '@' as the start of an identifier. */
1001 case 'A': case 'B': case 'C': case 'D': case 'E':
1002 case 'F': case 'G': case 'H': case 'I': case 'J':
1003 case 'K': case 'M': case 'N': case 'O':
1004 case 'P': case 'Q': case 'R': case 'S': case 'T':
1005 case 'U': case 'V': case 'W': case 'X': case 'Y':
1007 case 'a': case 'b': case 'c': case 'd': case 'e':
1008 case 'f': case 'g': case 'h': case 'i': case 'j':
1009 case 'k': case 'l': case 'm': case 'n': case 'o':
1010 case 'p': case 'q': case 'r': case 's': case 't':
1011 case 'u': case 'v': case 'w': case 'x': case 'y':
1017 while (isalnum (c
) || c
== '_' || c
== '$' || c
== '@')
1019 /* Make sure this char really belongs in an identifier. */
1020 if (c
== '@' && ! doing_objc_thang
)
1024 if (! dollars_in_ident
)
1025 error ("`$' in identifier");
1027 pedwarn ("`$' in identifier");
1030 if (p
>= token_buffer
+ maxtoken
)
1031 p
= extend_token_buffer (p
);
1043 /* Try to recognize a keyword. Uses minimum-perfect hash function */
1046 register struct resword
*ptr
;
1048 if (ptr
= is_reserved_word (token_buffer
, p
- token_buffer
))
1051 yylval
.ttype
= ridpointers
[(int) ptr
->rid
];
1052 value
= (int) ptr
->token
;
1054 /* Only return OBJECTNAME if it is a typedef. */
1055 if (doing_objc_thang
&& value
== OBJECTNAME
)
1057 lastiddecl
= lookup_name(yylval
.ttype
);
1059 if (lastiddecl
== NULL_TREE
1060 || TREE_CODE (lastiddecl
) != TYPE_DECL
)
1064 /* Even if we decided to recognize asm, still perhaps warn. */
1066 && (value
== ASM_KEYWORD
|| value
== TYPEOF
1067 || ptr
->rid
== RID_INLINE
)
1068 && token_buffer
[0] != '_')
1069 pedwarn ("ANSI does not permit the keyword `%s'",
1074 /* If we did not find a keyword, look for an identifier
1077 if (value
== IDENTIFIER
)
1079 if (token_buffer
[0] == '@')
1080 error("invalid identifier `%s'", token_buffer
);
1082 yylval
.ttype
= get_identifier (token_buffer
);
1083 lastiddecl
= lookup_name (yylval
.ttype
);
1085 if (lastiddecl
!= 0 && TREE_CODE (lastiddecl
) == TYPE_DECL
)
1087 /* A user-invisible read-only initialized variable
1088 should be replaced by its value.
1089 We handle only strings since that's the only case used in C. */
1090 else if (lastiddecl
!= 0 && TREE_CODE (lastiddecl
) == VAR_DECL
1091 && DECL_IGNORED_P (lastiddecl
)
1092 && TREE_READONLY (lastiddecl
)
1093 && DECL_INITIAL (lastiddecl
) != 0
1094 && TREE_CODE (DECL_INITIAL (lastiddecl
)) == STRING_CST
)
1096 tree stringval
= DECL_INITIAL (lastiddecl
);
1098 /* Copy the string value so that we won't clobber anything
1099 if we put something in the TREE_CHAIN of this one. */
1100 yylval
.ttype
= build_string (TREE_STRING_LENGTH (stringval
),
1101 TREE_STRING_POINTER (stringval
));
1104 else if (doing_objc_thang
)
1106 tree objc_interface_decl
= is_class_name (yylval
.ttype
);
1108 if (objc_interface_decl
)
1111 yylval
.ttype
= objc_interface_decl
;
1121 /* Check first for common special case: single-digit 0 or 1. */
1123 next_c
= getc (finput
);
1124 ungetc (next_c
, finput
); /* Always undo this lookahead. */
1125 if (!isalnum (next_c
) && next_c
!= '.')
1127 token_buffer
[0] = (char)c
, token_buffer
[1] = '\0';
1128 yylval
.ttype
= (c
== '0') ? integer_zero_node
: integer_one_node
;
1134 case '2': case '3': case '4':
1135 case '5': case '6': case '7': case '8': case '9':
1140 int largest_digit
= 0;
1142 /* for multi-precision arithmetic,
1143 we actually store only HOST_BITS_PER_CHAR bits in each part.
1144 The number of parts is chosen so as to be sufficient to hold
1145 the enough bits to fit into the two HOST_WIDE_INTs that contain
1146 the integer value (this is always at least as many bits as are
1147 in a target `long long' value, but may be wider). */
1148 #define TOTAL_PARTS ((HOST_BITS_PER_WIDE_INT / HOST_BITS_PER_CHAR) * 2 + 2)
1149 int parts
[TOTAL_PARTS
];
1152 enum anon1
{ NOT_FLOAT
, AFTER_POINT
, TOO_MANY_POINTS
} floatflag
1155 for (count
= 0; count
< TOTAL_PARTS
; count
++)
1163 *p
++ = (c
= getc (finput
));
1164 if ((c
== 'x') || (c
== 'X'))
1167 *p
++ = (c
= getc (finput
));
1169 /* Leading 0 forces octal unless the 0 is the only digit. */
1170 else if (c
>= '0' && c
<= '9')
1179 /* Read all the digits-and-decimal-points. */
1182 || (isalnum (c
) && c
!= 'l' && c
!= 'L'
1183 && c
!= 'u' && c
!= 'U'
1184 && c
!= 'i' && c
!= 'I' && c
!= 'j' && c
!= 'J'
1185 && (floatflag
== NOT_FLOAT
|| ((c
!= 'f') && (c
!= 'F')))))
1190 error ("floating constant may not be in radix 16");
1191 if (floatflag
== TOO_MANY_POINTS
)
1192 /* We have already emitted an error. Don't need another. */
1194 else if (floatflag
== AFTER_POINT
)
1196 error ("malformed floating constant");
1197 floatflag
= TOO_MANY_POINTS
;
1198 /* Avoid another error from atof by forcing all characters
1199 from here on to be ignored. */
1203 floatflag
= AFTER_POINT
;
1206 *p
++ = c
= getc (finput
);
1207 /* Accept '.' as the start of a floating-point number
1208 only when it is followed by a digit.
1209 Otherwise, unread the following non-digit
1210 and use the '.' as a structural token. */
1211 if (p
== token_buffer
+ 2 && !isdigit (c
))
1222 error ("parse error at `..'");
1225 token_buffer
[1] = 0;
1232 /* It is not a decimal point.
1233 It should be a digit (perhaps a hex digit). */
1239 else if (base
<= 10)
1241 if (c
== 'e' || c
== 'E')
1244 floatflag
= AFTER_POINT
;
1245 break; /* start of exponent */
1247 error ("nondigits in number and not hexadecimal");
1258 if (c
>= largest_digit
)
1262 for (count
= 0; count
< TOTAL_PARTS
; count
++)
1264 parts
[count
] *= base
;
1268 += (parts
[count
-1] >> HOST_BITS_PER_CHAR
);
1270 &= (1 << HOST_BITS_PER_CHAR
) - 1;
1276 /* If the extra highest-order part ever gets anything in it,
1277 the number is certainly too big. */
1278 if (parts
[TOTAL_PARTS
- 1] != 0)
1281 if (p
>= token_buffer
+ maxtoken
- 3)
1282 p
= extend_token_buffer (p
);
1283 *p
++ = (c
= getc (finput
));
1288 error ("numeric constant with no digits");
1290 if (largest_digit
>= base
)
1291 error ("numeric constant contains digits beyond the radix");
1293 /* Remove terminating char from the token buffer and delimit the string */
1296 if (floatflag
!= NOT_FLOAT
)
1298 tree type
= double_type_node
;
1299 int exceeds_double
= 0;
1301 REAL_VALUE_TYPE value
;
1304 /* Read explicit exponent if any, and put it in tokenbuf. */
1306 if ((c
== 'e') || (c
== 'E'))
1308 if (p
>= token_buffer
+ maxtoken
- 3)
1309 p
= extend_token_buffer (p
);
1312 if ((c
== '+') || (c
== '-'))
1318 error ("floating constant exponent has no digits");
1321 if (p
>= token_buffer
+ maxtoken
- 3)
1322 p
= extend_token_buffer (p
);
1331 /* Convert string to a double, checking for overflow. */
1332 if (setjmp (handler
))
1334 error ("floating constant out of range");
1339 int fflag
= 0, lflag
= 0;
1340 /* Copy token_buffer now, while it has just the number
1341 and not the suffixes; once we add `f' or `i',
1342 REAL_VALUE_ATOF may not work any more. */
1343 char *copy
= (char *) alloca (p
- token_buffer
+ 1);
1344 bcopy (token_buffer
, copy
, p
- token_buffer
+ 1);
1346 set_float_handler (handler
);
1352 /* Read the suffixes to choose a data type. */
1357 error ("more than one `f' in numeric constant");
1363 error ("more than one `l' in numeric constant");
1369 error ("more than one `i' or `j' in numeric constant");
1371 pedwarn ("ANSI C forbids imaginary numeric constants");
1382 if (p
>= token_buffer
+ maxtoken
- 3)
1383 p
= extend_token_buffer (p
);
1389 /* The second argument, machine_mode, of REAL_VALUE_ATOF
1390 tells the desired precision of the binary result
1391 of decimal-to-binary conversion. */
1396 error ("both `f' and `l' in floating constant");
1398 type
= float_type_node
;
1399 value
= REAL_VALUE_ATOF (copy
, TYPE_MODE (type
));
1400 /* A diagnostic is required here by some ANSI C testsuites.
1401 This is not pedwarn, become some people don't want
1402 an error for this. */
1403 if (REAL_VALUE_ISINF (value
) && pedantic
)
1404 warning ("floating point number exceeds range of `float'");
1408 type
= long_double_type_node
;
1409 value
= REAL_VALUE_ATOF (copy
, TYPE_MODE (type
));
1410 if (REAL_VALUE_ISINF (value
) && pedantic
)
1411 warning ("floating point number exceeds range of `long double'");
1415 value
= REAL_VALUE_ATOF (copy
, TYPE_MODE (type
));
1416 if (REAL_VALUE_ISINF (value
) && pedantic
)
1417 warning ("floating point number exceeds range of `double'");
1420 set_float_handler (NULL_PTR
);
1423 if (errno
== ERANGE
&& !flag_traditional
&& pedantic
)
1425 /* ERANGE is also reported for underflow,
1426 so test the value to distinguish overflow from that. */
1427 if (REAL_VALUES_LESS (dconst1
, value
)
1428 || REAL_VALUES_LESS (value
, dconstm1
))
1430 warning ("floating point number exceeds range of `double'");
1436 /* If the result is not a number, assume it must have been
1437 due to some error message above, so silently convert
1439 if (REAL_VALUE_ISNAN (value
))
1442 /* Create a node with determined type and value. */
1444 yylval
.ttype
= build_complex (NULL_TREE
,
1445 convert (type
, integer_zero_node
),
1446 build_real (type
, value
));
1448 yylval
.ttype
= build_real (type
, value
);
1452 tree traditional_type
, ansi_type
, type
;
1453 HOST_WIDE_INT high
, low
;
1454 int spec_unsigned
= 0;
1456 int spec_long_long
= 0;
1462 if (c
== 'u' || c
== 'U')
1465 error ("two `u's in integer constant");
1468 else if (c
== 'l' || c
== 'L')
1473 error ("three `l's in integer constant");
1475 pedwarn ("ANSI C forbids long long integer constants");
1480 else if (c
== 'i' || c
== 'j' || c
== 'I' || c
== 'J')
1483 error ("more than one `i' or `j' in numeric constant");
1485 pedwarn ("ANSI C forbids imaginary numeric constants");
1490 if (p
>= token_buffer
+ maxtoken
- 3)
1491 p
= extend_token_buffer (p
);
1496 /* If the constant is not long long and it won't fit in an
1497 unsigned long, or if the constant is long long and won't fit
1498 in an unsigned long long, then warn that the constant is out
1501 /* ??? This assumes that long long and long integer types are
1502 a multiple of 8 bits. This better than the original code
1503 though which assumed that long was exactly 32 bits and long
1504 long was exactly 64 bits. */
1507 bytes
= TYPE_PRECISION (long_long_integer_type_node
) / 8;
1509 bytes
= TYPE_PRECISION (long_integer_type_node
) / 8;
1512 for (i
= bytes
; i
< TOTAL_PARTS
; i
++)
1516 pedwarn ("integer constant out of range");
1518 /* This is simplified by the fact that our constant
1519 is always positive. */
1523 for (i
= 0; i
< HOST_BITS_PER_WIDE_INT
/ HOST_BITS_PER_CHAR
; i
++)
1525 high
|= ((HOST_WIDE_INT
) parts
[i
+ (HOST_BITS_PER_WIDE_INT
1526 / HOST_BITS_PER_CHAR
)]
1527 << (i
* HOST_BITS_PER_CHAR
));
1528 low
|= (HOST_WIDE_INT
) parts
[i
] << (i
* HOST_BITS_PER_CHAR
);
1531 yylval
.ttype
= build_int_2 (low
, high
);
1532 TREE_TYPE (yylval
.ttype
) = long_long_unsigned_type_node
;
1534 /* If warn_traditional, calculate both the ANSI type and the
1535 traditional type, then see if they disagree.
1536 Otherwise, calculate only the type for the dialect in use. */
1537 if (warn_traditional
|| flag_traditional
)
1539 /* Calculate the traditional type. */
1540 /* Traditionally, any constant is signed;
1541 but if unsigned is specified explicitly, obey that.
1542 Use the smallest size with the right number of bits,
1543 except for one special case with decimal constants. */
1544 if (! spec_long
&& base
!= 10
1545 && int_fits_type_p (yylval
.ttype
, unsigned_type_node
))
1546 traditional_type
= (spec_unsigned
? unsigned_type_node
1547 : integer_type_node
);
1548 /* A decimal constant must be long
1549 if it does not fit in type int.
1550 I think this is independent of whether
1551 the constant is signed. */
1552 else if (! spec_long
&& base
== 10
1553 && int_fits_type_p (yylval
.ttype
, integer_type_node
))
1554 traditional_type
= (spec_unsigned
? unsigned_type_node
1555 : integer_type_node
);
1556 else if (! spec_long_long
)
1557 traditional_type
= (spec_unsigned
? long_unsigned_type_node
1558 : long_integer_type_node
);
1560 traditional_type
= (spec_unsigned
1561 ? long_long_unsigned_type_node
1562 : long_long_integer_type_node
);
1564 if (warn_traditional
|| ! flag_traditional
)
1566 /* Calculate the ANSI type. */
1567 if (! spec_long
&& ! spec_unsigned
1568 && int_fits_type_p (yylval
.ttype
, integer_type_node
))
1569 ansi_type
= integer_type_node
;
1570 else if (! spec_long
&& (base
!= 10 || spec_unsigned
)
1571 && int_fits_type_p (yylval
.ttype
, unsigned_type_node
))
1572 ansi_type
= unsigned_type_node
;
1573 else if (! spec_unsigned
&& !spec_long_long
1574 && int_fits_type_p (yylval
.ttype
, long_integer_type_node
))
1575 ansi_type
= long_integer_type_node
;
1576 else if (! spec_long_long
)
1577 ansi_type
= long_unsigned_type_node
;
1578 else if (! spec_unsigned
1579 /* Verify value does not overflow into sign bit. */
1580 && TREE_INT_CST_HIGH (yylval
.ttype
) >= 0
1581 && int_fits_type_p (yylval
.ttype
,
1582 long_long_integer_type_node
))
1583 ansi_type
= long_long_integer_type_node
;
1585 ansi_type
= long_long_unsigned_type_node
;
1588 type
= flag_traditional
? traditional_type
: ansi_type
;
1590 if (warn_traditional
&& traditional_type
!= ansi_type
)
1592 if (TYPE_PRECISION (traditional_type
)
1593 != TYPE_PRECISION (ansi_type
))
1594 warning ("width of integer constant changes with -traditional");
1595 else if (TREE_UNSIGNED (traditional_type
)
1596 != TREE_UNSIGNED (ansi_type
))
1597 warning ("integer constant is unsigned in ANSI C, signed with -traditional");
1599 warning ("width of integer constant may change on other systems with -traditional");
1602 if (!flag_traditional
&& !int_fits_type_p (yylval
.ttype
, type
)
1604 pedwarn ("integer constant out of range");
1606 if (base
== 10 && ! spec_unsigned
&& TREE_UNSIGNED (type
))
1607 warning ("decimal constant is so large that it is unsigned");
1611 if (TYPE_PRECISION (type
)
1612 <= TYPE_PRECISION (integer_type_node
))
1614 = build_complex (NULL_TREE
, integer_zero_node
,
1615 convert (integer_type_node
,
1618 error ("complex integer constant is too wide for `complex int'");
1620 else if (flag_traditional
&& !int_fits_type_p (yylval
.ttype
, type
))
1621 /* The traditional constant 0x80000000 is signed
1622 but doesn't fit in the range of int.
1623 This will change it to -0x80000000, which does fit. */
1625 TREE_TYPE (yylval
.ttype
) = unsigned_type (type
);
1626 yylval
.ttype
= convert (type
, yylval
.ttype
);
1627 TREE_OVERFLOW (yylval
.ttype
)
1628 = TREE_CONSTANT_OVERFLOW (yylval
.ttype
) = 0;
1631 TREE_TYPE (yylval
.ttype
) = type
;
1637 if (isalnum (c
) || c
== '.' || c
== '_' || c
== '$'
1638 || (!flag_traditional
&& (c
== '-' || c
== '+')
1639 && (p
[-1] == 'e' || p
[-1] == 'E')))
1640 error ("missing white space after number `%s'", token_buffer
);
1642 value
= CONSTANT
; break;
1648 register int result
= 0;
1649 register int num_chars
= 0;
1650 unsigned width
= TYPE_PRECISION (char_type_node
);
1655 width
= WCHAR_TYPE_SIZE
;
1656 #ifdef MULTIBYTE_CHARS
1657 max_chars
= MB_CUR_MAX
;
1663 max_chars
= TYPE_PRECISION (integer_type_node
) / width
;
1671 if (c
== '\'' || c
== EOF
)
1677 c
= readescape (&ignore
);
1680 if (width
< HOST_BITS_PER_INT
1681 && (unsigned) c
>= (1 << width
))
1682 pedwarn ("escape sequence out of range for character");
1683 #ifdef MAP_CHARACTER
1685 c
= MAP_CHARACTER (c
);
1691 pedwarn ("ANSI C forbids newline in character constant");
1694 #ifdef MAP_CHARACTER
1696 c
= MAP_CHARACTER (c
);
1700 if (num_chars
> maxtoken
- 4)
1701 extend_token_buffer (token_buffer
);
1703 token_buffer
[num_chars
] = c
;
1705 /* Merge character into result; ignore excess chars. */
1706 if (num_chars
< max_chars
+ 1)
1708 if (width
< HOST_BITS_PER_INT
)
1709 result
= (result
<< width
) | (c
& ((1 << width
) - 1));
1715 token_buffer
[num_chars
+ 1] = '\'';
1716 token_buffer
[num_chars
+ 2] = 0;
1719 error ("malformatted character constant");
1720 else if (num_chars
== 0)
1721 error ("empty character constant");
1722 else if (num_chars
> max_chars
)
1724 num_chars
= max_chars
;
1725 error ("character constant too long");
1727 else if (num_chars
!= 1 && ! flag_traditional
)
1728 warning ("multi-character character constant");
1730 /* If char type is signed, sign-extend the constant. */
1733 int num_bits
= num_chars
* width
;
1735 /* We already got an error; avoid invalid shift. */
1736 yylval
.ttype
= build_int_2 (0, 0);
1737 else if (TREE_UNSIGNED (char_type_node
)
1738 || ((result
>> (num_bits
- 1)) & 1) == 0)
1740 = build_int_2 (result
& ((unsigned HOST_WIDE_INT
) ~0
1741 >> (HOST_BITS_PER_WIDE_INT
- num_bits
)),
1745 = build_int_2 (result
| ~((unsigned HOST_WIDE_INT
) ~0
1746 >> (HOST_BITS_PER_WIDE_INT
- num_bits
)),
1748 TREE_TYPE (yylval
.ttype
) = integer_type_node
;
1752 #ifdef MULTIBYTE_CHARS
1753 /* Set the initial shift state and convert the next sequence. */
1755 /* In all locales L'\0' is zero and mbtowc will return zero,
1758 || (num_chars
== 1 && token_buffer
[1] != '\0'))
1761 (void) mbtowc (NULL_PTR
, NULL_PTR
, 0);
1762 if (mbtowc (& wc
, token_buffer
+ 1, num_chars
) == num_chars
)
1765 warning ("Ignoring invalid multibyte character");
1768 yylval
.ttype
= build_int_2 (result
, 0);
1769 TREE_TYPE (yylval
.ttype
) = wchar_type_node
;
1780 p
= token_buffer
+ 1;
1782 while (c
!= '"' && c
>= 0)
1787 c
= readescape (&ignore
);
1791 && TYPE_PRECISION (char_type_node
) < HOST_BITS_PER_INT
1792 && c
>= (1 << TYPE_PRECISION (char_type_node
)))
1793 pedwarn ("escape sequence out of range for character");
1798 pedwarn ("ANSI C forbids newline in string constant");
1802 if (p
== token_buffer
+ maxtoken
)
1803 p
= extend_token_buffer (p
);
1812 error ("Unterminated string constant");
1814 /* We have read the entire constant.
1815 Construct a STRING_CST for the result. */
1819 /* If this is a L"..." wide-string, convert the multibyte string
1820 to a wide character string. */
1821 char *widep
= (char *) alloca ((p
- token_buffer
) * WCHAR_BYTES
);
1824 #ifdef MULTIBYTE_CHARS
1825 len
= mbstowcs ((wchar_t *) widep
, token_buffer
+ 1, p
- token_buffer
);
1826 if (len
< 0 || len
>= (p
- token_buffer
))
1828 warning ("Ignoring invalid multibyte string");
1831 bzero (widep
+ (len
* WCHAR_BYTES
), WCHAR_BYTES
);
1834 union { long l
; char c
[sizeof (long)]; } u
;
1838 /* Determine whether host is little or big endian. */
1840 big_endian
= u
.c
[sizeof (long) - 1];
1841 wp
= widep
+ (big_endian
? WCHAR_BYTES
- 1 : 0);
1843 bzero (widep
, (p
- token_buffer
) * WCHAR_BYTES
);
1844 for (cp
= token_buffer
+ 1; cp
< p
; cp
++)
1845 *wp
= *cp
, wp
+= WCHAR_BYTES
;
1846 len
= p
- token_buffer
- 1;
1849 yylval
.ttype
= build_string ((len
+ 1) * WCHAR_BYTES
, widep
);
1850 TREE_TYPE (yylval
.ttype
) = wchar_array_type_node
;
1855 extern tree
build_objc_string();
1856 /* Return an Objective-C @"..." constant string object. */
1857 yylval
.ttype
= build_objc_string (p
- token_buffer
,
1859 TREE_TYPE (yylval
.ttype
) = char_array_type_node
;
1860 value
= OBJC_STRING
;
1864 yylval
.ttype
= build_string (p
- token_buffer
, token_buffer
+ 1);
1865 TREE_TYPE (yylval
.ttype
) = char_array_type_node
;
1896 yylval
.code
= PLUS_EXPR
; break;
1898 yylval
.code
= MINUS_EXPR
; break;
1900 yylval
.code
= BIT_AND_EXPR
; break;
1902 yylval
.code
= BIT_IOR_EXPR
; break;
1904 yylval
.code
= MULT_EXPR
; break;
1906 yylval
.code
= TRUNC_DIV_EXPR
; break;
1908 yylval
.code
= TRUNC_MOD_EXPR
; break;
1910 yylval
.code
= BIT_XOR_EXPR
; break;
1912 yylval
.code
= LSHIFT_EXPR
; break;
1914 yylval
.code
= RSHIFT_EXPR
; break;
1916 yylval
.code
= LT_EXPR
; break;
1918 yylval
.code
= GT_EXPR
; break;
1921 token_buffer
[1] = c1
= getc (finput
);
1922 token_buffer
[2] = 0;
1929 value
= ARITHCOMPARE
; yylval
.code
= LE_EXPR
; goto done
;
1931 value
= ARITHCOMPARE
; yylval
.code
= GE_EXPR
; goto done
;
1933 value
= EQCOMPARE
; yylval
.code
= NE_EXPR
; goto done
;
1935 value
= EQCOMPARE
; yylval
.code
= EQ_EXPR
; goto done
;
1937 value
= ASSIGN
; goto done
;
1943 value
= PLUSPLUS
; goto done
;
1945 value
= MINUSMINUS
; goto done
;
1947 value
= ANDAND
; goto done
;
1949 value
= OROR
; goto done
;
1962 { value
= POINTSAT
; goto done
; }
1966 { value
= ']'; goto done
; }
1970 { value
= '{'; goto done
; }
1972 { value
= '['; goto done
; }
1976 { value
= '}'; goto done
; }
1979 ungetc (c1
, finput
);
1980 token_buffer
[1] = 0;
1982 if ((c
== '<') || (c
== '>'))
1983 value
= ARITHCOMPARE
;
1989 /* Don't make yyparse think this is eof. */
1998 /* yylloc.last_line = lineno; */
2003 /* Sets the value of the 'yydebug' variable to VALUE.
2004 This is a function so we don't have to have YYDEBUG defined
2005 in order to build the compiler. */
2014 warning ("YYDEBUG not defined.");