1*e4b17023SJohn Marino /* Data structures and function exported by the C++ Parser. 2*e4b17023SJohn Marino Copyright (C) 2010 Free Software Foundation, Inc. 3*e4b17023SJohn Marino 4*e4b17023SJohn Marino This file is part of GCC. 5*e4b17023SJohn Marino 6*e4b17023SJohn Marino GCC is free software; you can redistribute it and/or modify it 7*e4b17023SJohn Marino under the terms of the GNU General Public License as published by 8*e4b17023SJohn Marino the Free Software Foundation; either version 3, or (at your option) 9*e4b17023SJohn Marino any later version. 10*e4b17023SJohn Marino 11*e4b17023SJohn Marino GCC is distributed in the hope that it will be useful, but 12*e4b17023SJohn Marino WITHOUT ANY WARRANTY; without even the implied warranty of 13*e4b17023SJohn Marino MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 14*e4b17023SJohn Marino General Public License for more details. 15*e4b17023SJohn Marino 16*e4b17023SJohn Marino You should have received a copy of the GNU General Public License 17*e4b17023SJohn Marino along with GCC; see the file COPYING3. If not see 18*e4b17023SJohn Marino <http://www.gnu.org/licenses/>. */ 19*e4b17023SJohn Marino 20*e4b17023SJohn Marino #ifndef GCC_CP_PARSER_H 21*e4b17023SJohn Marino #define GCC_CP_PARSER_H 22*e4b17023SJohn Marino 23*e4b17023SJohn Marino #include "tree.h" 24*e4b17023SJohn Marino #include "c-family/c-pragma.h" 25*e4b17023SJohn Marino 26*e4b17023SJohn Marino /* A token's value and its associated deferred access checks and 27*e4b17023SJohn Marino qualifying scope. */ 28*e4b17023SJohn Marino 29*e4b17023SJohn Marino struct GTY(()) tree_check { 30*e4b17023SJohn Marino /* The value associated with the token. */ 31*e4b17023SJohn Marino tree value; 32*e4b17023SJohn Marino /* The checks that have been associated with value. */ 33*e4b17023SJohn Marino VEC (deferred_access_check, gc)* checks; 34*e4b17023SJohn Marino /* The token's qualifying scope (used when it is a 35*e4b17023SJohn Marino CPP_NESTED_NAME_SPECIFIER). */ 36*e4b17023SJohn Marino tree qualifying_scope; 37*e4b17023SJohn Marino }; 38*e4b17023SJohn Marino 39*e4b17023SJohn Marino /* A C++ token. */ 40*e4b17023SJohn Marino 41*e4b17023SJohn Marino typedef struct GTY (()) cp_token { 42*e4b17023SJohn Marino /* The kind of token. */ 43*e4b17023SJohn Marino ENUM_BITFIELD (cpp_ttype) type : 8; 44*e4b17023SJohn Marino /* If this token is a keyword, this value indicates which keyword. 45*e4b17023SJohn Marino Otherwise, this value is RID_MAX. */ 46*e4b17023SJohn Marino ENUM_BITFIELD (rid) keyword : 8; 47*e4b17023SJohn Marino /* Token flags. */ 48*e4b17023SJohn Marino unsigned char flags; 49*e4b17023SJohn Marino /* Identifier for the pragma. */ 50*e4b17023SJohn Marino ENUM_BITFIELD (pragma_kind) pragma_kind : 6; 51*e4b17023SJohn Marino /* True if this token is from a context where it is implicitly extern "C" */ 52*e4b17023SJohn Marino BOOL_BITFIELD implicit_extern_c : 1; 53*e4b17023SJohn Marino /* True for a CPP_NAME token that is not a keyword (i.e., for which 54*e4b17023SJohn Marino KEYWORD is RID_MAX) iff this name was looked up and found to be 55*e4b17023SJohn Marino ambiguous. An error has already been reported. */ 56*e4b17023SJohn Marino BOOL_BITFIELD ambiguous_p : 1; 57*e4b17023SJohn Marino /* True for a token that has been purged. If a token is purged, 58*e4b17023SJohn Marino it is no longer a valid token and it should be considered 59*e4b17023SJohn Marino deleted. */ 60*e4b17023SJohn Marino BOOL_BITFIELD purged_p : 1; 61*e4b17023SJohn Marino /* The location at which this token was found. */ 62*e4b17023SJohn Marino location_t location; 63*e4b17023SJohn Marino /* The value associated with this token, if any. */ 64*e4b17023SJohn Marino union cp_token_value { 65*e4b17023SJohn Marino /* Used for CPP_NESTED_NAME_SPECIFIER and CPP_TEMPLATE_ID. */ 66*e4b17023SJohn Marino struct tree_check* GTY((tag ("1"))) tree_check_value; 67*e4b17023SJohn Marino /* Use for all other tokens. */ 68*e4b17023SJohn Marino tree GTY((tag ("0"))) value; 69*e4b17023SJohn Marino } GTY((desc ("(%1.type == CPP_TEMPLATE_ID) || (%1.type == CPP_NESTED_NAME_SPECIFIER)"))) u; 70*e4b17023SJohn Marino } cp_token; 71*e4b17023SJohn Marino 72*e4b17023SJohn Marino DEF_VEC_O (cp_token); 73*e4b17023SJohn Marino DEF_VEC_ALLOC_O (cp_token,gc); 74*e4b17023SJohn Marino DEF_VEC_ALLOC_O (cp_token,heap); 75*e4b17023SJohn Marino 76*e4b17023SJohn Marino /* We use a stack of token pointer for saving token sets. */ 77*e4b17023SJohn Marino typedef struct cp_token *cp_token_position; 78*e4b17023SJohn Marino DEF_VEC_P (cp_token_position); 79*e4b17023SJohn Marino DEF_VEC_ALLOC_P (cp_token_position,heap); 80*e4b17023SJohn Marino 81*e4b17023SJohn Marino /* The cp_lexer structure represents the C++ lexer. It is responsible 82*e4b17023SJohn Marino for managing the token stream from the preprocessor and supplying 83*e4b17023SJohn Marino it to the parser. Tokens are never added to the cp_lexer after 84*e4b17023SJohn Marino it is created. */ 85*e4b17023SJohn Marino 86*e4b17023SJohn Marino typedef struct GTY (()) cp_lexer { 87*e4b17023SJohn Marino /* The memory allocated for the buffer. NULL if this lexer does not 88*e4b17023SJohn Marino own the token buffer. */ 89*e4b17023SJohn Marino VEC(cp_token,gc) *buffer; 90*e4b17023SJohn Marino 91*e4b17023SJohn Marino /* A pointer just past the last available token. The tokens 92*e4b17023SJohn Marino in this lexer are [buffer, last_token). */ 93*e4b17023SJohn Marino cp_token_position GTY ((skip)) last_token; 94*e4b17023SJohn Marino 95*e4b17023SJohn Marino /* The next available token. If NEXT_TOKEN is &eof_token, then there are 96*e4b17023SJohn Marino no more available tokens. */ 97*e4b17023SJohn Marino cp_token_position GTY ((skip)) next_token; 98*e4b17023SJohn Marino 99*e4b17023SJohn Marino /* A stack indicating positions at which cp_lexer_save_tokens was 100*e4b17023SJohn Marino called. The top entry is the most recent position at which we 101*e4b17023SJohn Marino began saving tokens. If the stack is non-empty, we are saving 102*e4b17023SJohn Marino tokens. */ 103*e4b17023SJohn Marino VEC(cp_token_position,heap) *GTY ((skip)) saved_tokens; 104*e4b17023SJohn Marino 105*e4b17023SJohn Marino /* The next lexer in a linked list of lexers. */ 106*e4b17023SJohn Marino struct cp_lexer *next; 107*e4b17023SJohn Marino 108*e4b17023SJohn Marino /* True if we should output debugging information. */ 109*e4b17023SJohn Marino bool debugging_p; 110*e4b17023SJohn Marino 111*e4b17023SJohn Marino /* True if we're in the context of parsing a pragma, and should not 112*e4b17023SJohn Marino increment past the end-of-line marker. */ 113*e4b17023SJohn Marino bool in_pragma; 114*e4b17023SJohn Marino } cp_lexer; 115*e4b17023SJohn Marino 116*e4b17023SJohn Marino DEF_VEC_O (cp_lexer); 117*e4b17023SJohn Marino DEF_VEC_ALLOC_O (cp_lexer,heap); 118*e4b17023SJohn Marino 119*e4b17023SJohn Marino /* cp_token_cache is a range of tokens. There is no need to represent 120*e4b17023SJohn Marino allocate heap memory for it, since tokens are never removed from the 121*e4b17023SJohn Marino lexer's array. There is also no need for the GC to walk through 122*e4b17023SJohn Marino a cp_token_cache, since everything in here is referenced through 123*e4b17023SJohn Marino a lexer. */ 124*e4b17023SJohn Marino 125*e4b17023SJohn Marino typedef struct GTY(()) cp_token_cache { 126*e4b17023SJohn Marino /* The beginning of the token range. */ 127*e4b17023SJohn Marino cp_token * GTY((skip)) first; 128*e4b17023SJohn Marino 129*e4b17023SJohn Marino /* Points immediately after the last token in the range. */ 130*e4b17023SJohn Marino cp_token * GTY ((skip)) last; 131*e4b17023SJohn Marino } cp_token_cache; 132*e4b17023SJohn Marino 133*e4b17023SJohn Marino typedef cp_token_cache *cp_token_cache_ptr; 134*e4b17023SJohn Marino DEF_VEC_P (cp_token_cache_ptr); 135*e4b17023SJohn Marino DEF_VEC_ALLOC_P (cp_token_cache_ptr,gc); 136*e4b17023SJohn Marino 137*e4b17023SJohn Marino struct cp_token_ident_d 138*e4b17023SJohn Marino { 139*e4b17023SJohn Marino unsigned int ident_len; 140*e4b17023SJohn Marino const char *ident_str; 141*e4b17023SJohn Marino unsigned int before_len; 142*e4b17023SJohn Marino const char *before_str; 143*e4b17023SJohn Marino unsigned int after_len; 144*e4b17023SJohn Marino const char *after_str; 145*e4b17023SJohn Marino }; 146*e4b17023SJohn Marino 147*e4b17023SJohn Marino typedef struct cp_token_ident_d cp_token_ident; 148*e4b17023SJohn Marino 149*e4b17023SJohn Marino /* An entry in a queue of function arguments that require post-processing. */ 150*e4b17023SJohn Marino 151*e4b17023SJohn Marino typedef struct GTY(()) cp_default_arg_entry_d { 152*e4b17023SJohn Marino /* The current_class_type when we parsed this arg. */ 153*e4b17023SJohn Marino tree class_type; 154*e4b17023SJohn Marino 155*e4b17023SJohn Marino /* The function decl itself. */ 156*e4b17023SJohn Marino tree decl; 157*e4b17023SJohn Marino } cp_default_arg_entry; 158*e4b17023SJohn Marino 159*e4b17023SJohn Marino DEF_VEC_O(cp_default_arg_entry); 160*e4b17023SJohn Marino DEF_VEC_ALLOC_O(cp_default_arg_entry,gc); 161*e4b17023SJohn Marino 162*e4b17023SJohn Marino /* An entry in a stack for member functions of local classes. */ 163*e4b17023SJohn Marino 164*e4b17023SJohn Marino typedef struct GTY(()) cp_unparsed_functions_entry_d { 165*e4b17023SJohn Marino /* Functions with default arguments that require post-processing. 166*e4b17023SJohn Marino Functions appear in this list in declaration order. */ 167*e4b17023SJohn Marino VEC(cp_default_arg_entry,gc) *funs_with_default_args; 168*e4b17023SJohn Marino 169*e4b17023SJohn Marino /* Functions with defintions that require post-processing. Functions 170*e4b17023SJohn Marino appear in this list in declaration order. */ 171*e4b17023SJohn Marino VEC(tree,gc) *funs_with_definitions; 172*e4b17023SJohn Marino 173*e4b17023SJohn Marino /* Non-static data members with initializers that require post-processing. 174*e4b17023SJohn Marino FIELD_DECLs appear in this list in declaration order. */ 175*e4b17023SJohn Marino VEC(tree,gc) *nsdmis; 176*e4b17023SJohn Marino } cp_unparsed_functions_entry; 177*e4b17023SJohn Marino 178*e4b17023SJohn Marino DEF_VEC_O(cp_unparsed_functions_entry); 179*e4b17023SJohn Marino DEF_VEC_ALLOC_O(cp_unparsed_functions_entry,gc); 180*e4b17023SJohn Marino 181*e4b17023SJohn Marino /* The status of a tentative parse. */ 182*e4b17023SJohn Marino 183*e4b17023SJohn Marino typedef enum cp_parser_status_kind 184*e4b17023SJohn Marino { 185*e4b17023SJohn Marino /* No errors have occurred. */ 186*e4b17023SJohn Marino CP_PARSER_STATUS_KIND_NO_ERROR, 187*e4b17023SJohn Marino /* An error has occurred. */ 188*e4b17023SJohn Marino CP_PARSER_STATUS_KIND_ERROR, 189*e4b17023SJohn Marino /* We are committed to this tentative parse, whether or not an error 190*e4b17023SJohn Marino has occurred. */ 191*e4b17023SJohn Marino CP_PARSER_STATUS_KIND_COMMITTED 192*e4b17023SJohn Marino } cp_parser_status_kind; 193*e4b17023SJohn Marino 194*e4b17023SJohn Marino 195*e4b17023SJohn Marino /* Context that is saved and restored when parsing tentatively. */ 196*e4b17023SJohn Marino typedef struct GTY (()) cp_parser_context { 197*e4b17023SJohn Marino /* If this is a tentative parsing context, the status of the 198*e4b17023SJohn Marino tentative parse. */ 199*e4b17023SJohn Marino enum cp_parser_status_kind status; 200*e4b17023SJohn Marino /* If non-NULL, we have just seen a `x->' or `x.' expression. Names 201*e4b17023SJohn Marino that are looked up in this context must be looked up both in the 202*e4b17023SJohn Marino scope given by OBJECT_TYPE (the type of `x' or `*x') and also in 203*e4b17023SJohn Marino the context of the containing expression. */ 204*e4b17023SJohn Marino tree object_type; 205*e4b17023SJohn Marino 206*e4b17023SJohn Marino /* The next parsing context in the stack. */ 207*e4b17023SJohn Marino struct cp_parser_context *next; 208*e4b17023SJohn Marino } cp_parser_context; 209*e4b17023SJohn Marino 210*e4b17023SJohn Marino 211*e4b17023SJohn Marino /* The cp_parser structure represents the C++ parser. */ 212*e4b17023SJohn Marino 213*e4b17023SJohn Marino typedef struct GTY(()) cp_parser { 214*e4b17023SJohn Marino /* The lexer from which we are obtaining tokens. */ 215*e4b17023SJohn Marino cp_lexer *lexer; 216*e4b17023SJohn Marino 217*e4b17023SJohn Marino /* The scope in which names should be looked up. If NULL_TREE, then 218*e4b17023SJohn Marino we look up names in the scope that is currently open in the 219*e4b17023SJohn Marino source program. If non-NULL, this is either a TYPE or 220*e4b17023SJohn Marino NAMESPACE_DECL for the scope in which we should look. It can 221*e4b17023SJohn Marino also be ERROR_MARK, when we've parsed a bogus scope. 222*e4b17023SJohn Marino 223*e4b17023SJohn Marino This value is not cleared automatically after a name is looked 224*e4b17023SJohn Marino up, so we must be careful to clear it before starting a new look 225*e4b17023SJohn Marino up sequence. (If it is not cleared, then `X::Y' followed by `Z' 226*e4b17023SJohn Marino will look up `Z' in the scope of `X', rather than the current 227*e4b17023SJohn Marino scope.) Unfortunately, it is difficult to tell when name lookup 228*e4b17023SJohn Marino is complete, because we sometimes peek at a token, look it up, 229*e4b17023SJohn Marino and then decide not to consume it. */ 230*e4b17023SJohn Marino tree scope; 231*e4b17023SJohn Marino 232*e4b17023SJohn Marino /* OBJECT_SCOPE and QUALIFYING_SCOPE give the scopes in which the 233*e4b17023SJohn Marino last lookup took place. OBJECT_SCOPE is used if an expression 234*e4b17023SJohn Marino like "x->y" or "x.y" was used; it gives the type of "*x" or "x", 235*e4b17023SJohn Marino respectively. QUALIFYING_SCOPE is used for an expression of the 236*e4b17023SJohn Marino form "X::Y"; it refers to X. */ 237*e4b17023SJohn Marino tree object_scope; 238*e4b17023SJohn Marino tree qualifying_scope; 239*e4b17023SJohn Marino 240*e4b17023SJohn Marino /* A stack of parsing contexts. All but the bottom entry on the 241*e4b17023SJohn Marino stack will be tentative contexts. 242*e4b17023SJohn Marino 243*e4b17023SJohn Marino We parse tentatively in order to determine which construct is in 244*e4b17023SJohn Marino use in some situations. For example, in order to determine 245*e4b17023SJohn Marino whether a statement is an expression-statement or a 246*e4b17023SJohn Marino declaration-statement we parse it tentatively as a 247*e4b17023SJohn Marino declaration-statement. If that fails, we then reparse the same 248*e4b17023SJohn Marino token stream as an expression-statement. */ 249*e4b17023SJohn Marino cp_parser_context *context; 250*e4b17023SJohn Marino 251*e4b17023SJohn Marino /* True if we are parsing GNU C++. If this flag is not set, then 252*e4b17023SJohn Marino GNU extensions are not recognized. */ 253*e4b17023SJohn Marino bool allow_gnu_extensions_p; 254*e4b17023SJohn Marino 255*e4b17023SJohn Marino /* TRUE if the `>' token should be interpreted as the greater-than 256*e4b17023SJohn Marino operator. FALSE if it is the end of a template-id or 257*e4b17023SJohn Marino template-parameter-list. In C++0x mode, this flag also applies to 258*e4b17023SJohn Marino `>>' tokens, which are viewed as two consecutive `>' tokens when 259*e4b17023SJohn Marino this flag is FALSE. */ 260*e4b17023SJohn Marino bool greater_than_is_operator_p; 261*e4b17023SJohn Marino 262*e4b17023SJohn Marino /* TRUE if default arguments are allowed within a parameter list 263*e4b17023SJohn Marino that starts at this point. FALSE if only a gnu extension makes 264*e4b17023SJohn Marino them permissible. */ 265*e4b17023SJohn Marino bool default_arg_ok_p; 266*e4b17023SJohn Marino 267*e4b17023SJohn Marino /* TRUE if we are parsing an integral constant-expression. See 268*e4b17023SJohn Marino [expr.const] for a precise definition. */ 269*e4b17023SJohn Marino bool integral_constant_expression_p; 270*e4b17023SJohn Marino 271*e4b17023SJohn Marino /* TRUE if we are parsing an integral constant-expression -- but a 272*e4b17023SJohn Marino non-constant expression should be permitted as well. This flag 273*e4b17023SJohn Marino is used when parsing an array bound so that GNU variable-length 274*e4b17023SJohn Marino arrays are tolerated. */ 275*e4b17023SJohn Marino bool allow_non_integral_constant_expression_p; 276*e4b17023SJohn Marino 277*e4b17023SJohn Marino /* TRUE if ALLOW_NON_CONSTANT_EXPRESSION_P is TRUE and something has 278*e4b17023SJohn Marino been seen that makes the expression non-constant. */ 279*e4b17023SJohn Marino bool non_integral_constant_expression_p; 280*e4b17023SJohn Marino 281*e4b17023SJohn Marino /* TRUE if local variable names and `this' are forbidden in the 282*e4b17023SJohn Marino current context. */ 283*e4b17023SJohn Marino bool local_variables_forbidden_p; 284*e4b17023SJohn Marino 285*e4b17023SJohn Marino /* TRUE if the declaration we are parsing is part of a 286*e4b17023SJohn Marino linkage-specification of the form `extern string-literal 287*e4b17023SJohn Marino declaration'. */ 288*e4b17023SJohn Marino bool in_unbraced_linkage_specification_p; 289*e4b17023SJohn Marino 290*e4b17023SJohn Marino /* TRUE if we are presently parsing a declarator, after the 291*e4b17023SJohn Marino direct-declarator. */ 292*e4b17023SJohn Marino bool in_declarator_p; 293*e4b17023SJohn Marino 294*e4b17023SJohn Marino /* TRUE if we are presently parsing a template-argument-list. */ 295*e4b17023SJohn Marino bool in_template_argument_list_p; 296*e4b17023SJohn Marino 297*e4b17023SJohn Marino /* Set to IN_ITERATION_STMT if parsing an iteration-statement, 298*e4b17023SJohn Marino to IN_OMP_BLOCK if parsing OpenMP structured block and 299*e4b17023SJohn Marino IN_OMP_FOR if parsing OpenMP loop. If parsing a switch statement, 300*e4b17023SJohn Marino this is bitwise ORed with IN_SWITCH_STMT, unless parsing an 301*e4b17023SJohn Marino iteration-statement, OpenMP block or loop within that switch. */ 302*e4b17023SJohn Marino #define IN_SWITCH_STMT 1 303*e4b17023SJohn Marino #define IN_ITERATION_STMT 2 304*e4b17023SJohn Marino #define IN_OMP_BLOCK 4 305*e4b17023SJohn Marino #define IN_OMP_FOR 8 306*e4b17023SJohn Marino #define IN_IF_STMT 16 307*e4b17023SJohn Marino unsigned char in_statement; 308*e4b17023SJohn Marino 309*e4b17023SJohn Marino /* TRUE if we are presently parsing the body of a switch statement. 310*e4b17023SJohn Marino Note that this doesn't quite overlap with in_statement above. 311*e4b17023SJohn Marino The difference relates to giving the right sets of error messages: 312*e4b17023SJohn Marino "case not in switch" vs "break statement used with OpenMP...". */ 313*e4b17023SJohn Marino bool in_switch_statement_p; 314*e4b17023SJohn Marino 315*e4b17023SJohn Marino /* TRUE if we are parsing a type-id in an expression context. In 316*e4b17023SJohn Marino such a situation, both "type (expr)" and "type (type)" are valid 317*e4b17023SJohn Marino alternatives. */ 318*e4b17023SJohn Marino bool in_type_id_in_expr_p; 319*e4b17023SJohn Marino 320*e4b17023SJohn Marino /* TRUE if we are currently in a header file where declarations are 321*e4b17023SJohn Marino implicitly extern "C". */ 322*e4b17023SJohn Marino bool implicit_extern_c; 323*e4b17023SJohn Marino 324*e4b17023SJohn Marino /* TRUE if strings in expressions should be translated to the execution 325*e4b17023SJohn Marino character set. */ 326*e4b17023SJohn Marino bool translate_strings_p; 327*e4b17023SJohn Marino 328*e4b17023SJohn Marino /* TRUE if we are presently parsing the body of a function, but not 329*e4b17023SJohn Marino a local class. */ 330*e4b17023SJohn Marino bool in_function_body; 331*e4b17023SJohn Marino 332*e4b17023SJohn Marino /* Nonzero if we're processing a __transaction_atomic or 333*e4b17023SJohn Marino __transaction_relaxed statement. */ 334*e4b17023SJohn Marino unsigned char in_transaction; 335*e4b17023SJohn Marino 336*e4b17023SJohn Marino /* TRUE if we can auto-correct a colon to a scope operator. */ 337*e4b17023SJohn Marino bool colon_corrects_to_scope_p; 338*e4b17023SJohn Marino 339*e4b17023SJohn Marino /* If non-NULL, then we are parsing a construct where new type 340*e4b17023SJohn Marino definitions are not permitted. The string stored here will be 341*e4b17023SJohn Marino issued as an error message if a type is defined. */ 342*e4b17023SJohn Marino const char *type_definition_forbidden_message; 343*e4b17023SJohn Marino 344*e4b17023SJohn Marino /* A stack used for member functions of local classes. The lists 345*e4b17023SJohn Marino contained in an individual entry can only be processed once the 346*e4b17023SJohn Marino outermost class being defined is complete. */ 347*e4b17023SJohn Marino VEC(cp_unparsed_functions_entry,gc) *unparsed_queues; 348*e4b17023SJohn Marino 349*e4b17023SJohn Marino /* The number of classes whose definitions are currently in 350*e4b17023SJohn Marino progress. */ 351*e4b17023SJohn Marino unsigned num_classes_being_defined; 352*e4b17023SJohn Marino 353*e4b17023SJohn Marino /* The number of template parameter lists that apply directly to the 354*e4b17023SJohn Marino current declaration. */ 355*e4b17023SJohn Marino unsigned num_template_parameter_lists; 356*e4b17023SJohn Marino } cp_parser; 357*e4b17023SJohn Marino 358*e4b17023SJohn Marino /* In parser.c */ 359*e4b17023SJohn Marino extern void cp_lexer_debug_tokens (VEC(cp_token,gc) *); 360*e4b17023SJohn Marino extern void cp_debug_parser (FILE *, cp_parser *); 361*e4b17023SJohn Marino 362*e4b17023SJohn Marino #endif /* GCC_CP_PARSER_H */ 363