/* A Bison parser, made by GNU Bison 2.7.12-4996.  */

/* Bison interface for Yacc-like parsers in C
   
      Copyright (C) 1984, 1989-1990, 2000-2013 Free Software Foundation, Inc.
   
   This program is free software: you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation, either version 3 of the License, or
   (at your option) any later version.
   
   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.
   
   You should have received a copy of the GNU General Public License
   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */

/* As a special exception, you may create a larger work that contains
   part or all of the Bison parser skeleton and distribute that work
   under terms of your choice, so long as that work isn't itself a
   parser generator using the skeleton or a modified version thereof
   as a parser skeleton.  Alternatively, if you modify or redistribute
   the parser skeleton itself, you may (at your option) remove this
   special exception, which will cause the skeleton and the resulting
   Bison output files to be licensed under the GNU General Public
   License without this special exception.
   
   This special exception was added by the Free Software Foundation in
   version 2.2 of Bison.  */

#ifndef YY_PARSER_PARSER_TAB_H_INCLUDED
# define YY_PARSER_PARSER_TAB_H_INCLUDED
/* Enabling traces.  */
#ifndef YYDEBUG
# define YYDEBUG 0
#endif
#if YYDEBUG
extern int parser_debug;
#endif

/* Tokens.  */
#ifndef YYTOKENTYPE
# define YYTOKENTYPE
   /* Put the tokens into the symbol table, so that GDB and other debuggers
      know about them.  */
   enum yytokentype {
     aIDENTIFIER = 258,
     aPRAGMA = 259,
     aKNOWNTYPE = 260,
     aNUM = 261,
     aHEXNUM = 262,
     aDOUBLE = 263,
     aSTRING = 264,
     aWSTRING = 265,
     aSQSTRING = 266,
     aUUID = 267,
     aEOF = 268,
     SHL = 269,
     SHR = 270,
     MEMBERPTR = 271,
     EQUALITY = 272,
     INEQUALITY = 273,
     GREATEREQUAL = 274,
     LESSEQUAL = 275,
     LOGICALOR = 276,
     LOGICALAND = 277,
     ELLIPSIS = 278,
     tAGGREGATABLE = 279,
     tALLOCATE = 280,
     tANNOTATION = 281,
     tAPPOBJECT = 282,
     tASYNC = 283,
     tASYNCUUID = 284,
     tAUTOHANDLE = 285,
     tBINDABLE = 286,
     tBOOLEAN = 287,
     tBROADCAST = 288,
     tBYTE = 289,
     tBYTECOUNT = 290,
     tCALLAS = 291,
     tCALLBACK = 292,
     tCASE = 293,
     tCDECL = 294,
     tCHAR = 295,
     tCOCLASS = 296,
     tCODE = 297,
     tCOMMSTATUS = 298,
     tCONST = 299,
     tCONTEXTHANDLE = 300,
     tCONTEXTHANDLENOSERIALIZE = 301,
     tCONTEXTHANDLESERIALIZE = 302,
     tCONTROL = 303,
     tCPPQUOTE = 304,
     tDECODE = 305,
     tDEFAULT = 306,
     tDEFAULTBIND = 307,
     tDEFAULTCOLLELEM = 308,
     tDEFAULTVALUE = 309,
     tDEFAULTVTABLE = 310,
     tDISABLECONSISTENCYCHECK = 311,
     tDISPLAYBIND = 312,
     tDISPINTERFACE = 313,
     tDLLNAME = 314,
     tDOUBLE = 315,
     tDUAL = 316,
     tENABLEALLOCATE = 317,
     tENCODE = 318,
     tENDPOINT = 319,
     tENTRY = 320,
     tENUM = 321,
     tERRORSTATUST = 322,
     tEXPLICITHANDLE = 323,
     tEXTERN = 324,
     tFALSE = 325,
     tFASTCALL = 326,
     tFAULTSTATUS = 327,
     tFLOAT = 328,
     tFORCEALLOCATE = 329,
     tHANDLE = 330,
     tHANDLET = 331,
     tHELPCONTEXT = 332,
     tHELPFILE = 333,
     tHELPSTRING = 334,
     tHELPSTRINGCONTEXT = 335,
     tHELPSTRINGDLL = 336,
     tHIDDEN = 337,
     tHYPER = 338,
     tID = 339,
     tIDEMPOTENT = 340,
     tIGNORE = 341,
     tIIDIS = 342,
     tIMMEDIATEBIND = 343,
     tIMPLICITHANDLE = 344,
     tIMPORT = 345,
     tIMPORTLIB = 346,
     tIN = 347,
     tIN_LINE = 348,
     tINLINE = 349,
     tINPUTSYNC = 350,
     tINT = 351,
     tINT3264 = 352,
     tINT64 = 353,
     tINTERFACE = 354,
     tLCID = 355,
     tLENGTHIS = 356,
     tLIBRARY = 357,
     tLICENSED = 358,
     tLOCAL = 359,
     tLONG = 360,
     tMAYBE = 361,
     tMESSAGE = 362,
     tMETHODS = 363,
     tMODULE = 364,
     tNAMESPACE = 365,
     tNOCODE = 366,
     tNONBROWSABLE = 367,
     tNONCREATABLE = 368,
     tNONEXTENSIBLE = 369,
     tNOTIFY = 370,
     tNOTIFYFLAG = 371,
     tNULL = 372,
     tOBJECT = 373,
     tODL = 374,
     tOLEAUTOMATION = 375,
     tOPTIMIZE = 376,
     tOPTIONAL = 377,
     tOUT = 378,
     tPARTIALIGNORE = 379,
     tPASCAL = 380,
     tPOINTERDEFAULT = 381,
     tPROGID = 382,
     tPROPERTIES = 383,
     tPROPGET = 384,
     tPROPPUT = 385,
     tPROPPUTREF = 386,
     tPROXY = 387,
     tPTR = 388,
     tPUBLIC = 389,
     tRANGE = 390,
     tREADONLY = 391,
     tREF = 392,
     tREGISTER = 393,
     tREPRESENTAS = 394,
     tREQUESTEDIT = 395,
     tRESTRICTED = 396,
     tRETVAL = 397,
     tSAFEARRAY = 398,
     tSHORT = 399,
     tSIGNED = 400,
     tSIZEIS = 401,
     tSIZEOF = 402,
     tSMALL = 403,
     tSOURCE = 404,
     tSTATIC = 405,
     tSTDCALL = 406,
     tSTRICTCONTEXTHANDLE = 407,
     tSTRING = 408,
     tSTRUCT = 409,
     tSWITCH = 410,
     tSWITCHIS = 411,
     tSWITCHTYPE = 412,
     tTHREADING = 413,
     tTRANSMITAS = 414,
     tTRUE = 415,
     tTYPEDEF = 416,
     tUIDEFAULT = 417,
     tUNION = 418,
     tUNIQUE = 419,
     tUNSIGNED = 420,
     tUSESGETLASTERROR = 421,
     tUSERMARSHAL = 422,
     tUUID = 423,
     tV1ENUM = 424,
     tVARARG = 425,
     tVERSION = 426,
     tVIPROGID = 427,
     tVOID = 428,
     tWCHAR = 429,
     tWIREMARSHAL = 430,
     tAPARTMENT = 431,
     tNEUTRAL = 432,
     tSINGLE = 433,
     tFREE = 434,
     tBOTH = 435,
     ADDRESSOF = 436,
     NEG = 437,
     POS = 438,
     PPTR = 439,
     CAST = 440
   };
