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