1 /* Declarations for the parser for C and Objective-C. 2 Copyright (C) 1987-2018 Free Software Foundation, Inc. 3 4 Parser actions based on the old Bison parser; structure somewhat 5 influenced by and fragments based on the C++ parser. 6 7 This file is part of GCC. 8 9 GCC is free software; you can redistribute it and/or modify it under 10 the terms of the GNU General Public License as published by the Free 11 Software Foundation; either version 3, or (at your option) any later 12 version. 13 14 GCC is distributed in the hope that it will be useful, but WITHOUT ANY 15 WARRANTY; without even the implied warranty of MERCHANTABILITY or 16 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 17 for more details. 18 19 You should have received a copy of the GNU General Public License 20 along with GCC; see the file COPYING3. If not see 21 <http://www.gnu.org/licenses/>. */ 22 23 #ifndef GCC_C_PARSER_H 24 #define GCC_C_PARSER_H 25 26 /* The C lexer intermediates between the lexer in cpplib and c-lex.c 27 and the C parser. Unlike the C++ lexer, the parser structure 28 stores the lexer information instead of using a separate structure. 29 Identifiers are separated into ordinary identifiers, type names, 30 keywords and some other Objective-C types of identifiers, and some 31 look-ahead is maintained. 32 33 ??? It might be a good idea to lex the whole file up front (as for 34 C++). It would then be possible to share more of the C and C++ 35 lexer code, if desired. */ 36 37 /* More information about the type of a CPP_NAME token. */ 38 enum c_id_kind { 39 /* An ordinary identifier. */ 40 C_ID_ID, 41 /* An identifier declared as a typedef name. */ 42 C_ID_TYPENAME, 43 /* An identifier declared as an Objective-C class name. */ 44 C_ID_CLASSNAME, 45 /* An address space identifier. */ 46 C_ID_ADDRSPACE, 47 /* Not an identifier. */ 48 C_ID_NONE 49 }; 50 51 /* A single C token after string literal concatenation and conversion 52 of preprocessing tokens to tokens. */ 53 struct GTY (()) c_token { 54 /* The kind of token. */ 55 ENUM_BITFIELD (cpp_ttype) type : 8; 56 /* If this token is a CPP_NAME, this value indicates whether also 57 declared as some kind of type. Otherwise, it is C_ID_NONE. */ 58 ENUM_BITFIELD (c_id_kind) id_kind : 8; 59 /* If this token is a keyword, this value indicates which keyword. 60 Otherwise, this value is RID_MAX. */ 61 ENUM_BITFIELD (rid) keyword : 8; 62 /* If this token is a CPP_PRAGMA, this indicates the pragma that 63 was seen. Otherwise it is PRAGMA_NONE. */ 64 ENUM_BITFIELD (pragma_kind) pragma_kind : 8; 65 /* The location at which this token was found. */ 66 location_t location; 67 /* The value associated with this token, if any. */ 68 tree value; 69 /* Token flags. */ 70 unsigned char flags; 71 72 source_range get_range () const 73 { 74 return get_range_from_loc (line_table, location); 75 } 76 77 location_t get_finish () const 78 { 79 return get_range ().m_finish; 80 } 81 }; 82 83 /* The parser. */ 84 struct c_parser; 85 86 /* Possibly kinds of declarator to parse. */ 87 enum c_dtr_syn { 88 /* A normal declarator with an identifier. */ 89 C_DTR_NORMAL, 90 /* An abstract declarator (maybe empty). */ 91 C_DTR_ABSTRACT, 92 /* A parameter declarator: may be either, but after a type name does 93 not redeclare a typedef name as an identifier if it can 94 alternatively be interpreted as a typedef name; see DR#009, 95 applied in C90 TC1, omitted from C99 and reapplied in C99 TC2 96 following DR#249. For example, given a typedef T, "int T" and 97 "int *T" are valid parameter declarations redeclaring T, while 98 "int (T)" and "int * (T)" and "int (T[])" and "int (T (int))" are 99 abstract declarators rather than involving redundant parentheses; 100 the same applies with attributes inside the parentheses before 101 "T". */ 102 C_DTR_PARM 103 }; 104 105 /* The binary operation precedence levels, where 0 is a dummy lowest level 106 used for the bottom of the stack. */ 107 enum c_parser_prec { 108 PREC_NONE, 109 PREC_LOGOR, 110 PREC_LOGAND, 111 PREC_BITOR, 112 PREC_BITXOR, 113 PREC_BITAND, 114 PREC_EQ, 115 PREC_REL, 116 PREC_SHIFT, 117 PREC_ADD, 118 PREC_MULT, 119 NUM_PRECS 120 }; 121 122 enum c_lookahead_kind { 123 /* Always treat unknown identifiers as typenames. */ 124 cla_prefer_type, 125 126 /* Could be parsing a nonabstract declarator. Only treat an identifier 127 as a typename if followed by another identifier or a star. */ 128 cla_nonabstract_decl, 129 130 /* Never treat identifiers as typenames. */ 131 cla_prefer_id 132 }; 133 134 135 extern c_token * c_parser_peek_token (c_parser *parser); 136 extern c_token * c_parser_peek_2nd_token (c_parser *parser); 137 extern c_token * c_parser_peek_nth_token (c_parser *parser, unsigned int n); 138 extern bool c_parser_require (c_parser *parser, enum cpp_ttype type, 139 const char *msgid, 140 location_t matching_location = UNKNOWN_LOCATION, 141 bool type_is_unique=true); 142 extern bool c_parser_error (c_parser *parser, const char *gmsgid); 143 extern void c_parser_consume_token (c_parser *parser); 144 extern void c_parser_skip_until_found (c_parser *parser, enum cpp_ttype type, 145 const char *msgid, 146 location_t = UNKNOWN_LOCATION); 147 extern bool c_parser_next_token_starts_declspecs (c_parser *parser); 148 bool c_parser_next_tokens_start_declaration (c_parser *parser); 149 bool c_token_starts_typename (c_token *token); 150 151 /* Abstraction to avoid defining c_parser here which messes up gengtype 152 output wrt ObjC due to vec<c_token> routines being put in gtype-c.h 153 but not gtype-objc.h. */ 154 extern c_token * c_parser_tokens_buf (c_parser *parser, unsigned n); 155 extern bool c_parser_error (c_parser *parser); 156 extern void c_parser_set_error (c_parser *parser, bool); 157 158 /* Return true if the next token from PARSER has the indicated 159 TYPE. */ 160 161 static inline bool 162 c_parser_next_token_is (c_parser *parser, enum cpp_ttype type) 163 { 164 return c_parser_peek_token (parser)->type == type; 165 } 166 167 /* Return true if the next token from PARSER does not have the 168 indicated TYPE. */ 169 170 static inline bool 171 c_parser_next_token_is_not (c_parser *parser, enum cpp_ttype type) 172 { 173 return !c_parser_next_token_is (parser, type); 174 } 175 176 /* Return true if the next token from PARSER is the indicated 177 KEYWORD. */ 178 179 static inline bool 180 c_parser_next_token_is_keyword (c_parser *parser, enum rid keyword) 181 { 182 return c_parser_peek_token (parser)->keyword == keyword; 183 } 184 185 extern struct c_declarator * 186 c_parser_declarator (c_parser *parser, bool type_seen_p, c_dtr_syn kind, 187 bool *seen_id); 188 extern void c_parser_declspecs (c_parser *, struct c_declspecs *, bool, bool, 189 bool, bool, bool, enum c_lookahead_kind); 190 extern struct c_type_name *c_parser_type_name (c_parser *, bool = false); 191 192 #endif 193