#endif


#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
typedef union YYSTYPE
{
/* Line 2053 of yacc.c  */
#line 129 "parser.y"

	attr_t *attr;
	attr_list_t *attr_list;
	str_list_t *str_list;
	expr_t *expr;
	expr_list_t *expr_list;
	array_dims_t *array_dims;
	type_t *type;
	var_t *var;
	var_list_t *var_list;
	declarator_t *declarator;
	declarator_list_t *declarator_list;
	statement_t *statement;
	statement_list_t *stmt_list;
	ifref_t *ifref;
	ifref_list_t *ifref_list;
	char *str;
	UUID *uuid;
	unsigned int num;
	double dbl;
	interface_info_t ifinfo;
	typelib_t *typelib;
	struct _import_t *import;
	struct _decl_spec_t *declspec;
	enum storage_class stgclass;


/* Line 2053 of yacc.c  */
#line 270 "parser.tab.h"
} YYSTYPE;
# define YYSTYPE_IS_TRIVIAL 1
# define yystype YYSTYPE /* obsolescent; will be withdrawn */
# define YYSTYPE_IS_DECLARED 1
#endif

extern YYSTYPE parser_lval;

#ifdef YYPARSE_PARAM
#if defined __STDC__ || defined __cplusplus
int parser_parse (void *YYPARSE_PARAM);
#else
int parser_parse ();
#endif
#else /* ! YYPARSE_PARAM */
#if defined __STDC__ || defined __cplusplus
int parser_parse (void);
#else
int parser_parse ();
#endif
#endif /* ! YYPARSE_PARAM */

#endif /* !YY_PARSER_PARSER_TAB_H_INCLUDED  */
