Sync to wine-1.1.0:
[reactos.git] / reactos / tools / widl / parser.tab.c
index 1810611..99423d7 100644 (file)
      aHEXNUM = 261,
      aDOUBLE = 262,
      aSTRING = 263,
-     aUUID = 264,
-     aEOF = 265,
-     SHL = 266,
-     SHR = 267,
-     tAGGREGATABLE = 268,
-     tALLOCATE = 269,
-     tAPPOBJECT = 270,
-     tASYNC = 271,
-     tASYNCUUID = 272,
-     tAUTOHANDLE = 273,
-     tBINDABLE = 274,
-     tBOOLEAN = 275,
-     tBROADCAST = 276,
-     tBYTE = 277,
-     tBYTECOUNT = 278,
-     tCALLAS = 279,
-     tCALLBACK = 280,
-     tCASE = 281,
-     tCDECL = 282,
-     tCHAR = 283,
-     tCOCLASS = 284,
-     tCODE = 285,
-     tCOMMSTATUS = 286,
-     tCONST = 287,
-     tCONTEXTHANDLE = 288,
-     tCONTEXTHANDLENOSERIALIZE = 289,
-     tCONTEXTHANDLESERIALIZE = 290,
-     tCONTROL = 291,
-     tCPPQUOTE = 292,
-     tDEFAULT = 293,
-     tDEFAULTCOLLELEM = 294,
-     tDEFAULTVALUE = 295,
-     tDEFAULTVTABLE = 296,
-     tDISPLAYBIND = 297,
-     tDISPINTERFACE = 298,
-     tDLLNAME = 299,
-     tDOUBLE = 300,
-     tDUAL = 301,
-     tENDPOINT = 302,
-     tENTRY = 303,
-     tENUM = 304,
-     tERRORSTATUST = 305,
-     tEXPLICITHANDLE = 306,
-     tEXTERN = 307,
-     tFALSE = 308,
-     tFLOAT = 309,
-     tHANDLE = 310,
-     tHANDLET = 311,
-     tHELPCONTEXT = 312,
-     tHELPFILE = 313,
-     tHELPSTRING = 314,
-     tHELPSTRINGCONTEXT = 315,
-     tHELPSTRINGDLL = 316,
-     tHIDDEN = 317,
-     tHYPER = 318,
-     tID = 319,
-     tIDEMPOTENT = 320,
-     tIIDIS = 321,
-     tIMMEDIATEBIND = 322,
-     tIMPLICITHANDLE = 323,
-     tIMPORT = 324,
-     tIMPORTLIB = 325,
-     tIN = 326,
-     tINLINE = 327,
-     tINPUTSYNC = 328,
-     tINT = 329,
-     tINT64 = 330,
-     tINTERFACE = 331,
-     tLCID = 332,
-     tLENGTHIS = 333,
-     tLIBRARY = 334,
-     tLOCAL = 335,
-     tLONG = 336,
-     tMETHODS = 337,
-     tMODULE = 338,
-     tNONBROWSABLE = 339,
-     tNONCREATABLE = 340,
-     tNONEXTENSIBLE = 341,
-     tOBJECT = 342,
-     tODL = 343,
-     tOLEAUTOMATION = 344,
-     tOPTIONAL = 345,
-     tOUT = 346,
-     tPOINTERDEFAULT = 347,
-     tPROPERTIES = 348,
-     tPROPGET = 349,
-     tPROPPUT = 350,
-     tPROPPUTREF = 351,
-     tPTR = 352,
-     tPUBLIC = 353,
-     tRANGE = 354,
-     tREADONLY = 355,
-     tREF = 356,
-     tREQUESTEDIT = 357,
-     tRESTRICTED = 358,
-     tRETVAL = 359,
-     tSAFEARRAY = 360,
-     tSHORT = 361,
-     tSIGNED = 362,
-     tSINGLE = 363,
-     tSIZEIS = 364,
-     tSIZEOF = 365,
-     tSMALL = 366,
-     tSOURCE = 367,
-     tSTDCALL = 368,
-     tSTRICTCONTEXTHANDLE = 369,
-     tSTRING = 370,
-     tSTRUCT = 371,
-     tSWITCH = 372,
-     tSWITCHIS = 373,
-     tSWITCHTYPE = 374,
-     tTRANSMITAS = 375,
-     tTRUE = 376,
-     tTYPEDEF = 377,
-     tUNION = 378,
-     tUNIQUE = 379,
-     tUNSIGNED = 380,
-     tUUID = 381,
-     tV1ENUM = 382,
-     tVARARG = 383,
-     tVERSION = 384,
-     tVOID = 385,
-     tWCHAR = 386,
-     tWIREMARSHAL = 387,
-     CAST = 388,
-     PPTR = 389,
-     NEG = 390,
-     ADDRESSOF = 391
+     aWSTRING = 264,
+     aUUID = 265,
+     aEOF = 266,
+     SHL = 267,
+     SHR = 268,
+     MEMBERPTR = 269,
+     EQUALITY = 270,
+     INEQUALITY = 271,
+     GREATEREQUAL = 272,
+     LESSEQUAL = 273,
+     LOGICALOR = 274,
+     LOGICALAND = 275,
+     tAGGREGATABLE = 276,
+     tALLOCATE = 277,
+     tAPPOBJECT = 278,
+     tASYNC = 279,
+     tASYNCUUID = 280,
+     tAUTOHANDLE = 281,
+     tBINDABLE = 282,
+     tBOOLEAN = 283,
+     tBROADCAST = 284,
+     tBYTE = 285,
+     tBYTECOUNT = 286,
+     tCALLAS = 287,
+     tCALLBACK = 288,
+     tCASE = 289,
+     tCDECL = 290,
+     tCHAR = 291,
+     tCOCLASS = 292,
+     tCODE = 293,
+     tCOMMSTATUS = 294,
+     tCONST = 295,
+     tCONTEXTHANDLE = 296,
+     tCONTEXTHANDLENOSERIALIZE = 297,
+     tCONTEXTHANDLESERIALIZE = 298,
+     tCONTROL = 299,
+     tCPPQUOTE = 300,
+     tDEFAULT = 301,
+     tDEFAULTCOLLELEM = 302,
+     tDEFAULTVALUE = 303,
+     tDEFAULTVTABLE = 304,
+     tDISPLAYBIND = 305,
+     tDISPINTERFACE = 306,
+     tDLLNAME = 307,
+     tDOUBLE = 308,
+     tDUAL = 309,
+     tENDPOINT = 310,
+     tENTRY = 311,
+     tENUM = 312,
+     tERRORSTATUST = 313,
+     tEXPLICITHANDLE = 314,
+     tEXTERN = 315,
+     tFALSE = 316,
+     tFASTCALL = 317,
+     tFLOAT = 318,
+     tHANDLE = 319,
+     tHANDLET = 320,
+     tHELPCONTEXT = 321,
+     tHELPFILE = 322,
+     tHELPSTRING = 323,
+     tHELPSTRINGCONTEXT = 324,
+     tHELPSTRINGDLL = 325,
+     tHIDDEN = 326,
+     tHYPER = 327,
+     tID = 328,
+     tIDEMPOTENT = 329,
+     tIIDIS = 330,
+     tIMMEDIATEBIND = 331,
+     tIMPLICITHANDLE = 332,
+     tIMPORT = 333,
+     tIMPORTLIB = 334,
+     tIN = 335,
+     tIN_LINE = 336,
+     tINLINE = 337,
+     tINPUTSYNC = 338,
+     tINT = 339,
+     tINT64 = 340,
+     tINTERFACE = 341,
+     tLCID = 342,
+     tLENGTHIS = 343,
+     tLIBRARY = 344,
+     tLOCAL = 345,
+     tLONG = 346,
+     tMETHODS = 347,
+     tMODULE = 348,
+     tNONBROWSABLE = 349,
+     tNONCREATABLE = 350,
+     tNONEXTENSIBLE = 351,
+     tNULL = 352,
+     tOBJECT = 353,
+     tODL = 354,
+     tOLEAUTOMATION = 355,
+     tOPTIONAL = 356,
+     tOUT = 357,
+     tPASCAL = 358,
+     tPOINTERDEFAULT = 359,
+     tPROPERTIES = 360,
+     tPROPGET = 361,
+     tPROPPUT = 362,
+     tPROPPUTREF = 363,
+     tPTR = 364,
+     tPUBLIC = 365,
+     tRANGE = 366,
+     tREADONLY = 367,
+     tREF = 368,
+     tREGISTER = 369,
+     tREQUESTEDIT = 370,
+     tRESTRICTED = 371,
+     tRETVAL = 372,
+     tSAFEARRAY = 373,
+     tSHORT = 374,
+     tSIGNED = 375,
+     tSINGLE = 376,
+     tSIZEIS = 377,
+     tSIZEOF = 378,
+     tSMALL = 379,
+     tSOURCE = 380,
+     tSTATIC = 381,
+     tSTDCALL = 382,
+     tSTRICTCONTEXTHANDLE = 383,
+     tSTRING = 384,
+     tSTRUCT = 385,
+     tSWITCH = 386,
+     tSWITCHIS = 387,
+     tSWITCHTYPE = 388,
+     tTRANSMITAS = 389,
+     tTRUE = 390,
+     tTYPEDEF = 391,
+     tUNION = 392,
+     tUNIQUE = 393,
+     tUNSIGNED = 394,
+     tUUID = 395,
+     tV1ENUM = 396,
+     tVARARG = 397,
+     tVERSION = 398,
+     tVOID = 399,
+     tWCHAR = 400,
+     tWIREMARSHAL = 401,
+     ADDRESSOF = 402,
+     NEG = 403,
+     POS = 404,
+     PPTR = 405,
+     CAST = 406
    };
 #endif
 /* Tokens.  */
 #define aHEXNUM 261
 #define aDOUBLE 262
 #define aSTRING 263
-#define aUUID 264
-#define aEOF 265
-#define SHL 266
-#define SHR 267
-#define tAGGREGATABLE 268
-#define tALLOCATE 269
-#define tAPPOBJECT 270
-#define tASYNC 271
-#define tASYNCUUID 272
-#define tAUTOHANDLE 273
-#define tBINDABLE 274
-#define tBOOLEAN 275
-#define tBROADCAST 276
-#define tBYTE 277
-#define tBYTECOUNT 278
-#define tCALLAS 279
-#define tCALLBACK 280
-#define tCASE 281
-#define tCDECL 282
-#define tCHAR 283
-#define tCOCLASS 284
-#define tCODE 285
-#define tCOMMSTATUS 286
-#define tCONST 287
-#define tCONTEXTHANDLE 288
-#define tCONTEXTHANDLENOSERIALIZE 289
-#define tCONTEXTHANDLESERIALIZE 290
-#define tCONTROL 291
-#define tCPPQUOTE 292
-#define tDEFAULT 293
-#define tDEFAULTCOLLELEM 294
-#define tDEFAULTVALUE 295
-#define tDEFAULTVTABLE 296
-#define tDISPLAYBIND 297
-#define tDISPINTERFACE 298
-#define tDLLNAME 299
-#define tDOUBLE 300
-#define tDUAL 301
-#define tENDPOINT 302
-#define tENTRY 303
-#define tENUM 304
-#define tERRORSTATUST 305
-#define tEXPLICITHANDLE 306
-#define tEXTERN 307
-#define tFALSE 308
-#define tFLOAT 309
-#define tHANDLE 310
-#define tHANDLET 311
-#define tHELPCONTEXT 312
-#define tHELPFILE 313
-#define tHELPSTRING 314
-#define tHELPSTRINGCONTEXT 315
-#define tHELPSTRINGDLL 316
-#define tHIDDEN 317
-#define tHYPER 318
-#define tID 319
-#define tIDEMPOTENT 320
-#define tIIDIS 321
-#define tIMMEDIATEBIND 322
-#define tIMPLICITHANDLE 323
-#define tIMPORT 324
-#define tIMPORTLIB 325
-#define tIN 326
-#define tINLINE 327
-#define tINPUTSYNC 328
-#define tINT 329
-#define tINT64 330
-#define tINTERFACE 331
-#define tLCID 332
-#define tLENGTHIS 333
-#define tLIBRARY 334
-#define tLOCAL 335
-#define tLONG 336
-#define tMETHODS 337
-#define tMODULE 338
-#define tNONBROWSABLE 339
-#define tNONCREATABLE 340
-#define tNONEXTENSIBLE 341
-#define tOBJECT 342
-#define tODL 343
-#define tOLEAUTOMATION 344
-#define tOPTIONAL 345
-#define tOUT 346
-#define tPOINTERDEFAULT 347
-#define tPROPERTIES 348
-#define tPROPGET 349
-#define tPROPPUT 350
-#define tPROPPUTREF 351
-#define tPTR 352
-#define tPUBLIC 353
-#define tRANGE 354
-#define tREADONLY 355
-#define tREF 356
-#define tREQUESTEDIT 357
-#define tRESTRICTED 358
-#define tRETVAL 359
-#define tSAFEARRAY 360
-#define tSHORT 361
-#define tSIGNED 362
-#define tSINGLE 363
-#define tSIZEIS 364
-#define tSIZEOF 365
-#define tSMALL 366
-#define tSOURCE 367
-#define tSTDCALL 368
-#define tSTRICTCONTEXTHANDLE 369
-#define tSTRING 370
-#define tSTRUCT 371
-#define tSWITCH 372
-#define tSWITCHIS 373
-#define tSWITCHTYPE 374
-#define tTRANSMITAS 375
-#define tTRUE 376
-#define tTYPEDEF 377
-#define tUNION 378
-#define tUNIQUE 379
-#define tUNSIGNED 380
-#define tUUID 381
-#define tV1ENUM 382
-#define tVARARG 383
-#define tVERSION 384
-#define tVOID 385
-#define tWCHAR 386
-#define tWIREMARSHAL 387
-#define CAST 388
-#define PPTR 389
-#define NEG 390
-#define ADDRESSOF 391
+#define aWSTRING 264
+#define aUUID 265
+#define aEOF 266
+#define SHL 267
+#define SHR 268
+#define MEMBERPTR 269
+#define EQUALITY 270
+#define INEQUALITY 271
+#define GREATEREQUAL 272
+#define LESSEQUAL 273
+#define LOGICALOR 274
+#define LOGICALAND 275
+#define tAGGREGATABLE 276
+#define tALLOCATE 277
+#define tAPPOBJECT 278
+#define tASYNC 279
+#define tASYNCUUID 280
+#define tAUTOHANDLE 281
+#define tBINDABLE 282
+#define tBOOLEAN 283
+#define tBROADCAST 284
+#define tBYTE 285
+#define tBYTECOUNT 286
+#define tCALLAS 287
+#define tCALLBACK 288
+#define tCASE 289
+#define tCDECL 290
+#define tCHAR 291
+#define tCOCLASS 292
+#define tCODE 293
+#define tCOMMSTATUS 294
+#define tCONST 295
+#define tCONTEXTHANDLE 296
+#define tCONTEXTHANDLENOSERIALIZE 297
+#define tCONTEXTHANDLESERIALIZE 298
+#define tCONTROL 299
+#define tCPPQUOTE 300
+#define tDEFAULT 301
+#define tDEFAULTCOLLELEM 302
+#define tDEFAULTVALUE 303
+#define tDEFAULTVTABLE 304
+#define tDISPLAYBIND 305
+#define tDISPINTERFACE 306
+#define tDLLNAME 307
+#define tDOUBLE 308
+#define tDUAL 309
+#define tENDPOINT 310
+#define tENTRY 311
+#define tENUM 312
+#define tERRORSTATUST 313
+#define tEXPLICITHANDLE 314
+#define tEXTERN 315
+#define tFALSE 316
+#define tFASTCALL 317
+#define tFLOAT 318
+#define tHANDLE 319
+#define tHANDLET 320
+#define tHELPCONTEXT 321
+#define tHELPFILE 322
+#define tHELPSTRING 323
+#define tHELPSTRINGCONTEXT 324
+#define tHELPSTRINGDLL 325
+#define tHIDDEN 326
+#define tHYPER 327
+#define tID 328
+#define tIDEMPOTENT 329
+#define tIIDIS 330
+#define tIMMEDIATEBIND 331
+#define tIMPLICITHANDLE 332
+#define tIMPORT 333
+#define tIMPORTLIB 334
+#define tIN 335
+#define tIN_LINE 336
+#define tINLINE 337
+#define tINPUTSYNC 338
+#define tINT 339
+#define tINT64 340
+#define tINTERFACE 341
+#define tLCID 342
+#define tLENGTHIS 343
+#define tLIBRARY 344
+#define tLOCAL 345
+#define tLONG 346
+#define tMETHODS 347
+#define tMODULE 348
+#define tNONBROWSABLE 349
+#define tNONCREATABLE 350
+#define tNONEXTENSIBLE 351
+#define tNULL 352
+#define tOBJECT 353
+#define tODL 354
+#define tOLEAUTOMATION 355
+#define tOPTIONAL 356
+#define tOUT 357
+#define tPASCAL 358
+#define tPOINTERDEFAULT 359
+#define tPROPERTIES 360
+#define tPROPGET 361
+#define tPROPPUT 362
+#define tPROPPUTREF 363
+#define tPTR 364
+#define tPUBLIC 365
+#define tRANGE 366
+#define tREADONLY 367
+#define tREF 368
+#define tREGISTER 369
+#define tREQUESTEDIT 370
+#define tRESTRICTED 371
+#define tRETVAL 372
+#define tSAFEARRAY 373
+#define tSHORT 374
+#define tSIGNED 375
+#define tSINGLE 376
+#define tSIZEIS 377
+#define tSIZEOF 378
+#define tSMALL 379
+#define tSOURCE 380
+#define tSTATIC 381
+#define tSTDCALL 382
+#define tSTRICTCONTEXTHANDLE 383
+#define tSTRING 384
+#define tSTRUCT 385
+#define tSWITCH 386
+#define tSWITCHIS 387
+#define tSWITCHTYPE 388
+#define tTRANSMITAS 389
+#define tTRUE 390
+#define tTYPEDEF 391
+#define tUNION 392
+#define tUNIQUE 393
+#define tUNSIGNED 394
+#define tUUID 395
+#define tV1ENUM 396
+#define tVARARG 397
+#define tVERSION 398
+#define tVOID 399
+#define tWCHAR 400
+#define tWIREMARSHAL 401
+#define ADDRESSOF 402
+#define NEG 403
+#define POS 404
+#define PPTR 405
+#define CAST 406
 
 
 
  * IDL Compiler
  *
  * Copyright 2002 Ove Kaaven
+ * Copyright 2006-2008 Robert Shearman
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
 #include "header.h"
 #include "typelib.h"
 #include "typegen.h"
+#include "expr.h"
 
 #if defined(YYBYACC)
        /* Berkeley yacc (byacc) doesn't seem to know about these */
 # endif
 #endif
 
+#define YYERROR_VERBOSE
+
 unsigned char pointer_default = RPC_FC_UP;
