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