+static int is_in_interface = FALSE;
+static int is_object_interface = FALSE;
+/* are we inside a library block? */
+static int is_inside_library = FALSE;
 
 typedef struct list typelist_t;
 struct typenode {
@@ -414,6 +452,19 @@ struct typenode {
   struct list entry;
 };
 
+struct _import_t
+{
+  char *name;
+  int import_performed;
+};
+
+typedef struct _decl_spec_t
+{
+  type_t *type;
+  attr_list_t *attrs;
+  enum storage_class stgclass;
+} decl_spec_t;
+
 typelist_t incomplete_types = LIST_INIT(incomplete_types);
 
 static void add_incomplete(type_t *t);
@@ -421,55 +472,75 @@ static void fix_incomplete(void);
 
 static str_list_t *append_str(str_list_t *list, char *str);
 static attr_list_t *append_attr(attr_list_t *list, attr_t *attr);
+static attr_list_t *append_attr_list(attr_list_t *new_list, attr_list_t *old_list);
+static decl_spec_t *make_decl_spec(type_t *type, decl_spec_t *left, decl_spec_t *right, attr_t *attr, enum storage_class stgclass);
 static attr_t *make_attr(enum attr_type type);
 static attr_t *make_attrv(enum attr_type type, unsigned long val);
 static attr_t *make_attrp(enum attr_type type, void *val);
-static expr_t *make_expr(enum expr_type type);
-static expr_t *make_exprl(enum expr_type type, long val);
-static expr_t *make_exprd(enum expr_type type, double val);
-static expr_t *make_exprs(enum expr_type type, char *val);
-static expr_t *make_exprt(enum expr_type type, type_t *tref, expr_t *expr);
-static expr_t *make_expr1(enum expr_type type, expr_t *expr);
-static expr_t *make_expr2(enum expr_type type, expr_t *exp1, expr_t *exp2);
-static expr_t *make_expr3(enum expr_type type, expr_t *expr1, expr_t *expr2, expr_t *expr3);
-static type_t *make_type(unsigned char type, type_t *ref);
 static expr_list_t *append_expr(expr_list_t *list, expr_t *expr);
 static array_dims_t *append_array(array_dims_t *list, expr_t *expr);
-static void set_type(var_t *v, type_t *type, int ptr_level, array_dims_t *arr, int top);
+static void set_type(var_t *v, decl_spec_t *decl_spec, const declarator_t *decl, int top);
+static var_list_t *set_var_types(attr_list_t *attrs, decl_spec_t *decl_spec, declarator_list_t *decls);
 static ifref_list_t *append_ifref(ifref_list_t *list, ifref_t *iface);
 static ifref_t *make_ifref(type_t *iface);
 static var_list_t *append_var(var_list_t *list, var_t *var);
+static var_list_t *append_var_list(var_list_t *list, var_list_t *vars);
 static var_t *make_var(char *name);
-static pident_list_t *append_pident(pident_list_t *list, pident_t *p);
-static pident_t *make_pident(var_t *var);
+static declarator_list_t *append_declarator(declarator_list_t *list, declarator_t *p);
+static declarator_t *make_declarator(var_t *var);
 static func_list_t *append_func(func_list_t *list, func_t *func);
-static func_t *make_func(var_t *def, var_list_t *args);
+static func_t *make_func(var_t *def);
 static type_t *make_class(char *name);
 static type_t *make_safearray(type_t *type);
 static type_t *make_builtin(char *name);
 static type_t *make_int(int sign);
+static typelib_t *make_library(const char *name, const attr_list_t *attrs);
+static type_t *make_func_type(var_list_t *args);
+static type_t *make_pointer_type(type_t *ref, attr_list_t *attrs);
+static type_t *append_ptrchain_type(type_t *ptrchain, type_t *type);
 
 static type_t *reg_type(type_t *type, const char *name, int t);
-static type_t *reg_typedefs(type_t *type, var_list_t *names, attr_list_t *attrs);
-static type_t *find_type(const char *name, int t);
+static type_t *reg_typedefs(decl_spec_t *decl_spec, var_list_t *names, attr_list_t *attrs);
 static type_t *find_type2(char *name, int t);
 static type_t *get_type(unsigned char type, char *name, int t);
 static type_t *get_typev(unsigned char type, var_t *name, int t);
 static int get_struct_type(var_list_t *fields);
 
 static var_t *reg_const(var_t *var);
-static var_t *find_const(char *name, int f);
 
-static void write_libid(const char *name, const attr_list_t *attr);
+static void write_libid(const typelib_t *typelib);
 static void write_clsid(type_t *cls);
 static void write_diid(type_t *iface);
 static void write_iid(type_t *iface);
 
 static int compute_method_indexes(type_t *iface);
 static char *gen_name(void);
-static void process_typedefs(var_list_t *names);
+static statement_t *process_typedefs(var_list_t *names);
 static void check_arg(var_t *arg);
-static void check_all_user_types(ifref_list_t *ifaces);
+static void check_functions(const type_t *iface);
+static void check_all_user_types(const statement_list_t *stmts);
+static attr_list_t *check_iface_attrs(const char *name, attr_list_t *attrs);
+static attr_list_t *check_function_attrs(const char *name, attr_list_t *attrs);
+static attr_list_t *check_typedef_attrs(attr_list_t *attrs);
+static attr_list_t *check_field_attrs(const char *name, attr_list_t *attrs);
+static attr_list_t *check_library_attrs(const char *name, attr_list_t *attrs);
+static attr_list_t *check_dispiface_attrs(const char *name, attr_list_t *attrs);
+static attr_list_t *check_module_attrs(const char *name, attr_list_t *attrs);
+static attr_list_t *check_coclass_attrs(const char *name, attr_list_t *attrs);
+const char *get_attr_display_name(enum attr_type type);
+static void add_explicit_handle_if_necessary(func_t *func);
+
+static statement_t *make_statement(enum statement_type type);
+static statement_t *make_statement_type_decl(type_t *type);
+static statement_t *make_statement_reference(type_t *type);
+static statement_t *make_statement_declaration(var_t *var);
+static statement_t *make_statement_library(typelib_t *typelib);
+static statement_t *make_statement_cppquote(const char *str);
+static statement_t *make_statement_importlib(const char *str);
+static statement_t *make_statement_module(type_t *type);
+static statement_t *make_statement_import(const char *str);
+static statement_list_t *append_statement(statement_list_t *list, statement_t *stmt);
+static func_list_t *append_func_from_statement(func_list_t *list, statement_t *stmt);
 
 #define tsENUM   1
 #define tsSTRUCT 2
@@ -496,7 +567,7 @@ static void check_all_user_types(ifref_list_t *ifaces);
 #endif
 
 #if ! defined (YYSTYPE) && ! defined (YYSTYPE_IS_DECLARED)
-#line 136 "parser.y"
+#line 177 "parser.y"
 typedef union YYSTYPE {
        attr_t *attr;
        attr_list_t *attr_list;
@@ -507,10 +578,12 @@ typedef union YYSTYPE {
        type_t *type;
        var_t *var;
        var_list_t *var_list;
-       pident_t *pident;
-       pident_list_t *pident_list;
+       declarator_t *declarator;
+       declarator_list_t *declarator_list;
        func_t *func;
        func_list_t *func_list;
+       statement_t *statement;
+       statement_list_t *stmt_list;
        ifref_t *ifref;
        ifref_list_t *ifref_list;
        char *str;
@@ -518,9 +591,13 @@ typedef union YYSTYPE {
        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;
 } YYSTYPE;
 /* Line 196 of yacc.c.  */
-#line 524 "parser.tab.c"
+#line 601 "parser.tab.c"
 # define yystype YYSTYPE /* obsolescent; will be withdrawn */
 # define YYSTYPE_IS_DECLARED 1
 # define YYSTYPE_IS_TRIVIAL 1
@@ -532,7 +609,7 @@ typedef union YYSTYPE {
 
 
 /* Line 219 of yacc.c.  */
-#line 536 "parser.tab.c"
+#line 613 "parser.tab.c"
 
 #if ! defined (YYSIZE_T) && defined (__SIZE_TYPE__)
 # define YYSIZE_T __SIZE_TYPE__
@@ -683,20 +760,20 @@ union yyalloc
 /* YYFINAL -- State number of the termination state. */
 #define YYFINAL  3
 /* YYLAST -- Last index in YYTABLE.  */
-#define YYLAST   992
+#define YYLAST   2015
 
 /* YYNTOKENS -- Number of terminals. */
-#define YYNTOKENS  156
+#define YYNTOKENS  176
 /* YYNNTS -- Number of nonterminals. */
-#define YYNNTS  76
+#define YYNNTS  87
 /* YYNRULES -- Number of rules. */
-#define YYNRULES  273
+#define YYNRULES  308
 /* YYNRULES -- Number of states. */
-#define YYNSTATES  500
+#define YYNSTATES  546
 
 /* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX.  */
 #define YYUNDEFTOK  2
-#define YYMAXUTOK   391
+#define YYMAXUTOK   406
 
 #define YYTRANSLATE(YYX)                                               \
   ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK)
@@ -707,16 +784,16 @@ static const unsigned char yytranslate[] =
        0,     2,     2,     2,     2,     2,     2,     2,     2,     2,
        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,   137,     2,
-     148,   149,   140,   139,   133,   138,   155,   141,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,   135,   147,
-       2,   154,     2,   134,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,   160,     2,     2,     2,   159,   152,     2,
+     171,   172,   157,   156,   147,   155,   167,   158,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,   149,   170,
+     153,   175,   154,   148,     2,     2,     2,     2,     2,     2,
        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,   152,     2,   153,     2,     2,     2,     2,     2,     2,
+       2,   168,     2,   169,   151,     2,     2,     2,     2,     2,
        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,   150,   136,   151,   142,     2,     2,     2,
+       2,     2,     2,   173,   150,   174,   161,     2,     2,     2,
        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
@@ -742,8 +819,9 @@ static const unsigned char yytranslate[] =
       95,    96,    97,    98,    99,   100,   101,   102,   103,   104,
      105,   106,   107,   108,   109,   110,   111,   112,   113,   114,
      115,   116,   117,   118,   119,   120,   121,   122,   123,   124,
-     125,   126,   127,   128,   129,   130,   131,   132,   143,   144,
-     145,   146
+     125,   126,   127,   128,   129,   130,   131,   132,   133,   134,
+     135,   136,   137,   138,   139,   140,   141,   142,   143,   144,
+     145,   146,   162,   163,   164,   165,   166
 };
 
 #if YYDEBUG
@@ -753,155 +831,170 @@ static const unsigned short int yyprhs[] =
 {
        0,     0,     3,     5,     6,     9,    12,    16,    19,    22,
       25,    28,    29,    32,    35,    39,    42,    45,    48,    51,
-      54,    55,    59,    62,    64,    67,    69,    72,    75,    77,
-      80,    83,    86,    91,    95,    99,   104,   107,   111,   115,
-     116,   118,   120,   122,   126,   128,   133,   137,   144,   150,
-     151,   155,   159,   161,   165,   170,   171,   173,   177,   179,
-     183,   188,   190,   194,   195,   197,   199,   201,   203,   205,
-     210,   215,   217,   219,   221,   223,   225,   227,   232,   237,
-     239,   241,   246,   248,   253,   258,   263,   265,   267,   272,
-     277,   282,   287,   292,   294,   299,   301,   306,   308,   314,
-     316,   318,   323,   325,   327,   329,   331,   333,   335,   337,
-     339,   341,   346,   348,   350,   352,   354,   361,   363,   365,
-     367,   369,   374,   376,   378,   380,   385,   390,   395,   400,
-     402,   404,   409,   414,   416,   418,   420,   421,   423,   424,
-     427,   432,   436,   442,   443,   446,   448,   450,   454,   458,
-     460,   466,   468,   472,   473,   475,   477,   479,   481,   483,
-     485,   487,   493,   497,   501,   505,   509,   513,   517,   521,
-     525,   528,   531,   534,   537,   542,   547,   551,   553,   557,
-     559,   564,   565,   568,   571,   575,   578,   580,   585,   593,
-     594,   596,   597,   599,   601,   603,   605,   607,   609,   611,
-     614,   617,   619,   621,   623,   625,   627,   629,   631,   632,
-     634,   636,   639,   641,   644,   647,   649,   651,   654,   657,
-     660,   665,   666,   669,   672,   675,   678,   681,   684,   688,
-     691,   695,   701,   707,   708,   711,   714,   717,   720,   726,
-     734,   736,   739,   742,   745,   748,   751,   756,   759,   762,
-     764,   766,   770,   772,   776,   778,   780,   782,   788,   790,
-     792,   794,   797,   799,   802,   804,   807,   809,   812,   817,
-     822,   828,   839,   841
+      54,    55,    58,    59,    61,    63,    66,    69,    71,    74,
+      77,    80,    85,    89,    93,    99,   102,   106,   111,   112,
+     114,   116,   118,   122,   124,   128,   131,   135,   139,   140,
+     142,   146,   148,   152,   157,   159,   163,   164,   166,   168,
+     170,   172,   174,   176,   181,   186,   188,   190,   192,   194,
+     196,   198,   203,   205,   207,   212,   214,   219,   224,   226,
+     228,   233,   238,   243,   248,   253,   255,   260,   262,   267,
+     269,   275,   277,   279,   284,   289,   291,   293,   295,   297,
+     299,   301,   303,   305,   307,   312,   314,   316,   318,   320,
+     327,   329,   331,   333,   335,   340,   342,   344,   346,   351,
+     356,   361,   366,   368,   370,   375,   380,   382,   384,   386,
+     388,   390,   392,   394,   395,   398,   403,   407,   408,   411,
+     413,   415,   419,   423,   425,   431,   433,   437,   438,   440,
+     442,   444,   446,   448,   450,   452,   454,   456,   458,   464,
+     468,   472,   476,   480,   484,   488,   492,   496,   500,   504,
+     508,   512,   516,   520,   524,   528,   532,   536,   539,   542,
+     545,   548,   551,   554,   558,   562,   567,   572,   577,   581,
+     583,   587,   589,   591,   592,   595,   600,   604,   607,   610,
+     611,   614,   617,   619,   623,   627,   631,   634,   635,   637,
+     638,   640,   642,   644,   646,   648,   650,   652,   655,   658,
+     660,   662,   664,   666,   668,   670,   672,   673,   675,   677,
+     680,   682,   685,   688,   690,   692,   695,   698,   701,   707,
+     708,   711,   714,   717,   720,   723,   726,   730,   733,   737,
+     743,   749,   750,   753,   756,   759,   762,   769,   778,   781,
+     784,   787,   790,   793,   796,   802,   804,   806,   808,   810,
+     812,   813,   816,   819,   823,   824,   826,   829,   832,   835,
+     839,   842,   844,   846,   850,   853,   858,   860,   864,   866,
+     870,   872,   874,   876,   882,   884,   886,   888,   890,   893,
+     895,   898,   900,   903,   908,   913,   919,   930,   932
 };
 
 /* YYRHS -- A `-1'-separated list of the rules' RHS. */
 static const short int yyrhs[] =
 {
-     157,     0,    -1,   158,    -1,    -1,   158,   219,    -1,   158,
-     218,    -1,   158,   205,   147,    -1,   158,   207,    -1,   158,
-     222,    -1,   158,   168,    -1,   158,   161,    -1,    -1,   159,
-     219,    -1,   159,   218,    -1,   159,   205,   147,    -1,   159,
-     207,    -1,   159,   222,    -1,   159,   161,    -1,   159,   165,
-      -1,   159,   168,    -1,    -1,   160,   198,   147,    -1,   160,
-     161,    -1,   147,    -1,   184,   147,    -1,   162,    -1,   188,
-     147,    -1,   194,   147,    -1,   164,    -1,   227,   147,    -1,
-     229,   147,    -1,   230,   147,    -1,    37,   148,     8,   149,
-      -1,    69,     8,   147,    -1,   163,   159,    10,    -1,    70,
-     148,     8,   149,    -1,    79,     3,    -1,   176,   166,   150,
-      -1,   167,   159,   151,    -1,    -1,   171,    -1,   130,    -1,
-     172,    -1,   171,   133,   172,    -1,   170,    -1,   176,   228,
-     224,   173,    -1,   228,   224,   173,    -1,   176,   228,   224,
-     148,   169,   149,    -1,   228,   224,   148,   169,   149,    -1,
-      -1,   152,   174,   153,    -1,   152,   140,   153,    -1,   190,
-      -1,   174,   133,   191,    -1,   174,   153,   152,   191,    -1,
-      -1,   176,    -1,   152,   177,   153,    -1,   179,    -1,   177,
-     133,   179,    -1,   177,   153,   152,   179,    -1,     8,    -1,
-     178,   133,     8,    -1,    -1,    13,    -1,    15,    -1,    16,
-      -1,    18,    -1,    19,    -1,    24,   148,   201,   149,    -1,
-      26,   148,   192,   149,    -1,    33,    -1,    34,    -1,    35,
-      -1,    36,    -1,    38,    -1,    39,    -1,    40,   148,   193,
-     149,    -1,    40,   148,     8,   149,    -1,    41,    -1,    42,
-      -1,    44,   148,     8,   149,    -1,    46,    -1,    47,   148,
-     178,   149,    -1,    48,   148,     8,   149,    -1,    48,   148,
-     193,   149,    -1,    51,    -1,    55,    -1,    57,   148,   193,
-     149,    -1,    58,   148,     8,   149,    -1,    59,   148,     8,
-     149,    -1,    60,   148,   193,   149,    -1,    61,   148,     8,
-     149,    -1,    62,    -1,    64,   148,   193,   149,    -1,    65,
-      -1,    66,   148,   191,   149,    -1,    67,    -1,    68,   148,
-      56,     3,   149,    -1,    71,    -1,    73,    -1,    78,   148,
-     189,   149,    -1,    80,    -1,    84,    -1,    85,    -1,    86,
-      -1,    87,    -1,    88,    -1,    89,    -1,    90,    -1,    91,
-      -1,    92,   148,   226,   149,    -1,    94,    -1,    95,    -1,
-      96,    -1,    98,    -1,    99,   148,   193,   133,   193,   149,
-      -1,   100,    -1,   102,    -1,   103,    -1,   104,    -1,   109,
-     148,   189,   149,    -1,   112,    -1,   114,    -1,   115,    -1,
-     118,   148,   191,   149,    -1,   119,   148,   228,   149,    -1,
-     120,   148,   228,   149,    -1,   126,   148,   180,   149,    -1,
-     127,    -1,   128,    -1,   129,   148,   231,   149,    -1,   132,
-     148,   228,   149,    -1,   226,    -1,     9,    -1,     8,    -1,
-      -1,   113,    -1,    -1,   182,   183,    -1,    26,   191,   135,
-     196,    -1,    38,   135,   196,    -1,    32,   228,   201,   154,
-     193,    -1,    -1,   186,   133,    -1,   186,    -1,   187,    -1,
-     186,   133,   187,    -1,   201,   154,   193,    -1,   201,    -1,
-      49,   200,   150,   185,   151,    -1,   190,    -1,   189,   133,
-     190,    -1,    -1,   191,    -1,     5,    -1,     6,    -1,     7,
-      -1,    53,    -1,   121,    -1,     3,    -1,   191,   134,   191,
-     135,   191,    -1,   191,   136,   191,    -1,   191,   137,   191,
-      -1,   191,   139,   191,    -1,   191,   138,   191,    -1,   191,
-     140,   191,    -1,   191,   141,   191,    -1,   191,    11,   191,
-      -1,   191,    12,   191,    -1,   142,   191,    -1,   138,   191,
-      -1,   137,   191,    -1,   140,   191,    -1,   148,   228,   149,
-     191,    -1,   110,   148,   228,   149,    -1,   148,   191,   149,
-      -1,   193,    -1,   192,   133,   193,    -1,   191,    -1,    52,
-      32,   228,   201,    -1,    -1,   195,   196,    -1,   197,   147,
-      -1,   175,   230,   147,    -1,   176,   147,    -1,   147,    -1,
-     175,   228,   224,   173,    -1,   175,   228,   181,   224,   148,
-     169,   149,    -1,    -1,   201,    -1,    -1,     3,    -1,     4,
-      -1,     3,    -1,     4,    -1,    22,    -1,   131,    -1,   204,
-      -1,   107,   204,    -1,   125,   204,    -1,   125,    -1,    54,
-      -1,   108,    -1,    45,    -1,    20,    -1,    50,    -1,    56,
-      -1,    -1,    74,    -1,    74,    -1,   106,   203,    -1,   111,
-      -1,    81,   203,    -1,    63,   203,    -1,    75,    -1,    28,
-      -1,    29,     3,    -1,    29,     4,    -1,   176,   205,    -1,
-     206,   150,   208,   151,    -1,    -1,   208,   209,    -1,   175,
-     219,    -1,    43,     3,    -1,    43,     4,    -1,   176,   210,
-      -1,    93,   135,    -1,   212,   197,   147,    -1,    82,   135,
-      -1,   213,   198,   147,    -1,   211,   150,   212,   213,   151,
-      -1,   211,   150,   216,   147,   151,    -1,    -1,   135,     4,
-      -1,    76,     3,    -1,    76,     4,    -1,   176,   216,    -1,
-     217,   215,   150,   160,   151,    -1,   217,   135,     3,   150,
-     164,   160,   151,    -1,   214,    -1,   216,   147,    -1,   210,
-     147,    -1,    83,     3,    -1,    83,     4,    -1,   176,   220,
-      -1,   221,   150,   160,   151,    -1,   140,   224,    -1,    32,
-     223,    -1,   201,    -1,   223,    -1,   148,   224,   149,    -1,
-     224,    -1,   225,   133,   224,    -1,   101,    -1,   124,    -1,
-      97,    -1,   116,   200,   150,   195,   151,    -1,   130,    -1,
-       4,    -1,   202,    -1,    32,   228,    -1,   188,    -1,    49,
-       3,    -1,   227,    -1,   116,     3,    -1,   230,    -1,   123,
-       3,    -1,   105,   148,   228,   149,    -1,   122,   175,   228,
-     225,    -1,   123,   200,   150,   195,   151,    -1,   123,   200,
-     117,   148,   197,   149,   199,   150,   182,   151,    -1,     5,
-      -1,     5,   155,     5,    -1
+     177,     0,    -1,   178,    -1,    -1,   178,   242,    -1,   178,
+     241,    -1,   178,   228,   170,    -1,   178,   230,    -1,   178,
+     245,    -1,   178,   189,    -1,   178,   182,    -1,    -1,   179,
+     242,    -1,   179,   241,    -1,   179,   228,   170,    -1,   179,
+     230,    -1,   179,   245,    -1,   179,   182,    -1,   179,   186,
+      -1,   179,   189,    -1,    -1,   180,   182,    -1,    -1,   170,
+      -1,   183,    -1,   207,   170,    -1,   221,   170,    -1,   185,
+      -1,   258,   170,    -1,   260,   170,    -1,   261,   170,    -1,
+      45,   171,     8,   172,    -1,    78,     8,   170,    -1,   184,
+     179,    11,    -1,    79,   171,     8,   172,   181,    -1,    89,
+       3,    -1,   196,   187,   173,    -1,   188,   179,   174,   181,
+      -1,    -1,   192,    -1,   144,    -1,   193,    -1,   192,   147,
+     193,    -1,   191,    -1,   196,   250,   253,    -1,   250,   253,
+      -1,   168,   209,   169,    -1,   168,   157,   169,    -1,    -1,
+     196,    -1,   168,   197,   169,    -1,   199,    -1,   197,   147,
+     199,    -1,   197,   169,   168,   199,    -1,     8,    -1,   198,
+     147,     8,    -1,    -1,    21,    -1,    23,    -1,    24,    -1,
+      26,    -1,    27,    -1,    29,    -1,    32,   171,   224,   172,
+      -1,    34,   171,   211,   172,    -1,    41,    -1,    42,    -1,
+      43,    -1,    44,    -1,    46,    -1,    47,    -1,    48,   171,
+     213,   172,    -1,    49,    -1,    50,    -1,    52,   171,     8,
+     172,    -1,    54,    -1,    55,   171,   198,   172,    -1,    56,
+     171,   213,   172,    -1,    59,    -1,    64,    -1,    66,   171,
+     212,   172,    -1,    67,   171,     8,   172,    -1,    68,   171,
+       8,   172,    -1,    69,   171,   212,   172,    -1,    70,   171,
+       8,   172,    -1,    71,    -1,    73,   171,   212,   172,    -1,
+      74,    -1,    75,   171,   210,   172,    -1,    76,    -1,    77,
+     171,    65,     3,   172,    -1,    80,    -1,    83,    -1,    88,
+     171,   208,   172,    -1,    87,   171,   212,   172,    -1,    90,
+      -1,    94,    -1,    95,    -1,    96,    -1,    98,    -1,    99,
+      -1,   100,    -1,   101,    -1,   102,    -1,   104,   171,   257,
+     172,    -1,   106,    -1,   107,    -1,   108,    -1,   110,    -1,
+     111,   171,   212,   147,   212,   172,    -1,   112,    -1,   115,
+      -1,   116,    -1,   117,    -1,   122,   171,   208,   172,    -1,
+     125,    -1,   128,    -1,   129,    -1,   132,   171,   210,   172,
+      -1,   133,   171,   259,   172,    -1,   134,   171,   259,   172,
+      -1,   140,   171,   200,   172,    -1,   141,    -1,   142,    -1,
+     143,   171,   262,   172,    -1,   146,   171,   259,   172,    -1,
+     257,    -1,    10,    -1,     8,    -1,    35,    -1,    62,    -1,
+     103,    -1,   127,    -1,    -1,   202,   203,    -1,    34,   212,
+     149,   218,    -1,    46,   149,   218,    -1,    -1,   205,   147,
+      -1,   205,    -1,   206,    -1,   205,   147,   206,    -1,   224,
+     175,   212,    -1,   224,    -1,    57,   223,   173,   204,   174,
+      -1,   209,    -1,   208,   147,   209,    -1,    -1,   210,    -1,
+       5,    -1,     6,    -1,     7,    -1,    61,    -1,    97,    -1,
+     135,    -1,     8,    -1,     9,    -1,     3,    -1,   210,   148,
+     210,   149,   210,    -1,   210,    19,   210,    -1,   210,    20,
+     210,    -1,   210,   150,   210,    -1,   210,   151,   210,    -1,
+     210,   152,   210,    -1,   210,    15,   210,    -1,   210,    16,
+     210,    -1,   210,   154,   210,    -1,   210,   153,   210,    -1,
+     210,    17,   210,    -1,   210,    18,   210,    -1,   210,    12,
+     210,    -1,   210,    13,   210,    -1,   210,   156,   210,    -1,
+     210,   155,   210,    -1,   210,   159,   210,    -1,   210,   157,
+     210,    -1,   210,   158,   210,    -1,   160,   210,    -1,   161,
+     210,    -1,   156,   210,    -1,   155,   210,    -1,   152,   210,
+      -1,   157,   210,    -1,   210,    14,     3,    -1,   210,   167,
+       3,    -1,   171,   259,   172,   210,    -1,   123,   171,   259,
+     172,    -1,   210,   168,   210,   169,    -1,   171,   210,   172,
+      -1,   212,    -1,   211,   147,   212,    -1,   210,    -1,   210,
+      -1,    -1,   214,   215,    -1,   195,   250,   255,   170,    -1,
+     195,   261,   170,    -1,   219,   170,    -1,   196,   170,    -1,
+      -1,   217,   216,    -1,   219,   170,    -1,   170,    -1,   195,
+     250,   253,    -1,   195,   250,   253,    -1,   196,   250,   256,
+      -1,   250,   256,    -1,    -1,   224,    -1,    -1,     3,    -1,
+       4,    -1,     3,    -1,     4,    -1,    30,    -1,   145,    -1,
+     227,    -1,   120,   227,    -1,   139,   227,    -1,   139,    -1,
+      63,    -1,   121,    -1,    53,    -1,    28,    -1,    58,    -1,
+      65,    -1,    -1,    84,    -1,    84,    -1,   119,   226,    -1,
+     124,    -1,    91,   226,    -1,    72,   226,    -1,    85,    -1,
+      36,    -1,    37,     3,    -1,    37,     4,    -1,   196,   228,
+      -1,   229,   173,   231,   174,   181,    -1,    -1,   231,   232,
+      -1,   195,   242,    -1,    51,     3,    -1,    51,     4,    -1,
+     196,   233,    -1,   105,   149,    -1,   235,   219,   170,    -1,
+      92,   149,    -1,   236,   220,   170,    -1,   234,   173,   235,
+     236,   174,    -1,   234,   173,   239,   170,   174,    -1,    -1,
+     149,     4,    -1,    86,     3,    -1,    86,     4,    -1,   196,
+     239,    -1,   240,   238,   173,   180,   174,   181,    -1,   240,
+     149,     3,   173,   185,   180,   174,   181,    -1,   237,   181,
+      -1,   239,   170,    -1,   233,   170,    -1,    93,     3,    -1,
+      93,     4,    -1,   196,   243,    -1,   244,   173,   180,   174,
+     181,    -1,    60,    -1,   126,    -1,   114,    -1,    82,    -1,
+      40,    -1,    -1,   249,   248,    -1,   259,   251,    -1,   252,
+     259,   251,    -1,    -1,   252,    -1,   248,   251,    -1,   247,
+     251,    -1,   246,   251,    -1,   157,   249,   253,    -1,   201,
+     253,    -1,   254,    -1,   224,    -1,   171,   253,   172,    -1,
+     254,   194,    -1,   254,   171,   190,   172,    -1,   253,    -1,
+     255,   147,   253,    -1,   253,    -1,   253,   175,   213,    -1,
+     113,    -1,   138,    -1,   109,    -1,   130,   223,   173,   214,
+     174,    -1,   144,    -1,     4,    -1,   225,    -1,   207,    -1,
+      57,     3,    -1,   258,    -1,   130,     3,    -1,   261,    -1,
+     137,     3,    -1,   118,   171,   259,   172,    -1,   136,   195,
+     250,   255,    -1,   137,   223,   173,   217,   174,    -1,   137,
+     223,   131,   171,   219,   172,   222,   173,   202,   174,    -1,
+       5,    -1,     5,   167,     5,    -1
 };
 
 /* YYRLINE[YYN] -- source line where rule number YYN was defined.  */
 static const unsigned short int yyrline[] =
 {
-       0,   286,   286,   295,   296,   297,   298,   302,   307,   308,
-     309,   312,   313,   314,   315,   316,   320,   321,   322,   323,
-     326,   327,   328,   331,   332,   333,   334,   339,   340,   341,
-     346,   347,   354,   356,   359,   362,   365,   367,   372,   375,
-     376,   379,   382,   383,   384,   388,   393,   397,   403,   410,
-     411,   412,   415,   416,   417,   420,   421,   425,   431,   432,
-     433,   436,   437,   440,   441,   442,   443,   444,   445,   446,
-     447,   448,   449,   450,   451,   452,   453,   454,   455,   456,
-     457,   458,   459,   460,   461,   462,   463,   464,   465,   466,
-     467,   468,   469,   470,   471,   472,   473,   474,   475,   476,
-     477,   478,   479,   480,   481,   482,   483,   484,   485,   486,
-     487,   488,   489,   490,   491,   492,   493,   496,   497,   498,
-     499,   500,   501,   502,   503,   504,   505,   506,   507,   508,
-     509,   510,   511,   512,   516,   517,   522,   523,   526,   527,
-     530,   534,   540,   546,   547,   548,   551,   555,   564,   568,
-     573,   582,   583,   596,   597,   600,   601,   602,   603,   604,
-     605,   606,   607,   608,   609,   610,   611,   612,   613,   614,
-     615,   616,   617,   618,   619,   620,   621,   624,   625,   628,
-     634,   639,   640,   643,   644,   645,   646,   649,   657,   669,
-     670,   673,   674,   675,   678,   680,   683,   684,   685,   686,
-     687,   703,   704,   705,   706,   707,   708,   709,   712,   713,
-     716,   717,   718,   719,   720,   721,   722,   725,   726,   732,
-     741,   747,   748,   752,   755,   756,   759,   771,   772,   775,
-     776,   779,   788,   797,   798,   801,   802,   805,   816,   828,
-     839,   843,   844,   847,   848,   851,   856,   862,   863,   866,
-     867,   868,   872,   873,   877,   878,   879,   882,   893,   894,
-     895,   896,   897,   898,   899,   900,   901,   902,   903,   906,
-     911,   916,   933,   934
+       0,   349,   349,   358,   359,   360,   361,   365,   370,   373,
+     374,   377,   378,   379,   380,   381,   386,   387,   388,   389,
+     392,   393,   396,   397,   401,   402,   408,   411,   412,   418,
+     419,   427,   429,   437,   444,   448,   450,   457,   465,   466,
+     469,   472,   473,   474,   478,   485,   493,   494,   497,   498,
+     502,   508,   509,   510,   513,   514,   517,   518,   519,   520,
+     521,   522,   523,   524,   525,   526,   527,   528,   529,   530,
+     531,   532,   533,   534,   535,   536,   537,   538,   539,   540,
+     541,   542,   543,   544,   545,   546,   547,   548,   549,   550,
+     551,   552,   553,   554,   555,   556,   557,   558,   559,   560,
+     561,   562,   563,   564,   565,   566,   567,   568,   569,   570,
+     574,   575,   576,   577,   578,   579,   580,   581,   582,   583,
+     584,   585,   586,   587,   588,   589,   590,   594,   595,   600,
+     601,   602,   603,   606,   607,   610,   614,   620,   621,   622,
+     625,   629,   638,   642,   647,   656,   657,   670,   671,   674,
+     675,   676,   677,   678,   679,   680,   681,   682,   683,   684,
+     685,   686,   687,   688,   689,   690,   691,   692,   693,   694,
+     695,   696,   697,   698,   699,   700,   701,   702,   703,   704,
+     705,   706,   707,   708,   709,   710,   711,   712,   713,   716,
+     717,   720,   726,   732,   733,   736,   741,   748,   749,   752,
+     753,   757,   758,   761,   769,   778,   784,   790,   791,   794,
+     795,   796,   799,   801,   804,   805,   806,   807,   808,   824,
+     825,   826,   827,   828,   829,   830,   833,   834,   837,   838,
+     839,   840,   841,   842,   843,   846,   847,   853,   862,   869,
+     870,   874,   877,   878,   881,   895,   896,   899,   900,   903,
+     913,   923,   924,   927,   928,   931,   944,   958,   971,   975,
+     976,   979,   980,   983,   988,   996,   997,   998,  1002,  1006,
+    1009,  1010,  1013,  1014,  1018,  1019,  1023,  1024,  1025,  1029,
+    1031,  1032,  1036,  1037,  1038,  1039,  1046,  1047,  1051,  1052,
+    1056,  1057,  1058,  1061,  1072,  1073,  1074,  1075,  1076,  1077,
+    1078,  1079,  1080,  1081,  1084,  1090,  1096,  1113,  1114
 };
 #endif
 
@@ -911,47 +1004,54 @@ static const unsigned short int yyrline[] =
 static const char *const yytname[] =
 {
   "$end", "error", "$undefined", "aIDENTIFIER", "aKNOWNTYPE", "aNUM",
-  "aHEXNUM", "aDOUBLE", "aSTRING", "aUUID", "aEOF", "SHL", "SHR",
-  "tAGGREGATABLE", "tALLOCATE", "tAPPOBJECT", "tASYNC", "tASYNCUUID",
-  "tAUTOHANDLE", "tBINDABLE", "tBOOLEAN", "tBROADCAST", "tBYTE",
-  "tBYTECOUNT", "tCALLAS", "tCALLBACK", "tCASE", "tCDECL", "tCHAR",
-  "tCOCLASS", "tCODE", "tCOMMSTATUS", "tCONST", "tCONTEXTHANDLE",
-  "tCONTEXTHANDLENOSERIALIZE", "tCONTEXTHANDLESERIALIZE", "tCONTROL",
-  "tCPPQUOTE", "tDEFAULT", "tDEFAULTCOLLELEM", "tDEFAULTVALUE",
+  "aHEXNUM", "aDOUBLE", "aSTRING", "aWSTRING", "aUUID", "aEOF", "SHL",
+  "SHR", "MEMBERPTR", "EQUALITY", "INEQUALITY", "GREATEREQUAL",
+  "LESSEQUAL", "LOGICALOR", "LOGICALAND", "tAGGREGATABLE", "tALLOCATE",
+  "tAPPOBJECT", "tASYNC", "tASYNCUUID", "tAUTOHANDLE", "tBINDABLE",
+  "tBOOLEAN", "tBROADCAST", "tBYTE", "tBYTECOUNT", "tCALLAS", "tCALLBACK",
+  "tCASE", "tCDECL", "tCHAR", "tCOCLASS", "tCODE", "tCOMMSTATUS", "tCONST",
+  "tCONTEXTHANDLE", "tCONTEXTHANDLENOSERIALIZE", "tCONTEXTHANDLESERIALIZE",
+  "tCONTROL", "tCPPQUOTE", "tDEFAULT", "tDEFAULTCOLLELEM", "tDEFAULTVALUE",
   "tDEFAULTVTABLE", "tDISPLAYBIND", "tDISPINTERFACE", "tDLLNAME",
   "tDOUBLE", "tDUAL", "tENDPOINT", "tENTRY", "tENUM", "tERRORSTATUST",
-  "tEXPLICITHANDLE", "tEXTERN", "tFALSE", "tFLOAT", "tHANDLE", "tHANDLET",
-  "tHELPCONTEXT", "tHELPFILE", "tHELPSTRING", "tHELPSTRINGCONTEXT",
-  "tHELPSTRINGDLL", "tHIDDEN", "tHYPER", "tID", "tIDEMPOTENT", "tIIDIS",
-  "tIMMEDIATEBIND", "tIMPLICITHANDLE", "tIMPORT", "tIMPORTLIB", "tIN",
-  "tINLINE", "tINPUTSYNC", "tINT", "tINT64", "tINTERFACE", "tLCID",
-  "tLENGTHIS", "tLIBRARY", "tLOCAL", "tLONG", "tMETHODS", "tMODULE",
-  "tNONBROWSABLE", "tNONCREATABLE", "tNONEXTENSIBLE", "tOBJECT", "tODL",
-  "tOLEAUTOMATION", "tOPTIONAL", "tOUT", "tPOINTERDEFAULT", "tPROPERTIES",
+  "tEXPLICITHANDLE", "tEXTERN", "tFALSE", "tFASTCALL", "tFLOAT", "tHANDLE",
+  "tHANDLET", "tHELPCONTEXT", "tHELPFILE", "tHELPSTRING",
+  "tHELPSTRINGCONTEXT", "tHELPSTRINGDLL", "tHIDDEN", "tHYPER", "tID",
+  "tIDEMPOTENT", "tIIDIS", "tIMMEDIATEBIND", "tIMPLICITHANDLE", "tIMPORT",
+  "tIMPORTLIB", "tIN", "tIN_LINE", "tINLINE", "tINPUTSYNC", "tINT",
+  "tINT64", "tINTERFACE", "tLCID", "tLENGTHIS", "tLIBRARY", "tLOCAL",
+  "tLONG", "tMETHODS", "tMODULE", "tNONBROWSABLE", "tNONCREATABLE",
+  "tNONEXTENSIBLE", "tNULL", "tOBJECT", "tODL", "tOLEAUTOMATION",
+  "tOPTIONAL", "tOUT", "tPASCAL", "tPOINTERDEFAULT", "tPROPERTIES",
   "tPROPGET", "tPROPPUT", "tPROPPUTREF", "tPTR", "tPUBLIC", "tRANGE",
-  "tREADONLY", "tREF", "tREQUESTEDIT", "tRESTRICTED", "tRETVAL",
-  "tSAFEARRAY", "tSHORT", "tSIGNED", "tSINGLE", "tSIZEIS", "tSIZEOF",
-  "tSMALL", "tSOURCE", "tSTDCALL", "tSTRICTCONTEXTHANDLE", "tSTRING",
-  "tSTRUCT", "tSWITCH", "tSWITCHIS", "tSWITCHTYPE", "tTRANSMITAS", "tTRUE",
-  "tTYPEDEF", "tUNION", "tUNIQUE", "tUNSIGNED", "tUUID", "tV1ENUM",
-  "tVARARG", "tVERSION", "tVOID", "tWCHAR", "tWIREMARSHAL", "','", "'?'",
-  "':'", "'|'", "'&'", "'-'", "'+'", "'*'", "'/'", "'~'", "CAST", "PPTR",
-  "NEG", "ADDRESSOF", "';'", "'('", "')'", "'{'", "'}'", "'['", "']'",
-  "'='", "'.'", "$accept", "input", "gbl_statements", "imp_statements",
-  "int_statements", "statement", "cppquote", "import_start", "import",
-  "importlib", "libraryhdr", "library_start", "librarydef", "m_args",
-  "no_args", "args", "arg", "array", "array_list", "m_attributes",
-  "attributes", "attrib_list", "str_list", "attribute", "uuid_string",
-  "callconv", "cases", "case", "constdef", "enums", "enum_list", "enum",
-  "enumdef", "m_exprs", "m_expr", "expr", "expr_list_const", "expr_const",
-  "externdef", "fields", "field", "s_field", "funcdef", "m_ident",
-  "t_ident", "ident", "base_type", "m_int", "int_std", "coclass",
-  "coclasshdr", "coclassdef", "coclass_ints", "coclass_int",
-  "dispinterface", "dispinterfacehdr", "dispint_props", "dispint_meths",
-  "dispinterfacedef", "inherit", "interface", "interfacehdr",
-  "interfacedef", "interfacedec", "module", "modulehdr", "moduledef",
-  "p_ident", "pident", "pident_list", "pointer_type", "structdef", "type",
-  "typedef", "uniondef", "version", 0
+  "tREADONLY", "tREF", "tREGISTER", "tREQUESTEDIT", "tRESTRICTED",
+  "tRETVAL", "tSAFEARRAY", "tSHORT", "tSIGNED", "tSINGLE", "tSIZEIS",
+  "tSIZEOF", "tSMALL", "tSOURCE", "tSTATIC", "tSTDCALL",
+  "tSTRICTCONTEXTHANDLE", "tSTRING", "tSTRUCT", "tSWITCH", "tSWITCHIS",
+  "tSWITCHTYPE", "tTRANSMITAS", "tTRUE", "tTYPEDEF", "tUNION", "tUNIQUE",
+  "tUNSIGNED", "tUUID", "tV1ENUM", "tVARARG", "tVERSION", "tVOID",
+  "tWCHAR", "tWIREMARSHAL", "','", "'?'", "':'", "'|'", "'^'", "'&'",
+  "'<'", "'>'", "'-'", "'+'", "'*'", "'/'", "'%'", "'!'", "'~'",
+  "ADDRESSOF", "NEG", "POS", "PPTR", "CAST", "'.'", "'['", "']'", "';'",
+  "'('", "')'", "'{'", "'}'", "'='", "$accept", "input", "gbl_statements",
+  "imp_statements", "int_statements", "semicolon_opt", "statement",
+  "cppquote", "import_start", "import", "importlib", "libraryhdr",
+  "library_start", "librarydef", "m_args", "no_args", "args", "arg",
+  "array", "m_attributes", "attributes", "attrib_list", "str_list",
+  "attribute", "uuid_string", "callconv", "cases", "case", "enums",
+  "enum_list", "enum", "enumdef", "m_exprs", "m_expr", "expr",
+  "expr_list_int_const", "expr_int_const", "expr_const", "fields", "field",
+  "ne_union_field", "ne_union_fields", "union_field", "s_field", "funcdef",
+  "declaration", "m_ident", "t_ident", "ident", "base_type", "m_int",
+  "int_std", "coclass", "coclasshdr", "coclassdef", "coclass_ints",
+  "coclass_int", "dispinterface", "dispinterfacehdr", "dispint_props",
+  "dispint_meths", "dispinterfacedef", "inherit", "interface",
+  "interfacehdr", "interfacedef", "interfacedec", "module", "modulehdr",
+  "moduledef", "storage_cls_spec", "function_specifier", "type_qualifier",
+  "m_type_qual_list", "decl_spec", "m_decl_spec_no_type",
+  "decl_spec_no_type", "declarator", "direct_declarator",
+  "declarator_list", "init_declarator", "pointer_type", "structdef",
+  "type", "typedef", "uniondef", "version", 0
 };
 #endif
 
@@ -973,43 +1073,48 @@ static const unsigned short int yytoknum[] =
      355,   356,   357,   358,   359,   360,   361,   362,   363,   364,
      365,   366,   367,   368,   369,   370,   371,   372,   373,   374,
      375,   376,   377,   378,   379,   380,   381,   382,   383,   384,
-     385,   386,   387,    44,    63,    58,   124,    38,    45,    43,
-      42,    47,   126,   388,   389,   390,   391,    59,    40,    41,
-     123,   125,    91,    93,    61,    46
+     385,   386,   387,   388,   389,   390,   391,   392,   393,   394,
+     395,   396,   397,   398,   399,   400,   401,    44,    63,    58,
+     124,    94,    38,    60,    62,    45,    43,    42,    47,    37,
+      33,   126,   402,   403,   404,   405,   406,    46,    91,    93,
+      59,    40,    41,   123,   125,    61
 };
 # endif
 
 /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives.  */
-static const unsigned char yyr1[] =
+static const unsigned short int yyr1[] =
 {
-       0,   156,   157,   158,   158,   158,   158,   158,   158,   158,
-     158,   159,   159,   159,   159,   159,   159,   159,   159,   159,
-     160,   160,   160,   161,   161,   161,   161,   161,   161,   161,
-     161,   161,   162,   163,   164,   165,   166,   167,   168,   169,
-     169,   170,   171,   171,   171,   172,   172,   172,   172,   173,
-     173,   173,   174,   174,   174,   175,   175,   176,   177,   177,
-     177,   178,   178,   179,   179,   179,   179,   179,   179,   179,
-     179,   179,   179,   179,   179,   179,   179,   179,   179,   179,
-     179,   179,   179,   179,   179,   179,   179,   179,   179,   179,
-     179,   179,   179,   179,   179,   179,   179,   179,   179,   179,
-     179,   179,   179,   179,   179,   179,   179,   179,   179,   179,
-     179,   179,   179,   179,   179,   179,   179,   179,   179,   179,
-     179,   179,   179,   179,   179,   179,   179,   179,   179,   179,
-     179,   179,   179,   179,   180,   180,   181,   181,   182,   182,
-     183,   183,   184,   185,   185,   185,   186,   186,   187,   187,
-     188,   189,   189,   190,   190,   191,   191,   191,   191,   191,
-     191,   191,   191,   191,   191,   191,   191,   191,   191,   191,
-     191,   191,   191,   191,   191,   191,   191,   192,   192,   193,
-     194,   195,   195,   196,   196,   196,   196,   197,   198,   199,
-     199,   200,   200,   200,   201,   201,   202,   202,   202,   202,
-     202,   202,   202,   202,   202,   202,   202,   202,   203,   203,
-     204,   204,   204,   204,   204,   204,   204,   205,   205,   206,
-     207,   208,   208,   209,   210,   210,   211,   212,   212,   213,
-     213,   214,   214,   215,   215,   216,   216,   217,   218,   218,
-     218,   219,   219,   220,   220,   221,   222,   223,   223,   224,
-     224,   224,   225,   225,   226,   226,   226,   227,   228,   228,
-     228,   228,   228,   228,   228,   228,   228,   228,   228,   229,
-     230,   230,   231,   231
+       0,   176,   177,   178,   178,   178,   178,   178,   178,   178,
+     178,   179,   179,   179,   179,   179,   179,   179,   179,   179,
+     180,   180,   181,   181,   182,   182,   182,   182,   182,   182,
+     182,   183,   184,   185,   186,   187,   188,   189,   190,   190,
+     191,   192,   192,   192,   193,   193,   194,   194,   195,   195,
+     196,   197,   197,   197,   198,   198,   199,   199,   199,   199,
+     199,   199,   199,   199,   199,   199,   199,   199,   199,   199,
+     199,   199,   199,   199,   199,   199,   199,   199,   199,   199,
+     199,   199,   199,   199,   199,   199,   199,   199,   199,   199,
+     199,   199,   199,   199,   199,   199,   199,   199,   199,   199,
+     199,   199,   199,   199,   199,   199,   199,   199,   199,   199,
+     199,   199,   199,   199,   199,   199,   199,   199,   199,   199,
+     199,   199,   199,   199,   199,   199,   199,   200,   200,   201,
+     201,   201,   201,   202,   202,   203,   203,   204,   204,   204,
+     205,   205,   206,   206,   207,   208,   208,   209,   209,   210,
+     210,   210,   210,   210,   210,   210,   210,   210,   210,   210,
+     210,   210,   210,   210,   210,   210,   210,   210,   210,   210,
+     210,   210,   210,   210,   210,   210,   210,   210,   210,   210,
+     210,   210,   210,   210,   210,   210,   210,   210,   210,   211,
+     211,   212,   213,   214,   214,   215,   215,   216,   216,   217,
+     217,   218,   218,   219,   220,   221,   221,   222,   222,   223,
+     223,   223,   224,   224,   225,   225,   225,   225,   225,   225,
+     225,   225,   225,   225,   225,   225,   226,   226,   227,   227,
+     227,   227,   227,   227,   227,   228,   228,   229,   230,   231,
+     231,   232,   233,   233,   234,   235,   235,   236,   236,   237,
+     237,   238,   238,   239,   239,   240,   241,   241,   241,   242,
+     242,   243,   243,   244,   245,   246,   246,   246,   247,   248,
+     249,   249,   250,   250,   251,   251,   252,   252,   252,   253,
+     253,   253,   254,   254,   254,   254,   255,   255,   256,   256,
+     257,   257,   257,   258,   259,   259,   259,   259,   259,   259,
+     259,   259,   259,   259,   260,   261,   261,   262,   262
 };
 
 /* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN.  */
@@ -1017,32 +1122,35 @@ static const unsigned char yyr2[] =
 {
        0,     2,     1,     0,     2,     2,     3,     2,     2,     2,
        2,     0,     2,     2,     3,     2,     2,     2,     2,     2,
-       0,     3,     2,     1,     2,     1,     2,     2,     1,     2,
-       2,     2,     4,     3,     3,     4,     2,     3,     3,     0,
-       1,     1,     1,     3,     1,     4,     3,     6,     5,     0,
-       3,     3,     1,     3,     4,     0,     1,     3,     1,     3,
-       4,     1,     3,     0,     1,     1,     1,     1,     1,     4,
-       4,     1,     1,     1,     1,     1,     1,     4,     4,     1,
-       1,     4,     1,     4,     4,     4,     1,     1,     4,     4,
-       4,     4,     4,     1,     4,     1,     4,     1,     5,     1,
-       1,     4,     1,     1,     1,     1,     1,     1,     1,     1,
-       1,     4,     1,     1,     1,     1,     6,     1,     1,     1,
-       1,     4,     1,     1,     1,     4,     4,     4,     4,     1,
-       1,     4,     4,     1,     1,     1,     0,     1,     0,     2,
-       4,     3,     5,     0,     2,     1,     1,     3,     3,     1,
-       5,     1,     3,     0,     1,     1,     1,     1,     1,     1,
-       1,     5,     3,     3,     3,     3,     3,     3,     3,     3,
-       2,     2,     2,     2,     4,     4,     3,     1,     3,     1,
-       4,     0,     2,     2,     3,     2,     1,     4,     7,     0,
-       1,     0,     1,     1,     1,     1,     1,     1,     1,     2,
-       2,     1,     1,     1,     1,     1,     1,     1,     0,     1,
-       1,     2,     1,     2,     2,     1,     1,     2,     2,     2,
-       4,     0,     2,     2,     2,     2,     2,     2,     3,     2,
-       3,     5,     5,     0,     2,     2,     2,     2,     5,     7,
-       1,     2,     2,     2,     2,     2,     4,     2,     2,     1,
-       1,     3,     1,     3,     1,     1,     1,     5,     1,     1,
-       1,     2,     1,     2,     1,     2,     1,     2,     4,     4,
-       5,    10,     1,     3
+       0,     2,     0,     1,     1,     2,     2,     1,     2,     2,
+       2,     4,     3,     3,     5,     2,     3,     4,     0,     1,
+       1,     1,     3,     1,     3,     2,     3,     3,     0,     1,
+       3,     1,     3,     4,     1,     3,     0,     1,     1,     1,
+       1,     1,     1,     4,     4,     1,     1,     1,     1,     1,
+       1,     4,     1,     1,     4,     1,     4,     4,     1,     1,
+       4,     4,     4,     4,     4,     1,     4,     1,     4,     1,
+       5,     1,     1,     4,     4,     1,     1,     1,     1,     1,
+       1,     1,     1,     1,     4,     1,     1,     1,     1,     6,
+       1,     1,     1,     1,     4,     1,     1,     1,     4,     4,
+       4,     4,     1,     1,     4,     4,     1,     1,     1,     1,
+       1,     1,     1,     0,     2,     4,     3,     0,     2,     1,
+       1,     3,     3,     1,     5,     1,     3,     0,     1,     1,
+       1,     1,     1,     1,     1,     1,     1,     1,     5,     3,
+       3,     3,     3,     3,     3,     3,     3,     3,     3,     3,
+       3,     3,     3,     3,     3,     3,     3,     2,     2,     2,
+       2,     2,     2,     3,     3,     4,     4,     4,     3,     1,
+       3,     1,     1,     0,     2,     4,     3,     2,     2,     0,
+       2,     2,     1,     3,     3,     3,     2,     0,     1,     0,
+       1,     1,     1,     1,     1,     1,     1,     2,     2,     1,
+       1,     1,     1,     1,     1,     1,     0,     1,     1,     2,
+       1,     2,     2,     1,     1,     2,     2,     2,     5,     0,
+       2,     2,     2,     2,     2,     2,     3,     2,     3,     5,
+       5,     0,     2,     2,     2,     2,     6,     8,     2,     2,
+       2,     2,     2,     2,     5,     1,     1,     1,     1,     1,
+       0,     2,     2,     3,     0,     1,     2,     2,     2,     3,
+       2,     1,     1,     3,     2,     4,     1,     3,     1,     3,
+       1,     1,     1,     5,     1,     1,     1,     1,     2,     1,
+       2,     1,     2,     4,     4,     5,    10,     1,     3
 };
 
 /* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state
@@ -1050,408 +1158,629 @@ static const unsigned char yyr2[] =
    means the default is an error.  */
 static const unsigned short int yydefact[] =
 {
-       3,     0,     2,     1,     0,     0,     0,     0,   191,     0,
-       0,     0,   191,    55,   191,    23,    63,    10,    25,    11,
-      28,    11,     9,     0,     0,     0,     0,     0,     0,     7,
-       0,     0,   240,     0,   233,     5,     4,     0,     8,     0,
-       0,     0,   217,   218,   259,   205,   196,   216,     0,   204,
-     191,   206,   202,   207,   208,   210,   215,   208,     0,   208,
-       0,   203,   212,   191,   191,   201,   258,   197,   262,   260,
-     198,   264,     0,   266,     0,   224,   225,   192,   193,     0,
-       0,     0,   235,   236,     0,     0,    56,     0,    64,    65,
-      66,    67,    68,     0,     0,    71,    72,    73,    74,    75,
-      76,     0,    79,    80,     0,    82,     0,     0,    86,    87,
-       0,     0,     0,     0,     0,    93,     0,    95,     0,    97,
-       0,    99,   100,     0,   102,   103,   104,   105,   106,   107,
-     108,   109,   110,     0,   112,   113,   114,   256,   115,     0,
-     117,   254,   118,   119,   120,     0,   122,   123,   124,     0,
-       0,     0,   255,     0,   129,   130,     0,     0,     0,    58,
-     133,     0,     0,     0,     0,     0,   219,   226,   237,   245,
-      24,    26,    27,     6,   221,   242,     0,   241,     0,     0,
-      20,    29,    30,    31,   261,   263,   209,   214,   213,     0,
-     211,   199,   265,   267,   200,   194,   195,     0,     0,   143,
-       0,    33,   181,     0,     0,   181,     0,     0,     0,     0,
+       3,     0,     2,     1,   295,   223,   214,   234,     0,   269,
+       0,     0,   222,   209,   224,   265,   220,   225,   226,     0,
+     268,   228,   233,     0,   226,   267,     0,   226,     0,   221,
+     230,   266,   209,    48,   209,   219,   294,   215,    56,    10,
+      24,    11,    27,    11,     9,     0,   297,     0,   296,   216,
+       0,     0,     7,     0,     0,    22,     0,   251,     5,     4,
+       0,     8,   274,   274,   274,     0,     0,   299,   274,     0,
+     301,   235,   236,     0,   242,   243,   298,   211,     0,   227,
+     232,     0,   253,   254,   231,     0,   229,   217,   300,     0,
+       0,    49,   302,     0,   218,    57,    58,    59,    60,    61,
+      62,     0,     0,    65,    66,    67,    68,    69,    70,     0,
+      72,    73,     0,    75,     0,     0,    78,    79,     0,     0,
+       0,     0,     0,    85,     0,    87,     0,    89,     0,    91,
+      92,     0,     0,    95,    96,    97,    98,    99,   100,   101,
+     102,   103,     0,   105,   106,   107,   292,   108,     0,   110,
+     290,   111,   112,   113,     0,   115,   116,   117,     0,     0,
+       0,   291,     0,   122,   123,     0,     0,     0,    51,   126,
+       0,     0,     0,     0,     0,   297,   237,   244,   255,   263,
+       0,   299,   301,    25,    26,     6,   239,   260,     0,    23,
+     258,   259,     0,     0,    20,   278,   275,   277,   276,   212,
+     213,   129,   130,   131,   132,   270,     0,     0,   282,   288,
+     281,   206,   274,    28,   272,    29,    30,     0,   137,    32,
+       0,   193,     0,     0,   199,     0,     0,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-     153,     0,     0,   153,     0,     0,     0,     0,     0,     0,
-      63,    57,    34,     0,    17,    18,    19,     0,    15,    13,
-      12,    16,    38,    36,   243,   244,    37,    55,     0,    55,
-       0,     0,   234,    20,    55,     0,     0,    32,     0,   145,
-     146,   149,   180,    55,     0,     0,     0,   249,   250,   252,
-     269,    55,    55,     0,   160,   155,   156,   157,   158,     0,
-     159,     0,     0,     0,     0,     0,   179,     0,   177,     0,
-       0,     0,    61,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,   151,   154,     0,     0,     0,
-       0,     0,     0,   135,   134,     0,   272,     0,     0,    59,
-      63,     0,    14,   220,     0,   222,   227,     0,     0,     0,
-      55,     0,     0,    55,   246,    22,     0,     0,   268,   142,
-     150,   144,     0,   186,   257,     0,    56,   182,     0,   248,
-     247,     0,     0,     0,   270,    69,     0,   172,   171,   173,
-     170,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,    70,    78,    77,    81,     0,    83,    84,
-      85,    88,    89,    90,    91,    92,    94,    96,     0,   153,
-     101,   111,     0,   121,   125,   126,   127,   128,     0,   131,
-     132,    60,     0,   223,   229,     0,   228,   231,     0,   232,
-      20,   238,   136,    21,   147,   148,   266,   185,   183,   251,
-     253,   189,     0,   176,     0,   168,   169,     0,   162,   163,
-     165,   164,   166,   167,   178,    62,    98,   152,     0,   273,
-      35,    49,   230,    55,   137,     0,   184,     0,   190,   175,
-     174,     0,   116,   153,   187,   239,     0,   138,   161,     0,
-       0,    52,    39,     0,    51,     0,    50,   258,     0,    44,
-      40,    42,     0,     0,     0,     0,   271,   139,    53,     0,
-     188,     0,     0,    49,     0,    55,    54,    43,    49,    39,
-      46,    55,   141,    39,    45,     0,   140,     0,    48,    47
+     147,     0,     0,   147,     0,     0,     0,     0,     0,     0,
+      56,    50,    33,     0,    17,    18,    19,     0,    15,    13,
+      12,    16,    22,    35,   261,   262,    36,   205,    48,     0,
+      48,     0,     0,   252,    20,     0,     0,     0,   280,     0,
+     147,    38,   284,   273,    31,     0,   139,   140,   143,   303,
+      48,   286,   304,    48,    48,     0,   157,   149,   150,   151,
+     155,   156,   152,   153,     0,   154,     0,     0,     0,     0,
+       0,     0,     0,   191,     0,   189,   192,     0,     0,    54,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,   145,   148,     0,     0,     0,     0,     0,     0,
+     128,   127,     0,   307,     0,     0,    52,    56,     0,    14,
+      37,    22,     0,   240,   245,     0,     0,     0,    48,     0,
+       0,     0,    22,    21,     0,   271,   279,   283,   289,     0,
+       0,   294,     0,    43,    39,    41,     0,     0,   144,   138,
+       0,   293,     0,   194,     0,     0,   305,    49,   200,     0,
+      63,     0,   181,   180,   179,   182,   177,   178,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,    64,    71,    74,     0,    76,    77,    80,
+      81,    82,    83,    84,    86,    88,     0,    94,   147,    93,
+     104,     0,   114,   118,   119,   120,   121,     0,   124,   125,
+      53,     0,   238,   241,   247,     0,   246,   249,     0,     0,
+     250,    20,    22,   264,    47,    46,   285,     0,     0,    45,
+     141,   142,     0,   301,   287,   207,   198,   197,     0,   188,
+       0,   170,   171,   183,   164,   165,   168,   169,   159,   160,
+       0,   161,   162,   163,   167,   166,   173,   172,   175,   176,
+     174,   184,     0,   190,    55,    90,   146,     0,   308,    22,
+     203,     0,   248,     0,   256,    42,    44,     0,   196,     0,
+     208,   186,   185,     0,   187,   109,    34,   204,    22,   195,
+     133,   158,   257,     0,     0,     0,   306,   134,     0,    48,
+      48,   202,   136,     0,   135,   201
 };
 
 /* YYDEFGOTO[NTERM-NUM]. */
 static const short int yydefgoto[] =
 {
-      -1,     1,     2,   161,   254,   335,    18,    19,    20,   235,
-     165,    21,   236,   468,   469,   470,   471,   454,   460,   336,
-      86,   158,   293,   159,   315,   445,   463,   477,    24,   258,
-     259,   260,    68,   304,   305,   286,   287,   288,    26,   263,
-     347,   348,   337,   447,    79,   267,    69,   187,    70,   237,
-      28,   238,   247,   325,    30,    31,   249,   330,    32,   179,
-      33,    34,   239,   240,   169,    37,   241,   268,   269,   270,
-     160,    71,   473,    40,    73,   317
+      -1,     1,     2,   170,   275,   190,   363,    40,    41,    42,
+     255,   174,    43,   256,   372,   373,   374,   375,   282,   356,
+      91,   167,   320,   168,   342,   207,   533,   537,   285,   286,
+     287,   175,   331,   332,   313,   314,   315,   317,   290,   383,
+     388,   294,   542,   543,   459,    47,   519,    78,   208,    48,
+      80,    49,   257,    51,   258,   268,   353,    53,    54,   270,
+     358,    55,   193,    56,    57,   259,   260,   179,    60,   261,
+      62,    63,    64,   276,    65,   195,    66,   209,   210,   292,
+     211,   169,   181,    68,    69,   182,   344
 };
 
 /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
    STATE-NUM.  */
-#define YYPACT_NINF -422
+#define YYPACT_NINF -267
 static const short int yypact[] =
 {
-    -422,    32,   758,  -422,   122,   675,  -101,   139,   194,    41,
-      67,   196,   194,   -43,   194,  -422,   860,  -422,  -422,  -422,
-    -422,  -422,  -422,    34,   -35,   -13,    -7,    11,   -18,  -422,
-      80,    22,  -422,    98,    39,  -422,  -422,    51,  -422,   100,
-     109,   111,  -422,  -422,  -422,  -422,  -422,  -422,   675,  -422,
-     200,  -422,  -422,  -422,   117,  -422,  -422,   117,   112,   117,
-      27,  -422,  -422,   202,   213,    27,  -422,  -422,  -422,  -422,
-    -422,  -422,   215,  -422,   257,  -422,  -422,  -422,  -422,   118,
-     675,   120,  -422,  -422,   119,   675,  -422,   -94,  -422,  -422,
-    -422,  -422,  -422,   125,   126,  -422,  -422,  -422,  -422,  -422,
-    -422,   127,  -422,  -422,   128,  -422,   129,   131,  -422,  -422,
-     132,   134,   135,   136,   138,  -422,   140,  -422,   141,  -422,
-     142,  -422,  -422,   143,  -422,  -422,  -422,  -422,  -422,  -422,
-    -422,  -422,  -422,   154,  -422,  -422,  -422,  -422,  -422,   156,
-    -422,  -422,  -422,  -422,  -422,   157,  -422,  -422,  -422,   158,
-     159,   160,  -422,   162,  -422,  -422,   163,   164,   -95,  -422,
-    -422,   594,   708,   311,   227,   165,  -422,  -422,  -422,  -422,
-    -422,  -422,  -422,  -422,  -422,  -422,   -42,  -422,   229,   166,
-    -422,  -422,  -422,  -422,  -422,   168,  -422,  -422,  -422,   675,
-    -422,  -422,   168,   -93,  -422,  -422,  -422,   169,   173,   215,
-     215,  -422,  -422,    46,   177,  -422,   215,   314,   243,   319,
-     321,   292,   314,   325,   331,   314,   332,   314,   314,   286,
-     314,   -58,   314,   314,   314,   675,   675,   233,   338,   675,
-     860,   195,  -422,   201,  -422,  -422,  -422,   203,  -422,  -422,
-    -422,  -422,  -422,  -422,  -422,  -422,  -422,    84,   219,   -52,
-     210,   198,  -422,  -422,   358,   209,   314,  -422,   208,   228,
-    -422,   206,  -422,   -36,   -22,    46,    46,  -422,  -422,  -422,
-     230,   -43,   -24,   216,  -422,  -422,  -422,  -422,  -422,   218,
-    -422,   314,   314,   314,   314,   511,    10,   -80,  -422,   220,
-     221,   222,  -422,   -62,   223,   224,   225,   226,   235,   244,
-     245,   247,   282,   365,   -61,  -422,    10,   249,   246,   -28,
-     537,   250,   251,  -422,  -422,   252,   248,   256,   259,  -422,
-     860,   368,  -422,  -422,   -14,  -422,  -422,   242,   675,   231,
-      92,   258,   313,   695,  -422,  -422,   675,   267,  -422,  -422,
-    -422,   215,   314,  -422,  -422,   675,   268,  -422,   270,  -422,
-    -422,   277,    46,   279,  -422,  -422,   675,  -422,  -422,  -422,
-    -422,   551,   287,   314,   314,   314,   314,   314,   314,   314,
-     314,   314,   314,  -422,  -422,  -422,  -422,   429,  -422,  -422,
-    -422,  -422,  -422,  -422,  -422,  -422,  -422,  -422,   289,   314,
-    -422,  -422,   314,  -422,  -422,  -422,  -422,  -422,   434,  -422,
-    -422,  -422,   293,  -422,  -422,    46,  -422,  -422,   298,  -422,
-    -422,  -422,   334,  -422,  -422,  -422,   303,  -422,  -422,  -422,
-    -422,   215,   306,  -422,   314,  -422,  -422,    74,    16,    49,
-      30,    30,   241,   241,  -422,  -422,  -422,  -422,   308,  -422,
-    -422,   307,  -422,   716,  -422,    46,  -422,   317,  -422,  -422,
-    -422,   314,  -422,   458,  -422,  -422,   310,  -422,    10,    86,
-     -88,  -422,   281,    42,  -422,   314,   320,   -27,   324,  -422,
-     336,  -422,   675,    46,   314,   343,  -422,  -422,    10,   314,
-    -422,   421,    46,   -17,   474,  -112,    10,  -422,   -11,   281,
-    -422,  -112,  -422,   281,  -422,   339,  -422,   341,  -422,  -422
+    -267,    42,  1020,  -267,  -267,  -267,  -267,  -267,    47,  -267,
+     -94,    86,  -267,   144,  -267,  -267,  -267,  -267,    40,   137,
+    -267,  -267,  -267,   150,    40,  -267,   -20,    40,   199,  -267,
+    -267,  -267,   161,    -7,   194,   199,  -267,  -267,  1869,  -267,
+    -267,  -267,  -267,  -267,  -267,  1631,   -14,     4,  -267,  -267,
+      10,    -6,  -267,    12,    21,    38,    43,    73,  -267,  -267,
+      59,  -267,    -3,    -3,    -3,    52,  1744,    55,    -3,    56,
+      63,  -267,  -267,   226,  -267,  -267,    65,  -267,    66,  -267,
+    -267,    70,  -267,  -267,  -267,  1744,  -267,  -267,    65,    69,
+    1674,  -267,  -110,  -108,  -267,  -267,  -267,  -267,  -267,  -267,
+    -267,    77,    78,  -267,  -267,  -267,  -267,  -267,  -267,    79,
+    -267,  -267,    81,  -267,    82,    83,  -267,  -267,    87,    89,
+      91,    93,    98,  -267,    99,  -267,   101,  -267,   110,  -267,
+    -267,   115,   116,  -267,  -267,  -267,  -267,  -267,  -267,  -267,
+    -267,  -267,   117,  -267,  -267,  -267,  -267,  -267,   118,  -267,
+    -267,  -267,  -267,  -267,   120,  -267,  -267,  -267,   129,   130,
+     131,  -267,   138,  -267,  -267,   139,   140,  -107,  -267,  -267,
+     925,   403,   233,   203,    95,  -267,  -267,  -267,  -267,  -267,
+      52,  -267,  -267,  -267,  -267,  -267,  -267,  -267,   -12,  -267,
+    -267,  -267,   208,   135,  -267,  -267,  -267,  -267,  -267,  -267,
+    -267,  -267,  -267,  -267,  -267,  -267,    52,    52,  -267,    84,
+     -42,  -267,    -3,  -267,  -267,  -267,  -267,   113,   212,  -267,
+     141,  -267,    52,   151,  -267,   212,   749,   749,   311,   313,
+     749,   749,   316,   317,   749,   318,   749,   749,   262,   749,
+     749,   -79,   749,   749,   749,  1744,  1744,    97,   323,  1744,
+    1869,   165,  -267,   158,  -267,  -267,  -267,   164,  -267,  -267,
+    -267,  -267,    38,  -267,  -267,  -267,  -267,  -267,  -114,   186,
+     -65,   166,   174,  -267,  -267,    13,    32,   167,  -267,   749,
+     789,  1095,  -267,  -267,  -267,   163,   201,  -267,   175,  -267,
+     -82,  -267,   202,    -7,   -46,   179,  -267,  -267,  -267,  -267,
+    -267,  -267,  -267,  -267,   181,  -267,   749,   749,   749,   749,
+     749,   749,   688,  1390,  -103,  -267,  1390,   185,   188,  -267,
+     -66,   190,   192,   193,   195,   196,   197,   198,  1229,   355,
+     200,   -64,  -267,  1390,   204,   224,   -63,  1272,   205,   206,
+    -267,  -267,   207,   213,   209,   211,  -267,  1869,   365,  -267,
+    -267,    38,   -22,  -267,  -267,   225,  1674,   214,   -38,   215,
+     297,   498,    38,  -267,  1674,  -267,  -267,  -267,  -267,   444,
+     216,   -59,   237,  -267,   239,  -267,  1674,    52,  -267,   212,
+     749,  -267,  1674,  -267,    52,   238,  -267,   241,  -267,   242,
+    -267,  1744,    25,    25,    25,    25,    25,    25,  1295,   243,
+     749,   749,   410,   749,   749,   749,   749,   749,   749,   749,
+     749,   749,   749,   749,   749,   749,   749,   749,   749,   749,
+     413,   749,   749,  -267,  -267,  -267,   409,  -267,  -267,  -267,
+    -267,  -267,  -267,  -267,  -267,  -267,   246,  -267,   749,  -267,
+    -267,   749,  -267,  -267,  -267,  -267,  -267,   414,  -267,  -267,
+    -267,   248,  -267,  -267,  -267,    52,  -267,  -267,  1674,   251,
+    -267,  -267,    38,  -267,  -267,  -267,  -267,  1138,    52,  -267,
+    -267,  -267,    52,   252,  -267,   212,  -267,  -267,   254,  -267,
+     749,   148,   148,  -267,   187,   187,    88,    88,  1497,  1420,
+    1340,  1443,  1466,   864,    88,    88,    61,    61,    25,    25,
+      25,  -267,  1318,  -267,  -267,  -267,  -267,   255,  -267,    38,
+    -267,    52,  -267,   593,  -267,  -267,  -267,  -102,  -267,   256,
+    -267,  -267,    25,   749,  -267,  -267,  -267,  -267,    38,  -267,
+    -267,  1390,  -267,    -8,   749,   275,  -267,  -267,   279,   -28,
+     -28,  -267,  -267,   260,  -267,  -267
 };
 
 /* YYPGOTO[NTERM-NUM].  */
 static const short int yypgoto[] =
 {
-    -422,  -422,  -422,   471,  -237,     7,  -422,  -422,   161,  -422,
-    -422,  -422,   492,  -369,  -422,  -422,    17,  -409,  -422,    -9,
-      -2,  -422,  -422,  -213,  -422,  -422,  -422,  -422,  -422,  -422,
-    -422,   167,     3,   274,  -370,  -187,  -422,  -197,  -422,   294,
-    -421,  -223,   170,  -422,    40,   -70,  -422,    25,    54,    44,
-    -422,   499,  -422,  -422,   480,  -422,  -422,  -422,  -422,  -422,
-     -15,  -422,   502,     4,  -422,  -422,   504,   255,  -253,  -422,
-     291,     5,    -4,  -422,     1,  -422
+    -267,  -267,  -267,   389,  -266,  -252,     7,  -267,  -267,    74,
+    -267,  -267,  -267,   433,  -267,  -267,  -267,   -31,  -267,   -27,
+      -2,  -267,  -267,  -235,  -267,  -267,  -267,  -267,  -267,  -267,
+      58,     2,   219,  -247,   -13,  -267,  -220,  -199,  -267,  -267,
+    -267,  -267,   -99,  -174,  -267,  -267,  -267,   112,  -193,  -267,
+     114,    90,    16,  -267,   436,  -267,  -267,   397,  -267,  -267,
+    -267,  -267,  -267,   -25,  -267,   442,     1,  -267,  -267,   443,
+    -267,  -267,   170,  -267,   -44,   -16,    53,  -194,  -267,   -17,
+     277,   217,     5,   -61,  -267,     0,  -267
 };
 
 /* YYTABLE[YYPACT[STATE-NUM]].  What to do in state STATE-NUM.  If
    positive, shift that token.  If negative, reduce the rule which
    number is the opposite.  If zero, do what YYDEFACT says.
    If YYTABLE_NINF, syntax error.  */
-#define YYTABLE_NINF -193
+#define YYTABLE_NINF -211
 static const short int yytable[] =
 {
-      23,    72,   197,    41,    85,    25,    36,    39,   168,    17,
-     264,   290,   350,   351,   295,   296,   333,   319,   299,   437,
-     301,   363,   364,   204,  -192,   308,   329,   363,   364,     7,
-     327,   302,     3,   306,    11,   343,   306,   310,   230,   137,
-      16,   363,   364,   141,   184,   465,    27,    74,   353,   195,
-     196,   248,    84,   372,    87,    47,   205,  -192,   231,   339,
-     363,   364,    11,     4,   492,   466,   152,   166,   474,   373,
-     496,   377,   389,    80,   490,    81,   200,     7,   264,   494,
-     475,   203,   188,   461,   190,   363,   364,   378,   390,   274,
-      54,   275,   276,   277,   357,   358,   359,   360,   361,   420,
-      16,    55,    56,    84,    87,   389,   -41,   401,    57,    16,
-      11,   343,   170,   163,   191,   344,    16,   164,   265,   194,
-     495,   393,   -41,   343,   497,    42,    43,   354,    16,   261,
-     262,   489,   174,    59,   171,   453,   273,   493,    62,   278,
-     172,   453,    75,    76,   365,   415,   366,   367,   368,   369,
-     370,   371,   441,   367,   368,   369,   370,   371,   173,    23,
-      23,   250,    41,    41,    25,    25,    39,    39,   234,   234,
-     370,   371,   176,   443,   178,   434,   425,   426,   427,   428,
-     429,   430,   431,   432,   433,   255,   265,   368,   369,   370,
-     371,   186,   456,   476,   266,   438,   279,    77,    78,    82,
-      83,   180,   306,   185,    78,   192,    78,   280,   365,   451,
-     366,   367,   368,   369,   370,   371,   193,    78,   195,   196,
-     483,   311,   312,   281,   282,   318,   283,   175,   284,   488,
-     244,   245,   251,   252,   285,   323,    16,   450,   324,   464,
-     328,   313,   314,   407,    16,   177,   274,   181,   275,   276,
-     277,   289,   363,   364,   345,    41,   182,    25,   183,    39,
-     189,   346,   328,   345,   458,   198,   306,   201,   199,   202,
-     346,   261,   359,   206,   207,   208,   209,   210,   478,   211,
-     212,   362,   213,   214,   215,    44,   216,   484,   217,   218,
-     219,   220,   486,   363,   364,   274,   278,   275,   276,   277,
-     294,    45,   221,    46,   222,   223,   224,   225,   226,    47,
-     227,   228,   229,    48,   243,   246,   253,   274,  -192,   275,
-     276,   277,   257,   256,   405,   271,    49,   291,   403,   292,
-      50,    51,   412,   297,    41,    52,    25,    53,    39,   298,
-     300,   405,   303,   316,    54,   278,   416,   320,   332,   321,
-     322,   448,   422,   279,   326,    55,    56,   331,   338,   340,
-     342,   341,    57,   352,   280,   355,   356,   278,   388,   374,
-     375,   376,   379,   380,   381,   382,   402,   404,   406,   392,
-     281,   282,    10,   283,   383,   284,    58,    59,    60,    61,
-       5,   285,    62,   384,   385,     6,   386,    63,   391,   395,
-     396,   397,   279,   398,    64,   399,    65,     8,   400,   409,
-       9,   467,    67,   280,   413,   417,   365,   418,   366,   367,
-     368,   369,   370,   371,   279,    44,   419,    10,   421,   281,
-     282,   387,   283,    16,   284,   280,   424,   435,   436,   439,
-     285,    45,   440,    46,    41,   442,    25,   444,    39,    47,
-     446,   281,   282,    48,   283,   449,   284,   452,   462,   453,
-     472,   274,   285,   275,   276,   277,    49,   457,   482,   481,
-      50,    51,   479,   480,    12,    52,   345,    53,   485,   472,
-      13,    14,   345,   346,    54,   363,   364,   472,   498,   346,
-     499,   472,   162,   410,    22,    55,    56,   309,   487,   272,
-     408,    29,    57,   167,    35,    15,    38,     0,   414,   334,
-      16,   278,   307,     0,   274,    44,   275,   276,   277,   349,
-       0,     0,     0,     0,     0,     0,    58,    59,    60,    61,
-       0,    45,    62,    46,     0,     0,     0,    63,     0,    47,
-       0,     0,     0,    48,    64,     0,    65,     0,   363,   364,
-       0,    66,    67,     0,     0,     0,    49,     0,     0,     0,
-      50,    51,   363,   364,   278,    52,     0,    53,   279,     0,
-       0,     0,     0,    16,    54,     0,     0,     0,     0,   280,
-       0,     0,     0,     0,     0,    55,    56,     0,     0,     0,
-       0,     0,    57,     0,     0,   281,   282,     0,   459,     0,
-     284,     0,     0,     0,   232,     0,   285,     0,   365,   491,
-     366,   367,   368,   369,   370,   371,    58,    59,    60,    61,
-       0,   279,    62,     4,     0,     0,     5,    63,     0,     0,
-       0,     6,   280,     0,    64,     0,    65,     7,     0,     0,
-       0,    66,    67,     8,     0,     0,     9,     0,   281,   282,
-       0,   283,     0,   284,     0,     0,     0,     0,     0,   285,
-       0,     0,     0,    10,   233,     0,     0,     0,     0,     0,
-      11,   365,     0,   366,   367,   368,   369,   370,   371,    44,
-       0,     0,     0,     0,     0,   365,   394,   366,   367,   368,
-     369,   370,   371,     0,     0,    45,     0,    46,     0,     0,
-     423,     0,     0,    47,     0,     0,     0,    48,     0,     0,
-      12,     0,     0,     0,     0,     0,    13,    14,     0,     0,
-      49,     0,     0,     0,    50,    51,     0,     5,     0,    52,
-       0,    53,     6,     0,     0,     0,     0,     4,    54,     0,
-       5,    15,     0,     0,     8,     6,    16,     9,     5,    55,
-      56,     7,     0,     6,     0,     0,    57,     8,     0,     0,
-       9,     0,     0,     0,    10,     8,     0,     0,     9,     0,
-       0,     0,     0,     0,     0,     0,     0,    10,   233,     0,
-      58,    59,    60,    61,    11,    10,    62,     4,     0,     0,
-       5,    63,     0,     0,     0,     6,     0,     0,    64,     0,
-      65,     7,     0,     0,     0,    66,    67,     8,     0,     0,
-       9,    12,     0,     0,     0,     0,     0,    13,    14,     0,
-       0,     0,     0,     0,    12,     0,     0,    10,     0,     0,
-      13,    14,    12,     0,    11,     0,     0,     0,    13,    14,
-       0,     0,    15,     0,     0,     0,   411,    16,     0,     0,
-       0,     0,     0,     0,     0,    15,     0,     0,     0,   242,
-      16,     0,     0,    15,     0,     0,     0,   455,    16,     0,
-       0,     0,     0,    88,    12,    89,    90,     0,    91,    92,
-      13,    14,     0,     0,    93,     0,    94,     0,     0,     0,
-       0,     0,     0,    95,    96,    97,    98,     0,    99,   100,
-     101,   102,   103,     0,   104,    15,   105,   106,   107,     0,
-      16,   108,     0,     0,     0,   109,     0,   110,   111,   112,
-     113,   114,   115,     0,   116,   117,   118,   119,   120,     0,
-       0,   121,     0,   122,     0,     0,     0,     0,   123,     0,
-     124,     0,     0,     0,   125,   126,   127,   128,   129,   130,
-     131,   132,   133,     0,   134,   135,   136,   137,   138,   139,
-     140,   141,   142,   143,   144,     0,     0,     0,     0,   145,
-       0,     0,   146,     0,   147,   148,     0,     0,   149,   150,
-     151,     0,     0,     0,   152,     0,   153,   154,   155,   156,
-       0,     0,   157
+      45,   180,    70,    59,    46,   212,    90,    67,   361,    39,
+     350,   322,   277,   278,   325,   346,   327,     4,    50,   330,
+     178,  -210,   335,   223,   220,   288,   534,   355,   291,    11,
+     146,   321,   295,   370,   150,   199,   200,     9,   535,   402,
+     250,     5,     3,     6,   422,   384,   222,   197,   198,     7,
+      71,    72,   214,     9,    38,   199,   200,    15,    10,   161,
+     351,   176,   251,  -210,    23,   224,    12,   201,   529,   423,
+      13,    14,     9,    15,    23,   402,    16,    73,    17,    20,
+     368,   426,   366,   438,   438,    18,    38,   201,   -40,    74,
+      75,    19,   381,   269,   202,    20,   357,    21,    22,   452,
+     400,   401,   402,    38,    24,   340,   427,   341,   439,   442,
+     463,    25,   450,   -40,   202,   196,   196,   196,    87,   385,
+     389,   196,    38,    31,    79,    94,   280,    25,   386,   281,
+      38,    26,    27,    28,    29,   203,   457,    30,    84,    31,
+      38,    86,   541,    32,    89,    81,    93,    76,    77,    33,
+      34,    85,    35,    82,    83,   203,   183,    36,    37,   204,
+     471,    38,   402,   271,    88,    77,   536,   186,    45,    45,
+      70,    70,    46,    46,   184,    67,    67,   254,   254,   204,
+     185,    38,   187,   469,   338,   339,   288,   362,   345,   205,
+     474,   506,   420,   421,   188,   513,   283,    92,    77,   400,
+     401,   402,   503,   206,   405,   406,   264,   265,   189,   205,
+     514,   272,   273,   191,   316,   199,   200,   316,   417,   418,
+     419,   507,   192,   206,   328,   213,   215,   333,   420,   421,
+     333,   337,   194,   216,   217,     7,   263,   377,  -210,   218,
+     219,   352,   221,   415,   416,   417,   418,   419,   225,   226,
+     227,   399,   228,   229,   230,   420,   421,   526,   231,   279,
+     232,   510,   233,   382,   234,   196,   316,   333,   266,   235,
+     236,    18,   237,   364,   516,    70,   532,    46,   291,   376,
+      67,   238,   520,    21,    22,   284,   239,   240,   241,   242,
+      24,   243,   387,   392,   393,   394,   395,   396,   397,   398,
+     244,   245,   246,   415,   416,   417,   418,   419,   274,   247,
+     248,   249,   455,   289,   538,   420,   421,   527,    27,   318,
+     180,   319,   293,    30,   323,   324,   326,   329,   343,   348,
+     478,   458,   468,   347,   349,   354,   359,   378,   472,   367,
+     413,   414,   415,   416,   417,   418,   419,   360,   379,   384,
+     380,   390,   391,   453,   420,   421,   395,   424,   436,   364,
+     425,    70,   428,    46,   429,   430,    67,   431,   432,   433,
+     434,   441,   437,   451,   454,    19,   440,   444,   445,   446,
+     447,   448,   473,   449,   456,   465,   467,   481,   482,   460,
+     484,   485,   486,   487,   488,   489,   490,   491,   492,   493,
+     494,   495,   496,   497,   498,   499,   500,     4,   502,   466,
+     475,   476,   477,   483,   511,   480,   501,   504,   505,   508,
+     509,   512,   518,   377,   539,   333,   521,   525,   540,   530,
+     545,     5,   171,     6,   461,    44,   515,   470,    52,     7,
+       8,   544,   177,     9,    58,    61,   365,   296,    10,   297,
+     298,   299,   300,   301,    11,   517,    12,   267,   334,     0,
+      13,    14,   336,    15,     0,   376,    16,   522,    17,     0,
+       0,     0,     0,     0,     0,    18,     0,     0,     0,     0,
+       0,    19,   253,     0,     0,    20,     0,    21,    22,    23,
+       0,     0,     0,     0,    24,     0,     0,     0,     0,     0,
+       0,     0,     4,     0,     0,   302,     0,     0,     0,     0,
+     531,   364,     0,    70,     0,    46,     0,    25,    67,     0,
+       0,    26,    27,    28,    29,     0,     5,    30,     6,    31,
+       0,     0,     0,    32,     7,     0,     0,     0,     9,    33,
+      34,   303,    35,    10,     0,     0,     0,    36,    37,     0,
+       0,    12,     0,     0,     0,    13,    14,     0,    15,     0,
+       0,    16,     0,    17,     0,     0,     0,   304,     0,     0,
+      18,    38,     0,     0,     0,     0,    19,   262,     0,   305,
+      20,     0,    21,    22,     0,     0,     0,     0,     0,    24,
+       0,     0,     0,     0,     0,     0,   306,     4,     0,   307,
+     308,   309,     0,     0,   310,   311,     0,     0,     0,     0,
+       0,     0,    25,   464,     0,   312,    26,    27,    28,    29,
+       0,     5,    30,     6,    31,     0,     0,     0,    32,     7,
+       0,     0,     0,     9,    33,    34,     0,    35,    10,     0,
+       0,     0,    36,    37,     0,     0,    12,     0,     0,     0,
+      13,    14,     0,    15,     0,     0,    16,     0,    17,     0,
+       0,     0,     0,     0,     0,    18,    38,     0,     0,     0,
+       0,    19,   462,     0,     0,    20,     0,    21,    22,     0,
+       0,     0,     0,     0,    24,     0,     0,     0,     0,     0,
+       0,   296,     4,   297,   298,   299,   300,   301,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,    25,     0,     0,
+       0,    26,    27,    28,    29,     0,     5,    30,     6,    31,
+       0,     0,     0,    32,     7,     0,     0,     0,     0,    33,
+      34,     0,    35,     0,     0,     0,     0,    36,    37,     0,
+       0,    12,     0,     0,     0,    13,    14,     0,     0,   302,
+       0,    16,   296,    17,   297,   298,   299,   300,   301,     0,
+      18,    38,     0,     0,     0,     0,     0,   528,     0,     0,
+       0,     0,    21,    22,     0,     0,     0,     0,     0,    24,
+       0,     0,     0,     0,     0,   303,     0,     0,     0,     0,
+       0,     0,   296,     0,   297,   298,   299,   300,   301,     0,
+       0,     0,     0,     0,     0,     0,    26,    27,    28,    29,
+     302,   304,    30,     0,     0,     0,     0,     0,    32,     0,
+       0,     0,     0,   305,     0,    34,     0,    35,     0,     0,
+       0,     0,    36,    37,     0,     0,     0,     0,     0,     0,
+     306,     0,     0,   307,   308,   309,   303,     0,   310,   311,
+     302,     0,     0,     0,     0,     0,     0,     0,     0,   312,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,   304,     0,     0,     0,   400,   401,   402,   403,
+     404,   405,   406,     0,   305,     0,   303,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,   306,     0,     0,   307,   308,   309,     0,     0,   310,
+     311,     0,   304,     0,     0,     0,     0,     0,     0,     0,
+     312,     0,     0,     0,   305,     0,     0,     0,     0,     4,
+       0,     0,     0,     0,     0,     0,   252,     0,     0,     0,
+       0,   306,     0,     0,   307,   308,   369,     0,     0,   310,
+     311,     0,     0,     5,     0,     6,     0,     0,     0,     0,
+     312,     7,     8,     0,     0,     9,     0,     0,     0,     0,
+      10,     0,     0,     0,     0,     0,    11,     0,    12,     0,
+       0,     0,    13,    14,     0,    15,     0,     0,    16,     0,
+      17,     0,     0,     0,     0,     0,     0,    18,     0,     0,
+       0,     0,     0,    19,   253,     0,     0,    20,     0,    21,
+      22,    23,     0,     0,     0,     0,    24,   413,   414,   415,
+     416,   417,   418,   419,     4,     0,     0,     0,     0,     0,
+       0,   420,   421,     0,     0,     0,     0,     0,     0,    25,
+       0,     0,     0,    26,    27,    28,    29,     0,     5,    30,
+       6,    31,     0,     0,     0,    32,     7,     8,     0,     0,
+       9,    33,    34,     0,    35,    10,     0,     0,     0,    36,
+      37,    11,     0,    12,     0,     0,     0,    13,    14,     0,
+      15,     0,     0,    16,     0,    17,     0,     0,     0,     0,
+       0,     0,    18,    38,     0,     0,     0,     0,    19,     4,
+       0,     0,    20,     0,    21,    22,    23,     0,     0,     0,
+       0,    24,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     5,     0,     6,     0,     0,     0,     0,
+       0,     7,     0,     0,    25,     9,     0,     0,    26,    27,
+      28,    29,     4,     0,    30,     0,    31,     0,    12,     0,
+      32,     0,    13,    14,     0,    15,    33,    34,    16,    35,
+      17,     0,     0,     0,    36,    37,     5,    18,     6,     0,
+       0,     0,     0,     0,     7,     0,     0,    20,     9,    21,
+      22,     0,     0,     0,     0,     0,    24,     0,    38,     0,
+       0,    12,     0,     0,     0,    13,    14,     0,    15,     0,
+       0,    16,     0,    17,     0,     0,     0,     0,     0,    25,
+      18,     0,     0,    26,    27,    28,    29,     0,     0,    30,
+      20,    31,    21,    22,     0,    32,     0,     0,     0,    24,
+       0,     0,    34,     0,    35,     0,     0,     0,     0,   371,
+      37,   400,   401,   402,   403,   404,   405,   406,   407,   408,
+       0,     0,    25,     0,     0,     0,    26,    27,    28,    29,
+       0,     0,    30,    38,    31,     0,     0,     0,    32,     0,
+       0,     0,     0,     0,     0,    34,     0,    35,     0,     0,
+       0,     0,    36,    37,   400,   401,   402,   403,   404,   405,
+     406,   407,   408,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,    38,   400,   401,   402,
+     403,   404,   405,   406,   407,   408,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+     400,   401,   402,   403,   404,   405,   406,   407,   408,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,   400,   401,   402,   403,   404,   405,   406,   407,
+     408,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,   409,     0,   410,
+     411,   412,   413,   414,   415,   416,   417,   418,   419,     0,
+       0,     0,     0,     0,     0,     0,   420,   421,     0,     0,
+       0,   435,   400,   401,   402,   403,   404,   405,   406,   407,
+     408,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+     409,     0,   410,   411,   412,   413,   414,   415,   416,   417,
+     418,   419,   400,   401,   402,   403,   404,   405,   406,   420,
+     421,     0,     0,   409,   443,   410,   411,   412,   413,   414,
+     415,   416,   417,   418,   419,   400,   401,   402,   403,   404,
+     405,   406,   420,   421,     0,     0,   409,   479,   410,   411,
+     412,   413,   414,   415,   416,   417,   418,   419,   400,   401,
+     402,   403,   404,   405,   406,   420,   421,   524,   409,   523,
+     410,   411,   412,   413,   414,   415,   416,   417,   418,   419,
+       0,     0,     0,     0,     0,     0,     0,   420,   421,   400,
+     401,   402,   403,   404,   405,   406,     0,   408,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,   409,     0,
+     410,   411,   412,   413,   414,   415,   416,   417,   418,   419,
+       0,     0,     0,     0,     0,     0,     0,   420,   421,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+     410,   411,   412,   413,   414,   415,   416,   417,   418,   419,
+       0,     0,     0,     0,     0,     0,     0,   420,   421,     0,
+       0,     0,     0,     0,   411,   412,   413,   414,   415,   416,
+     417,   418,   419,     0,     0,     0,     0,     0,     0,     0,
+     420,   421,     0,     0,     0,     0,     0,     0,   412,   413,
+     414,   415,   416,   417,   418,   419,     0,     0,     0,     0,
+       0,     0,     0,   420,   421,     4,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,   410,   411,   412,
+     413,   414,   415,   416,   417,   418,   419,     0,     0,     5,
+       0,     6,     0,     0,   420,   421,     0,     7,     8,     0,
+       0,     9,     0,     0,     0,     0,     0,     0,     4,     0,
+       0,     0,    11,     0,    12,     0,     0,     0,    13,    14,
+       0,    15,     0,     0,    16,     0,    17,     0,     0,     0,
+       0,     0,     5,    18,     6,     0,     0,     0,     0,     0,
+       7,     0,     0,    20,     9,    21,    22,    23,     0,     0,
+     172,     0,    24,     0,   173,     0,     0,    12,     0,     0,
+       0,    13,    14,     0,    15,     0,     0,    16,     0,    17,
+       0,     0,     0,     0,     0,    25,    18,     0,     4,    26,
+      27,    28,    29,     0,     0,    30,    20,    31,    21,    22,
+       0,    32,     0,     0,     0,    24,     0,     0,    34,     0,
+      35,     0,     5,     0,     6,    36,    37,     0,     0,     0,
+       7,     0,     0,     0,     0,     0,     0,     0,    25,     0,
+       0,     0,    26,    27,    28,    29,     0,    12,    30,     0,
+      31,    13,    14,     0,    32,     0,     0,    16,     0,    17,
+       0,    34,     0,    35,     0,     0,    18,     0,    36,    37,
+       0,     0,     0,     0,     0,     0,     0,     0,    21,    22,
+       0,     0,     0,     0,     0,    24,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,    26,    27,    28,    29,     0,     0,    30,     0,
+       0,     0,     0,     0,    32,     0,     0,     0,     0,     0,
+       0,    34,     0,    35,     0,     0,     0,     0,    36,    37,
+      95,     0,    96,    97,     0,    98,    99,     0,   100,     0,
+       0,   101,     0,   102,     0,     0,     0,     0,     0,     0,
+     103,   104,   105,   106,     0,   107,   108,   109,   110,   111,
+       0,   112,     0,   113,   114,   115,     0,     0,   116,     0,
+       0,     0,     0,   117,     0,   118,   119,   120,   121,   122,
+     123,     0,   124,   125,   126,   127,   128,     0,     0,   129,
+       0,     0,   130,     0,     0,     0,   131,   132,     0,   133,
+       0,     0,     0,   134,   135,   136,     0,   137,   138,   139,
+     140,   141,     0,   142,     0,   143,   144,   145,   146,   147,
+     148,   149,   150,     0,   151,   152,   153,     0,     0,     0,
+       0,   154,     0,     0,   155,     0,     0,   156,   157,     0,
+       0,   158,   159,   160,     0,     0,     0,   161,     0,   162,
+     163,   164,   165,     0,     0,   166
 };
 
 static const short int yycheck[] =
 {
-       2,     5,    72,     2,    13,     2,     2,     2,    23,     2,
-      32,   208,   265,   266,   211,   212,   253,   230,   215,   389,
-     217,    11,    12,   117,   117,   222,   249,    11,    12,    43,
-      82,   218,     0,   220,    76,   147,   223,   224,   133,    97,
-     152,    11,    12,   101,    48,   133,     2,   148,   271,     3,
-       4,    93,    12,   133,    14,    28,   150,   150,   153,   256,
-      11,    12,    76,    29,   485,   153,   124,    23,    26,   149,
-     491,   133,   133,    32,   483,     8,    80,    43,    32,   488,
-      38,    85,    57,   453,    59,    11,    12,   149,   149,     3,
-      63,     5,     6,     7,   281,   282,   283,   284,   285,   352,
-     152,    74,    75,    63,    64,   133,   133,   320,    81,   152,
-      76,   147,   147,    79,    60,   151,   152,    83,   140,    65,
-     489,   149,   149,   147,   493,     3,     4,   151,   152,   199,
-     200,   148,   150,   106,   147,   152,   206,   148,   111,    53,
-     147,   152,     3,     4,   134,   342,   136,   137,   138,   139,
-     140,   141,   405,   137,   138,   139,   140,   141,   147,   161,
-     162,   176,   161,   162,   161,   162,   161,   162,   161,   162,
-     140,   141,   150,   410,   135,   372,   363,   364,   365,   366,
-     367,   368,   369,   370,   371,   189,   140,   138,   139,   140,
-     141,    74,   445,   151,   148,   392,   110,     3,     4,     3,
-       4,   150,   389,     3,     4,     3,     4,   121,   134,   135,
-     136,   137,   138,   139,   140,   141,     3,     4,     3,     4,
-     473,   225,   226,   137,   138,   229,   140,   147,   142,   482,
-       3,     4,     3,     4,   148,   151,   152,   424,   247,   153,
-     249,     8,     9,   151,   152,   147,     3,   147,     5,     6,
-       7,     8,    11,    12,   263,   254,   147,   254,   147,   254,
-     148,   263,   271,   272,   451,     8,   453,   147,   150,   150,
-     272,   341,   459,   148,   148,   148,   148,   148,   465,   148,
-     148,   285,   148,   148,   148,     4,   148,   474,   148,   148,
-     148,   148,   479,    11,    12,     3,    53,     5,     6,     7,
-       8,    20,   148,    22,   148,   148,   148,   148,   148,    28,
-     148,   148,   148,    32,     3,   150,   150,     3,   150,     5,
-       6,     7,   149,   154,   328,   148,    45,     8,   324,     8,
-      49,    50,   336,     8,   333,    54,   333,    56,   333,     8,
-       8,   345,    56,     5,    63,    53,   345,   152,   150,   148,
-     147,   421,   356,   110,   135,    74,    75,   147,   149,   151,
-     154,   133,    81,   133,   121,   149,   148,    53,     3,   149,
-     149,   149,   149,   149,   149,   149,     8,   135,   147,   133,
-     137,   138,    69,   140,   149,   142,   105,   106,   107,   108,
-      32,   148,   111,   149,   149,    37,   149,   116,   149,   149,
-     149,   149,   110,   155,   123,   149,   125,    49,   149,   151,
-      52,   130,   131,   121,   147,   147,   134,   147,   136,   137,
-     138,   139,   140,   141,   110,     4,   149,    69,   149,   137,
-     138,   149,   140,   152,   142,   121,   149,     8,   149,     5,
-     148,    20,   149,    22,   443,   147,   443,   113,   443,    28,
-     147,   137,   138,    32,   140,   149,   142,   149,   148,   152,
-     462,     3,   148,     5,     6,     7,    45,   150,   472,   133,
-      49,    50,   152,   149,   116,    54,   485,    56,   135,   481,
-     122,   123,   491,   485,    63,    11,    12,   489,   149,   491,
-     149,   493,    21,   332,     2,    74,    75,   223,   481,   205,
-     330,     2,    81,    23,     2,   147,     2,    -1,   341,   151,
-     152,    53,   221,    -1,     3,     4,     5,     6,     7,   264,
-      -1,    -1,    -1,    -1,    -1,    -1,   105,   106,   107,   108,
-      -1,    20,   111,    22,    -1,    -1,    -1,   116,    -1,    28,
-      -1,    -1,    -1,    32,   123,    -1,   125,    -1,    11,    12,
-      -1,   130,   131,    -1,    -1,    -1,    45,    -1,    -1,    -1,
-      49,    50,    11,    12,    53,    54,    -1,    56,   110,    -1,
-      -1,    -1,    -1,   152,    63,    -1,    -1,    -1,    -1,   121,
-      -1,    -1,    -1,    -1,    -1,    74,    75,    -1,    -1,    -1,
-      -1,    -1,    81,    -1,    -1,   137,   138,    -1,   140,    -1,
-     142,    -1,    -1,    -1,    10,    -1,   148,    -1,   134,   135,
-     136,   137,   138,   139,   140,   141,   105,   106,   107,   108,
-      -1,   110,   111,    29,    -1,    -1,    32,   116,    -1,    -1,
-      -1,    37,   121,    -1,   123,    -1,   125,    43,    -1,    -1,
-      -1,   130,   131,    49,    -1,    -1,    52,    -1,   137,   138,
-      -1,   140,    -1,   142,    -1,    -1,    -1,    -1,    -1,   148,
-      -1,    -1,    -1,    69,    70,    -1,    -1,    -1,    -1,    -1,
-      76,   134,    -1,   136,   137,   138,   139,   140,   141,     4,
-      -1,    -1,    -1,    -1,    -1,   134,   149,   136,   137,   138,
-     139,   140,   141,    -1,    -1,    20,    -1,    22,    -1,    -1,
-     149,    -1,    -1,    28,    -1,    -1,    -1,    32,    -1,    -1,
-     116,    -1,    -1,    -1,    -1,    -1,   122,   123,    -1,    -1,
-      45,    -1,    -1,    -1,    49,    50,    -1,    32,    -1,    54,
-      -1,    56,    37,    -1,    -1,    -1,    -1,    29,    63,    -1,
-      32,   147,    -1,    -1,    49,    37,   152,    52,    32,    74,
-      75,    43,    -1,    37,    -1,    -1,    81,    49,    -1,    -1,
-      52,    -1,    -1,    -1,    69,    49,    -1,    -1,    52,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    69,    70,    -1,
-     105,   106,   107,   108,    76,    69,   111,    29,    -1,    -1,
-      32,   116,    -1,    -1,    -1,    37,    -1,    -1,   123,    -1,
-     125,    43,    -1,    -1,    -1,   130,   131,    49,    -1,    -1,
-      52,   116,    -1,    -1,    -1,    -1,    -1,   122,   123,    -1,
-      -1,    -1,    -1,    -1,   116,    -1,    -1,    69,    -1,    -1,
-     122,   123,   116,    -1,    76,    -1,    -1,    -1,   122,   123,
-      -1,    -1,   147,    -1,    -1,    -1,   151,   152,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,   147,    -1,    -1,    -1,   151,
-     152,    -1,    -1,   147,    -1,    -1,    -1,   151,   152,    -1,
-      -1,    -1,    -1,    13,   116,    15,    16,    -1,    18,    19,
-     122,   123,    -1,    -1,    24,    -1,    26,    -1,    -1,    -1,
-      -1,    -1,    -1,    33,    34,    35,    36,    -1,    38,    39,
-      40,    41,    42,    -1,    44,   147,    46,    47,    48,    -1,
-     152,    51,    -1,    -1,    -1,    55,    -1,    57,    58,    59,
-      60,    61,    62,    -1,    64,    65,    66,    67,    68,    -1,
-      -1,    71,    -1,    73,    -1,    -1,    -1,    -1,    78,    -1,
-      80,    -1,    -1,    -1,    84,    85,    86,    87,    88,    89,
-      90,    91,    92,    -1,    94,    95,    96,    97,    98,    99,
-     100,   101,   102,   103,   104,    -1,    -1,    -1,    -1,   109,
-      -1,    -1,   112,    -1,   114,   115,    -1,    -1,   118,   119,
-     120,    -1,    -1,    -1,   124,    -1,   126,   127,   128,   129,
-      -1,    -1,   132
+       2,    45,     2,     2,     2,    66,    33,     2,   274,     2,
+     262,   231,   206,   207,   234,   250,   236,     4,     2,   239,
+      45,   131,   242,   131,    85,   218,    34,    92,   222,    51,
+     109,   230,   225,   280,   113,     3,     4,    40,    46,    14,
+     147,    28,     0,    30,   147,   147,    90,    63,    64,    36,
+       3,     4,    68,    40,   168,     3,     4,    60,    45,   138,
+     174,    45,   169,   173,    86,   173,    53,    35,   170,   172,
+      57,    58,    40,    60,    86,    14,    63,   171,    65,    82,
+     279,   147,   276,   147,   147,    72,   168,    35,   147,     3,
+       4,    78,   174,   105,    62,    82,   270,    84,    85,   351,
+      12,    13,    14,   168,    91,     8,   172,    10,   172,   172,
+     362,   114,   347,   172,    62,    62,    63,    64,    28,   293,
+     294,    68,   168,   126,    84,    35,   168,   114,   174,   171,
+     168,   118,   119,   120,   121,   103,   174,   124,    24,   126,
+     168,    27,   170,   130,    32,     8,    34,     3,     4,   136,
+     137,   171,   139,     3,     4,   103,   170,   144,   145,   127,
+     380,   168,    14,   188,     3,     4,   174,   173,   170,   171,
+     170,   171,   170,   171,   170,   170,   171,   170,   171,   127,
+     170,   168,   170,   377,   245,   246,   379,   174,   249,   157,
+     384,   438,   167,   168,   173,   461,   212,     3,     4,    12,
+      13,    14,   422,   171,    17,    18,     3,     4,   170,   157,
+     462,     3,     4,   170,   227,     3,     4,   230,   157,   158,
+     159,   441,   149,   171,   237,   170,   170,   240,   167,   168,
+     243,   244,   173,   170,     8,    36,     3,   281,   173,   173,
+     170,   268,   173,   155,   156,   157,   158,   159,   171,   171,
+     171,   312,   171,   171,   171,   167,   168,   509,   171,   175,
+     171,   455,   171,   290,   171,   212,   279,   280,   173,   171,
+     171,    72,   171,   275,   468,   275,   528,   275,   472,   281,
+     275,   171,   475,    84,    85,   172,   171,   171,   171,   171,
+      91,   171,   294,   306,   307,   308,   309,   310,   311,   312,
+     171,   171,   171,   155,   156,   157,   158,   159,   173,   171,
+     171,   171,   356,   172,   534,   167,   168,   511,   119,     8,
+     364,     8,   171,   124,     8,     8,     8,    65,     5,   171,
+     391,   358,   376,   168,   170,   149,   170,   174,   382,   172,
+     153,   154,   155,   156,   157,   158,   159,   173,   147,   147,
+     175,   172,   171,   352,   167,   168,   369,   172,     3,   361,
+     172,   361,   172,   361,   172,   172,   361,   172,   172,   172,
+     172,   147,   172,     8,   149,    78,   172,   172,   172,   172,
+     167,   172,   382,   172,   170,   169,   147,   400,   401,   174,
+     403,   404,   405,   406,   407,   408,   409,   410,   411,   412,
+     413,   414,   415,   416,   417,   418,   419,     4,   421,   172,
+     172,   170,   170,     3,   458,   172,     3,     8,   172,     5,
+     172,   170,   170,   467,   149,   438,   172,   172,   149,   173,
+     170,    28,    43,    30,   360,     2,   467,   379,     2,    36,
+      37,   540,    45,    40,     2,     2,   276,     3,    45,     5,
+       6,     7,     8,     9,    51,   472,    53,   180,   241,    -1,
+      57,    58,   243,    60,    -1,   467,    63,   480,    65,    -1,
+      -1,    -1,    -1,    -1,    -1,    72,    -1,    -1,    -1,    -1,
+      -1,    78,    79,    -1,    -1,    82,    -1,    84,    85,    86,
+      -1,    -1,    -1,    -1,    91,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,     4,    -1,    -1,    61,    -1,    -1,    -1,    -1,
+     523,   513,    -1,   513,    -1,   513,    -1,   114,   513,    -1,
+      -1,   118,   119,   120,   121,    -1,    28,   124,    30,   126,
+      -1,    -1,    -1,   130,    36,    -1,    -1,    -1,    40,   136,
+     137,    97,   139,    45,    -1,    -1,    -1,   144,   145,    -1,
+      -1,    53,    -1,    -1,    -1,    57,    58,    -1,    60,    -1,
+      -1,    63,    -1,    65,    -1,    -1,    -1,   123,    -1,    -1,
+      72,   168,    -1,    -1,    -1,    -1,    78,   174,    -1,   135,
+      82,    -1,    84,    85,    -1,    -1,    -1,    -1,    -1,    91,
+      -1,    -1,    -1,    -1,    -1,    -1,   152,     4,    -1,   155,
+     156,   157,    -1,    -1,   160,   161,    -1,    -1,    -1,    -1,
+      -1,    -1,   114,   169,    -1,   171,   118,   119,   120,   121,
+      -1,    28,   124,    30,   126,    -1,    -1,    -1,   130,    36,
+      -1,    -1,    -1,    40,   136,   137,    -1,   139,    45,    -1,
+      -1,    -1,   144,   145,    -1,    -1,    53,    -1,    -1,    -1,
+      57,    58,    -1,    60,    -1,    -1,    63,    -1,    65,    -1,
+      -1,    -1,    -1,    -1,    -1,    72,   168,    -1,    -1,    -1,
+      -1,    78,   174,    -1,    -1,    82,    -1,    84,    85,    -1,
+      -1,    -1,    -1,    -1,    91,    -1,    -1,    -1,    -1,    -1,
+      -1,     3,     4,     5,     6,     7,     8,     9,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,   114,    -1,    -1,
+      -1,   118,   119,   120,   121,    -1,    28,   124,    30,   126,
+      -1,    -1,    -1,   130,    36,    -1,    -1,    -1,    -1,   136,
+     137,    -1,   139,    -1,    -1,    -1,    -1,   144,   145,    -1,
+      -1,    53,    -1,    -1,    -1,    57,    58,    -1,    -1,    61,
+      -1,    63,     3,    65,     5,     6,     7,     8,     9,    -1,
+      72,   168,    -1,    -1,    -1,    -1,    -1,   174,    -1,    -1,
+      -1,    -1,    84,    85,    -1,    -1,    -1,    -1,    -1,    91,
+      -1,    -1,    -1,    -1,    -1,    97,    -1,    -1,    -1,    -1,
+      -1,    -1,     3,    -1,     5,     6,     7,     8,     9,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,   118,   119,   120,   121,
+      61,   123,   124,    -1,    -1,    -1,    -1,    -1,   130,    -1,
+      -1,    -1,    -1,   135,    -1,   137,    -1,   139,    -1,    -1,
+      -1,    -1,   144,   145,    -1,    -1,    -1,    -1,    -1,    -1,
+     152,    -1,    -1,   155,   156,   157,    97,    -1,   160,   161,
+      61,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   171,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,   123,    -1,    -1,    -1,    12,    13,    14,    15,
+      16,    17,    18,    -1,   135,    -1,    97,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,   152,    -1,    -1,   155,   156,   157,    -1,    -1,   160,
+     161,    -1,   123,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+     171,    -1,    -1,    -1,   135,    -1,    -1,    -1,    -1,     4,
+      -1,    -1,    -1,    -1,    -1,    -1,    11,    -1,    -1,    -1,
+      -1,   152,    -1,    -1,   155,   156,   157,    -1,    -1,   160,
+     161,    -1,    -1,    28,    -1,    30,    -1,    -1,    -1,    -1,
+     171,    36,    37,    -1,    -1,    40,    -1,    -1,    -1,    -1,
+      45,    -1,    -1,    -1,    -1,    -1,    51,    -1,    53,    -1,
+      -1,    -1,    57,    58,    -1,    60,    -1,    -1,    63,    -1,
+      65,    -1,    -1,    -1,    -1,    -1,    -1,    72,    -1,    -1,
+      -1,    -1,    -1,    78,    79,    -1,    -1,    82,    -1,    84,
+      85,    86,    -1,    -1,    -1,    -1,    91,   153,   154,   155,
+     156,   157,   158,   159,     4,    -1,    -1,    -1,    -1,    -1,
+      -1,   167,   168,    -1,    -1,    -1,    -1,    -1,    -1,   114,
+      -1,    -1,    -1,   118,   119,   120,   121,    -1,    28,   124,
+      30,   126,    -1,    -1,    -1,   130,    36,    37,    -1,    -1,
+      40,   136,   137,    -1,   139,    45,    -1,    -1,    -1,   144,
+     145,    51,    -1,    53,    -1,    -1,    -1,    57,    58,    -1,
+      60,    -1,    -1,    63,    -1,    65,    -1,    -1,    -1,    -1,
+      -1,    -1,    72,   168,    -1,    -1,    -1,    -1,    78,     4,
+      -1,    -1,    82,    -1,    84,    85,    86,    -1,    -1,    -1,
+      -1,    91,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    28,    -1,    30,    -1,    -1,    -1,    -1,
+      -1,    36,    -1,    -1,   114,    40,    -1,    -1,   118,   119,
+     120,   121,     4,    -1,   124,    -1,   126,    -1,    53,    -1,
+     130,    -1,    57,    58,    -1,    60,   136,   137,    63,   139,
+      65,    -1,    -1,    -1,   144,   145,    28,    72,    30,    -1,
+      -1,    -1,    -1,    -1,    36,    -1,    -1,    82,    40,    84,
+      85,    -1,    -1,    -1,    -1,    -1,    91,    -1,   168,    -1,
+      -1,    53,    -1,    -1,    -1,    57,    58,    -1,    60,    -1,
+      -1,    63,    -1,    65,    -1,    -1,    -1,    -1,    -1,   114,
+      72,    -1,    -1,   118,   119,   120,   121,    -1,    -1,   124,
+      82,   126,    84,    85,    -1,   130,    -1,    -1,    -1,    91,
+      -1,    -1,   137,    -1,   139,    -1,    -1,    -1,    -1,   144,
+     145,    12,    13,    14,    15,    16,    17,    18,    19,    20,
+      -1,    -1,   114,    -1,    -1,    -1,   118,   119,   120,   121,
+      -1,    -1,   124,   168,   126,    -1,    -1,    -1,   130,    -1,
+      -1,    -1,    -1,    -1,    -1,   137,    -1,   139,    -1,    -1,
+      -1,    -1,   144,   145,    12,    13,    14,    15,    16,    17,
+      18,    19,    20,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,   168,    12,    13,    14,
+      15,    16,    17,    18,    19,    20,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      12,    13,    14,    15,    16,    17,    18,    19,    20,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    12,    13,    14,    15,    16,    17,    18,    19,
+      20,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,   148,    -1,   150,
+     151,   152,   153,   154,   155,   156,   157,   158,   159,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,   167,   168,    -1,    -1,
+      -1,   172,    12,    13,    14,    15,    16,    17,    18,    19,
+      20,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+     148,    -1,   150,   151,   152,   153,   154,   155,   156,   157,
+     158,   159,    12,    13,    14,    15,    16,    17,    18,   167,
+     168,    -1,    -1,   148,   172,   150,   151,   152,   153,   154,
+     155,   156,   157,   158,   159,    12,    13,    14,    15,    16,
+      17,    18,   167,   168,    -1,    -1,   148,   172,   150,   151,
+     152,   153,   154,   155,   156,   157,   158,   159,    12,    13,
+      14,    15,    16,    17,    18,   167,   168,   169,   148,   149,
+     150,   151,   152,   153,   154,   155,   156,   157,   158,   159,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,   167,   168,    12,
+      13,    14,    15,    16,    17,    18,    -1,    20,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   148,    -1,
+     150,   151,   152,   153,   154,   155,   156,   157,   158,   159,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,   167,   168,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+     150,   151,   152,   153,   154,   155,   156,   157,   158,   159,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,   167,   168,    -1,
+      -1,    -1,    -1,    -1,   151,   152,   153,   154,   155,   156,
+     157,   158,   159,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+     167,   168,    -1,    -1,    -1,    -1,    -1,    -1,   152,   153,
+     154,   155,   156,   157,   158,   159,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,   167,   168,     4,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,   150,   151,   152,
+     153,   154,   155,   156,   157,   158,   159,    -1,    -1,    28,
+      -1,    30,    -1,    -1,   167,   168,    -1,    36,    37,    -1,
+      -1,    40,    -1,    -1,    -1,    -1,    -1,    -1,     4,    -1,
+      -1,    -1,    51,    -1,    53,    -1,    -1,    -1,    57,    58,
+      -1,    60,    -1,    -1,    63,    -1,    65,    -1,    -1,    -1,
+      -1,    -1,    28,    72,    30,    -1,    -1,    -1,    -1,    -1,
+      36,    -1,    -1,    82,    40,    84,    85,    86,    -1,    -1,
+      89,    -1,    91,    -1,    93,    -1,    -1,    53,    -1,    -1,
+      -1,    57,    58,    -1,    60,    -1,    -1,    63,    -1,    65,
+      -1,    -1,    -1,    -1,    -1,   114,    72,    -1,     4,   118,
+     119,   120,   121,    -1,    -1,   124,    82,   126,    84,    85,
+      -1,   130,    -1,    -1,    -1,    91,    -1,    -1,   137,    -1,
+     139,    -1,    28,    -1,    30,   144,   145,    -1,    -1,    -1,
+      36,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   114,    -1,
+      -1,    -1,   118,   119,   120,   121,    -1,    53,   124,    -1,
+     126,    57,    58,    -1,   130,    -1,    -1,    63,    -1,    65,
+      -1,   137,    -1,   139,    -1,    -1,    72,    -1,   144,   145,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    84,    85,
+      -1,    -1,    -1,    -1,    -1,    91,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,   118,   119,   120,   121,    -1,    -1,   124,    -1,
+      -1,    -1,    -1,    -1,   130,    -1,    -1,    -1,    -1,    -1,
+      -1,   137,    -1,   139,    -1,    -1,    -1,    -1,   144,   145,
+      21,    -1,    23,    24,    -1,    26,    27,    -1,    29,    -1,
+      -1,    32,    -1,    34,    -1,    -1,    -1,    -1,    -1,    -1,
+      41,    42,    43,    44,    -1,    46,    47,    48,    49,    50,
+      -1,    52,    -1,    54,    55,    56,    -1,    -1,    59,    -1,
+      -1,    -1,    -1,    64,    -1,    66,    67,    68,    69,    70,
+      71,    -1,    73,    74,    75,    76,    77,    -1,    -1,    80,
+      -1,    -1,    83,    -1,    -1,    -1,    87,    88,    -1,    90,
+      -1,    -1,    -1,    94,    95,    96,    -1,    98,    99,   100,
+     101,   102,    -1,   104,    -1,   106,   107,   108,   109,   110,
+     111,   112,   113,    -1,   115,   116,   117,    -1,    -1,    -1,
+      -1,   122,    -1,    -1,   125,    -1,    -1,   128,   129,    -1,
+      -1,   132,   133,   134,    -1,    -1,    -1,   138,    -1,   140,
+     141,   142,   143,    -1,    -1,   146
 };
 
 /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
    symbol of state STATE-NUM.  */
-static const unsigned char yystos[] =
+static const unsigned short int yystos[] =
 {
-       0,   157,   158,     0,    29,    32,    37,    43,    49,    52,
-      69,    76,   116,   122,   123,   147,   152,   161,   162,   163,
-     164,   167,   168,   176,   184,   188,   194,   205,   206,   207,
-     210,   211,   214,   216,   217,   218,   219,   221,   222,   227,
-     229,   230,     3,     4,     4,    20,    22,    28,    32,    45,
-      49,    50,    54,    56,    63,    74,    75,    81,   105,   106,
-     107,   108,   111,   116,   123,   125,   130,   131,   188,   202,
-     204,   227,   228,   230,   148,     3,     4,     3,     4,   200,
-      32,     8,     3,     4,   200,   175,   176,   200,    13,    15,
-      16,    18,    19,    24,    26,    33,    34,    35,    36,    38,
-      39,    40,    41,    42,    44,    46,    47,    48,    51,    55,
-      57,    58,    59,    60,    61,    62,    64,    65,    66,    67,
-      68,    71,    73,    78,    80,    84,    85,    86,    87,    88,
-      89,    90,    91,    92,    94,    95,    96,    97,    98,    99,
-     100,   101,   102,   103,   104,   109,   112,   114,   115,   118,
-     119,   120,   124,   126,   127,   128,   129,   132,   177,   179,
-     226,   159,   159,    79,    83,   166,   205,   210,   216,   220,
-     147,   147,   147,   147,   150,   147,   150,   147,   135,   215,
-     150,   147,   147,   147,   228,     3,    74,   203,   203,   148,
-     203,   204,     3,     3,   204,     3,     4,   201,     8,   150,
-     228,   147,   150,   228,   117,   150,   148,   148,   148,   148,
-     148,   148,   148,   148,   148,   148,   148,   148,   148,   148,
-     148,   148,   148,   148,   148,   148,   148,   148,   148,   148,
-     133,   153,    10,    70,   161,   165,   168,   205,   207,   218,
-     219,   222,   151,     3,     3,     4,   150,   208,    93,   212,
-     216,     3,     4,   150,   160,   228,   154,   149,   185,   186,
-     187,   201,   201,   195,    32,   140,   148,   201,   223,   224,
-     225,   148,   195,   201,     3,     5,     6,     7,    53,   110,
-     121,   137,   138,   140,   142,   148,   191,   192,   193,     8,
-     193,     8,     8,   178,     8,   193,   193,     8,     8,   193,
-       8,   193,   191,    56,   189,   190,   191,   226,   193,   189,
-     191,   228,   228,     8,     9,   180,     5,   231,   228,   179,
-     152,   148,   147,   151,   175,   209,   135,    82,   175,   197,
-     213,   147,   150,   160,   151,   161,   175,   198,   149,   193,
-     151,   133,   154,   147,   151,   175,   176,   196,   197,   223,
-     224,   224,   133,   197,   151,   149,   148,   191,   191,   191,
-     191,   191,   228,    11,    12,   134,   136,   137,   138,   139,
-     140,   141,   133,   149,   149,   149,   149,   133,   149,   149,
-     149,   149,   149,   149,   149,   149,   149,   149,     3,   133,
-     149,   149,   133,   149,   149,   149,   149,   149,   155,   149,
-     149,   179,     8,   219,   135,   228,   147,   151,   198,   151,
-     164,   151,   228,   147,   187,   193,   230,   147,   147,   149,
-     224,   149,   228,   149,   149,   191,   191,   191,   191,   191,
-     191,   191,   191,   191,   193,     8,   149,   190,   193,     5,
-     149,   224,   147,   160,   113,   181,   147,   199,   201,   149,
-     191,   135,   149,   152,   173,   151,   224,   150,   191,   140,
-     174,   190,   148,   182,   153,   133,   153,   130,   169,   170,
-     171,   172,   176,   228,    26,    38,   151,   183,   191,   152,
-     149,   133,   228,   224,   191,   135,   191,   172,   224,   148,
-     173,   135,   196,   148,   173,   169,   196,   169,   149,   149
+       0,   177,   178,     0,     4,    28,    30,    36,    37,    40,
+      45,    51,    53,    57,    58,    60,    63,    65,    72,    78,
+      82,    84,    85,    86,    91,   114,   118,   119,   120,   121,
+     124,   126,   130,   136,   137,   139,   144,   145,   168,   182,
+     183,   184,   185,   188,   189,   196,   207,   221,   225,   227,
+     228,   229,   230,   233,   234,   237,   239,   240,   241,   242,
+     244,   245,   246,   247,   248,   250,   252,   258,   259,   260,
+     261,     3,     4,   171,     3,     4,     3,     4,   223,    84,
+     226,     8,     3,     4,   226,   171,   226,   227,     3,   223,
+     195,   196,     3,   223,   227,    21,    23,    24,    26,    27,
+      29,    32,    34,    41,    42,    43,    44,    46,    47,    48,
+      49,    50,    52,    54,    55,    56,    59,    64,    66,    67,
+      68,    69,    70,    71,    73,    74,    75,    76,    77,    80,
+      83,    87,    88,    90,    94,    95,    96,    98,    99,   100,
+     101,   102,   104,   106,   107,   108,   109,   110,   111,   112,
+     113,   115,   116,   117,   122,   125,   128,   129,   132,   133,
+     134,   138,   140,   141,   142,   143,   146,   197,   199,   257,
+     179,   179,    89,    93,   187,   207,   228,   233,   239,   243,
+     250,   258,   261,   170,   170,   170,   173,   170,   173,   170,
+     181,   170,   149,   238,   173,   251,   252,   251,   251,     3,
+       4,    35,    62,   103,   127,   157,   171,   201,   224,   253,
+     254,   256,   259,   170,   251,   170,   170,     8,   173,   170,
+     259,   173,   250,   131,   173,   171,   171,   171,   171,   171,
+     171,   171,   171,   171,   171,   171,   171,   171,   171,   171,
+     171,   171,   171,   171,   171,   171,   171,   171,   171,   171,
+     147,   169,    11,    79,   182,   186,   189,   228,   230,   241,
+     242,   245,   174,     3,     3,     4,   173,   256,   231,   105,
+     235,   239,     3,     4,   173,   180,   249,   253,   253,   175,
+     168,   171,   194,   251,   172,   204,   205,   206,   224,   172,
+     214,   253,   255,   171,   217,   224,     3,     5,     6,     7,
+       8,     9,    61,    97,   123,   135,   152,   155,   156,   157,
+     160,   161,   171,   210,   211,   212,   210,   213,     8,     8,
+     198,   213,   212,     8,     8,   212,     8,   212,   210,    65,
+     212,   208,   209,   210,   257,   212,   208,   210,   259,   259,
+       8,    10,   200,     5,   262,   259,   199,   168,   171,   170,
+     181,   174,   195,   232,   149,    92,   195,   219,   236,   170,
+     173,   180,   174,   182,   196,   248,   253,   172,   213,   157,
+     209,   144,   190,   191,   192,   193,   196,   250,   174,   147,
+     175,   174,   195,   215,   147,   219,   174,   196,   216,   219,
+     172,   171,   210,   210,   210,   210,   210,   210,   210,   259,
+      12,    13,    14,    15,    16,    17,    18,    19,    20,   148,
+     150,   151,   152,   153,   154,   155,   156,   157,   158,   159,
+     167,   168,   147,   172,   172,   172,   147,   172,   172,   172,
+     172,   172,   172,   172,   172,   172,     3,   172,   147,   172,
+     172,   147,   172,   172,   172,   172,   172,   167,   172,   172,
+     199,     8,   181,   242,   149,   250,   170,   174,   195,   220,
+     174,   185,   174,   181,   169,   169,   172,   147,   250,   253,
+     206,   212,   250,   261,   253,   172,   170,   170,   259,   172,
+     172,   210,   210,     3,   210,   210,   210,   210,   210,   210,
+     210,   210,   210,   210,   210,   210,   210,   210,   210,   210,
+     210,     3,   210,   212,     8,   172,   209,   212,     5,   172,
+     253,   250,   170,   180,   181,   193,   253,   255,   170,   222,
+     224,   172,   210,   149,   169,   172,   181,   253,   174,   170,
+     173,   210,   181,   202,    34,    46,   174,   203,   212,   149,
+     149,   170,   218,   219,   218,   170
 };
 
 #define yyerrok                (yyerrstatus = 0)
@@ -2121,42 +2450,42 @@ yyreduce:
   switch (yyn)
     {
         case 2:
-#line 286 "parser.y"
+#line 349 "parser.y"
     { fix_incomplete();
-                                                 check_all_user_types((yyvsp[0].ifref_list));
-                                                 write_proxies((yyvsp[0].ifref_list));
-                                                 write_client((yyvsp[0].ifref_list));
-                                                 write_server((yyvsp[0].ifref_list));
-                                                 write_dlldata((yyvsp[0].ifref_list));
+                                                 check_all_user_types((yyvsp[0].stmt_list));
+                                                 write_proxies((yyvsp[0].stmt_list));
+                                                 write_client((yyvsp[0].stmt_list));
+                                                 write_server((yyvsp[0].stmt_list));
+                                                 write_dlldata((yyvsp[0].stmt_list));
                                                ;}
     break;
 
   case 3:
-#line 295 "parser.y"
-    { (yyval.ifref_list) = NULL; ;}
+#line 358 "parser.y"
+    { (yyval.stmt_list) = NULL; ;}
     break;
 
   case 4:
-#line 296 "parser.y"
-    { (yyval.ifref_list) = (yyvsp[-1].ifref_list); ;}
+#line 359 "parser.y"
+    { (yyval.stmt_list) = (yyvsp[-1].stmt_list); ;}
     break;
 
   case 5:
-#line 297 "parser.y"
-    { (yyval.ifref_list) = append_ifref( (yyvsp[-1].ifref_list), make_ifref((yyvsp[0].type)) ); ;}
+#line 360 "parser.y"
+    { (yyval.stmt_list) = append_statement((yyvsp[-1].stmt_list), make_statement_type_decl((yyvsp[0].type))); ;}
     break;
 
   case 6:
-#line 298 "parser.y"
-    { (yyval.ifref_list) = (yyvsp[-2].ifref_list);
+#line 361 "parser.y"
+    { (yyval.stmt_list) = (yyvsp[-2].stmt_list);
                                                  reg_type((yyvsp[-1].type), (yyvsp[-1].type)->name, 0);
                                                  if (!parse_only && do_header) write_coclass_forward((yyvsp[-1].type));
                                                ;}
     break;
 
   case 7:
-#line 302 "parser.y"
-    { (yyval.ifref_list) = (yyvsp[-1].ifref_list);
+#line 365 "parser.y"
+    { (yyval.stmt_list) = append_statement((yyvsp[-1].stmt_list), make_statement_type_decl((yyvsp[0].type)));
                                                  add_typelib_entry((yyvsp[0].type));
                                                  reg_type((yyvsp[0].type), (yyvsp[0].type)->name, 0);
                                                  if (!parse_only && do_header) write_coclass_forward((yyvsp[0].type));
@@ -2164,721 +2493,705 @@ yyreduce:
     break;
 
   case 8:
-#line 307 "parser.y"
-    { (yyval.ifref_list) = (yyvsp[-1].ifref_list); add_typelib_entry((yyvsp[0].type)); ;}
+#line 370 "parser.y"
+    { (yyval.stmt_list) = append_statement((yyvsp[-1].stmt_list), make_statement_module((yyvsp[0].type)));
+                                                 add_typelib_entry((yyvsp[0].type));
+                                               ;}
     break;
 
   case 9:
-#line 308 "parser.y"
-    { (yyval.ifref_list) = (yyvsp[-1].ifref_list); ;}
+#line 373 "parser.y"
+    { (yyval.stmt_list) = append_statement((yyvsp[-1].stmt_list), make_statement_library((yyvsp[0].typelib))); ;}
     break;
 
   case 10:
-#line 309 "parser.y"
-    { (yyval.ifref_list) = (yyvsp[-1].ifref_list); ;}
+#line 374 "parser.y"
+    { (yyval.stmt_list) = append_statement((yyvsp[-1].stmt_list), (yyvsp[0].statement)); ;}
     break;
 
   case 11:
-#line 312 "parser.y"
-    {;}
+#line 377 "parser.y"
+    { (yyval.stmt_list) = NULL; ;}
     break;
 
   case 12:
-#line 313 "parser.y"
-    { if (!parse_only) add_typelib_entry((yyvsp[0].type)); ;}
+#line 378 "parser.y"
+    { (yyval.stmt_list) = append_statement((yyvsp[-1].stmt_list), make_statement_reference((yyvsp[0].type))); if (!parse_only) add_typelib_entry((yyvsp[0].type)); ;}
     break;
 
   case 13:
-#line 314 "parser.y"
-    { if (!parse_only) add_typelib_entry((yyvsp[0].type)); ;}
+#line 379 "parser.y"
+    { (yyval.stmt_list) = append_statement((yyvsp[-1].stmt_list), make_statement_type_decl((yyvsp[0].type))); if (!parse_only) add_typelib_entry((yyvsp[0].type)); ;}
     break;
 
   case 14:
-#line 315 "parser.y"
-    { reg_type((yyvsp[-1].type), (yyvsp[-1].type)->name, 0); if (!parse_only && do_header) write_coclass_forward((yyvsp[-1].type)); ;}
+#line 380 "parser.y"
+    { (yyval.stmt_list) = (yyvsp[-2].stmt_list); reg_type((yyvsp[-1].type), (yyvsp[-1].type)->name, 0); if (!parse_only && do_header) write_coclass_forward((yyvsp[-1].type)); ;}
     break;
 
   case 15:
-#line 316 "parser.y"
-    { if (!parse_only) add_typelib_entry((yyvsp[0].type));
+#line 381 "parser.y"
+    { (yyval.stmt_list) = append_statement((yyvsp[-1].stmt_list), make_statement_type_decl((yyvsp[0].type)));
+                                                 if (!parse_only) add_typelib_entry((yyvsp[0].type));
                                                  reg_type((yyvsp[0].type), (yyvsp[0].type)->name, 0);
                                                  if (!parse_only && do_header) write_coclass_forward((yyvsp[0].type));
                                                ;}
     break;
 
   case 16:
-#line 320 "parser.y"
-    { if (!parse_only) add_typelib_entry((yyvsp[0].type)); ;}
+#line 386 "parser.y"
+    { (yyval.stmt_list) = append_statement((yyvsp[-1].stmt_list), make_statement_module((yyvsp[0].type))); if (!parse_only) add_typelib_entry((yyvsp[0].type)); ;}
     break;
 
   case 17:
-#line 321 "parser.y"
-    {;}
+#line 387 "parser.y"
+    { (yyval.stmt_list) = append_statement((yyvsp[-1].stmt_list), (yyvsp[0].statement)); ;}
     break;
 
   case 18:
-#line 322 "parser.y"
-    {;}
+#line 388 "parser.y"
+    { (yyval.stmt_list) = append_statement((yyvsp[-1].stmt_list), make_statement_importlib((yyvsp[0].str))); ;}
     break;
 
   case 19:
-#line 323 "parser.y"
-    {;}
+#line 389 "parser.y"
+    { (yyval.stmt_list) = append_statement((yyvsp[-1].stmt_list), make_statement_library((yyvsp[0].typelib))); ;}
     break;
 
   case 20:
-#line 326 "parser.y"
+#line 392 "parser.y"
     { (yyval.func_list) = NULL; ;}
     break;
 
   case 21:
-#line 327 "parser.y"
-    { (yyval.func_list) = append_func( (yyvsp[-2].func_list), (yyvsp[-1].func) ); ;}
-    break;
-
-  case 22:
-#line 328 "parser.y"
-    { (yyval.func_list) = (yyvsp[-1].func_list); ;}
-    break;
-
-  case 23:
-#line 331 "parser.y"
-    {;}
+#line 393 "parser.y"
+    { (yyval.func_list) = append_func_from_statement( (yyvsp[-1].func_list), (yyvsp[0].statement) ); ;}
     break;
 
   case 24:
-#line 332 "parser.y"
-    { if (!parse_only && do_header) { write_constdef((yyvsp[-1].var)); } ;}
+#line 401 "parser.y"
+    { (yyval.statement) = make_statement_cppquote((yyvsp[0].str)); ;}
     break;
 
   case 25:
-#line 333 "parser.y"
-    {;}
-    break;
-
-  case 26:
-#line 334 "parser.y"
-    { if (!parse_only && do_header) {
+#line 402 "parser.y"
+    { (yyval.statement) = make_statement_type_decl((yyvsp[-1].type));
+                                                 if (!parse_only && do_header) {
                                                    write_type_def_or_decl(header, (yyvsp[-1].type), FALSE, NULL);
                                                    fprintf(header, ";\n\n");
                                                  }
                                                ;}
     break;
 
-  case 27:
-#line 339 "parser.y"
-    { if (!parse_only && do_header) { write_externdef((yyvsp[-1].var)); } ;}
+  case 26:
+#line 408 "parser.y"
+    { (yyval.statement) = make_statement_declaration((yyvsp[-1].var));
+                                                 if (!parse_only && do_header) write_declaration((yyvsp[-1].var), is_in_interface);
+                                               ;}
     break;
 
-  case 28:
-#line 340 "parser.y"
-    {;}
+  case 27:
+#line 411 "parser.y"
+    { (yyval.statement) = make_statement_import((yyvsp[0].str)); ;}
     break;
 
-  case 29:
-#line 341 "parser.y"
-    { if (!parse_only && do_header) {
+  case 28:
+#line 412 "parser.y"
+    { (yyval.statement) = make_statement_type_decl((yyvsp[-1].type));
+                                                 if (!parse_only && do_header) {
                                                    write_type_def_or_decl(header, (yyvsp[-1].type), FALSE, NULL);
                                                    fprintf(header, ";\n\n");
                                                  }
                                                ;}
     break;
 
-  case 30:
-#line 346 "parser.y"
-    {;}
+  case 29:
+#line 418 "parser.y"
+    { (yyval.statement) = (yyvsp[-1].statement); ;}
     break;
 
-  case 31:
-#line 347 "parser.y"
-    { if (!parse_only && do_header) {
+  case 30:
+#line 419 "parser.y"
+    { (yyval.statement) = make_statement_type_decl((yyvsp[-1].type));
+                                                 if (!parse_only && do_header) {
                                                    write_type_def_or_decl(header, (yyvsp[-1].type), FALSE, NULL);
                                                    fprintf(header, ";\n\n");
                                                  }
                                                ;}
     break;
 
+  case 31:
+#line 427 "parser.y"
+    { (yyval.str) = (yyvsp[-1].str); if (!parse_only && do_header) fprintf(header, "%s\n", (yyvsp[-1].str)); ;}
+    break;
+
   case 32:
-#line 354 "parser.y"
-    { if (!parse_only && do_header) fprintf(header, "%s\n", (yyvsp[-1].str)); ;}
+#line 429 "parser.y"
+    { assert(yychar == YYEMPTY);
+                                                 (yyval.import) = xmalloc(sizeof(struct _import_t));
+                                                 (yyval.import)->name = (yyvsp[-1].str);
+                                                 (yyval.import)->import_performed = do_import((yyvsp[-1].str));
+                                                 if (!(yyval.import)->import_performed) yychar = aEOF;
+                                               ;}
     break;
 
   case 33:
-#line 356 "parser.y"
-    { assert(yychar == YYEMPTY);
-                                                 if (!do_import((yyvsp[-1].str))) yychar = aEOF; ;}
+#line 437 "parser.y"
+    { (yyval.str) = (yyvsp[-2].import)->name;
+                                                 if ((yyvsp[-2].import)->import_performed) pop_import();
+                                                 free((yyvsp[-2].import));
+                                                 if (!parse_only && do_header) write_import((yyval.str));
+                                               ;}
     break;
 
   case 34:
-#line 359 "parser.y"
-    {;}
+#line 445 "parser.y"
+    { (yyval.str) = (yyvsp[-2].str); if(!parse_only) add_importlib((yyvsp[-2].str)); ;}
     break;
 
   case 35:
-#line 362 "parser.y"
-    { if(!parse_only) add_importlib((yyvsp[-1].str)); ;}
+#line 448 "parser.y"
+    { (yyval.str) = (yyvsp[0].str); ;}
     break;
 
   case 36:
-#line 365 "parser.y"
-    { (yyval.str) = (yyvsp[0].str); ;}
+#line 450 "parser.y"
+    { (yyval.typelib) = make_library((yyvsp[-1].str), check_library_attrs((yyvsp[-1].str), (yyvsp[-2].attr_list)));
+                                                 if (!parse_only) start_typelib((yyval.typelib));
+                                                 if (!parse_only && do_header) write_library((yyval.typelib));
+                                                 if (!parse_only && do_idfile) write_libid((yyval.typelib));
+                                                 is_inside_library = TRUE;
+                                               ;}
     break;
 
   case 37:
-#line 367 "parser.y"
-    { if (!parse_only) start_typelib((yyvsp[-1].str), (yyvsp[-2].attr_list));
-                                                 if (!parse_only && do_header) write_library((yyvsp[-1].str), (yyvsp[-2].attr_list));
-                                                 if (!parse_only && do_idfile) write_libid((yyvsp[-1].str), (yyvsp[-2].attr_list));
+#line 458 "parser.y"
+    { (yyval.typelib) = (yyvsp[-3].typelib);
+                                                 (yyval.typelib)->stmts = (yyvsp[-2].stmt_list);
+                                                 if (!parse_only) end_typelib();
+                                                 is_inside_library = FALSE;
                                                ;}
     break;
 
   case 38:
-#line 372 "parser.y"
-    { if (!parse_only) end_typelib(); ;}
+#line 465 "parser.y"
+    { (yyval.var_list) = NULL; ;}
     break;
 
-  case 39:
-#line 375 "parser.y"
+  case 40:
+#line 469 "parser.y"
     { (yyval.var_list) = NULL; ;}
     break;
 
   case 41:
-#line 379 "parser.y"
-    { (yyval.var_list) = NULL; ;}
+#line 472 "parser.y"
+    { check_arg((yyvsp[0].var)); (yyval.var_list) = append_var( NULL, (yyvsp[0].var) ); ;}
     break;
 
   case 42:
-#line 382 "parser.y"
-    { check_arg((yyvsp[0].var)); (yyval.var_list) = append_var( NULL, (yyvsp[0].var) ); ;}
+#line 473 "parser.y"
+    { check_arg((yyvsp[0].var)); (yyval.var_list) = append_var( (yyvsp[-2].var_list), (yyvsp[0].var)); ;}
     break;
 
-  case 43:
-#line 383 "parser.y"
-    { check_arg((yyvsp[0].var)); (yyval.var_list) = append_var( (yyvsp[-2].var_list), (yyvsp[0].var)); ;}
+  case 44:
+#line 478 "parser.y"
+    { (yyval.var) = (yyvsp[0].declarator)->var;
+                                                 (yyval.var)->attrs = (yyvsp[-2].attr_list);
+                                                 if ((yyvsp[-1].declspec)->stgclass != STG_NONE && (yyvsp[-1].declspec)->stgclass != STG_REGISTER)
+                                                   error_loc("invalid storage class for function parameter\n");
+                                                 set_type((yyval.var), (yyvsp[-1].declspec), (yyvsp[0].declarator), TRUE);
+                                                 free((yyvsp[0].declarator));
+                                               ;}
     break;
 
   case 45:
-#line 388 "parser.y"
-    { (yyval.var) = (yyvsp[-1].pident)->var;
-                                                 (yyval.var)->attrs = (yyvsp[-3].attr_list);
-                                                 set_type((yyval.var), (yyvsp[-2].type), (yyvsp[-1].pident)->ptr_level, (yyvsp[0].array_dims), TRUE);
-                                                 free((yyvsp[-1].pident));
+#line 485 "parser.y"
+    { (yyval.var) = (yyvsp[0].declarator)->var;
+                                                 if ((yyvsp[-1].declspec)->stgclass != STG_NONE && (yyvsp[-1].declspec)->stgclass != STG_REGISTER)
+                                                   error_loc("invalid storage class for function parameter\n");
+                                                 set_type((yyval.var), (yyvsp[-1].declspec), (yyvsp[0].declarator), TRUE);
+                                                 free((yyvsp[0].declarator));
                                                ;}
     break;
 
   case 46:
-#line 393 "parser.y"
-    { (yyval.var) = (yyvsp[-1].pident)->var;
-                                                 set_type((yyval.var), (yyvsp[-2].type), (yyvsp[-1].pident)->ptr_level, (yyvsp[0].array_dims), TRUE);
-                                                 free((yyvsp[-1].pident));
-                                               ;}
+#line 493 "parser.y"
+    { (yyval.expr) = (yyvsp[-1].expr); ;}
     break;
 
   case 47:
-#line 397 "parser.y"
-    { (yyval.var) = (yyvsp[-3].pident)->var;
-                                                 (yyval.var)->attrs = (yyvsp[-5].attr_list);
-                                                 set_type((yyval.var), (yyvsp[-4].type), (yyvsp[-3].pident)->ptr_level - 1, NULL, TRUE);
-                                                 free((yyvsp[-3].pident));
-                                                 (yyval.var)->args = (yyvsp[-1].var_list);
-                                               ;}
+#line 494 "parser.y"
+    { (yyval.expr) = make_expr(EXPR_VOID); ;}
     break;
 
   case 48:
-#line 403 "parser.y"
-    { (yyval.var) = (yyvsp[-3].pident)->var;
-                                                 set_type((yyval.var), (yyvsp[-4].type), (yyvsp[-3].pident)->ptr_level - 1, NULL, TRUE);
-                                                 free((yyvsp[-3].pident));
-                                                 (yyval.var)->args = (yyvsp[-1].var_list);
-                                               ;}
-    break;
-
-  case 49:
-#line 410 "parser.y"
-    { (yyval.array_dims) = NULL; ;}
+#line 497 "parser.y"
+    { (yyval.attr_list) = NULL; ;}
     break;
 
   case 50:
-#line 411 "parser.y"
-    { (yyval.array_dims) = (yyvsp[-1].array_dims); ;}
+#line 502 "parser.y"
+    { (yyval.attr_list) = (yyvsp[-1].attr_list);
+                                                 if (!(yyval.attr_list))
+                                                   error_loc("empty attribute lists unsupported\n");
+                                               ;}
     break;
 
   case 51:
-#line 412 "parser.y"
-    { (yyval.array_dims) = append_array( NULL, make_expr(EXPR_VOID) ); ;}
+#line 508 "parser.y"
+    { (yyval.attr_list) = append_attr( NULL, (yyvsp[0].attr) ); ;}
     break;
 
   case 52:
-#line 415 "parser.y"
-    { (yyval.array_dims) = append_array( NULL, (yyvsp[0].expr) ); ;}
+#line 509 "parser.y"
+    { (yyval.attr_list) = append_attr( (yyvsp[-2].attr_list), (yyvsp[0].attr) ); ;}
     break;
 
   case 53:
-#line 416 "parser.y"
-    { (yyval.array_dims) = append_array( (yyvsp[-2].array_dims), (yyvsp[0].expr) ); ;}
+#line 510 "parser.y"
+    { (yyval.attr_list) = append_attr( (yyvsp[-3].attr_list), (yyvsp[0].attr) ); ;}
     break;
 
   case 54:
-#line 417 "parser.y"
-    { (yyval.array_dims) = append_array( (yyvsp[-3].array_dims), (yyvsp[0].expr) ); ;}
+#line 513 "parser.y"
+    { (yyval.str_list) = append_str( NULL, (yyvsp[0].str) ); ;}
     break;
 
   case 55:
-#line 420 "parser.y"
-    { (yyval.attr_list) = NULL; ;}
+#line 514 "parser.y"
+    { (yyval.str_list) = append_str( (yyvsp[-2].str_list), (yyvsp[0].str) ); ;}
+    break;
+
+  case 56:
+#line 517 "parser.y"
+    { (yyval.attr) = NULL; ;}
     break;
 
   case 57:
-#line 425 "parser.y"
-    { (yyval.attr_list) = (yyvsp[-1].attr_list);
-                                                 if (!(yyval.attr_list))
-                                                   error_loc("empty attribute lists unsupported\n");
-                                               ;}
+#line 518 "parser.y"
+    { (yyval.attr) = make_attr(ATTR_AGGREGATABLE); ;}
     break;
 
   case 58:
-#line 431 "parser.y"
-    { (yyval.attr_list) = append_attr( NULL, (yyvsp[0].attr) ); ;}
+#line 519 "parser.y"
+    { (yyval.attr) = make_attr(ATTR_APPOBJECT); ;}
     break;
 
   case 59:
-#line 432 "parser.y"
-    { (yyval.attr_list) = append_attr( (yyvsp[-2].attr_list), (yyvsp[0].attr) ); ;}
+#line 520 "parser.y"
+    { (yyval.attr) = make_attr(ATTR_ASYNC); ;}
     break;
 
   case 60:
-#line 433 "parser.y"
-    { (yyval.attr_list) = append_attr( (yyvsp[-3].attr_list), (yyvsp[0].attr) ); ;}
+#line 521 "parser.y"
+    { (yyval.attr) = make_attr(ATTR_AUTO_HANDLE); ;}
     break;
 
   case 61:
-#line 436 "parser.y"
-    { (yyval.str_list) = append_str( NULL, (yyvsp[0].str) ); ;}
+#line 522 "parser.y"
+    { (yyval.attr) = make_attr(ATTR_BINDABLE); ;}
     break;
 
   case 62:
-#line 437 "parser.y"
-    { (yyval.str_list) = append_str( (yyvsp[-2].str_list), (yyvsp[0].str) ); ;}
+#line 523 "parser.y"
+    { (yyval.attr) = make_attr(ATTR_BROADCAST); ;}
     break;
 
   case 63:
-#line 440 "parser.y"
-    { (yyval.attr) = NULL; ;}
+#line 524 "parser.y"
+    { (yyval.attr) = make_attrp(ATTR_CALLAS, (yyvsp[-1].var)); ;}
     break;
 
   case 64:
-#line 441 "parser.y"
-    { (yyval.attr) = make_attr(ATTR_AGGREGATABLE); ;}
+#line 525 "parser.y"
+    { (yyval.attr) = make_attrp(ATTR_CASE, (yyvsp[-1].expr_list)); ;}
     break;
 
   case 65:
-#line 442 "parser.y"
-    { (yyval.attr) = make_attr(ATTR_APPOBJECT); ;}
+#line 526 "parser.y"
+    { (yyval.attr) = make_attrv(ATTR_CONTEXTHANDLE, 0); ;}
     break;
 
   case 66:
-#line 443 "parser.y"
-    { (yyval.attr) = make_attr(ATTR_ASYNC); ;}
+#line 527 "parser.y"
+    { (yyval.attr) = make_attrv(ATTR_CONTEXTHANDLE, 0); /* RPC_CONTEXT_HANDLE_DONT_SERIALIZE */ ;}
     break;
 
   case 67:
-#line 444 "parser.y"
-    { (yyval.attr) = make_attr(ATTR_AUTO_HANDLE); ;}
+#line 528 "parser.y"
+    { (yyval.attr) = make_attrv(ATTR_CONTEXTHANDLE, 0); /* RPC_CONTEXT_HANDLE_SERIALIZE */ ;}
     break;
 
   case 68:
-#line 445 "parser.y"
-    { (yyval.attr) = make_attr(ATTR_BINDABLE); ;}
+#line 529 "parser.y"
+    { (yyval.attr) = make_attr(ATTR_CONTROL); ;}
     break;
 
   case 69:
-#line 446 "parser.y"
-    { (yyval.attr) = make_attrp(ATTR_CALLAS, (yyvsp[-1].var)); ;}
+#line 530 "parser.y"
+    { (yyval.attr) = make_attr(ATTR_DEFAULT); ;}
     break;
 
   case 70:
-#line 447 "parser.y"
-    { (yyval.attr) = make_attrp(ATTR_CASE, (yyvsp[-1].expr_list)); ;}
+#line 531 "parser.y"
+    { (yyval.attr) = make_attr(ATTR_DEFAULTCOLLELEM); ;}
     break;
 
   case 71:
-#line 448 "parser.y"
-    { (yyval.attr) = make_attrv(ATTR_CONTEXTHANDLE, 0); ;}
+#line 532 "parser.y"
+    { (yyval.attr) = make_attrp(ATTR_DEFAULTVALUE, (yyvsp[-1].expr)); ;}
     break;
 
   case 72:
-#line 449 "parser.y"
-    { (yyval.attr) = make_attrv(ATTR_CONTEXTHANDLE, 0); /* RPC_CONTEXT_HANDLE_DONT_SERIALIZE */ ;}
+#line 533 "parser.y"
+    { (yyval.attr) = make_attr(ATTR_DEFAULTVTABLE); ;}
     break;
 
   case 73:
-#line 450 "parser.y"
-    { (yyval.attr) = make_attrv(ATTR_CONTEXTHANDLE, 0); /* RPC_CONTEXT_HANDLE_SERIALIZE */ ;}
+#line 534 "parser.y"
+    { (yyval.attr) = make_attr(ATTR_DISPLAYBIND); ;}
     break;
 
   case 74:
-#line 451 "parser.y"
-    { (yyval.attr) = make_attr(ATTR_CONTROL); ;}
+#line 535 "parser.y"
+    { (yyval.attr) = make_attrp(ATTR_DLLNAME, (yyvsp[-1].str)); ;}
     break;
 
   case 75:
-#line 452 "parser.y"
-    { (yyval.attr) = make_attr(ATTR_DEFAULT); ;}
+#line 536 "parser.y"
+    { (yyval.attr) = make_attr(ATTR_DUAL); ;}
     break;
 
   case 76:
-#line 453 "parser.y"
-    { (yyval.attr) = make_attr(ATTR_DEFAULTCOLLELEM); ;}
+#line 537 "parser.y"
+    { (yyval.attr) = make_attrp(ATTR_ENDPOINT, (yyvsp[-1].str_list)); ;}
     break;
 
   case 77:
-#line 454 "parser.y"
-    { (yyval.attr) = make_attrp(ATTR_DEFAULTVALUE_EXPR, (yyvsp[-1].expr)); ;}
+#line 538 "parser.y"
+    { (yyval.attr) = make_attrp(ATTR_ENTRY, (yyvsp[-1].expr)); ;}
     break;
 
   case 78:
-#line 455 "parser.y"
-    { (yyval.attr) = make_attrp(ATTR_DEFAULTVALUE_STRING, (yyvsp[-1].str)); ;}
+#line 539 "parser.y"
+    { (yyval.attr) = make_attr(ATTR_EXPLICIT_HANDLE); ;}
     break;
 
   case 79:
-#line 456 "parser.y"
-    { (yyval.attr) = make_attr(ATTR_DEFAULTVTABLE); ;}
+#line 540 "parser.y"
+    { (yyval.attr) = make_attr(ATTR_HANDLE); ;}
     break;
 
   case 80:
-#line 457 "parser.y"
-    { (yyval.attr) = make_attr(ATTR_DISPLAYBIND); ;}
+#line 541 "parser.y"
+    { (yyval.attr) = make_attrp(ATTR_HELPCONTEXT, (yyvsp[-1].expr)); ;}
     break;
 
   case 81:
-#line 458 "parser.y"
-    { (yyval.attr) = make_attrp(ATTR_DLLNAME, (yyvsp[-1].str)); ;}
+#line 542 "parser.y"
+    { (yyval.attr) = make_attrp(ATTR_HELPFILE, (yyvsp[-1].str)); ;}
     break;
 
   case 82:
-#line 459 "parser.y"
-    { (yyval.attr) = make_attr(ATTR_DUAL); ;}
+#line 543 "parser.y"
+    { (yyval.attr) = make_attrp(ATTR_HELPSTRING, (yyvsp[-1].str)); ;}
     break;
 
   case 83:
-#line 460 "parser.y"
-    { (yyval.attr) = make_attrp(ATTR_ENDPOINT, (yyvsp[-1].str_list)); ;}
+#line 544 "parser.y"
+    { (yyval.attr) = make_attrp(ATTR_HELPSTRINGCONTEXT, (yyvsp[-1].expr)); ;}
     break;
 
   case 84:
-#line 461 "parser.y"
-    { (yyval.attr) = make_attrp(ATTR_ENTRY_STRING, (yyvsp[-1].str)); ;}
+#line 545 "parser.y"
+    { (yyval.attr) = make_attrp(ATTR_HELPSTRINGDLL, (yyvsp[-1].str)); ;}
     break;
 
   case 85:
-#line 462 "parser.y"
-    { (yyval.attr) = make_attrp(ATTR_ENTRY_ORDINAL, (yyvsp[-1].expr)); ;}
+#line 546 "parser.y"
+    { (yyval.attr) = make_attr(ATTR_HIDDEN); ;}
     break;
 
   case 86:
-#line 463 "parser.y"
-    { (yyval.attr) = make_attr(ATTR_EXPLICIT_HANDLE); ;}
+#line 547 "parser.y"
+    { (yyval.attr) = make_attrp(ATTR_ID, (yyvsp[-1].expr)); ;}
     break;
 
   case 87:
-#line 464 "parser.y"
-    { (yyval.attr) = make_attr(ATTR_HANDLE); ;}
+#line 548 "parser.y"
+    { (yyval.attr) = make_attr(ATTR_IDEMPOTENT); ;}
     break;
 
   case 88:
-#line 465 "parser.y"
-    { (yyval.attr) = make_attrp(ATTR_HELPCONTEXT, (yyvsp[-1].expr)); ;}
+#line 549 "parser.y"
+    { (yyval.attr) = make_attrp(ATTR_IIDIS, (yyvsp[-1].expr)); ;}
     break;
 
   case 89:
-#line 466 "parser.y"
-    { (yyval.attr) = make_attrp(ATTR_HELPFILE, (yyvsp[-1].str)); ;}
+#line 550 "parser.y"
+    { (yyval.attr) = make_attr(ATTR_IMMEDIATEBIND); ;}
     break;
 
   case 90:
-#line 467 "parser.y"
-    { (yyval.attr) = make_attrp(ATTR_HELPSTRING, (yyvsp[-1].str)); ;}
+#line 551 "parser.y"
+    { (yyval.attr) = make_attrp(ATTR_IMPLICIT_HANDLE, (yyvsp[-1].str)); ;}
     break;
 
   case 91:
-#line 468 "parser.y"
-    { (yyval.attr) = make_attrp(ATTR_HELPSTRINGCONTEXT, (yyvsp[-1].expr)); ;}
+#line 552 "parser.y"
+    { (yyval.attr) = make_attr(ATTR_IN); ;}
     break;
 
   case 92:
-#line 469 "parser.y"
-    { (yyval.attr) = make_attrp(ATTR_HELPSTRINGDLL, (yyvsp[-1].str)); ;}
+#line 553 "parser.y"
+    { (yyval.attr) = make_attr(ATTR_INPUTSYNC); ;}
     break;
 
   case 93:
-#line 470 "parser.y"
-    { (yyval.attr) = make_attr(ATTR_HIDDEN); ;}
+#line 554 "parser.y"
+    { (yyval.attr) = make_attrp(ATTR_LENGTHIS, (yyvsp[-1].expr_list)); ;}
     break;
 
   case 94:
-#line 471 "parser.y"
-    { (yyval.attr) = make_attrp(ATTR_ID, (yyvsp[-1].expr)); ;}
+#line 555 "parser.y"
+    { (yyval.attr) = make_attrp(ATTR_LIBLCID, (yyvsp[-1].expr)); ;}
     break;
 
   case 95:
-#line 472 "parser.y"
-    { (yyval.attr) = make_attr(ATTR_IDEMPOTENT); ;}
+#line 556 "parser.y"
+    { (yyval.attr) = make_attr(ATTR_LOCAL); ;}
     break;
 
   case 96:
-#line 473 "parser.y"
-    { (yyval.attr) = make_attrp(ATTR_IIDIS, (yyvsp[-1].expr)); ;}
+#line 557 "parser.y"
+    { (yyval.attr) = make_attr(ATTR_NONBROWSABLE); ;}
     break;
 
   case 97:
-#line 474 "parser.y"
-    { (yyval.attr) = make_attr(ATTR_IMMEDIATEBIND); ;}
+#line 558 "parser.y"
+    { (yyval.attr) = make_attr(ATTR_NONCREATABLE); ;}
     break;
 
   case 98:
-#line 475 "parser.y"
-    { (yyval.attr) = make_attrp(ATTR_IMPLICIT_HANDLE, (yyvsp[-1].str)); ;}
+#line 559 "parser.y"
+    { (yyval.attr) = make_attr(ATTR_NONEXTENSIBLE); ;}
     break;
 
   case 99:
-#line 476 "parser.y"
-    { (yyval.attr) = make_attr(ATTR_IN); ;}
+#line 560 "parser.y"
+    { (yyval.attr) = make_attr(ATTR_OBJECT); ;}
     break;
 
   case 100:
-#line 477 "parser.y"
-    { (yyval.attr) = make_attr(ATTR_INPUTSYNC); ;}
+#line 561 "parser.y"
+    { (yyval.attr) = make_attr(ATTR_ODL); ;}
     break;
 
   case 101:
-#line 478 "parser.y"
-    { (yyval.attr) = make_attrp(ATTR_LENGTHIS, (yyvsp[-1].expr_list)); ;}
+#line 562 "parser.y"
+    { (yyval.attr) = make_attr(ATTR_OLEAUTOMATION); ;}
     break;
 
   case 102:
-#line 479 "parser.y"
-    { (yyval.attr) = make_attr(ATTR_LOCAL); ;}
+#line 563 "parser.y"
+    { (yyval.attr) = make_attr(ATTR_OPTIONAL); ;}
     break;
 
   case 103:
-#line 480 "parser.y"
-    { (yyval.attr) = make_attr(ATTR_NONBROWSABLE); ;}
+#line 564 "parser.y"
+    { (yyval.attr) = make_attr(ATTR_OUT); ;}
     break;
 
   case 104:
-#line 481 "parser.y"
-    { (yyval.attr) = make_attr(ATTR_NONCREATABLE); ;}
+#line 565 "parser.y"
+    { (yyval.attr) = make_attrv(ATTR_POINTERDEFAULT, (yyvsp[-1].num)); ;}
     break;
 
   case 105:
-#line 482 "parser.y"
-    { (yyval.attr) = make_attr(ATTR_NONEXTENSIBLE); ;}
+#line 566 "parser.y"
+    { (yyval.attr) = make_attr(ATTR_PROPGET); ;}
     break;
 
   case 106:
-#line 483 "parser.y"
-    { (yyval.attr) = make_attr(ATTR_OBJECT); ;}
+#line 567 "parser.y"
+    { (yyval.attr) = make_attr(ATTR_PROPPUT); ;}
     break;
 
   case 107:
-#line 484 "parser.y"
-    { (yyval.attr) = make_attr(ATTR_ODL); ;}
+#line 568 "parser.y"
+    { (yyval.attr) = make_attr(ATTR_PROPPUTREF); ;}
     break;
 
   case 108:
-#line 485 "parser.y"
-    { (yyval.attr) = make_attr(ATTR_OLEAUTOMATION); ;}
+#line 569 "parser.y"
+    { (yyval.attr) = make_attr(ATTR_PUBLIC); ;}
     break;
 
   case 109:
-#line 486 "parser.y"
-    { (yyval.attr) = make_attr(ATTR_OPTIONAL); ;}
+#line 571 "parser.y"
+    { expr_list_t *list = append_expr( NULL, (yyvsp[-3].expr) );
+                                                 list = append_expr( list, (yyvsp[-1].expr) );
+                                                 (yyval.attr) = make_attrp(ATTR_RANGE, list); ;}
     break;
 
   case 110:
-#line 487 "parser.y"
-    { (yyval.attr) = make_attr(ATTR_OUT); ;}
+#line 574 "parser.y"
+    { (yyval.attr) = make_attr(ATTR_READONLY); ;}
     break;
 
   case 111:
-#line 488 "parser.y"
-    { (yyval.attr) = make_attrv(ATTR_POINTERDEFAULT, (yyvsp[-1].num)); ;}
+#line 575 "parser.y"
+    { (yyval.attr) = make_attr(ATTR_REQUESTEDIT); ;}
     break;
 
   case 112:
-#line 489 "parser.y"
-    { (yyval.attr) = make_attr(ATTR_PROPGET); ;}
+#line 576 "parser.y"
+    { (yyval.attr) = make_attr(ATTR_RESTRICTED); ;}
     break;
 
   case 113:
-#line 490 "parser.y"
-    { (yyval.attr) = make_attr(ATTR_PROPPUT); ;}
+#line 577 "parser.y"
+    { (yyval.attr) = make_attr(ATTR_RETVAL); ;}
     break;
 
   case 114:
-#line 491 "parser.y"
-    { (yyval.attr) = make_attr(ATTR_PROPPUTREF); ;}
+#line 578 "parser.y"
+    { (yyval.attr) = make_attrp(ATTR_SIZEIS, (yyvsp[-1].expr_list)); ;}
     break;
 
   case 115:
-#line 492 "parser.y"
-    { (yyval.attr) = make_attr(ATTR_PUBLIC); ;}
+#line 579 "parser.y"
+    { (yyval.attr) = make_attr(ATTR_SOURCE); ;}
     break;
 
   case 116:
-#line 493 "parser.y"
-    { expr_list_t *list = append_expr( NULL, (yyvsp[-3].expr) );
-                                                     list = append_expr( list, (yyvsp[-1].expr) );
-                                                     (yyval.attr) = make_attrp(ATTR_RANGE, list); ;}
+#line 580 "parser.y"
+    { (yyval.attr) = make_attr(ATTR_STRICTCONTEXTHANDLE); ;}
     break;
 
   case 117:
-#line 496 "parser.y"
-    { (yyval.attr) = make_attr(ATTR_READONLY); ;}
+#line 581 "parser.y"
+    { (yyval.attr) = make_attr(ATTR_STRING); ;}
     break;
 
   case 118:
-#line 497 "parser.y"
-    { (yyval.attr) = make_attr(ATTR_REQUESTEDIT); ;}
+#line 582 "parser.y"
+    { (yyval.attr) = make_attrp(ATTR_SWITCHIS, (yyvsp[-1].expr)); ;}
     break;
 
   case 119:
-#line 498 "parser.y"
-    { (yyval.attr) = make_attr(ATTR_RESTRICTED); ;}
+#line 583 "parser.y"
+    { (yyval.attr) = make_attrp(ATTR_SWITCHTYPE, (yyvsp[-1].type)); ;}
     break;
 
   case 120:
-#line 499 "parser.y"
-    { (yyval.attr) = make_attr(ATTR_RETVAL); ;}
+#line 584 "parser.y"
+    { (yyval.attr) = make_attrp(ATTR_TRANSMITAS, (yyvsp[-1].type)); ;}
     break;
 
   case 121:
-#line 500 "parser.y"
-    { (yyval.attr) = make_attrp(ATTR_SIZEIS, (yyvsp[-1].expr_list)); ;}
+#line 585 "parser.y"
+    { (yyval.attr) = make_attrp(ATTR_UUID, (yyvsp[-1].uuid)); ;}
     break;
 
   case 122:
-#line 501 "parser.y"
-    { (yyval.attr) = make_attr(ATTR_SOURCE); ;}
+#line 586 "parser.y"
+    { (yyval.attr) = make_attr(ATTR_V1ENUM); ;}
     break;
 
   case 123:
-#line 502 "parser.y"
-    { (yyval.attr) = make_attr(ATTR_STRICTCONTEXTHANDLE); ;}
+#line 587 "parser.y"
+    { (yyval.attr) = make_attr(ATTR_VARARG); ;}
     break;
 
   case 124:
-#line 503 "parser.y"
-    { (yyval.attr) = make_attr(ATTR_STRING); ;}
+#line 588 "parser.y"
+    { (yyval.attr) = make_attrv(ATTR_VERSION, (yyvsp[-1].num)); ;}
     break;
 
   case 125:
-#line 504 "parser.y"
-    { (yyval.attr) = make_attrp(ATTR_SWITCHIS, (yyvsp[-1].expr)); ;}
+#line 589 "parser.y"
+    { (yyval.attr) = make_attrp(ATTR_WIREMARSHAL, (yyvsp[-1].type)); ;}
     break;
 
   case 126:
-#line 505 "parser.y"
-    { (yyval.attr) = make_attrp(ATTR_SWITCHTYPE, (yyvsp[-1].type)); ;}
-    break;
-
-  case 127:
-#line 506 "parser.y"
-    { (yyval.attr) = make_attrp(ATTR_TRANSMITAS, (yyvsp[-1].type)); ;}
+#line 590 "parser.y"
+    { (yyval.attr) = make_attrv(ATTR_POINTERTYPE, (yyvsp[0].num)); ;}
     break;
 
   case 128:
-#line 507 "parser.y"
-    { (yyval.attr) = make_attrp(ATTR_UUID, (yyvsp[-1].uuid)); ;}
+#line 595 "parser.y"
+    { if (!is_valid_uuid((yyvsp[0].str)))
+                                                   error_loc("invalid UUID: %s\n", (yyvsp[0].str));
+                                                 (yyval.uuid) = parse_uuid((yyvsp[0].str)); ;}
     break;
 
   case 129:
-#line 508 "parser.y"
-    { (yyval.attr) = make_attr(ATTR_V1ENUM); ;}
+#line 600 "parser.y"
+    { (yyval.str) = (yyvsp[0].str); ;}
     break;
 
   case 130:
-#line 509 "parser.y"
-    { (yyval.attr) = make_attr(ATTR_VARARG); ;}
+#line 601 "parser.y"
+    { (yyval.str) = (yyvsp[0].str); ;}
     break;
 
   case 131:
-#line 510 "parser.y"
-    { (yyval.attr) = make_attrv(ATTR_VERSION, (yyvsp[-1].num)); ;}
+#line 602 "parser.y"
+    { (yyval.str) = (yyvsp[0].str); ;}
     break;
 
   case 132:
-#line 511 "parser.y"
-    { (yyval.attr) = make_attrp(ATTR_WIREMARSHAL, (yyvsp[-1].type)); ;}
+#line 603 "parser.y"
+    { (yyval.str) = (yyvsp[0].str); ;}
     break;
 
   case 133:
-#line 512 "parser.y"
-    { (yyval.attr) = make_attrv(ATTR_POINTERTYPE, (yyvsp[0].num)); ;}
-    break;
-
-  case 135:
-#line 517 "parser.y"
-    { if (!is_valid_uuid((yyvsp[0].str)))
-                                                   error_loc("invalid UUID: %s\n", (yyvsp[0].str));
-                                                 (yyval.uuid) = parse_uuid((yyvsp[0].str)); ;}
-    break;
-
-  case 138:
-#line 526 "parser.y"
+#line 606 "parser.y"
     { (yyval.var_list) = NULL; ;}
     break;
 
-  case 139:
-#line 527 "parser.y"
+  case 134:
+#line 607 "parser.y"
     { (yyval.var_list) = append_var( (yyvsp[-1].var_list), (yyvsp[0].var) ); ;}
     break;
 
-  case 140:
-#line 530 "parser.y"
+  case 135:
+#line 610 "parser.y"
     { attr_t *a = make_attrp(ATTR_CASE, append_expr( NULL, (yyvsp[-2].expr) ));
                                                  (yyval.var) = (yyvsp[0].var); if (!(yyval.var)) (yyval.var) = make_var(NULL);
                                                  (yyval.var)->attrs = append_attr( (yyval.var)->attrs, a );
                                                ;}
     break;
 
-  case 141:
-#line 534 "parser.y"
+  case 136:
+#line 614 "parser.y"
     { attr_t *a = make_attr(ATTR_DEFAULT);
                                                  (yyval.var) = (yyvsp[0].var); if (!(yyval.var)) (yyval.var) = make_var(NULL);
                                                  (yyval.var)->attrs = append_attr( (yyval.var)->attrs, a );
                                                ;}
     break;
 
-  case 142:
-#line 540 "parser.y"
-    { (yyval.var) = reg_const((yyvsp[-2].var));
-                                                 set_type((yyval.var), (yyvsp[-3].type), 0, NULL, FALSE);
-                                                 (yyval.var)->eval = (yyvsp[0].expr);
-                                               ;}
-    break;
-
-  case 143:
-#line 546 "parser.y"
+  case 137:
+#line 620 "parser.y"
     { (yyval.var_list) = NULL; ;}
     break;
 
-  case 144:
-#line 547 "parser.y"
+  case 138:
+#line 621 "parser.y"
     { (yyval.var_list) = (yyvsp[-1].var_list); ;}
     break;
 
-  case 146:
-#line 551 "parser.y"
+  case 140:
+#line 625 "parser.y"
     { if (!(yyvsp[0].var)->eval)
                                                    (yyvsp[0].var)->eval = make_exprl(EXPR_NUM, 0 /* default for first enum entry */);
                                                   (yyval.var_list) = append_var( NULL, (yyvsp[0].var) );
                                                ;}
     break;
 
-  case 147:
-#line 555 "parser.y"
+  case 141:
+#line 629 "parser.y"
     { if (!(yyvsp[0].var)->eval)
                                                   {
                                                     var_t *last = LIST_ENTRY( list_tail((yyval.var_list)), var_t, entry );
@@ -2888,281 +3201,412 @@ yyreduce:
                                                ;}
     break;
 
-  case 148:
-#line 564 "parser.y"
+  case 142:
+#line 638 "parser.y"
     { (yyval.var) = reg_const((yyvsp[-2].var));
                                                  (yyval.var)->eval = (yyvsp[0].expr);
                                                   (yyval.var)->type = make_int(0);
                                                ;}
     break;
 
-  case 149:
-#line 568 "parser.y"
+  case 143:
+#line 642 "parser.y"
     { (yyval.var) = reg_const((yyvsp[0].var));
                                                   (yyval.var)->type = make_int(0);
                                                ;}
     break;
 
-  case 150:
-#line 573 "parser.y"
+  case 144:
+#line 647 "parser.y"
     { (yyval.type) = get_typev(RPC_FC_ENUM16, (yyvsp[-3].var), tsENUM);
                                                  (yyval.type)->kind = TKIND_ENUM;
-                                                 (yyval.type)->fields = (yyvsp[-1].var_list);
+                                                 (yyval.type)->fields_or_args = (yyvsp[-1].var_list);
                                                  (yyval.type)->defined = TRUE;
                                                   if(in_typelib)
                                                       add_typelib_entry((yyval.type));
                                                ;}
     break;
 
-  case 151:
-#line 582 "parser.y"
+  case 145:
+#line 656 "parser.y"
     { (yyval.expr_list) = append_expr( NULL, (yyvsp[0].expr) ); ;}
     break;
 
-  case 152:
-#line 583 "parser.y"
+  case 146:
+#line 657 "parser.y"
     { (yyval.expr_list) = append_expr( (yyvsp[-2].expr_list), (yyvsp[0].expr) ); ;}
     break;
 
-  case 153:
-#line 596 "parser.y"
+  case 147:
+#line 670 "parser.y"
     { (yyval.expr) = make_expr(EXPR_VOID); ;}
     break;
 
-  case 155:
-#line 600 "parser.y"
+  case 149:
+#line 674 "parser.y"
     { (yyval.expr) = make_exprl(EXPR_NUM, (yyvsp[0].num)); ;}
     break;
 
-  case 156:
-#line 601 "parser.y"
+  case 150:
+#line 675 "parser.y"
     { (yyval.expr) = make_exprl(EXPR_HEXNUM, (yyvsp[0].num)); ;}
     break;
 
-  case 157:
-#line 602 "parser.y"
+  case 151:
+#line 676 "parser.y"
     { (yyval.expr) = make_exprd(EXPR_DOUBLE, (yyvsp[0].dbl)); ;}
     break;
 
-  case 158:
-#line 603 "parser.y"
+  case 152:
+#line 677 "parser.y"
     { (yyval.expr) = make_exprl(EXPR_TRUEFALSE, 0); ;}
     break;
 
-  case 159:
-#line 604 "parser.y"
+  case 153:
+#line 678 "parser.y"
+    { (yyval.expr) = make_exprl(EXPR_NUM, 0); ;}
+    break;
+
+  case 154:
+#line 679 "parser.y"
     { (yyval.expr) = make_exprl(EXPR_TRUEFALSE, 1); ;}
     break;
 
-  case 160:
-#line 605 "parser.y"
+  case 155:
+#line 680 "parser.y"
+    { (yyval.expr) = make_exprs(EXPR_STRLIT, (yyvsp[0].str)); ;}
+    break;
+
+  case 156:
+#line 681 "parser.y"
+    { (yyval.expr) = make_exprs(EXPR_WSTRLIT, (yyvsp[0].str)); ;}
+    break;
+
+  case 157:
+#line 682 "parser.y"
     { (yyval.expr) = make_exprs(EXPR_IDENTIFIER, (yyvsp[0].str)); ;}
     break;
 
-  case 161:
-#line 606 "parser.y"
+  case 158:
+#line 683 "parser.y"
     { (yyval.expr) = make_expr3(EXPR_COND, (yyvsp[-4].expr), (yyvsp[-2].expr), (yyvsp[0].expr)); ;}
     break;
 
-  case 162:
-#line 607 "parser.y"
+  case 159:
+#line 684 "parser.y"
+    { (yyval.expr) = make_expr2(EXPR_LOGOR, (yyvsp[-2].expr), (yyvsp[0].expr)); ;}
+    break;
+
+  case 160:
+#line 685 "parser.y"
+    { (yyval.expr) = make_expr2(EXPR_LOGAND, (yyvsp[-2].expr), (yyvsp[0].expr)); ;}
+    break;
+
+  case 161:
+#line 686 "parser.y"
     { (yyval.expr) = make_expr2(EXPR_OR , (yyvsp[-2].expr), (yyvsp[0].expr)); ;}
     break;
 
+  case 162:
+#line 687 "parser.y"
+    { (yyval.expr) = make_expr2(EXPR_XOR, (yyvsp[-2].expr), (yyvsp[0].expr)); ;}
+    break;
+
   case 163:
-#line 608 "parser.y"
+#line 688 "parser.y"
     { (yyval.expr) = make_expr2(EXPR_AND, (yyvsp[-2].expr), (yyvsp[0].expr)); ;}
     break;
 
   case 164:
-#line 609 "parser.y"
-    { (yyval.expr) = make_expr2(EXPR_ADD, (yyvsp[-2].expr), (yyvsp[0].expr)); ;}
+#line 689 "parser.y"
+    { (yyval.expr) = make_expr2(EXPR_EQUALITY, (yyvsp[-2].expr), (yyvsp[0].expr)); ;}
     break;
 
   case 165:
-#line 610 "parser.y"
-    { (yyval.expr) = make_expr2(EXPR_SUB, (yyvsp[-2].expr), (yyvsp[0].expr)); ;}
+#line 690 "parser.y"
+    { (yyval.expr) = make_expr2(EXPR_INEQUALITY, (yyvsp[-2].expr), (yyvsp[0].expr)); ;}
     break;
 
   case 166:
-#line 611 "parser.y"
-    { (yyval.expr) = make_expr2(EXPR_MUL, (yyvsp[-2].expr), (yyvsp[0].expr)); ;}
+#line 691 "parser.y"
+    { (yyval.expr) = make_expr2(EXPR_GTR, (yyvsp[-2].expr), (yyvsp[0].expr)); ;}
     break;
 
   case 167:
-#line 612 "parser.y"
-    { (yyval.expr) = make_expr2(EXPR_DIV, (yyvsp[-2].expr), (yyvsp[0].expr)); ;}
+#line 692 "parser.y"
+    { (yyval.expr) = make_expr2(EXPR_LESS, (yyvsp[-2].expr), (yyvsp[0].expr)); ;}
     break;
 
   case 168:
-#line 613 "parser.y"
-    { (yyval.expr) = make_expr2(EXPR_SHL, (yyvsp[-2].expr), (yyvsp[0].expr)); ;}
+#line 693 "parser.y"
+    { (yyval.expr) = make_expr2(EXPR_GTREQL, (yyvsp[-2].expr), (yyvsp[0].expr)); ;}
     break;
 
   case 169:
-#line 614 "parser.y"
-    { (yyval.expr) = make_expr2(EXPR_SHR, (yyvsp[-2].expr), (yyvsp[0].expr)); ;}
+#line 694 "parser.y"
+    { (yyval.expr) = make_expr2(EXPR_LESSEQL, (yyvsp[-2].expr), (yyvsp[0].expr)); ;}
     break;
 
   case 170:
-#line 615 "parser.y"
-    { (yyval.expr) = make_expr1(EXPR_NOT, (yyvsp[0].expr)); ;}
+#line 695 "parser.y"
+    { (yyval.expr) = make_expr2(EXPR_SHL, (yyvsp[-2].expr), (yyvsp[0].expr)); ;}
     break;
 
   case 171:
-#line 616 "parser.y"
-    { (yyval.expr) = make_expr1(EXPR_NEG, (yyvsp[0].expr)); ;}
+#line 696 "parser.y"
+    { (yyval.expr) = make_expr2(EXPR_SHR, (yyvsp[-2].expr), (yyvsp[0].expr)); ;}
     break;
 
   case 172:
-#line 617 "parser.y"
-    { (yyval.expr) = make_expr1(EXPR_ADDRESSOF, (yyvsp[0].expr)); ;}
+#line 697 "parser.y"
+    { (yyval.expr) = make_expr2(EXPR_ADD, (yyvsp[-2].expr), (yyvsp[0].expr)); ;}
     break;
 
   case 173:
-#line 618 "parser.y"
-    { (yyval.expr) = make_expr1(EXPR_PPTR, (yyvsp[0].expr)); ;}
+#line 698 "parser.y"
+    { (yyval.expr) = make_expr2(EXPR_SUB, (yyvsp[-2].expr), (yyvsp[0].expr)); ;}
     break;
 
   case 174:
-#line 619 "parser.y"
-    { (yyval.expr) = make_exprt(EXPR_CAST, (yyvsp[-2].type), (yyvsp[0].expr)); ;}
+#line 699 "parser.y"
+    { (yyval.expr) = make_expr2(EXPR_MOD, (yyvsp[-2].expr), (yyvsp[0].expr)); ;}
     break;
 
   case 175:
-#line 620 "parser.y"
-    { (yyval.expr) = make_exprt(EXPR_SIZEOF, (yyvsp[-1].type), NULL); ;}
+#line 700 "parser.y"
+    { (yyval.expr) = make_expr2(EXPR_MUL, (yyvsp[-2].expr), (yyvsp[0].expr)); ;}
     break;
 
   case 176:
-#line 621 "parser.y"
-    { (yyval.expr) = (yyvsp[-1].expr); ;}
+#line 701 "parser.y"
+    { (yyval.expr) = make_expr2(EXPR_DIV, (yyvsp[-2].expr), (yyvsp[0].expr)); ;}
     break;
 
   case 177:
-#line 624 "parser.y"
-    { (yyval.expr_list) = append_expr( NULL, (yyvsp[0].expr) ); ;}
+#line 702 "parser.y"
+    { (yyval.expr) = make_expr1(EXPR_LOGNOT, (yyvsp[0].expr)); ;}
     break;
 
   case 178:
-#line 625 "parser.y"
-    { (yyval.expr_list) = append_expr( (yyvsp[-2].expr_list), (yyvsp[0].expr) ); ;}
+#line 703 "parser.y"
+    { (yyval.expr) = make_expr1(EXPR_NOT, (yyvsp[0].expr)); ;}
     break;
 
   case 179:
-#line 628 "parser.y"
-    { (yyval.expr) = (yyvsp[0].expr);
-                                                 if (!(yyval.expr)->is_const)
-                                                     error_loc("expression is not constant\n");
-                                               ;}
+#line 704 "parser.y"
+    { (yyval.expr) = make_expr1(EXPR_POS, (yyvsp[0].expr)); ;}
     break;
 
   case 180:
-#line 634 "parser.y"
-    { (yyval.var) = (yyvsp[0].var);
-                                                 set_type((yyval.var), (yyvsp[-1].type), 0, NULL, FALSE);
-                                               ;}
+#line 705 "parser.y"
+    { (yyval.expr) = make_expr1(EXPR_NEG, (yyvsp[0].expr)); ;}
     break;
 
   case 181:
-#line 639 "parser.y"
-    { (yyval.var_list) = NULL; ;}
+#line 706 "parser.y"
+    { (yyval.expr) = make_expr1(EXPR_ADDRESSOF, (yyvsp[0].expr)); ;}
     break;
 
   case 182:
-#line 640 "parser.y"
-    { (yyval.var_list) = append_var( (yyvsp[-1].var_list), (yyvsp[0].var) ); ;}
+#line 707 "parser.y"
+    { (yyval.expr) = make_expr1(EXPR_PPTR, (yyvsp[0].expr)); ;}
     break;
 
   case 183:
-#line 643 "parser.y"
-    { (yyval.var) = (yyvsp[-1].var); ;}
+#line 708 "parser.y"
+    { (yyval.expr) = make_expr2(EXPR_MEMBER, make_expr1(EXPR_PPTR, (yyvsp[-2].expr)), make_exprs(EXPR_IDENTIFIER, (yyvsp[0].str))); ;}
     break;
 
   case 184:
-#line 644 "parser.y"
-    { (yyval.var) = make_var(NULL); (yyval.var)->type = (yyvsp[-1].type); (yyval.var)->attrs = (yyvsp[-2].attr_list); ;}
+#line 709 "parser.y"
+    { (yyval.expr) = make_expr2(EXPR_MEMBER, (yyvsp[-2].expr), make_exprs(EXPR_IDENTIFIER, (yyvsp[0].str))); ;}
     break;
 
   case 185:
-#line 645 "parser.y"
-    { (yyval.var) = make_var(NULL); (yyval.var)->attrs = (yyvsp[-1].attr_list); ;}
+#line 710 "parser.y"
+    { (yyval.expr) = make_exprt(EXPR_CAST, (yyvsp[-2].type), (yyvsp[0].expr)); ;}
     break;
 
   case 186:
-#line 646 "parser.y"
-    { (yyval.var) = NULL; ;}
+#line 711 "parser.y"
+    { (yyval.expr) = make_exprt(EXPR_SIZEOF, (yyvsp[-1].type), NULL); ;}
     break;
 
   case 187:
-#line 649 "parser.y"
-    { (yyval.var) = (yyvsp[-1].pident)->var;
-                                                 (yyval.var)->attrs = (yyvsp[-3].attr_list);
-                                                 set_type((yyval.var), (yyvsp[-2].type), (yyvsp[-1].pident)->ptr_level, (yyvsp[0].array_dims), FALSE);
-                                                 free((yyvsp[-1].pident));
-                                               ;}
+#line 712 "parser.y"
+    { (yyval.expr) = make_expr2(EXPR_ARRAY, (yyvsp[-3].expr), (yyvsp[-1].expr)); ;}
     break;
 
   case 188:
-#line 658 "parser.y"
-    { var_t *v = (yyvsp[-3].pident)->var;
-                                                 v->attrs = (yyvsp[-6].attr_list);
-                                                 set_type(v, (yyvsp[-5].type), (yyvsp[-3].pident)->ptr_level, NULL, FALSE);
-                                                 free((yyvsp[-3].pident));
-                                                 (yyval.func) = make_func(v, (yyvsp[-1].var_list));
-                                                 if (is_attr(v->attrs, ATTR_IN)) {
-                                                   error_loc("inapplicable attribute [in] for function '%s'\n",(yyval.func)->def->name);
-                                                 }
-                                               ;}
+#line 713 "parser.y"
+    { (yyval.expr) = (yyvsp[-1].expr); ;}
     break;
 
   case 189:
-#line 669 "parser.y"
-    { (yyval.var) = NULL; ;}
+#line 716 "parser.y"
+    { (yyval.expr_list) = append_expr( NULL, (yyvsp[0].expr) ); ;}
+    break;
+
+  case 190:
+#line 717 "parser.y"
+    { (yyval.expr_list) = append_expr( (yyvsp[-2].expr_list), (yyvsp[0].expr) ); ;}
     break;
 
   case 191:
-#line 673 "parser.y"
-    { (yyval.var) = NULL; ;}
+#line 720 "parser.y"
+    { (yyval.expr) = (yyvsp[0].expr);
+                                                 if (!(yyval.expr)->is_const)
+                                                     error_loc("expression is not an integer constant\n");
+                                               ;}
     break;
 
   case 192:
-#line 674 "parser.y"
-    { (yyval.var) = make_var((yyvsp[0].str)); ;}
+#line 726 "parser.y"
+    { (yyval.expr) = (yyvsp[0].expr);
+                                                 if (!(yyval.expr)->is_const && (yyval.expr)->type != EXPR_STRLIT && (yyval.expr)->type != EXPR_WSTRLIT)
+                                                     error_loc("expression is not constant\n");
+                                               ;}
     break;
 
   case 193:
-#line 675 "parser.y"
-    { (yyval.var) = make_var((yyvsp[0].str)); ;}
+#line 732 "parser.y"
+    { (yyval.var_list) = NULL; ;}
     break;
 
   case 194:
-#line 678 "parser.y"
-    { (yyval.var) = make_var((yyvsp[0].str)); ;}
+#line 733 "parser.y"
+    { (yyval.var_list) = append_var_list((yyvsp[-1].var_list), (yyvsp[0].var_list)); ;}
     break;
 
   case 195:
-#line 680 "parser.y"
-    { (yyval.var) = make_var((yyvsp[0].str)); ;}
+#line 737 "parser.y"
+    { const char *first = LIST_ENTRY(list_head((yyvsp[-1].declarator_list)), declarator_t, entry)->var->name;
+                                                 check_field_attrs(first, (yyvsp[-3].attr_list));
+                                                 (yyval.var_list) = set_var_types((yyvsp[-3].attr_list), (yyvsp[-2].declspec), (yyvsp[-1].declarator_list));
+                                               ;}
     break;
 
   case 196:
-#line 683 "parser.y"
-    { (yyval.type) = make_builtin((yyvsp[0].str)); ;}
+#line 741 "parser.y"
+    { var_t *v = make_var(NULL);
+                                                 v->type = (yyvsp[-1].type); v->attrs = (yyvsp[-2].attr_list);
+                                                 (yyval.var_list) = append_var(NULL, v);
+                                               ;}
     break;
 
   case 197:
-#line 684 "parser.y"
-    { (yyval.type) = make_builtin((yyvsp[0].str)); ;}
+#line 748 "parser.y"
+    { (yyval.var) = (yyvsp[-1].var); ;}
+    break;
+
+  case 198:
+#line 749 "parser.y"
+    { (yyval.var) = make_var(NULL); (yyval.var)->attrs = (yyvsp[-1].attr_list); ;}
     break;
 
   case 199:
-#line 686 "parser.y"
-    { (yyval.type) = (yyvsp[0].type); (yyval.type)->sign = 1; ;}
+#line 752 "parser.y"
+    { (yyval.var_list) = NULL; ;}
     break;
 
   case 200:
-#line 687 "parser.y"
+#line 753 "parser.y"
+    { (yyval.var_list) = append_var( (yyvsp[-1].var_list), (yyvsp[0].var) ); ;}
+    break;
+
+  case 201:
+#line 757 "parser.y"
+    { (yyval.var) = (yyvsp[-1].var); ;}
+    break;
+
+  case 202:
+#line 758 "parser.y"
+    { (yyval.var) = NULL; ;}
+    break;
+
+  case 203:
+#line 761 "parser.y"
+    { (yyval.var) = (yyvsp[0].declarator)->var;
+                                                 (yyval.var)->attrs = check_field_attrs((yyval.var)->name, (yyvsp[-2].attr_list));
+                                                 set_type((yyval.var), (yyvsp[-1].declspec), (yyvsp[0].declarator), FALSE);
+                                                 free((yyvsp[0].declarator));
+                                               ;}
+    break;
+
+  case 204:
+#line 769 "parser.y"
+    { var_t *v = (yyvsp[0].declarator)->var;
+                                                 v->attrs = check_function_attrs(v->name, (yyvsp[-2].attr_list));
+                                                 set_type(v, (yyvsp[-1].declspec), (yyvsp[0].declarator), FALSE);
+                                                 free((yyvsp[0].declarator));
+                                                 (yyval.func) = make_func(v);
+                                               ;}
+    break;
+
+  case 205:
+#line 779 "parser.y"
+    { (yyval.var) = (yyvsp[0].declarator)->var;
+                                                 (yyval.var)->attrs = (yyvsp[-2].attr_list);
+                                                 set_type((yyval.var), (yyvsp[-1].declspec), (yyvsp[0].declarator), FALSE);
+                                                 free((yyvsp[0].declarator));
+                                               ;}
+    break;
+
+  case 206:
+#line 784 "parser.y"
+    { (yyval.var) = (yyvsp[0].declarator)->var;
+                                                 set_type((yyval.var), (yyvsp[-1].declspec), (yyvsp[0].declarator), FALSE);
+                                                 free((yyvsp[0].declarator));
+                                               ;}
+    break;
+
+  case 207:
+#line 790 "parser.y"
+    { (yyval.var) = NULL; ;}
+    break;
+
+  case 209:
+#line 794 "parser.y"
+    { (yyval.var) = NULL; ;}
+    break;
+
+  case 210:
+#line 795 "parser.y"
+    { (yyval.var) = make_var((yyvsp[0].str)); ;}
+    break;
+
+  case 211:
+#line 796 "parser.y"
+    { (yyval.var) = make_var((yyvsp[0].str)); ;}
+    break;
+
+  case 212:
+#line 799 "parser.y"
+    { (yyval.var) = make_var((yyvsp[0].str)); ;}
+    break;
+
+  case 213:
+#line 801 "parser.y"
+    { (yyval.var) = make_var((yyvsp[0].str)); ;}
+    break;
+
+  case 214:
+#line 804 "parser.y"
+    { (yyval.type) = make_builtin((yyvsp[0].str)); ;}
+    break;
+
+  case 215:
+#line 805 "parser.y"
+    { (yyval.type) = make_builtin((yyvsp[0].str)); ;}
+    break;
+
+  case 217:
+#line 807 "parser.y"
+    { (yyval.type) = (yyvsp[0].type); (yyval.type)->sign = 1; ;}
+    break;
+
+  case 218:
+#line 808 "parser.y"
     { (yyval.type) = (yyvsp[0].type); (yyval.type)->sign = -1;
                                                  switch ((yyval.type)->type) {
                                                  case RPC_FC_CHAR:  break;
@@ -3181,93 +3625,93 @@ yyreduce:
                                                ;}
     break;
 
-  case 201:
-#line 703 "parser.y"
+  case 219:
+#line 824 "parser.y"
     { (yyval.type) = make_int(-1); ;}
     break;
 
-  case 202:
-#line 704 "parser.y"
+  case 220:
+#line 825 "parser.y"
     { (yyval.type) = make_builtin((yyvsp[0].str)); ;}
     break;
 
-  case 203:
-#line 705 "parser.y"
+  case 221:
+#line 826 "parser.y"
     { (yyval.type) = duptype(find_type("float", 0), 1); ;}
     break;
 
-  case 204:
-#line 706 "parser.y"
+  case 222:
+#line 827 "parser.y"
     { (yyval.type) = make_builtin((yyvsp[0].str)); ;}
     break;
 
-  case 205:
-#line 707 "parser.y"
+  case 223:
+#line 828 "parser.y"
     { (yyval.type) = make_builtin((yyvsp[0].str)); ;}
     break;
 
-  case 206:
-#line 708 "parser.y"
+  case 224:
+#line 829 "parser.y"
     { (yyval.type) = make_builtin((yyvsp[0].str)); ;}
     break;
 
-  case 207:
-#line 709 "parser.y"
+  case 225:
+#line 830 "parser.y"
     { (yyval.type) = make_builtin((yyvsp[0].str)); ;}
     break;
 
-  case 210:
-#line 716 "parser.y"
+  case 228:
+#line 837 "parser.y"
     { (yyval.type) = make_builtin((yyvsp[0].str)); ;}
     break;
 
-  case 211:
-#line 717 "parser.y"
+  case 229:
+#line 838 "parser.y"
     { (yyval.type) = make_builtin((yyvsp[-1].str)); ;}
     break;
 
-  case 212:
-#line 718 "parser.y"
+  case 230:
+#line 839 "parser.y"
     { (yyval.type) = make_builtin((yyvsp[0].str)); ;}
     break;
 
-  case 213:
-#line 719 "parser.y"
+  case 231:
+#line 840 "parser.y"
     { (yyval.type) = make_builtin((yyvsp[-1].str)); ;}
     break;
 
-  case 214:
-#line 720 "parser.y"
+  case 232:
+#line 841 "parser.y"
     { (yyval.type) = make_builtin((yyvsp[-1].str)); ;}
     break;
 
-  case 215:
-#line 721 "parser.y"
+  case 233:
+#line 842 "parser.y"
     { (yyval.type) = make_builtin((yyvsp[0].str)); ;}
     break;
 
-  case 216:
-#line 722 "parser.y"
+  case 234:
+#line 843 "parser.y"
     { (yyval.type) = make_builtin((yyvsp[0].str)); ;}
     break;
 
-  case 217:
-#line 725 "parser.y"
+  case 235:
+#line 846 "parser.y"
     { (yyval.type) = make_class((yyvsp[0].str)); ;}
     break;
 
-  case 218:
-#line 726 "parser.y"
+  case 236:
+#line 847 "parser.y"
     { (yyval.type) = find_type((yyvsp[0].str), 0);
                                                  if ((yyval.type)->defined) error_loc("multiple definition error\n");
                                                  if ((yyval.type)->kind != TKIND_COCLASS) error_loc("%s was not declared a coclass\n", (yyvsp[0].str));
                                                ;}
     break;
 
-  case 219:
-#line 732 "parser.y"
+  case 237:
+#line 853 "parser.y"
     { (yyval.type) = (yyvsp[0].type);
-                                                 (yyval.type)->attrs = (yyvsp[-1].attr_list);
+                                                 (yyval.type)->attrs = check_coclass_attrs((yyvsp[0].type)->name, (yyvsp[-1].attr_list));
                                                  if (!parse_only && do_header)
                                                    write_coclass((yyval.type));
                                                  if (!parse_only && do_idfile)
@@ -3275,46 +3719,48 @@ yyreduce:
                                                ;}
     break;
 
-  case 220:
-#line 741 "parser.y"
-    { (yyval.type) = (yyvsp[-3].type);
-                                                 (yyval.type)->ifaces = (yyvsp[-1].ifref_list);
+  case 238:
+#line 863 "parser.y"
+    { (yyval.type) = (yyvsp[-4].type);
+                                                 (yyval.type)->ifaces = (yyvsp[-2].ifref_list);
                                                  (yyval.type)->defined = TRUE;
                                                ;}
     break;
 
-  case 221:
-#line 747 "parser.y"
+  case 239:
+#line 869 "parser.y"
     { (yyval.ifref_list) = NULL; ;}
     break;
 
-  case 222:
-#line 748 "parser.y"
+  case 240:
+#line 870 "parser.y"
     { (yyval.ifref_list) = append_ifref( (yyvsp[-1].ifref_list), (yyvsp[0].ifref) ); ;}
     break;
 
-  case 223:
-#line 752 "parser.y"
+  case 241:
+#line 874 "parser.y"
     { (yyval.ifref) = make_ifref((yyvsp[0].type)); (yyval.ifref)->attrs = (yyvsp[-1].attr_list); ;}
     break;
 
-  case 224:
-#line 755 "parser.y"
-    { (yyval.type) = get_type(0, (yyvsp[0].str), 0); (yyval.type)->kind = TKIND_DISPATCH; ;}
+  case 242:
+#line 877 "parser.y"
+    { (yyval.type) = get_type(RPC_FC_IP, (yyvsp[0].str), 0); (yyval.type)->kind = TKIND_DISPATCH; ;}
     break;
 
-  case 225:
-#line 756 "parser.y"
-    { (yyval.type) = get_type(0, (yyvsp[0].str), 0); (yyval.type)->kind = TKIND_DISPATCH; ;}
+  case 243:
+#line 878 "parser.y"
+    { (yyval.type) = get_type(RPC_FC_IP, (yyvsp[0].str), 0); (yyval.type)->kind = TKIND_DISPATCH; ;}
     break;
 
-  case 226:
-#line 759 "parser.y"
+  case 244:
+#line 881 "parser.y"
     { attr_t *attrs;
+                                                 is_in_interface = TRUE;
+                                                 is_object_interface = TRUE;
                                                  (yyval.type) = (yyvsp[0].type);
                                                  if ((yyval.type)->defined) error_loc("multiple definition error\n");
                                                  attrs = make_attr(ATTR_DISPINTERFACE);
-                                                 (yyval.type)->attrs = append_attr( (yyvsp[-1].attr_list), attrs );
+                                                 (yyval.type)->attrs = append_attr( check_dispiface_attrs((yyvsp[0].type)->name, (yyvsp[-1].attr_list)), attrs );
                                                  (yyval.type)->ref = find_type("IDispatch", 0);
                                                  if (!(yyval.type)->ref) error_loc("IDispatch is undefined\n");
                                                  (yyval.type)->defined = TRUE;
@@ -3322,298 +3768,388 @@ yyreduce:
                                                ;}
     break;
 
-  case 227:
-#line 771 "parser.y"
+  case 245:
+#line 895 "parser.y"
     { (yyval.var_list) = NULL; ;}
     break;
 
-  case 228:
-#line 772 "parser.y"
+  case 246:
+#line 896 "parser.y"
     { (yyval.var_list) = append_var( (yyvsp[-2].var_list), (yyvsp[-1].var) ); ;}
     break;
 
-  case 229:
-#line 775 "parser.y"
+  case 247:
+#line 899 "parser.y"
     { (yyval.func_list) = NULL; ;}
     break;
 
-  case 230:
-#line 776 "parser.y"
+  case 248:
+#line 900 "parser.y"
     { (yyval.func_list) = append_func( (yyvsp[-2].func_list), (yyvsp[-1].func) ); ;}
     break;
 
-  case 231:
-#line 782 "parser.y"
+  case 249:
+#line 906 "parser.y"
     { (yyval.type) = (yyvsp[-4].type);
-                                                 (yyval.type)->fields = (yyvsp[-2].var_list);
+                                                 (yyval.type)->fields_or_args = (yyvsp[-2].var_list);
                                                  (yyval.type)->funcs = (yyvsp[-1].func_list);
-                                                 if (!parse_only && do_header) write_dispinterface((yyval.type));
+                                                 if (!parse_only && do_header) write_interface((yyval.type));
                                                  if (!parse_only && do_idfile) write_diid((yyval.type));
+                                                 is_in_interface = FALSE;
                                                ;}
     break;
 
-  case 232:
-#line 789 "parser.y"
+  case 250:
+#line 914 "parser.y"
     { (yyval.type) = (yyvsp[-4].type);
-                                                 (yyval.type)->fields = (yyvsp[-2].type)->fields;
+                                                 (yyval.type)->fields_or_args = (yyvsp[-2].type)->fields_or_args;
                                                  (yyval.type)->funcs = (yyvsp[-2].type)->funcs;
-                                                 if (!parse_only && do_header) write_dispinterface((yyval.type));
+                                                 if (!parse_only && do_header) write_interface((yyval.type));
                                                  if (!parse_only && do_idfile) write_diid((yyval.type));
+                                                 is_in_interface = FALSE;
                                                ;}
     break;
 
-  case 233:
-#line 797 "parser.y"
+  case 251:
+#line 923 "parser.y"
     { (yyval.type) = NULL; ;}
     break;
 
-  case 234:
-#line 798 "parser.y"
+  case 252:
+#line 924 "parser.y"
     { (yyval.type) = find_type2((yyvsp[0].str), 0); ;}
     break;
 
-  case 235:
-#line 801 "parser.y"
+  case 253:
+#line 927 "parser.y"
     { (yyval.type) = get_type(RPC_FC_IP, (yyvsp[0].str), 0); (yyval.type)->kind = TKIND_INTERFACE; ;}
     break;
 
-  case 236:
-#line 802 "parser.y"
+  case 254:
+#line 928 "parser.y"
     { (yyval.type) = get_type(RPC_FC_IP, (yyvsp[0].str), 0); (yyval.type)->kind = TKIND_INTERFACE; ;}
     break;
 
-  case 237:
-#line 805 "parser.y"
+  case 255:
+#line 931 "parser.y"
     { (yyval.ifinfo).interface = (yyvsp[0].type);
                                                  (yyval.ifinfo).old_pointer_default = pointer_default;
                                                  if (is_attr((yyvsp[-1].attr_list), ATTR_POINTERDEFAULT))
                                                    pointer_default = get_attrv((yyvsp[-1].attr_list), ATTR_POINTERDEFAULT);
+                                                 is_object_interface = is_object((yyvsp[-1].attr_list));
+                                                 is_in_interface = TRUE;
                                                  if ((yyvsp[0].type)->defined) error_loc("multiple definition error\n");
-                                                 (yyvsp[0].type)->attrs = (yyvsp[-1].attr_list);
+                                                 (yyvsp[0].type)->attrs = check_iface_attrs((yyvsp[0].type)->name, (yyvsp[-1].attr_list));
                                                  (yyvsp[0].type)->defined = TRUE;
                                                  if (!parse_only && do_header) write_forward((yyvsp[0].type));
                                                ;}
     break;
 
-  case 238:
-#line 817 "parser.y"
-    { (yyval.type) = (yyvsp[-4].ifinfo).interface;
-                                                 (yyval.type)->ref = (yyvsp[-3].type);
-                                                 (yyval.type)->funcs = (yyvsp[-1].func_list);
+  case 256:
+#line 945 "parser.y"
+    { (yyval.type) = (yyvsp[-5].ifinfo).interface;
+                                                 (yyval.type)->ref = (yyvsp[-4].type);
+                                                 (yyval.type)->funcs = (yyvsp[-2].func_list);
+                                                 check_functions((yyval.type));
                                                  compute_method_indexes((yyval.type));
                                                  if (!parse_only && do_header) write_interface((yyval.type));
                                                  if (!parse_only && local_stubs) write_locals(local_stubs, (yyval.type), TRUE);
                                                  if (!parse_only && do_idfile) write_iid((yyval.type));
-                                                 pointer_default = (yyvsp[-4].ifinfo).old_pointer_default;
+                                                 pointer_default = (yyvsp[-5].ifinfo).old_pointer_default;
+                                                 is_in_interface = FALSE;
                                                ;}
     break;
 
-  case 239:
-#line 829 "parser.y"
-    { (yyval.type) = (yyvsp[-6].ifinfo).interface;
-                                                 (yyval.type)->ref = find_type2((yyvsp[-4].str), 0);
-                                                 if (!(yyval.type)->ref) error_loc("base class '%s' not found in import\n", (yyvsp[-4].str));
-                                                 (yyval.type)->funcs = (yyvsp[-1].func_list);
+  case 257:
+#line 960 "parser.y"
+    { (yyval.type) = (yyvsp[-7].ifinfo).interface;
+                                                 (yyval.type)->ref = find_type2((yyvsp[-5].str), 0);
+                                                 if (!(yyval.type)->ref) error_loc("base class '%s' not found in import\n", (yyvsp[-5].str));
+                                                 (yyval.type)->funcs = (yyvsp[-2].func_list);
                                                  compute_method_indexes((yyval.type));
                                                  if (!parse_only && do_header) write_interface((yyval.type));
                                                  if (!parse_only && local_stubs) write_locals(local_stubs, (yyval.type), TRUE);
                                                  if (!parse_only && do_idfile) write_iid((yyval.type));
-                                                 pointer_default = (yyvsp[-6].ifinfo).old_pointer_default;
+                                                 pointer_default = (yyvsp[-7].ifinfo).old_pointer_default;
+                                                 is_in_interface = FALSE;
                                                ;}
     break;
 
-  case 240:
-#line 839 "parser.y"
-    { (yyval.type) = (yyvsp[0].type); ;}
+  case 258:
+#line 971 "parser.y"
+    { (yyval.type) = (yyvsp[-1].type); ;}
     break;
 
-  case 241:
-#line 843 "parser.y"
+  case 259:
+#line 975 "parser.y"
     { (yyval.type) = (yyvsp[-1].type); if (!parse_only && do_header) write_forward((yyval.type)); ;}
     break;
 
-  case 242:
-#line 844 "parser.y"
+  case 260:
+#line 976 "parser.y"
     { (yyval.type) = (yyvsp[-1].type); if (!parse_only && do_header) write_forward((yyval.type)); ;}
     break;
 
-  case 243:
-#line 847 "parser.y"
+  case 261:
+#line 979 "parser.y"
     { (yyval.type) = make_type(0, NULL); (yyval.type)->name = (yyvsp[0].str); (yyval.type)->kind = TKIND_MODULE; ;}
     break;
 
-  case 244:
-#line 848 "parser.y"
+  case 262:
+#line 980 "parser.y"
     { (yyval.type) = make_type(0, NULL); (yyval.type)->name = (yyvsp[0].str); (yyval.type)->kind = TKIND_MODULE; ;}
     break;
 
-  case 245:
-#line 851 "parser.y"
+  case 263:
+#line 983 "parser.y"
     { (yyval.type) = (yyvsp[0].type);
-                                                 (yyval.type)->attrs = (yyvsp[-1].attr_list);
+                                                 (yyval.type)->attrs = check_module_attrs((yyvsp[0].type)->name, (yyvsp[-1].attr_list));
                                                ;}
     break;
 
-  case 246:
-#line 856 "parser.y"
-    { (yyval.type) = (yyvsp[-3].type);
-                                                 (yyval.type)->funcs = (yyvsp[-1].func_list);
+  case 264:
+#line 989 "parser.y"
+    { (yyval.type) = (yyvsp[-4].type);
+                                                 (yyval.type)->funcs = (yyvsp[-2].func_list);
                                                  /* FIXME: if (!parse_only && do_header) write_module($$); */
                                                ;}
     break;
 
-  case 247:
-#line 862 "parser.y"
-    { (yyval.pident) = (yyvsp[0].pident); (yyval.pident)->ptr_level++; ;}
+  case 265:
+#line 996 "parser.y"
+    { (yyval.stgclass) = STG_EXTERN; ;}
     break;
 
-  case 248:
-#line 863 "parser.y"
-    { (yyval.pident) = (yyvsp[0].pident); /* FIXME */ ;}
+  case 266:
+#line 997 "parser.y"
+    { (yyval.stgclass) = STG_STATIC; ;}
     break;
 
-  case 249:
-#line 866 "parser.y"
-    { (yyval.pident) = make_pident((yyvsp[0].var)); ;}
+  case 267:
+#line 998 "parser.y"
+    { (yyval.stgclass) = STG_REGISTER; ;}
     break;
 
-  case 251:
-#line 868 "parser.y"
-    { (yyval.pident) = (yyvsp[-1].pident); ;}
+  case 268:
+#line 1002 "parser.y"
+    { (yyval.attr) = make_attr(ATTR_INLINE); ;}
     break;
 
-  case 252:
-#line 872 "parser.y"
-    { (yyval.pident_list) = append_pident( NULL, (yyvsp[0].pident) ); ;}
+  case 269:
+#line 1006 "parser.y"
+    { (yyval.attr) = make_attr(ATTR_CONST); ;}
     break;
 
-  case 253:
-#line 873 "parser.y"
-    { (yyval.pident_list) = append_pident( (yyvsp[-2].pident_list), (yyvsp[0].pident) ); ;}
+  case 270:
+#line 1009 "parser.y"
+    { (yyval.attr_list) = NULL; ;}
     break;
 
-  case 254:
-#line 877 "parser.y"
+  case 271:
+#line 1010 "parser.y"
+    { (yyval.attr_list) = append_attr((yyvsp[-1].attr_list), (yyvsp[0].attr)); ;}
+    break;
+
+  case 272:
+#line 1013 "parser.y"
+    { (yyval.declspec) = make_decl_spec((yyvsp[-1].type), (yyvsp[0].declspec), NULL, NULL, STG_NONE); ;}
+    break;
+
+  case 273:
+#line 1015 "parser.y"
+    { (yyval.declspec) = make_decl_spec((yyvsp[-1].type), (yyvsp[-2].declspec), (yyvsp[0].declspec), NULL, STG_NONE); ;}
+    break;
+
+  case 274:
+#line 1018 "parser.y"
+    { (yyval.declspec) = NULL; ;}
+    break;
+
+  case 276:
+#line 1023 "parser.y"
+    { (yyval.declspec) = make_decl_spec(NULL, (yyvsp[0].declspec), NULL, (yyvsp[-1].attr), STG_NONE); ;}
+    break;
+
+  case 277:
+#line 1024 "parser.y"
+    { (yyval.declspec) = make_decl_spec(NULL, (yyvsp[0].declspec), NULL, (yyvsp[-1].attr), STG_NONE); ;}
+    break;
+
+  case 278:
+#line 1025 "parser.y"
+    { (yyval.declspec) = make_decl_spec(NULL, (yyvsp[0].declspec), NULL, NULL, (yyvsp[-1].stgclass)); ;}
+    break;
+
+  case 279:
+#line 1030 "parser.y"
+    { (yyval.declarator) = (yyvsp[0].declarator); (yyval.declarator)->type = append_ptrchain_type((yyval.declarator)->type, make_pointer_type(NULL, (yyvsp[-1].attr_list))); ;}
+    break;
+
+  case 280:
+#line 1031 "parser.y"
+    { (yyval.declarator) = (yyvsp[0].declarator); (yyval.declarator)->type->attrs = append_attr((yyval.declarator)->type->attrs, make_attrp(ATTR_CALLCONV, (yyvsp[-1].str))); ;}
+    break;
+
+  case 282:
+#line 1036 "parser.y"
+    { (yyval.declarator) = make_declarator((yyvsp[0].var)); ;}
+    break;
+
+  case 283:
+#line 1037 "parser.y"
+    { (yyval.declarator) = (yyvsp[-1].declarator); ;}
+    break;
+
+  case 284:
+#line 1038 "parser.y"
+    { (yyval.declarator) = (yyvsp[-1].declarator); (yyval.declarator)->array = append_array((yyval.declarator)->array, (yyvsp[0].expr)); ;}
+    break;
+
+  case 285:
+#line 1039 "parser.y"
+    { (yyval.declarator) = (yyvsp[-3].declarator);
+                                                 (yyval.declarator)->func_type = append_ptrchain_type((yyval.declarator)->type, make_func_type((yyvsp[-1].var_list)));
+                                                 (yyval.declarator)->type = NULL;
+                                               ;}
+    break;
+
+  case 286:
+#line 1046 "parser.y"
+    { (yyval.declarator_list) = append_declarator( NULL, (yyvsp[0].declarator) ); ;}
+    break;
+
+  case 287:
+#line 1047 "parser.y"
+    { (yyval.declarator_list) = append_declarator( (yyvsp[-2].declarator_list), (yyvsp[0].declarator) ); ;}
+    break;
+
+  case 288:
+#line 1051 "parser.y"
+    { (yyval.declarator) = (yyvsp[0].declarator); ;}
+    break;
+
+  case 289:
+#line 1052 "parser.y"
+    { (yyval.declarator) = (yyvsp[-2].declarator); (yyvsp[-2].declarator)->var->eval = (yyvsp[0].expr); ;}
+    break;
+
+  case 290:
+#line 1056 "parser.y"
     { (yyval.num) = RPC_FC_RP; ;}
     break;
 
-  case 255:
-#line 878 "parser.y"
+  case 291:
+#line 1057 "parser.y"
     { (yyval.num) = RPC_FC_UP; ;}
     break;
 
-  case 256:
-#line 879 "parser.y"
+  case 292:
+#line 1058 "parser.y"
     { (yyval.num) = RPC_FC_FP; ;}
     break;
 
-  case 257:
-#line 882 "parser.y"
+  case 293:
+#line 1061 "parser.y"
     { (yyval.type) = get_typev(RPC_FC_STRUCT, (yyvsp[-3].var), tsSTRUCT);
                                                   /* overwrite RPC_FC_STRUCT with a more exact type */
                                                  (yyval.type)->type = get_struct_type( (yyvsp[-1].var_list) );
                                                  (yyval.type)->kind = TKIND_RECORD;
-                                                 (yyval.type)->fields = (yyvsp[-1].var_list);
+                                                 (yyval.type)->fields_or_args = (yyvsp[-1].var_list);
                                                  (yyval.type)->defined = TRUE;
                                                   if(in_typelib)
                                                       add_typelib_entry((yyval.type));
                                                 ;}
     break;
 
-  case 258:
-#line 893 "parser.y"
+  case 294:
+#line 1072 "parser.y"
     { (yyval.type) = duptype(find_type("void", 0), 1); ;}
     break;
 
-  case 259:
-#line 894 "parser.y"
+  case 295:
+#line 1073 "parser.y"
     { (yyval.type) = find_type((yyvsp[0].str), 0); ;}
     break;
 
-  case 260:
-#line 895 "parser.y"
+  case 296:
+#line 1074 "parser.y"
     { (yyval.type) = (yyvsp[0].type); ;}
     break;
 
-  case 261:
-#line 896 "parser.y"
-    { (yyval.type) = duptype((yyvsp[0].type), 1); (yyval.type)->is_const = TRUE; ;}
-    break;
-
-  case 262:
-#line 897 "parser.y"
+  case 297:
+#line 1075 "parser.y"
     { (yyval.type) = (yyvsp[0].type); ;}
     break;
 
-  case 263:
-#line 898 "parser.y"
+  case 298:
+#line 1076 "parser.y"
     { (yyval.type) = find_type2((yyvsp[0].str), tsENUM); ;}
     break;
 
-  case 264:
-#line 899 "parser.y"
+  case 299:
+#line 1077 "parser.y"
     { (yyval.type) = (yyvsp[0].type); ;}
     break;
 
-  case 265:
-#line 900 "parser.y"
+  case 300:
+#line 1078 "parser.y"
     { (yyval.type) = get_type(RPC_FC_STRUCT, (yyvsp[0].str), tsSTRUCT); ;}
     break;
 
-  case 266:
-#line 901 "parser.y"
+  case 301:
+#line 1079 "parser.y"
     { (yyval.type) = (yyvsp[0].type); ;}
     break;
 
-  case 267:
-#line 902 "parser.y"
+  case 302:
+#line 1080 "parser.y"
     { (yyval.type) = find_type2((yyvsp[0].str), tsUNION); ;}
     break;
 
-  case 268:
-#line 903 "parser.y"
+  case 303:
+#line 1081 "parser.y"
     { (yyval.type) = make_safearray((yyvsp[-1].type)); ;}
     break;
 
-  case 269:
-#line 906 "parser.y"
-    { reg_typedefs((yyvsp[-1].type), (yyvsp[0].pident_list), (yyvsp[-2].attr_list));
-                                                 process_typedefs((yyvsp[0].pident_list));
+  case 304:
+#line 1085 "parser.y"
+    { reg_typedefs((yyvsp[-1].declspec), (yyvsp[0].declarator_list), check_typedef_attrs((yyvsp[-2].attr_list)));
+                                                 (yyval.statement) = process_typedefs((yyvsp[0].declarator_list));
                                                ;}
     break;
 
-  case 270:
-#line 911 "parser.y"
+  case 305:
+#line 1091 "parser.y"
     { (yyval.type) = get_typev(RPC_FC_NON_ENCAPSULATED_UNION, (yyvsp[-3].var), tsUNION);
                                                  (yyval.type)->kind = TKIND_UNION;
-                                                 (yyval.type)->fields = (yyvsp[-1].var_list);
+                                                 (yyval.type)->fields_or_args = (yyvsp[-1].var_list);
                                                  (yyval.type)->defined = TRUE;
                                                ;}
     break;
 
-  case 271:
-#line 918 "parser.y"
+  case 306:
+#line 1098 "parser.y"
     { var_t *u = (yyvsp[-3].var);
                                                  (yyval.type) = get_typev(RPC_FC_ENCAPSULATED_UNION, (yyvsp[-8].var), tsUNION);
                                                  (yyval.type)->kind = TKIND_UNION;
                                                  if (!u) u = make_var( xstrdup("tagged_union") );
                                                  u->type = make_type(RPC_FC_NON_ENCAPSULATED_UNION, NULL);
                                                  u->type->kind = TKIND_UNION;
-                                                 u->type->fields = (yyvsp[-1].var_list);
+                                                 u->type->fields_or_args = (yyvsp[-1].var_list);
                                                  u->type->defined = TRUE;
-                                                 (yyval.type)->fields = append_var( (yyval.type)->fields, (yyvsp[-5].var) );
-                                                 (yyval.type)->fields = append_var( (yyval.type)->fields, u );
+                                                 (yyval.type)->fields_or_args = append_var( (yyval.type)->fields_or_args, (yyvsp[-5].var) );
+                                                 (yyval.type)->fields_or_args = append_var( (yyval.type)->fields_or_args, u );
                                                  (yyval.type)->defined = TRUE;
                                                ;}
     break;
 
-  case 272:
-#line 933 "parser.y"
+  case 307:
+#line 1113 "parser.y"
     { (yyval.num) = MAKEVERSION((yyvsp[0].num), 0); ;}
     break;
 
-  case 273:
-#line 934 "parser.y"
+  case 308:
+#line 1114 "parser.y"
     { (yyval.num) = MAKEVERSION((yyvsp[-2].num), (yyvsp[0].num)); ;}
     break;
 
@@ -3622,7 +4158,7 @@ yyreduce:
     }
 
 /* Line 1126 of yacc.c.  */
-#line 3626 "parser.tab.c"
+#line 4162 "parser.tab.c"
 \f
   yyvsp -= yylen;
   yyssp -= yylen;
@@ -3890,7 +4426,7 @@ yyreturn:
 }
 
 
-#line 937 "parser.y"
+#line 1117 "parser.y"
 
 
 static void decl_builtin(const char *name, unsigned char type)
@@ -3956,239 +4492,144 @@ static str_list_t *append_str(str_list_t *list, char *str)
 
 static attr_list_t *append_attr(attr_list_t *list, attr_t *attr)
 {
+    attr_t *attr_existing;
     if (!attr) return list;
     if (!list)
     {
         list = xmalloc( sizeof(*list) );
         list_init( list );
     }
+    LIST_FOR_EACH_ENTRY(attr_existing, list, attr_t, entry)
+        if (attr_existing->type == attr->type)
+        {
+            parser_warning("duplicate attribute %s\n", get_attr_display_name(attr->type));
+            /* use the last attribute, like MIDL does */
+            list_remove(&attr_existing->entry);
+            break;
+        }
     list_add_tail( list, &attr->entry );
     return list;
 }
 
-static attr_t *make_attr(enum attr_type type)
-{
-  attr_t *a = xmalloc(sizeof(attr_t));
-  a->type = type;
-  a->u.ival = 0;
-  return a;
-}
-
-static attr_t *make_attrv(enum attr_type type, unsigned long val)
+static attr_list_t *move_attr(attr_list_t *dst, attr_list_t *src, enum attr_type type)
 {
-  attr_t *a = xmalloc(sizeof(attr_t));
-  a->type = type;
-  a->u.ival = val;
-  return a;
+  attr_t *attr;
+  if (!src) return dst;
+  LIST_FOR_EACH_ENTRY(attr, src, attr_t, entry)
+    if (attr->type == type)
+    {
+      list_remove(&attr->entry);
+      return append_attr(dst, attr);
+    }
+  return dst;
 }
 
-static attr_t *make_attrp(enum attr_type type, void *val)
+static attr_list_t *append_attr_list(attr_list_t *new_list, attr_list_t *old_list)
 {
-  attr_t *a = xmalloc(sizeof(attr_t));
-  a->type = type;
-  a->u.pval = val;
-  return a;
-}
+  struct list *entry;
 
-static expr_t *make_expr(enum expr_type type)
-{
-  expr_t *e = xmalloc(sizeof(expr_t));
-  e->type = type;
-  e->ref = NULL;
-  e->u.lval = 0;
-  e->is_const = FALSE;
-  e->cval = 0;
-  return e;
-}
+  if (!old_list) return new_list;
 
-static expr_t *make_exprl(enum expr_type type, long val)
-{
-  expr_t *e = xmalloc(sizeof(expr_t));
-  e->type = type;
-  e->ref = NULL;
-  e->u.lval = val;
-  e->is_const = FALSE;
-  /* check for numeric constant */
-  if (type == EXPR_NUM || type == EXPR_HEXNUM || type == EXPR_TRUEFALSE) {
-    /* make sure true/false value is valid */
-    assert(type != EXPR_TRUEFALSE || val == 0 || val == 1);
-    e->is_const = TRUE;
-    e->cval = val;
+  while ((entry = list_head(old_list)))
+  {
+    attr_t *attr = LIST_ENTRY(entry, attr_t, entry);
+    list_remove(entry);
+    new_list = append_attr(new_list, attr);
   }
-  return e;
+  return new_list;
 }
 
-static expr_t *make_exprd(enum expr_type type, double val)
+static attr_list_t *dupattrs(const attr_list_t *list)
 {
-  expr_t *e = xmalloc(sizeof(expr_t));
-  e->type = type;
-  e->ref = NULL;
-  e->u.dval = val;
-  e->is_const = TRUE;
-  e->cval = val;
-  return e;
-}
+  attr_list_t *new_list;
+  const attr_t *attr;
 
-static expr_t *make_exprs(enum expr_type type, char *val)
-{
-  expr_t *e;
-  e = xmalloc(sizeof(expr_t));
-  e->type = type;
-  e->ref = NULL;
-  e->u.sval = val;
-  e->is_const = FALSE;
-  /* check for predefined constants */
-  if (type == EXPR_IDENTIFIER) {
-    var_t *c = find_const(val, 0);
-    if (c) {
-      e->u.sval = c->name;
-      free(val);
-      e->is_const = TRUE;
-      e->cval = c->eval->cval;
-    }
+  if (!list) return NULL;
+
+  new_list = xmalloc( sizeof(*list) );
+  list_init( new_list );
+  LIST_FOR_EACH_ENTRY(attr, list, const attr_t, entry)
+  {
+    attr_t *new_attr = xmalloc(sizeof(*new_attr));
+    *new_attr = *attr;
+    list_add_tail(new_list, &new_attr->entry);
   }
-  return e;
+  return new_list;
 }
 
-static expr_t *make_exprt(enum expr_type type, type_t *tref, expr_t *expr)
+static decl_spec_t *make_decl_spec(type_t *type, decl_spec_t *left, decl_spec_t *right, attr_t *attr, enum storage_class stgclass)
 {
-  expr_t *e;
-  e = xmalloc(sizeof(expr_t));
-  e->type = type;
-  e->ref = expr;
-  e->u.tref = tref;
-  e->is_const = FALSE;
-  /* check for cast of constant expression */
-  if (type == EXPR_SIZEOF) {
-    switch (tref->type) {
-      case RPC_FC_BYTE:
-      case RPC_FC_CHAR:
-      case RPC_FC_SMALL:
-      case RPC_FC_USMALL:
-        e->is_const = TRUE;
-        e->cval = 1;
-        break;
-      case RPC_FC_WCHAR:
-      case RPC_FC_USHORT:
-      case RPC_FC_SHORT:
-        e->is_const = TRUE;
-        e->cval = 2;
-        break;
-      case RPC_FC_LONG:
-      case RPC_FC_ULONG:
-      case RPC_FC_FLOAT:
-      case RPC_FC_ERROR_STATUS_T:
-        e->is_const = TRUE;
-        e->cval = 4;
-        break;
-      case RPC_FC_HYPER:
-      case RPC_FC_DOUBLE:
-        e->is_const = TRUE;
-        e->cval = 8;
-        break;
-    }
+  decl_spec_t *declspec = left ? left : right;
+  if (!declspec)
+  {
+    declspec = xmalloc(sizeof(*declspec));
+    declspec->type = NULL;
+    declspec->attrs = NULL;
+    declspec->stgclass = STG_NONE;
+  }
+  declspec->type = type;
+  if (left && declspec != left)
+  {
+    declspec->attrs = append_attr_list(declspec->attrs, left->attrs);
+    if (declspec->stgclass == STG_NONE)
+      declspec->stgclass = left->stgclass;
+    else if (left->stgclass != STG_NONE)
+      error_loc("only one storage class can be specified\n");
+    assert(!left->type);
+    free(left);
   }
-  if (type == EXPR_CAST && expr->is_const) {
-    e->is_const = TRUE;
-    e->cval = expr->cval;
+  if (right && declspec != right)
+  {
+    declspec->attrs = append_attr_list(declspec->attrs, right->attrs);
+    if (declspec->stgclass == STG_NONE)
+      declspec->stgclass = right->stgclass;
+    else if (right->stgclass != STG_NONE)
+      error_loc("only one storage class can be specified\n");
+    assert(!right->type);
+    free(right);
+  }
+
+  declspec->attrs = append_attr(declspec->attrs, attr);
+  if (declspec->stgclass == STG_NONE)
+    declspec->stgclass = stgclass;
+  else if (stgclass != STG_NONE)
+    error_loc("only one storage class can be specified\n");
+
+  /* apply attributes to type */
+  if (type && declspec->attrs)
+  {
+    attr_list_t *attrs;
+    declspec->type = duptype(type, 1);
+    attrs = dupattrs(type->attrs);
+    declspec->type->attrs = append_attr_list(attrs, declspec->attrs);
+    declspec->attrs = NULL;
   }
-  return e;
+
+  return declspec;
 }
 
-static expr_t *make_expr1(enum expr_type type, expr_t *expr)
+static attr_t *make_attr(enum attr_type type)
 {
-  expr_t *e;
-  if (type == EXPR_ADDRESSOF && expr->type != EXPR_IDENTIFIER)
-    error("address-of operator applied to invalid expression\n");
-  e = xmalloc(sizeof(expr_t));
-  e->type = type;
-  e->ref = expr;
-  e->u.lval = 0;
-  e->is_const = FALSE;
-  /* check for compile-time optimization */
-  if (expr->is_const) {
-    e->is_const = TRUE;
-    switch (type) {
-    case EXPR_NEG:
-      e->cval = -expr->cval;
-      break;
-    case EXPR_NOT:
-      e->cval = ~expr->cval;
-      break;
-    default:
-      e->is_const = FALSE;
-      break;
-    }
-  }
-  return e;
+  attr_t *a = xmalloc(sizeof(attr_t));
+  a->type = type;
+  a->u.ival = 0;
+  return a;
 }
 
-static expr_t *make_expr2(enum expr_type type, expr_t *expr1, expr_t *expr2)
+static attr_t *make_attrv(enum attr_type type, unsigned long val)
 {
-  expr_t *e;
-  e = xmalloc(sizeof(expr_t));
-  e->type = type;
-  e->ref = expr1;
-  e->u.ext = expr2;
-  e->is_const = FALSE;
-  /* check for compile-time optimization */
-  if (expr1->is_const && expr2->is_const) {
-    e->is_const = TRUE;
-    switch (type) {
-    case EXPR_ADD:
-      e->cval = expr1->cval + expr2->cval;
-      break;
-    case EXPR_SUB:
-      e->cval = expr1->cval - expr2->cval;
-      break;
-    case EXPR_MUL:
-      e->cval = expr1->cval * expr2->cval;
-      break;
-    case EXPR_DIV:
-      e->cval = expr1->cval / expr2->cval;
-      break;
-    case EXPR_OR:
-      e->cval = expr1->cval | expr2->cval;
-      break;
-    case EXPR_AND:
-      e->cval = expr1->cval & expr2->cval;
-      break;
-    case EXPR_SHL:
-      e->cval = expr1->cval << expr2->cval;
-      break;
-    case EXPR_SHR:
-      e->cval = expr1->cval >> expr2->cval;
-      break;
-    default:
-      e->is_const = FALSE;
-      break;
-    }
-  }
-  return e;
+  attr_t *a = xmalloc(sizeof(attr_t));
+  a->type = type;
+  a->u.ival = val;
+  return a;
 }
 
-static expr_t *make_expr3(enum expr_type type, expr_t *expr1, expr_t *expr2, expr_t *expr3)
+static attr_t *make_attrp(enum attr_type type, void *val)
 {
-  expr_t *e;
-  e = xmalloc(sizeof(expr_t));
-  e->type = type;
-  e->ref = expr1;
-  e->u.ext = expr2;
-  e->ext2 = expr3;
-  e->is_const = FALSE;
-  /* check for compile-time optimization */
-  if (expr1->is_const && expr2->is_const && expr3->is_const) {
-    e->is_const = TRUE;
-    switch (type) {
-    case EXPR_COND:
-      e->cval = expr1->cval ? expr2->cval : expr3->cval;
-      break;
-    default:
-      e->is_const = FALSE;
-      break;
-    }
-  }
-  return e;
+  attr_t *a = xmalloc(sizeof(attr_t));
+  a->type = type;
+  a->u.pval = val;
+  return a;
 }
 
 static expr_list_t *append_expr(expr_list_t *list, expr_t *expr)
@@ -4236,7 +4677,7 @@ void set_all_tfswrite(int val)
     node->data.tfswrite = val;
 }
 
-static type_t *make_type(unsigned char type, type_t *ref)
+type_t *make_type(unsigned char type, type_t *ref)
 {
   type_t *t = alloc_type();
   t->name = NULL;
@@ -4246,7 +4687,7 @@ static type_t *make_type(unsigned char type, type_t *ref)
   t->attrs = NULL;
   t->orig = NULL;
   t->funcs = NULL;
-  t->fields = NULL;
+  t->fields_or_args = NULL;
   t->ifaces = NULL;
   t->dim = 0;
   t->size_is = NULL;
@@ -4255,61 +4696,115 @@ static type_t *make_type(unsigned char type, type_t *ref)
   t->ptrdesc = 0;
   t->declarray = FALSE;
   t->ignore = (parse_only != 0);
-  t->is_const = FALSE;
   t->sign = 0;
   t->defined = FALSE;
   t->written = FALSE;
   t->user_types_registered = FALSE;
   t->tfswrite = FALSE;
+  t->checked = FALSE;
   t->typelib_idx = -1;
   return t;
 }
 
-static void set_type(var_t *v, type_t *type, int ptr_level, array_dims_t *arr,
+static type_t *make_func_type(var_list_t *args)
+{
+  type_t *t = make_type(RPC_FC_FUNCTION, NULL);
+  t->fields_or_args = args;
+  return t;
+}
+
+static type_t *make_pointer_type(type_t *ref, attr_list_t *attrs)
+{
+    type_t *t = make_type(pointer_default, ref);
+    t->attrs = attrs;
+    return t;
+}
+
+static type_t *append_ptrchain_type(type_t *ptrchain, type_t *type)
+{
+  type_t *ptrchain_type;
+  if (!ptrchain)
+    return type;
+  for (ptrchain_type = ptrchain; ptrchain_type->ref; ptrchain_type = ptrchain_type->ref)
+    ;
+  ptrchain_type->ref = type;
+  return ptrchain;
+}
+
+static void set_type(var_t *v, decl_spec_t *decl_spec, const declarator_t *decl,
                      int top)
 {
   expr_list_t *sizes = get_attrp(v->attrs, ATTR_SIZEIS);
   expr_list_t *lengs = get_attrp(v->attrs, ATTR_LENGTHIS);
   int ptr_attr = get_attrv(v->attrs, ATTR_POINTERTYPE);
-  int ptr_type = ptr_attr;
   int sizeless, has_varconf;
   expr_t *dim;
   type_t *atype, **ptype;
+  array_dims_t *arr = decl ? decl->array : NULL;
+  type_t *func_type = decl ? decl->func_type : NULL;
+  type_t *type = decl_spec->type;
 
-  v->type = type;
+  if (is_attr(type->attrs, ATTR_INLINE))
+  {
+    if (!func_type)
+      error_loc("inline attribute applied to non-function type\n");
+    else
+    {
+      type_t *t;
+      /* move inline attribute from return type node to function node */
+      for (t = func_type; is_ptr(t); t = t->ref)
+        ;
+      t->attrs = move_attr(t->attrs, type->attrs, ATTR_INLINE);
+    }
+  }
 
-  if (!ptr_type && top)
-    ptr_type = RPC_FC_RP;
+  /* add type onto the end of the pointers in pident->type */
+  v->type = append_ptrchain_type(decl ? decl->type : NULL, type);
+  v->stgclass = decl_spec->stgclass;
 
-  for ( ; 0 < ptr_level; --ptr_level)
+  /* the highest level of pointer specified should default to the var's ptr attr
+   * or (RPC_FC_RP if not specified and it's a top level ptr), not
+   * pointer_default so we need to fix that up here */
+  if (!arr)
   {
-    v->type = make_type(pointer_default, v->type);
-    if (ptr_level == 1 && ptr_type && !arr)
+    const type_t *ptr = NULL;
+    /* pointer attributes on the left side of the type belong to the function
+     * pointer, if one is being declared */
+    type_t **pt = func_type ? &func_type : &v->type;
+    for (ptr = *pt; ptr; )
+    {
+      if (ptr->kind == TKIND_ALIAS)
+        ptr = ptr->orig;
+      else
+        break;
+    }
+    if (ptr && is_ptr(ptr) && (ptr_attr || top))
     {
-      v->type->type = ptr_type;
-      ptr_type = 0;
+      /* duplicate type to avoid changing original type */
+      *pt = duptype(*pt, 1);
+      (*pt)->type = ptr_attr ? ptr_attr : RPC_FC_RP;
     }
+    else if (ptr_attr)
+       error_loc("%s: pointer attribute applied to non-pointer type\n", v->name);
   }
 
-  if (ptr_type && !arr)
+  if (is_attr(v->attrs, ATTR_STRING) && !is_ptr(v->type) && !arr)
+    error_loc("'%s': [string] attribute applied to non-pointer, non-array type\n",
+              v->name);
+
+  if (is_attr(v->attrs, ATTR_V1ENUM))
   {
-    if (is_ptr(v->type))
-    {
-      if (v->type->type != ptr_type)
-      {
-        v->type = duptype(v->type, 1);
-        v->type->type = ptr_type;
-      }
-    }
-    else if (!arr && ptr_attr)
-      error("%s: pointer attribute applied to non-pointer type\n", v->name);
+    if (v->type->type == RPC_FC_ENUM16)
+      v->type->type = RPC_FC_ENUM32;
+    else
+      error_loc("'%s': [v1_enum] attribute applied to non-enum type\n", v->name);
   }
 
   sizeless = FALSE;
   if (arr) LIST_FOR_EACH_ENTRY_REV(dim, arr, expr_t, entry)
   {
     if (sizeless)
-      error("%s: only the first array dimension can be unspecified\n", v->name);
+      error_loc("%s: only the first array dimension can be unspecified\n", v->name);
 
     if (dim->is_const)
     {
@@ -4317,10 +4812,10 @@ static void set_type(var_t *v, type_t *type, int ptr_level, array_dims_t *arr,
       size_t size = type_memsize(v->type, &align);
 
       if (dim->cval <= 0)
-        error("%s: array dimension must be positive\n", v->name);
+        error_loc("%s: array dimension must be positive\n", v->name);
 
       if (0xffffffffuL / size < (unsigned long) dim->cval)
-        error("%s: total array size is too large\n", v->name);
+        error_loc("%s: total array size is too large\n", v->name);
       else if (0xffffuL < size * dim->cval)
         v->type = make_type(RPC_FC_LGFARRAY, v->type);
       else
@@ -4346,10 +4841,10 @@ static void set_type(var_t *v, type_t *type, int ptr_level, array_dims_t *arr,
       atype = *ptype = duptype(*ptype, 0);
 
       if (atype->type == RPC_FC_SMFARRAY || atype->type == RPC_FC_LGFARRAY)
-        error("%s: cannot specify size_is for a fixed sized array\n", v->name);
+        error_loc("%s: cannot specify size_is for a fixed sized array\n", v->name);
 
       if (atype->type != RPC_FC_CARRAY && !is_ptr(atype))
-        error("%s: size_is attribute applied to illegal type\n", v->name);
+        error_loc("%s: size_is attribute applied to illegal type\n", v->name);
 
       atype->type = RPC_FC_CARRAY;
       atype->size_is = dim;
@@ -4357,7 +4852,7 @@ static void set_type(var_t *v, type_t *type, int ptr_level, array_dims_t *arr,
 
     ptype = &(*ptype)->ref;
     if (*ptype == NULL)
-      error("%s: too many expressions in size_is attribute\n", v->name);
+      error_loc("%s: too many expressions in size_is attribute\n", v->name);
   }
 
   ptype = &v->type;
@@ -4375,14 +4870,14 @@ static void set_type(var_t *v, type_t *type, int ptr_level, array_dims_t *arr,
       else if (atype->type == RPC_FC_CARRAY)
         atype->type = RPC_FC_CVARRAY;
       else
-        error("%s: length_is attribute applied to illegal type\n", v->name);
+        error_loc("%s: length_is attribute applied to illegal type\n", v->name);
 
       atype->length_is = dim;
     }
 
     ptype = &(*ptype)->ref;
     if (*ptype == NULL)
-      error("%s: too many expressions in length_is attribute\n", v->name);
+      error_loc("%s: too many expressions in length_is attribute\n", v->name);
   }
 
   if (has_varconf && !last_array(v->type))
@@ -4417,6 +4912,54 @@ static void set_type(var_t *v, type_t *type, int ptr_level, array_dims_t *arr,
           break;
         }
   }
+
+  /* v->type is currently pointing to the type on the left-side of the
+   * declaration, so we need to fix this up so that it is the return type of the
+   * function and make v->type point to the function side of the declaration */
+  if (func_type)
+  {
+    type_t *ft, *t;
+    type_t *return_type = v->type;
+    v->type = func_type;
+    for (ft = v->type; is_ptr(ft); ft = ft->ref)
+      ;
+    assert(ft->type == RPC_FC_FUNCTION);
+    ft->ref = return_type;
+    /* move calling convention attribute, if present, from pointer nodes to
+     * function node */
+    for (t = v->type; is_ptr(t); t = t->ref)
+      ft->attrs = move_attr(ft->attrs, t->attrs, ATTR_CALLCONV);
+    if (is_object_interface && !is_attr(ft->attrs, ATTR_CALLCONV))
+    {
+      static char *stdmethodcalltype;
+      if (!stdmethodcalltype) stdmethodcalltype = strdup("STDMETHODCALLTYPE");
+      ft->attrs = append_attr(NULL, make_attrp(ATTR_CALLCONV, stdmethodcalltype));
+    }
+  }
+  else
+  {
+    type_t *t;
+    for (t = v->type; is_ptr(t); t = t->ref)
+      if (is_attr(t->attrs, ATTR_CALLCONV))
+        error_loc("calling convention applied to non-function-pointer type\n");
+  }
+}
+
+static var_list_t *set_var_types(attr_list_t *attrs, decl_spec_t *decl_spec, declarator_list_t *decls)
+{
+  declarator_t *decl, *next;
+  var_list_t *var_list = NULL;
+
+  LIST_FOR_EACH_ENTRY_SAFE( decl, next, decls, declarator_t, entry )
+  {
+    var_t *var = decl->var;
+
+    var->attrs = attrs;
+    set_type(var, decl_spec, decl, 0);
+    var_list = append_var(var_list, var);
+    free(decl);
+  }
+  return var_list;
 }
 
 static ifref_list_t *append_ifref(ifref_list_t *list, ifref_t *iface)
@@ -4451,34 +4994,51 @@ static var_list_t *append_var(var_list_t *list, var_t *var)
     return list;
 }
 
+static var_list_t *append_var_list(var_list_t *list, var_list_t *vars)
+{
+    if (!vars) return list;
+    if (!list)
+    {
+        list = xmalloc( sizeof(*list) );
+        list_init( list );
+    }
+    list_move_tail( list, vars );
+    return list;
+}
+
 static var_t *make_var(char *name)
 {
   var_t *v = xmalloc(sizeof(var_t));
   v->name = name;
   v->type = NULL;
-  v->args = NULL;
   v->attrs = NULL;
   v->eval = NULL;
+  v->stgclass = STG_NONE;
+  v->loc_info.input_name = input_name ? input_name : "stdin";
+  v->loc_info.line_number = line_number;
+  v->loc_info.near_text = parser_text;
   return v;
 }
 
-static pident_list_t *append_pident(pident_list_t *list, pident_t *p)
+static declarator_list_t *append_declarator(declarator_list_t *list, declarator_t *d)
 {
-  if (!p) return list;
+  if (!d) return list;
   if (!list) {
     list = xmalloc(sizeof(*list));
     list_init(list);
   }
-  list_add_tail(list, &p->entry);
+  list_add_tail(list, &d->entry);
   return list;
 }
 
-static pident_t *make_pident(var_t *var)
+static declarator_t *make_declarator(var_t *var)
 {
-  pident_t *p = xmalloc(sizeof(*p));
-  p->var = var;
-  p->ptr_level = 0;
-  return p;
+  declarator_t *d = xmalloc(sizeof(*d));
+  d->var = var;
+  d->type = NULL;
+  d->func_type = NULL;
+  d->array = NULL;
+  return d;
 }
 
 static func_list_t *append_func(func_list_t *list, func_t *func)
@@ -4493,11 +5053,11 @@ static func_list_t *append_func(func_list_t *list, func_t *func)
     return list;
 }
 
-static func_t *make_func(var_t *def, var_list_t *args)
+static func_t *make_func(var_t *def)
 {
   func_t *f = xmalloc(sizeof(func_t));
   f->def = def;
-  f->args = args;
+  f->args = def->type->fields_or_args;
   f->ignore = parse_only;
   f->idx = -1;
   return f;
@@ -4505,7 +5065,7 @@ static func_t *make_func(var_t *def, var_list_t *args)
 
 static type_t *make_class(char *name)
 {
-  type_t *c = make_type(0, NULL);
+  type_t *c = make_type(RPC_FC_COCLASS, NULL);
   c->name = name;
   c->kind = TKIND_COCLASS;
   return c;
@@ -4518,6 +5078,17 @@ static type_t *make_safearray(type_t *type)
   return make_type(pointer_default, sa);
 }
 
+static typelib_t *make_library(const char *name, const attr_list_t *attrs)
+{
+    typelib_t *typelib = xmalloc(sizeof(*typelib));
+    typelib->name = xstrdup(name);
+    typelib->filename = NULL;
+    typelib->attrs = attrs;
+    list_init( &typelib->entries );
+    list_init( &typelib->importlibs );
+    return typelib;
+}
+
 #define HASHMAX 64
 
 static int hash_ident(const char *name)
@@ -4578,7 +5149,7 @@ static void fix_type(type_t *t)
   if (t->kind == TKIND_ALIAS && is_incomplete(t)) {
     type_t *ot = t->orig;
     fix_type(ot);
-    t->fields = ot->fields;
+    t->fields_or_args = ot->fields_or_args;
     t->defined = ot->defined;
   }
 }
@@ -4593,17 +5164,15 @@ static void fix_incomplete(void)
   }
 }
 
-static type_t *reg_typedefs(type_t *type, pident_list_t *pidents, attr_list_t *attrs)
+static type_t *reg_typedefs(decl_spec_t *decl_spec, declarator_list_t *decls, attr_list_t *attrs)
 {
-  type_t *ptr = type;
-  const pident_t *pident;
-  int ptrc = 0;
+  const declarator_t *decl;
   int is_str = is_attr(attrs, ATTR_STRING);
-  unsigned char ptr_type = get_attrv(attrs, ATTR_POINTERTYPE);
+  type_t *type = decl_spec->type;
 
   if (is_str)
   {
-    type_t *t = type;
+    type_t *t = decl_spec->type;
     unsigned char c;
 
     while (is_ptr(t))
@@ -4612,16 +5181,15 @@ static type_t *reg_typedefs(type_t *type, pident_list_t *pidents, attr_list_t *a
     c = t->type;
     if (c != RPC_FC_CHAR && c != RPC_FC_BYTE && c != RPC_FC_WCHAR)
     {
-      pident = LIST_ENTRY( list_head( pidents ), const pident_t, entry );
+      decl = LIST_ENTRY( list_head( decls ), const declarator_t, entry );
       error_loc("'%s': [string] attribute is only valid on 'char', 'byte', or 'wchar_t' pointers and arrays\n",
-              pident->var->name);
+              decl->var->name);
     }
   }
 
   /* We must generate names for tagless enum, struct or union.
      Typedef-ing a tagless enum, struct or union means we want the typedef
-     to be included in a library whether it has other attributes or not,
-     hence the public attribute.  */
+     to be included in a library hence the public attribute.  */
   if ((type->kind == TKIND_ENUM || type->kind == TKIND_RECORD
        || type->kind == TKIND_UNION) && ! type->name && ! parse_only)
   {
@@ -4629,38 +5197,21 @@ static type_t *reg_typedefs(type_t *type, pident_list_t *pidents, attr_list_t *a
       attrs = append_attr( attrs, make_attr(ATTR_PUBLIC) );
     type->name = gen_name();
   }
+  else if (is_attr(attrs, ATTR_UUID) && !is_attr(attrs, ATTR_PUBLIC))
+    attrs = append_attr( attrs, make_attr(ATTR_PUBLIC) );
 
-  LIST_FOR_EACH_ENTRY( pident, pidents, const pident_t, entry )
+  LIST_FOR_EACH_ENTRY( decl, decls, const declarator_t, entry )
   {
-    var_t *name = pident->var;
+    var_t *name = decl->var;
 
     if (name->name) {
-      type_t *cur = ptr;
-      int cptr = pident->ptr_level;
-      if (cptr > ptrc) {
-        while (cptr > ptrc) {
-          cur = ptr = make_type(pointer_default, cur);
-          ptrc++;
-        }
-      } else {
-        while (cptr < ptrc) {
-          cur = cur->ref;
-          cptr++;
-        }
-      }
-      cur = alias(cur, name->name);
+      type_t *cur;
+
+      /* set the attributes to allow set_type to do some checks on them */
+      name->attrs = attrs;
+      set_type(name, decl_spec, decl, 0);
+      cur = alias(name->type, name->name);
       cur->attrs = attrs;
-      if (ptr_type)
-      {
-        if (is_ptr(cur))
-          cur->type = ptr_type;
-        else
-          error_loc("'%s': pointer attribute applied to non-pointer type\n",
-                  cur->name);
-      }
-      else if (is_str && ! is_ptr(cur))
-        error_loc("'%s': [string] attribute applied to non-pointer type\n",
-                cur->name);
 
       if (is_incomplete(cur))
         add_incomplete(cur);
@@ -4670,16 +5221,22 @@ static type_t *reg_typedefs(type_t *type, pident_list_t *pidents, attr_list_t *a
   return type;
 }
 
-static type_t *find_type(const char *name, int t)
+static type_t *find_type_helper(const char *name, int t)
 {
   struct rtype *cur = type_hash[hash_ident(name)];
   while (cur && (cur->t != t || strcmp(cur->name, name)))
     cur = cur->next;
-  if (!cur) {
+  return cur ? cur->type : NULL;
+}
+
+type_t *find_type(const char *name, int t)
+{
+  type_t *type = find_type_helper(name, t);
+  if (!type) {
     error_loc("type '%s' not found\n", name);
     return NULL;
   }
-  return cur->type;
+  return type;
 }
 
 static type_t *find_type2(char *name, int t)
@@ -4691,25 +5248,18 @@ static type_t *find_type2(char *name, int t)
 
 int is_type(const char *name)
 {
-  struct rtype *cur = type_hash[hash_ident(name)];
-  while (cur && (cur->t || strcmp(cur->name, name)))
-    cur = cur->next;
-  if (cur) return TRUE;
-  return FALSE;
+  return find_type_helper(name, 0) != NULL;
 }
 
 static type_t *get_type(unsigned char type, char *name, int t)
 {
-  struct rtype *cur = NULL;
   type_t *tp;
   if (name) {
-    cur = type_hash[hash_ident(name)];
-    while (cur && (cur->t != t || strcmp(cur->name, name)))
-      cur = cur->next;
-  }
-  if (cur) {
-    free(name);
-    return cur->type;
+    tp = find_type_helper(name, t);
+    if (tp) {
+      free(name);
+      return tp;
+    }
   }
   tp = make_type(type, NULL);
   tp->name = name;
@@ -4911,7 +5461,7 @@ static var_t *reg_const(var_t *var)
   return var;
 }
 
-static var_t *find_const(char *name, int f)
+var_t *find_const(const char *name, int f)
 {
   struct rconst *cur = const_hash[hash_ident(name)];
   while (cur && strcmp(cur->name, name))
@@ -4923,10 +5473,10 @@ static var_t *find_const(char *name, int f)
   return cur->var;
 }
 
-static void write_libid(const char *name, const attr_list_t *attr)
+static void write_libid(const typelib_t *typelib)
 {
-  const UUID *uuid = get_attrp(attr, ATTR_UUID);
-  write_guid(idfile, "LIBID", name, uuid);
+  const UUID *uuid = get_attrp(typelib->attrs, ATTR_UUID);
+  write_guid(idfile, "LIBID", typelib->name, uuid);
 }
 
 static void write_clsid(type_t *cls)
@@ -4992,44 +5542,517 @@ static char *gen_name(void)
   return name;
 }
 
-static void process_typedefs(pident_list_t *pidents)
+struct allowed_attr
+{
+    unsigned int dce_compatible : 1;
+    unsigned int acf : 1;
+    unsigned int on_interface : 1;
+    unsigned int on_function : 1;
+    unsigned int on_arg : 1;
+    unsigned int on_type : 1;
+    unsigned int on_field : 1;
+    unsigned int on_library : 1;
+    unsigned int on_dispinterface : 1;
+    unsigned int on_module : 1;
+    unsigned int on_coclass : 1;
+    const char *display_name;
+};
+
+struct allowed_attr allowed_attr[] =
 {
-  pident_t *pident, *next;
+    /* attr                     { D ACF I Fn ARG T Fi  L  DI M  C  <display name> } */
+    /* ATTR_AGGREGATABLE */     { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, "aggregatable" },
+    /* ATTR_APPOBJECT */        { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, "appobject" },
+    /* ATTR_ASYNC */            { 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, "async" },
+    /* ATTR_AUTO_HANDLE */      { 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, "auto_handle" },
+    /* ATTR_BINDABLE */         { 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, "bindable" },
+    /* ATTR_BROADCAST */        { 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, "broadcast" },
+    /* ATTR_CALLAS */           { 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, "call_as" },
+    /* ATTR_CALLCONV */         { 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, NULL },
+    /* ATTR_CASE */             { 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, "case" },
+    /* ATTR_CONST */            { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "const" },
+    /* ATTR_CONTEXTHANDLE */    { 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, "context_handle" },
+    /* ATTR_CONTROL */          { 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, "control" },
+    /* ATTR_DEFAULT */          { 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, "default" },
+    /* ATTR_DEFAULTCOLLELEM */  { 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, "defaultcollelem" },
+    /* ATTR_DEFAULTVALUE */     { 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, "defaultvalue" },
+    /* ATTR_DEFAULTVTABLE */    { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, "defaultvtable" },
+    /* ATTR_DISPINTERFACE */    { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL },
+    /* ATTR_DISPLAYBIND */      { 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, "displaybind" },
+    /* ATTR_DLLNAME */          { 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, "dllname" },
+    /* ATTR_DUAL */             { 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, "dual" },
+    /* ATTR_ENDPOINT */         { 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, "endpoint" },
+    /* ATTR_ENTRY */            { 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, "entry" },
+    /* ATTR_EXPLICIT_HANDLE */  { 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, "explicit_handle" },
+    /* ATTR_HANDLE */           { 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, "handle" },
+    /* ATTR_HELPCONTEXT */      { 0, 0, 1, 1, 0, 1, 0, 1, 1, 1, 1, "helpcontext" },
+    /* ATTR_HELPFILE */         { 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, "helpfile" },
+    /* ATTR_HELPSTRING */       { 0, 0, 1, 1, 0, 1, 0, 1, 1, 1, 1, "helpstring" },
+    /* ATTR_HELPSTRINGCONTEXT */ { 0, 0, 1, 1, 0, 1, 0, 1, 1, 1, 1, "helpstringcontext" },
+    /* ATTR_HELPSTRINGDLL */    { 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, "helpstringdll" },
+    /* ATTR_HIDDEN */           { 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 1, "hidden" },
+    /* ATTR_ID */               { 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, "id" },
+    /* ATTR_IDEMPOTENT */       { 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, "idempotent" },
+    /* ATTR_IIDIS */            { 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, "iid_is" },
+    /* ATTR_IMMEDIATEBIND */    { 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, "immediatebind" },
+    /* ATTR_IMPLICIT_HANDLE */  { 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, "implicit_handle" },
+    /* ATTR_IN */               { 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, "in" },
+    /* ATTR_INLINE */           { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "inline" },
+    /* ATTR_INPUTSYNC */        { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "inputsync" },
+    /* ATTR_LENGTHIS */         { 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, "length_is" },
+    /* ATTR_LIBLCID */          { 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, "lcid" },
+    /* ATTR_LOCAL */            { 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, "local" },
+    /* ATTR_NONBROWSABLE */     { 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, "nonbrowsable" },
+    /* ATTR_NONCREATABLE */     { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, "noncreatable" },
+    /* ATTR_NONEXTENSIBLE */    { 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, "nonextensible" },
+    /* ATTR_OBJECT */           { 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, "object" },
+    /* ATTR_ODL */              { 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, "odl" },
+    /* ATTR_OLEAUTOMATION */    { 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, "oleautomation" },
+    /* ATTR_OPTIONAL */         { 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, "optional" },
+    /* ATTR_OUT */              { 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, "out" },
+    /* ATTR_POINTERDEFAULT */   { 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, "pointer_default" },
+    /* ATTR_POINTERTYPE */      { 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, "ref, unique or ptr" },
+    /* ATTR_PROPGET */          { 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, "propget" },
+    /* ATTR_PROPPUT */          { 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, "propput" },
+    /* ATTR_PROPPUTREF */       { 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, "propputref" },
+    /* ATTR_PUBLIC */           { 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, "public" },
+    /* ATTR_RANGE */            { 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, "range" },
+    /* ATTR_READONLY */         { 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, "readonly" },
+    /* ATTR_REQUESTEDIT */      { 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, "requestedit" },
+    /* ATTR_RESTRICTED */       { 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0, "restricted" },
+    /* ATTR_RETVAL */           { 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, "retval" },
+    /* ATTR_SIZEIS */           { 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, "size_is" },
+    /* ATTR_SOURCE */           { 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, "source" },
+    /* ATTR_STRICTCONTEXTHANDLE */ { 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, "strict_context_handle" },
+    /* ATTR_STRING */           { 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, "string" },
+    /* ATTR_SWITCHIS */         { 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, "switch_is" },
+    /* ATTR_SWITCHTYPE */       { 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, "switch_type" },
+    /* ATTR_TRANSMITAS */       { 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, "transmit_as" },
+    /* ATTR_UUID */             { 1, 0, 1, 0, 0, 1, 0, 1, 1, 1, 1, "uuid" },
+    /* ATTR_V1ENUM */           { 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, "v1_enum" },
+    /* ATTR_VARARG */           { 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, "vararg" },
+    /* ATTR_VERSION */          { 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, "version" },
+    /* ATTR_WIREMARSHAL */      { 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, "wire_marshal" },
+};
 
-  if (!pidents) return;
-  LIST_FOR_EACH_ENTRY_SAFE( pident, next, pidents, pident_t, entry )
-  {
-    var_t *var = pident->var;
-    type_t *type = find_type(var->name, 0);
+const char *get_attr_display_name(enum attr_type type)
+{
+    return allowed_attr[type].display_name;
+}
 
-    if (! parse_only && do_header)
-      write_typedef(type);
-    if (in_typelib && type->attrs)
-      add_typelib_entry(type);
+static attr_list_t *check_iface_attrs(const char *name, attr_list_t *attrs)
+{
+  const attr_t *attr;
+  if (!attrs) return attrs;
+  LIST_FOR_EACH_ENTRY(attr, attrs, const attr_t, entry)
+  {
+    if (!allowed_attr[attr->type].on_interface)
+      error_loc("inapplicable attribute %s for interface %s\n",
+                allowed_attr[attr->type].display_name, name);
+  }
+  return attrs;
+}
 
-    free(pident);
-    free(var);
+static attr_list_t *check_function_attrs(const char *name, attr_list_t *attrs)
+{
+  const attr_t *attr;
+  if (!attrs) return attrs;
+  LIST_FOR_EACH_ENTRY(attr, attrs, const attr_t, entry)
+  {
+    if (!allowed_attr[attr->type].on_function)
+      error_loc("inapplicable attribute %s for function %s\n",
+                allowed_attr[attr->type].display_name, name);
   }
+  return attrs;
 }
 
 static void check_arg(var_t *arg)
 {
-  type_t *t = arg->type;
+  const type_t *t = arg->type;
+  const attr_t *attr;
 
   if (t->type == 0 && ! is_var_ptr(arg))
     error_loc("argument '%s' has void type\n", arg->name);
+
+  if (arg->attrs)
+  {
+    LIST_FOR_EACH_ENTRY(attr, arg->attrs, const attr_t, entry)
+    {
+      if (!allowed_attr[attr->type].on_arg)
+        error_loc("inapplicable attribute %s for argument %s\n",
+                  allowed_attr[attr->type].display_name, arg->name);
+    }
+  }
+}
+
+static attr_list_t *check_typedef_attrs(attr_list_t *attrs)
+{
+  const attr_t *attr;
+  if (!attrs) return attrs;
+  LIST_FOR_EACH_ENTRY(attr, attrs, const attr_t, entry)
+  {
+    if (!allowed_attr[attr->type].on_type)
+      error_loc("inapplicable attribute %s for typedef\n",
+                allowed_attr[attr->type].display_name);
+  }
+  return attrs;
+}
+
+static attr_list_t *check_field_attrs(const char *name, attr_list_t *attrs)
+{
+  const attr_t *attr;
+  if (!attrs) return attrs;
+  LIST_FOR_EACH_ENTRY(attr, attrs, const attr_t, entry)
+  {
+    if (!allowed_attr[attr->type].on_field)
+      error_loc("inapplicable attribute %s for field %s\n",
+                allowed_attr[attr->type].display_name, name);
+  }
+  return attrs;
+}
+
+static attr_list_t *check_library_attrs(const char *name, attr_list_t *attrs)
+{
+  const attr_t *attr;
+  if (!attrs) return attrs;
+  LIST_FOR_EACH_ENTRY(attr, attrs, const attr_t, entry)
+  {
+    if (!allowed_attr[attr->type].on_library)
+      error_loc("inapplicable attribute %s for library %s\n",
+                allowed_attr[attr->type].display_name, name);
+  }
+  return attrs;
+}
+
+static attr_list_t *check_dispiface_attrs(const char *name, attr_list_t *attrs)
+{
+  const attr_t *attr;
+  if (!attrs) return attrs;
+  LIST_FOR_EACH_ENTRY(attr, attrs, const attr_t, entry)
+  {
+    if (!allowed_attr[attr->type].on_dispinterface)
+      error_loc("inapplicable attribute %s for dispinterface %s\n",
+                allowed_attr[attr->type].display_name, name);
+  }
+  return attrs;
+}
+
+static attr_list_t *check_module_attrs(const char *name, attr_list_t *attrs)
+{
+  const attr_t *attr;
+  if (!attrs) return attrs;
+  LIST_FOR_EACH_ENTRY(attr, attrs, const attr_t, entry)
+  {
+    if (!allowed_attr[attr->type].on_module)
+      error_loc("inapplicable attribute %s for module %s\n",
+                allowed_attr[attr->type].display_name, name);
+  }
+  return attrs;
+}
+
+static attr_list_t *check_coclass_attrs(const char *name, attr_list_t *attrs)
+{
+  const attr_t *attr;
+  if (!attrs) return attrs;
+  LIST_FOR_EACH_ENTRY(attr, attrs, const attr_t, entry)
+  {
+    if (!allowed_attr[attr->type].on_coclass)
+      error_loc("inapplicable attribute %s for coclass %s\n",
+                allowed_attr[attr->type].display_name, name);
+  }
+  return attrs;
+}
+
+static int is_allowed_conf_type(const type_t *type)
+{
+    switch (type->type)
+    {
+    case RPC_FC_CHAR:
+    case RPC_FC_SMALL:
+    case RPC_FC_BYTE:
+    case RPC_FC_USMALL:
+    case RPC_FC_WCHAR:
+    case RPC_FC_SHORT:
+    case RPC_FC_ENUM16:
+    case RPC_FC_USHORT:
+    case RPC_FC_LONG:
+    case RPC_FC_ENUM32:
+    case RPC_FC_ULONG:
+        return TRUE;
+    default:
+        return FALSE;
+    }
+}
+
+static int is_ptr_guid_type(const type_t *type)
+{
+    unsigned int align = 0;
+    for (;;)
+    {
+        if (type->kind == TKIND_ALIAS)
+            type = type->orig;
+        else if (is_ptr(type))
+        {
+            type = type->ref;
+            break;
+        }
+        else
+            return FALSE;
+    }
+    return (type_memsize(type, &align) == 16);
+}
+
+static void check_conformance_expr_list(const char *attr_name, const var_t *arg, const type_t *container_type, expr_list_t *expr_list)
+{
+    expr_t *dim;
+    struct expr_loc expr_loc;
+    expr_loc.v = arg;
+    expr_loc.attr = attr_name;
+    if (expr_list) LIST_FOR_EACH_ENTRY(dim, expr_list, expr_t, entry)
+    {
+        if (dim->type != EXPR_VOID)
+        {
+            const type_t *expr_type = expr_resolve_type(&expr_loc, container_type, dim);
+            if (!is_allowed_conf_type(expr_type))
+                error_loc_info(&arg->loc_info, "expression must resolve to integral type <= 32bits for attribute %s\n",
+                               attr_name);
+        }
+    }
+}
+
+static void check_remoting_fields(const var_t *var, type_t *type);
+
+/* checks that properties common to fields and arguments are consistent */
+static void check_field_common(const type_t *container_type,
+                               const char *container_name, const var_t *arg)
+{
+    type_t *type = arg->type;
+    int is_wire_marshal = 0;
+    int is_context_handle = 0;
+    const char *container_type_name = NULL;
+
+    if (is_struct(container_type->type))
+        container_type_name = "struct";
+    else if (is_union(container_type->type))
+        container_type_name = "union";
+    else if (container_type->type == RPC_FC_FUNCTION)
+        container_type_name = "function";
+
+    if (is_attr(arg->attrs, ATTR_LENGTHIS) &&
+        (is_attr(arg->attrs, ATTR_STRING) || is_aliaschain_attr(arg->type, ATTR_STRING)))
+        error_loc_info(&arg->loc_info,
+                       "string and length_is specified for argument %s are mutually exclusive attributes\n",
+                       arg->name);
+
+    if (is_attr(arg->attrs, ATTR_SIZEIS))
+    {
+        expr_list_t *size_is_exprs = get_attrp(arg->attrs, ATTR_SIZEIS);
+        check_conformance_expr_list("size_is", arg, container_type, size_is_exprs);
+    }
+    if (is_attr(arg->attrs, ATTR_LENGTHIS))
+    {
+        expr_list_t *length_is_exprs = get_attrp(arg->attrs, ATTR_LENGTHIS);
+        check_conformance_expr_list("length_is", arg, container_type, length_is_exprs);
+    }
+    if (is_attr(arg->attrs, ATTR_IIDIS))
+    {
+        struct expr_loc expr_loc;
+        expr_t *expr = get_attrp(arg->attrs, ATTR_IIDIS);
+        if (expr->type != EXPR_VOID)
+        {
+            const type_t *expr_type;
+            expr_loc.v = arg;
+            expr_loc.attr = "iid_is";
+            expr_type = expr_resolve_type(&expr_loc, container_type, expr);
+            if (!expr_type || !is_ptr_guid_type(expr_type))
+                error_loc_info(&arg->loc_info, "expression must resolve to pointer to GUID type for attribute iid_is\n");
+        }
+    }
+    if (is_attr(arg->attrs, ATTR_SWITCHIS))
+    {
+        struct expr_loc expr_loc;
+        expr_t *expr = get_attrp(arg->attrs, ATTR_SWITCHIS);
+        if (expr->type != EXPR_VOID)
+        {
+            const type_t *expr_type;
+            expr_loc.v = arg;
+            expr_loc.attr = "switch_is";
+            expr_type = expr_resolve_type(&expr_loc, container_type, expr);
+            if (!expr_type || !is_allowed_conf_type(expr_type))
+                error_loc_info(&arg->loc_info, "expression must resolve to integral type <= 32bits for attribute %s\n",
+                               expr_loc.attr);
+        }
+    }
+
+    /* get fundamental type for the argument */
+    for (;;)
+    {
+        if (is_attr(type->attrs, ATTR_WIREMARSHAL))
+        {
+            is_wire_marshal = 1;
+            break;
+        }
+        if (is_attr(type->attrs, ATTR_CONTEXTHANDLE))
+        {
+            is_context_handle = 1;
+            break;
+        }
+        if (type->kind == TKIND_ALIAS)
+            type = type->orig;
+        else if (is_ptr(type) || is_array(type))
+            type = type->ref;
+        else
+            break;
+    }
+
+    if (type->type == 0 && !is_attr(arg->attrs, ATTR_IIDIS) && !is_wire_marshal && !is_context_handle)
+        error_loc_info(&arg->loc_info, "parameter \'%s\' of %s \'%s\' cannot derive from void *\n", arg->name, container_type_name, container_name);
+    else if (type->type == RPC_FC_FUNCTION)
+        error_loc_info(&arg->loc_info, "parameter \'%s\' of %s \'%s\' cannot be a function pointer\n", arg->name, container_type_name, container_name);
+    else if (!is_wire_marshal && (is_struct(type->type) || is_union(type->type)))
+        check_remoting_fields(arg, type);
+}
+
+static void check_remoting_fields(const var_t *var, type_t *type)
+{
+    const var_t *field;
+    const var_list_t *fields = NULL;
+
+    if (type->checked)
+        return;
+
+    type->checked = TRUE;
+
+    if (is_struct(type->type))
+        fields = type->fields_or_args;
+    else if (is_union(type->type))
+    {
+        if (type->type == RPC_FC_ENCAPSULATED_UNION)
+        {
+            const var_t *uv = LIST_ENTRY(list_tail(type->fields_or_args), const var_t, entry);
+            fields = uv->type->fields_or_args;
+        }
+        else
+            fields = type->fields_or_args;
+    }
+
+    if (fields) LIST_FOR_EACH_ENTRY( field, fields, const var_t, entry )
+        if (field->type) check_field_common(type, type->name, field);
+}
+
+/* checks that arguments for a function make sense for marshalling and unmarshalling */
+static void check_remoting_args(const func_t *func)
+{
+    const char *funcname = func->def->name;
+    const var_t *arg;
+
+    if (func->args) LIST_FOR_EACH_ENTRY( arg, func->args, const var_t, entry )
+    {
+        int ptr_level = 0;
+        const type_t *type = arg->type;
+
+        /* get pointer level and fundamental type for the argument */
+        for (;;)
+        {
+            if (is_attr(type->attrs, ATTR_WIREMARSHAL))
+                break;
+            if (is_attr(type->attrs, ATTR_CONTEXTHANDLE))
+                break;
+            if (type->kind == TKIND_ALIAS)
+                type = type->orig;
+            else if (is_ptr(type))
+            {
+                ptr_level++;
+                type = type->ref;
+            }
+            else
+                break;
+        }
+
+        /* check that [out] parameters have enough pointer levels */
+        if (is_attr(arg->attrs, ATTR_OUT))
+        {
+            if (!is_array(type))
+            {
+                if (!ptr_level)
+                    error_loc_info(&arg->loc_info, "out parameter \'%s\' of function \'%s\' is not a pointer\n", arg->name, funcname);
+                if (type->type == RPC_FC_IP && ptr_level == 1)
+                    error_loc_info(&arg->loc_info, "out interface pointer \'%s\' of function \'%s\' is not a double pointer\n", arg->name, funcname);
+            }
+        }
+
+        check_field_common(func->def->type, funcname, arg);
+    }
+}
+
+static void add_explicit_handle_if_necessary(func_t *func)
+{
+    const var_t* explicit_handle_var;
+    const var_t* explicit_generic_handle_var = NULL;
+    const var_t* context_handle_var = NULL;
+
+    /* check for a defined binding handle */
+    explicit_handle_var = get_explicit_handle_var(func);
+    if (!explicit_handle_var)
+    {
+        explicit_generic_handle_var = get_explicit_generic_handle_var(func);
+        if (!explicit_generic_handle_var)
+        {
+            context_handle_var = get_context_handle_var(func);
+            if (!context_handle_var)
+            {
+                /* no explicit handle specified so add
+                 * "[in] handle_t IDL_handle" as the first parameter to the
+                 * function */
+                var_t *idl_handle = make_var(xstrdup("IDL_handle"));
+                idl_handle->attrs = append_attr(NULL, make_attr(ATTR_IN));
+                idl_handle->type = find_type("handle_t", 0);
+                if (!func->def->type->fields_or_args)
+                {
+                    func->def->type->fields_or_args = xmalloc( sizeof(*func->def->type->fields_or_args) );
+                    list_init( func->def->type->fields_or_args );
+                }
+                list_add_head( func->def->type->fields_or_args, &idl_handle->entry );
+                func->args = func->def->type->fields_or_args;
+            }
+        }
+    }
+}
+
+static void check_functions(const type_t *iface)
+{
+    if (is_attr(iface->attrs, ATTR_EXPLICIT_HANDLE) && iface->funcs)
+    {
+        func_t *func;
+        LIST_FOR_EACH_ENTRY( func, iface->funcs, func_t, entry )
+            add_explicit_handle_if_necessary(func);
+    }
+    if (!is_inside_library && !is_attr(iface->attrs, ATTR_LOCAL))
+    {
+        const func_t *func;
+        if (iface->funcs) LIST_FOR_EACH_ENTRY( func, iface->funcs, const func_t, entry )
+        {
+            if (!is_attr(func->def->attrs, ATTR_LOCAL))
+                check_remoting_args(func);
+        }
+    }
 }
 
-static void check_all_user_types(ifref_list_t *ifrefs)
+static void check_all_user_types(const statement_list_t *stmts)
 {
-  const ifref_t *ifref;
-  const func_t *f;
+  const statement_t *stmt;
 
-  if (ifrefs) LIST_FOR_EACH_ENTRY(ifref, ifrefs, const ifref_t, entry)
+  if (stmts) LIST_FOR_EACH_ENTRY(stmt, stmts, const statement_t, entry)
   {
-    const func_list_t *fs = ifref->iface->funcs;
-    if (fs) LIST_FOR_EACH_ENTRY(f, fs, const func_t, entry)
-      check_for_user_types_and_context_handles(f->args);
+    if (stmt->type == STMT_LIBRARY)
+      check_all_user_types(stmt->u.lib->stmts);
+    else if (stmt->type == STMT_TYPE && stmt->u.type->type == RPC_FC_IP)
+    {
+      const func_t *f;
+      const func_list_t *fs = stmt->u.type->funcs;
+      if (fs) LIST_FOR_EACH_ENTRY(f, fs, const func_t, entry)
+        check_for_additional_prototype_types(f->args);
+    }
   }
 }
 
@@ -5050,3 +6073,135 @@ int is_valid_uuid(const char *s)
   return s[i] == '\0';
 }
 
+static statement_t *make_statement(enum statement_type type)
+{
+    statement_t *stmt = xmalloc(sizeof(*stmt));
+    stmt->type = type;
+    return stmt;
+}
+
+static statement_t *make_statement_type_decl(type_t *type)
+{
+    statement_t *stmt = make_statement(STMT_TYPE);
+    stmt->u.type = type;
+    return stmt;
+}
+
+static statement_t *make_statement_reference(type_t *type)
+{
+    statement_t *stmt = make_statement(STMT_TYPEREF);
+    stmt->u.type = type;
+    return stmt;
+}
+
+static statement_t *make_statement_declaration(var_t *var)
+{
+    statement_t *stmt = make_statement(STMT_DECLARATION);
+    stmt->u.var = var;
+    if (var->stgclass == STG_EXTERN && var->eval)
+        warning("'%s' initialised and declared extern\n", var->name);
+    if (is_const_decl(var))
+    {
+        if (var->eval)
+            reg_const(var);
+    }
+    else if ((var->stgclass == STG_NONE || var->stgclass == STG_REGISTER) &&
+             var->type->type != RPC_FC_FUNCTION)
+        error_loc("instantiation of data is illegal\n");
+    return stmt;
+}
+
+static statement_t *make_statement_library(typelib_t *typelib)
+{
+    statement_t *stmt = make_statement(STMT_LIBRARY);
+    stmt->u.lib = typelib;
+    return stmt;
+}
+
+static statement_t *make_statement_cppquote(const char *str)
+{
+    statement_t *stmt = make_statement(STMT_CPPQUOTE);
+    stmt->u.str = str;
+    return stmt;
+}
+
+static statement_t *make_statement_importlib(const char *str)
+{
+    statement_t *stmt = make_statement(STMT_IMPORTLIB);
+    stmt->u.str = str;
+    return stmt;
+}
+
+static statement_t *make_statement_import(const char *str)
+{
+    statement_t *stmt = make_statement(STMT_IMPORT);
+    stmt->u.str = str;
+    return stmt;
+}
+
+static statement_t *make_statement_module(type_t *type)
+{
+    statement_t *stmt = make_statement(STMT_MODULE);
+    stmt->u.type = type;
+    return stmt;
+}
+
+static statement_t *process_typedefs(declarator_list_t *decls)
+{
+    declarator_t *decl, *next;
+    statement_t *stmt;
+    type_list_t **type_list;
+
+    if (!decls) return NULL;
+
+    stmt = make_statement(STMT_TYPEDEF);
+    stmt->u.type_list = NULL;
+    type_list = &stmt->u.type_list;
+
+    LIST_FOR_EACH_ENTRY_SAFE( decl, next, decls, declarator_t, entry )
+    {
+        var_t *var = decl->var;
+        type_t *type = find_type(var->name, 0);
+        *type_list = xmalloc(sizeof(type_list_t));
+        (*type_list)->type = type;
+        (*type_list)->next = NULL;
+
+        if (! parse_only && do_header)
+            write_typedef(type);
+        if (in_typelib && is_attr(type->attrs, ATTR_PUBLIC))
+            add_typelib_entry(type);
+
+        type_list = &(*type_list)->next;
+        free(decl);
+        free(var);
+    }
+
+    return stmt;
+}
+
+static statement_list_t *append_statement(statement_list_t *list, statement_t *stmt)
+{
+    if (!stmt) return list;
+    if (!list)
+    {
+        list = xmalloc( sizeof(*list) );
+        list_init( list );
+    }
+    list_add_tail( list, &stmt->entry );
+    return list;
+}
+
+static func_list_t *append_func_from_statement(func_list_t *list, statement_t *stmt)
+{
+    if (stmt->type == STMT_DECLARATION)
+    {
+        var_t *var = stmt->u.var;
+        if (var->stgclass == STG_NONE && var->type->type == RPC_FC_FUNCTION)
+        {
+            check_function_attrs(var->name, var->type->attrs);
+            return append_func(list, make_func(stmt->u.var));
+        }
+    }
+    return list;
+}
+