PageRenderTime 53ms CodeModel.GetById 18ms RepoModel.GetById 1ms app.codeStats 0ms

/tools/widl/parser.y

https://bitbucket.org/arty/arty-newcc-reactos
Happy | 2827 lines | 2542 code | 285 blank | 0 comment | 0 complexity | c34bb2d6da8d2f13311d3fed158711cc MD5 | raw file
Possible License(s): GPL-2.0, LGPL-2.1, LGPL-3.0, CC-BY-SA-3.0, AGPL-3.0, GPL-3.0, CPL-1.0

Large files files are truncated, but you can click here to view the full file

  1. %{
  2. /*
  3. * IDL Compiler
  4. *
  5. * Copyright 2002 Ove Kaaven
  6. * Copyright 2006-2008 Robert Shearman
  7. *
  8. * This library is free software; you can redistribute it and/or
  9. * modify it under the terms of the GNU Lesser General Public
  10. * License as published by the Free Software Foundation; either
  11. * version 2.1 of the License, or (at your option) any later version.
  12. *
  13. * This library is distributed in the hope that it will be useful,
  14. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  15. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  16. * Lesser General Public License for more details.
  17. *
  18. * You should have received a copy of the GNU Lesser General Public
  19. * License along with this library; if not, write to the Free Software
  20. * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
  21. */
  22. #include "config.h"
  23. #include <stdio.h>
  24. #include <stdlib.h>
  25. #include <stdarg.h>
  26. #include <assert.h>
  27. #include <ctype.h>
  28. #include <string.h>
  29. #include "widl.h"
  30. #include "utils.h"
  31. #include "parser.h"
  32. #include "header.h"
  33. #include "typelib.h"
  34. #include "typegen.h"
  35. #include "expr.h"
  36. #include "typetree.h"
  37. #if defined(YYBYACC)
  38. /* Berkeley yacc (byacc) doesn't seem to know about these */
  39. /* Some *BSD supplied versions do define these though */
  40. # ifndef YYEMPTY
  41. # define YYEMPTY (-1) /* Empty lookahead value of yychar */
  42. # endif
  43. # ifndef YYLEX
  44. # define YYLEX yylex()
  45. # endif
  46. #elif defined(YYBISON)
  47. /* Bison was used for original development */
  48. /* #define YYEMPTY -2 */
  49. /* #define YYLEX yylex() */
  50. #else
  51. /* No yacc we know yet */
  52. # if !defined(YYEMPTY) || !defined(YYLEX)
  53. # error Yacc version/type unknown. This version needs to be verified for settings of YYEMPTY and YYLEX.
  54. # elif defined(__GNUC__) /* gcc defines the #warning directive */
  55. # warning Yacc version/type unknown. It defines YYEMPTY and YYLEX, but is not tested
  56. /* #else we just take a chance that it works... */
  57. # endif
  58. #endif
  59. #define YYERROR_VERBOSE
  60. static unsigned char pointer_default = RPC_FC_UP;
  61. typedef struct list typelist_t;
  62. struct typenode {
  63. type_t *type;
  64. struct list entry;
  65. };
  66. struct _import_t
  67. {
  68. char *name;
  69. int import_performed;
  70. };
  71. typedef struct _decl_spec_t
  72. {
  73. type_t *type;
  74. attr_list_t *attrs;
  75. enum storage_class stgclass;
  76. } decl_spec_t;
  77. typelist_t incomplete_types = LIST_INIT(incomplete_types);
  78. static void fix_incomplete(void);
  79. static void fix_incomplete_types(type_t *complete_type);
  80. static str_list_t *append_str(str_list_t *list, char *str);
  81. static attr_list_t *append_attr(attr_list_t *list, attr_t *attr);
  82. static attr_list_t *append_attr_list(attr_list_t *new_list, attr_list_t *old_list);
  83. 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);
  84. static attr_t *make_attr(enum attr_type type);
  85. static attr_t *make_attrv(enum attr_type type, unsigned int val);
  86. static attr_t *make_attrp(enum attr_type type, void *val);
  87. static expr_list_t *append_expr(expr_list_t *list, expr_t *expr);
  88. static array_dims_t *append_array(array_dims_t *list, expr_t *expr);
  89. static var_t *declare_var(attr_list_t *attrs, decl_spec_t *decl_spec, const declarator_t *decl, int top);
  90. static var_list_t *set_var_types(attr_list_t *attrs, decl_spec_t *decl_spec, declarator_list_t *decls);
  91. static ifref_list_t *append_ifref(ifref_list_t *list, ifref_t *iface);
  92. static ifref_t *make_ifref(type_t *iface);
  93. static var_list_t *append_var_list(var_list_t *list, var_list_t *vars);
  94. static declarator_list_t *append_declarator(declarator_list_t *list, declarator_t *p);
  95. static declarator_t *make_declarator(var_t *var);
  96. static type_t *make_safearray(type_t *type);
  97. static typelib_t *make_library(const char *name, const attr_list_t *attrs);
  98. static type_t *append_ptrchain_type(type_t *ptrchain, type_t *type);
  99. static type_t *reg_typedefs(decl_spec_t *decl_spec, var_list_t *names, attr_list_t *attrs);
  100. static type_t *find_type_or_error(const char *name, int t);
  101. static type_t *find_type_or_error2(char *name, int t);
  102. static var_t *reg_const(var_t *var);
  103. static char *gen_name(void);
  104. static void check_arg_attrs(const var_t *arg);
  105. static void check_statements(const statement_list_t *stmts, int is_inside_library);
  106. static void check_all_user_types(const statement_list_t *stmts);
  107. static attr_list_t *check_iface_attrs(const char *name, attr_list_t *attrs);
  108. static attr_list_t *check_function_attrs(const char *name, attr_list_t *attrs);
  109. static attr_list_t *check_typedef_attrs(attr_list_t *attrs);
  110. static attr_list_t *check_enum_attrs(attr_list_t *attrs);
  111. static attr_list_t *check_struct_attrs(attr_list_t *attrs);
  112. static attr_list_t *check_union_attrs(attr_list_t *attrs);
  113. static attr_list_t *check_field_attrs(const char *name, attr_list_t *attrs);
  114. static attr_list_t *check_library_attrs(const char *name, attr_list_t *attrs);
  115. static attr_list_t *check_dispiface_attrs(const char *name, attr_list_t *attrs);
  116. static attr_list_t *check_module_attrs(const char *name, attr_list_t *attrs);
  117. static attr_list_t *check_coclass_attrs(const char *name, attr_list_t *attrs);
  118. const char *get_attr_display_name(enum attr_type type);
  119. static void add_explicit_handle_if_necessary(const type_t *iface, var_t *func);
  120. static void check_def(const type_t *t);
  121. static statement_t *make_statement(enum statement_type type);
  122. static statement_t *make_statement_type_decl(type_t *type);
  123. static statement_t *make_statement_reference(type_t *type);
  124. static statement_t *make_statement_declaration(var_t *var);
  125. static statement_t *make_statement_library(typelib_t *typelib);
  126. static statement_t *make_statement_cppquote(const char *str);
  127. static statement_t *make_statement_importlib(const char *str);
  128. static statement_t *make_statement_module(type_t *type);
  129. static statement_t *make_statement_typedef(var_list_t *names);
  130. static statement_t *make_statement_import(const char *str);
  131. static statement_t *make_statement_typedef(var_list_t *names);
  132. static statement_list_t *append_statement(statement_list_t *list, statement_t *stmt);
  133. %}
  134. %union {
  135. attr_t *attr;
  136. attr_list_t *attr_list;
  137. str_list_t *str_list;
  138. expr_t *expr;
  139. expr_list_t *expr_list;
  140. array_dims_t *array_dims;
  141. type_t *type;
  142. var_t *var;
  143. var_list_t *var_list;
  144. declarator_t *declarator;
  145. declarator_list_t *declarator_list;
  146. statement_t *statement;
  147. statement_list_t *stmt_list;
  148. ifref_t *ifref;
  149. ifref_list_t *ifref_list;
  150. char *str;
  151. UUID *uuid;
  152. unsigned int num;
  153. double dbl;
  154. interface_info_t ifinfo;
  155. typelib_t *typelib;
  156. struct _import_t *import;
  157. struct _decl_spec_t *declspec;
  158. enum storage_class stgclass;
  159. }
  160. %token <str> aIDENTIFIER
  161. %token <str> aKNOWNTYPE
  162. %token <num> aNUM aHEXNUM
  163. %token <dbl> aDOUBLE
  164. %token <str> aSTRING aWSTRING aSQSTRING
  165. %token <uuid> aUUID
  166. %token aEOF
  167. %token SHL SHR
  168. %token MEMBERPTR
  169. %token EQUALITY INEQUALITY
  170. %token GREATEREQUAL LESSEQUAL
  171. %token LOGICALOR LOGICALAND
  172. %token ELLIPSIS
  173. %token tAGGREGATABLE tALLOCATE tANNOTATION tAPPOBJECT tASYNC tASYNCUUID
  174. %token tAUTOHANDLE tBINDABLE tBOOLEAN tBROADCAST tBYTE tBYTECOUNT
  175. %token tCALLAS tCALLBACK tCASE tCDECL tCHAR tCOCLASS tCODE tCOMMSTATUS
  176. %token tCONST tCONTEXTHANDLE tCONTEXTHANDLENOSERIALIZE
  177. %token tCONTEXTHANDLESERIALIZE tCONTROL tCPPQUOTE
  178. %token tDECODE tDEFAULT tDEFAULTBIND
  179. %token tDEFAULTCOLLELEM
  180. %token tDEFAULTVALUE
  181. %token tDEFAULTVTABLE
  182. %token tDISABLECONSISTENCYCHECK tDISPLAYBIND
  183. %token tDISPINTERFACE
  184. %token tDLLNAME tDOUBLE tDUAL
  185. %token tENABLEALLOCATE tENCODE tENDPOINT
  186. %token tENTRY tENUM tERRORSTATUST
  187. %token tEXPLICITHANDLE tEXTERN
  188. %token tFALSE
  189. %token tFASTCALL tFAULTSTATUS
  190. %token tFLOAT tFORCEALLOCATE
  191. %token tHANDLE
  192. %token tHANDLET
  193. %token tHELPCONTEXT tHELPFILE
  194. %token tHELPSTRING tHELPSTRINGCONTEXT tHELPSTRINGDLL
  195. %token tHIDDEN
  196. %token tHYPER tID tIDEMPOTENT
  197. %token tIGNORE tIIDIS
  198. %token tIMMEDIATEBIND
  199. %token tIMPLICITHANDLE
  200. %token tIMPORT tIMPORTLIB
  201. %token tIN tIN_LINE tINLINE
  202. %token tINPUTSYNC
  203. %token tINT tINT3264 tINT64
  204. %token tINTERFACE
  205. %token tLCID
  206. %token tLENGTHIS tLIBRARY
  207. %token tLICENSED tLOCAL
  208. %token tLONG
  209. %token tMAYBE tMESSAGE
  210. %token tMETHODS
  211. %token tMODULE
  212. %token tNOCODE tNONBROWSABLE
  213. %token tNONCREATABLE
  214. %token tNONEXTENSIBLE
  215. %token tNOTIFY tNOTIFYFLAG
  216. %token tNULL
  217. %token tOBJECT tODL tOLEAUTOMATION
  218. %token tOPTIMIZE tOPTIONAL
  219. %token tOUT
  220. %token tPARTIALIGNORE tPASCAL
  221. %token tPOINTERDEFAULT
  222. %token tPROGID tPROPERTIES
  223. %token tPROPGET tPROPPUT tPROPPUTREF
  224. %token tPROXY tPTR
  225. %token tPUBLIC
  226. %token tRANGE
  227. %token tREADONLY tREF
  228. %token tREGISTER tREPRESENTAS
  229. %token tREQUESTEDIT
  230. %token tRESTRICTED
  231. %token tRETVAL
  232. %token tSAFEARRAY
  233. %token tSHORT
  234. %token tSIGNED
  235. %token tSIZEIS tSIZEOF
  236. %token tSMALL
  237. %token tSOURCE
  238. %token tSTATIC
  239. %token tSTDCALL
  240. %token tSTRICTCONTEXTHANDLE
  241. %token tSTRING tSTRUCT
  242. %token tSWITCH tSWITCHIS tSWITCHTYPE
  243. %token tTHREADING tTRANSMITAS
  244. %token tTRUE
  245. %token tTYPEDEF
  246. %token tUIDEFAULT tUNION
  247. %token tUNIQUE
  248. %token tUNSIGNED
  249. %token tUSESGETLASTERROR tUSERMARSHAL tUUID
  250. %token tV1ENUM
  251. %token tVARARG
  252. %token tVERSION tVIPROGID
  253. %token tVOID
  254. %token tWCHAR tWIREMARSHAL
  255. %token tAPARTMENT tNEUTRAL tSINGLE tFREE tBOTH
  256. %type <attr> attribute type_qualifier function_specifier
  257. %type <attr_list> m_attributes attributes attrib_list m_type_qual_list
  258. %type <str_list> str_list
  259. %type <expr> m_expr expr expr_const expr_int_const array m_bitfield
  260. %type <expr_list> m_exprs /* exprs expr_list */ expr_list_int_const
  261. %type <ifinfo> interfacehdr
  262. %type <stgclass> storage_cls_spec
  263. %type <declspec> decl_spec decl_spec_no_type m_decl_spec_no_type
  264. %type <type> inherit interface interfacedef interfacedec
  265. %type <type> dispinterface dispinterfacehdr dispinterfacedef
  266. %type <type> module modulehdr moduledef
  267. %type <type> base_type int_std
  268. %type <type> enumdef structdef uniondef typedecl
  269. %type <type> type
  270. %type <ifref> coclass_int
  271. %type <ifref_list> coclass_ints
  272. %type <var> arg ne_union_field union_field s_field case enum declaration
  273. %type <var> funcdef
  274. %type <var_list> m_args arg_list args dispint_meths
  275. %type <var_list> fields ne_union_fields cases enums enum_list dispint_props field
  276. %type <var> m_ident ident
  277. %type <declarator> declarator direct_declarator init_declarator struct_declarator
  278. %type <declarator> m_any_declarator any_declarator any_declarator_no_direct any_direct_declarator
  279. %type <declarator> m_abstract_declarator abstract_declarator abstract_declarator_no_direct abstract_direct_declarator
  280. %type <declarator_list> declarator_list struct_declarator_list
  281. %type <type> coclass coclasshdr coclassdef
  282. %type <num> pointer_type threading_type version
  283. %type <str> libraryhdr callconv cppquote importlib import t_ident
  284. %type <uuid> uuid_string
  285. %type <import> import_start
  286. %type <typelib> library_start librarydef
  287. %type <statement> statement typedef
  288. %type <stmt_list> gbl_statements imp_statements int_statements
  289. %left ','
  290. %right '?' ':'
  291. %left LOGICALOR
  292. %left LOGICALAND
  293. %left '|'
  294. %left '^'
  295. %left '&'
  296. %left EQUALITY INEQUALITY
  297. %left '<' '>' LESSEQUAL GREATEREQUAL
  298. %left SHL SHR
  299. %left '-' '+'
  300. %left '*' '/' '%'
  301. %right '!' '~' CAST PPTR POS NEG ADDRESSOF tSIZEOF
  302. %left '.' MEMBERPTR '[' ']'
  303. %%
  304. input: gbl_statements { fix_incomplete();
  305. check_statements($1, FALSE);
  306. check_all_user_types($1);
  307. write_header($1);
  308. write_id_data($1);
  309. write_proxies($1);
  310. write_client($1);
  311. write_server($1);
  312. write_regscript($1);
  313. write_dlldata($1);
  314. write_local_stubs($1);
  315. }
  316. ;
  317. gbl_statements: { $$ = NULL; }
  318. | gbl_statements interfacedec { $$ = append_statement($1, make_statement_reference($2)); }
  319. | gbl_statements interfacedef { $$ = append_statement($1, make_statement_type_decl($2)); }
  320. | gbl_statements coclass ';' { $$ = $1;
  321. reg_type($2, $2->name, 0);
  322. }
  323. | gbl_statements coclassdef { $$ = append_statement($1, make_statement_type_decl($2));
  324. reg_type($2, $2->name, 0);
  325. }
  326. | gbl_statements moduledef { $$ = append_statement($1, make_statement_module($2)); }
  327. | gbl_statements librarydef { $$ = append_statement($1, make_statement_library($2)); }
  328. | gbl_statements statement { $$ = append_statement($1, $2); }
  329. ;
  330. imp_statements: { $$ = NULL; }
  331. | imp_statements interfacedec { $$ = append_statement($1, make_statement_reference($2)); }
  332. | imp_statements interfacedef { $$ = append_statement($1, make_statement_type_decl($2)); }
  333. | imp_statements coclass ';' { $$ = $1; reg_type($2, $2->name, 0); }
  334. | imp_statements coclassdef { $$ = append_statement($1, make_statement_type_decl($2));
  335. reg_type($2, $2->name, 0);
  336. }
  337. | imp_statements moduledef { $$ = append_statement($1, make_statement_module($2)); }
  338. | imp_statements statement { $$ = append_statement($1, $2); }
  339. | imp_statements importlib { $$ = append_statement($1, make_statement_importlib($2)); }
  340. | imp_statements librarydef { $$ = append_statement($1, make_statement_library($2)); }
  341. ;
  342. int_statements: { $$ = NULL; }
  343. | int_statements statement { $$ = append_statement($1, $2); }
  344. ;
  345. semicolon_opt:
  346. | ';'
  347. ;
  348. statement:
  349. cppquote { $$ = make_statement_cppquote($1); }
  350. | typedecl ';' { $$ = make_statement_type_decl($1); }
  351. | declaration ';' { $$ = make_statement_declaration($1); }
  352. | import { $$ = make_statement_import($1); }
  353. | typedef ';' { $$ = $1; }
  354. ;
  355. typedecl:
  356. enumdef
  357. | tENUM aIDENTIFIER { $$ = type_new_enum($2, FALSE, NULL); }
  358. | structdef
  359. | tSTRUCT aIDENTIFIER { $$ = type_new_struct($2, FALSE, NULL); }
  360. | uniondef
  361. | tUNION aIDENTIFIER { $$ = type_new_nonencapsulated_union($2, FALSE, NULL); }
  362. | attributes enumdef { $$ = $2; $$->attrs = check_enum_attrs($1); }
  363. | attributes structdef { $$ = $2; $$->attrs = check_struct_attrs($1); }
  364. | attributes uniondef { $$ = $2; $$->attrs = check_union_attrs($1); }
  365. ;
  366. cppquote: tCPPQUOTE '(' aSTRING ')' { $$ = $3; }
  367. ;
  368. import_start: tIMPORT aSTRING ';' { assert(yychar == YYEMPTY);
  369. $$ = xmalloc(sizeof(struct _import_t));
  370. $$->name = $2;
  371. $$->import_performed = do_import($2);
  372. if (!$$->import_performed) yychar = aEOF;
  373. }
  374. ;
  375. import: import_start imp_statements aEOF { $$ = $1->name;
  376. if ($1->import_performed) pop_import();
  377. free($1);
  378. }
  379. ;
  380. importlib: tIMPORTLIB '(' aSTRING ')'
  381. semicolon_opt { $$ = $3; if(!parse_only) add_importlib($3); }
  382. ;
  383. libraryhdr: tLIBRARY aIDENTIFIER { $$ = $2; }
  384. ;
  385. library_start: attributes libraryhdr '{' { $$ = make_library($2, check_library_attrs($2, $1));
  386. if (!parse_only) start_typelib($$);
  387. }
  388. ;
  389. librarydef: library_start imp_statements '}'
  390. semicolon_opt { $$ = $1;
  391. $$->stmts = $2;
  392. if (!parse_only) end_typelib();
  393. }
  394. ;
  395. m_args: { $$ = NULL; }
  396. | args
  397. ;
  398. arg_list: arg { check_arg_attrs($1); $$ = append_var( NULL, $1 ); }
  399. | arg_list ',' arg { check_arg_attrs($3); $$ = append_var( $1, $3 ); }
  400. ;
  401. args: arg_list
  402. | arg_list ',' ELLIPSIS { $$ = append_var( $1, make_var(strdup("...")) ); }
  403. ;
  404. /* split into two rules to get bison to resolve a tVOID conflict */
  405. arg: attributes decl_spec m_any_declarator { if ($2->stgclass != STG_NONE && $2->stgclass != STG_REGISTER)
  406. error_loc("invalid storage class for function parameter\n");
  407. $$ = declare_var($1, $2, $3, TRUE);
  408. free($2); free($3);
  409. }
  410. | decl_spec m_any_declarator { if ($1->stgclass != STG_NONE && $1->stgclass != STG_REGISTER)
  411. error_loc("invalid storage class for function parameter\n");
  412. $$ = declare_var(NULL, $1, $2, TRUE);
  413. free($1); free($2);
  414. }
  415. ;
  416. array: '[' expr ']' { $$ = $2;
  417. if (!$$->is_const)
  418. error_loc("array dimension is not an integer constant\n");
  419. }
  420. | '[' '*' ']' { $$ = make_expr(EXPR_VOID); }
  421. | '[' ']' { $$ = make_expr(EXPR_VOID); }
  422. ;
  423. m_attributes: { $$ = NULL; }
  424. | attributes
  425. ;
  426. attributes:
  427. '[' attrib_list ']' { $$ = $2; }
  428. ;
  429. attrib_list: attribute { $$ = append_attr( NULL, $1 ); }
  430. | attrib_list ',' attribute { $$ = append_attr( $1, $3 ); }
  431. | attrib_list ']' '[' attribute { $$ = append_attr( $1, $4 ); }
  432. ;
  433. str_list: aSTRING { $$ = append_str( NULL, $1 ); }
  434. | str_list ',' aSTRING { $$ = append_str( $1, $3 ); }
  435. ;
  436. attribute: { $$ = NULL; }
  437. | tAGGREGATABLE { $$ = make_attr(ATTR_AGGREGATABLE); }
  438. | tANNOTATION '(' aSTRING ')' { $$ = make_attrp(ATTR_ANNOTATION, $3); }
  439. | tAPPOBJECT { $$ = make_attr(ATTR_APPOBJECT); }
  440. | tASYNC { $$ = make_attr(ATTR_ASYNC); }
  441. | tAUTOHANDLE { $$ = make_attr(ATTR_AUTO_HANDLE); }
  442. | tBINDABLE { $$ = make_attr(ATTR_BINDABLE); }
  443. | tBROADCAST { $$ = make_attr(ATTR_BROADCAST); }
  444. | tCALLAS '(' ident ')' { $$ = make_attrp(ATTR_CALLAS, $3); }
  445. | tCASE '(' expr_list_int_const ')' { $$ = make_attrp(ATTR_CASE, $3); }
  446. | tCODE { $$ = make_attr(ATTR_CODE); }
  447. | tCOMMSTATUS { $$ = make_attr(ATTR_COMMSTATUS); }
  448. | tCONTEXTHANDLE { $$ = make_attrv(ATTR_CONTEXTHANDLE, 0); }
  449. | tCONTEXTHANDLENOSERIALIZE { $$ = make_attrv(ATTR_CONTEXTHANDLE, 0); /* RPC_CONTEXT_HANDLE_DONT_SERIALIZE */ }
  450. | tCONTEXTHANDLESERIALIZE { $$ = make_attrv(ATTR_CONTEXTHANDLE, 0); /* RPC_CONTEXT_HANDLE_SERIALIZE */ }
  451. | tCONTROL { $$ = make_attr(ATTR_CONTROL); }
  452. | tDECODE { $$ = make_attr(ATTR_DECODE); }
  453. | tDEFAULT { $$ = make_attr(ATTR_DEFAULT); }
  454. | tDEFAULTBIND { $$ = make_attr(ATTR_DEFAULTBIND); }
  455. | tDEFAULTCOLLELEM { $$ = make_attr(ATTR_DEFAULTCOLLELEM); }
  456. | tDEFAULTVALUE '(' expr_const ')' { $$ = make_attrp(ATTR_DEFAULTVALUE, $3); }
  457. | tDEFAULTVTABLE { $$ = make_attr(ATTR_DEFAULTVTABLE); }
  458. | tDISABLECONSISTENCYCHECK { $$ = make_attr(ATTR_DISABLECONSISTENCYCHECK); }
  459. | tDISPLAYBIND { $$ = make_attr(ATTR_DISPLAYBIND); }
  460. | tDLLNAME '(' aSTRING ')' { $$ = make_attrp(ATTR_DLLNAME, $3); }
  461. | tDUAL { $$ = make_attr(ATTR_DUAL); }
  462. | tENABLEALLOCATE { $$ = make_attr(ATTR_ENABLEALLOCATE); }
  463. | tENCODE { $$ = make_attr(ATTR_ENCODE); }
  464. | tENDPOINT '(' str_list ')' { $$ = make_attrp(ATTR_ENDPOINT, $3); }
  465. | tENTRY '(' expr_const ')' { $$ = make_attrp(ATTR_ENTRY, $3); }
  466. | tEXPLICITHANDLE { $$ = make_attr(ATTR_EXPLICIT_HANDLE); }
  467. | tFAULTSTATUS { $$ = make_attr(ATTR_FAULTSTATUS); }
  468. | tFORCEALLOCATE { $$ = make_attr(ATTR_FORCEALLOCATE); }
  469. | tHANDLE { $$ = make_attr(ATTR_HANDLE); }
  470. | tHELPCONTEXT '(' expr_int_const ')' { $$ = make_attrp(ATTR_HELPCONTEXT, $3); }
  471. | tHELPFILE '(' aSTRING ')' { $$ = make_attrp(ATTR_HELPFILE, $3); }
  472. | tHELPSTRING '(' aSTRING ')' { $$ = make_attrp(ATTR_HELPSTRING, $3); }
  473. | tHELPSTRINGCONTEXT '(' expr_int_const ')' { $$ = make_attrp(ATTR_HELPSTRINGCONTEXT, $3); }
  474. | tHELPSTRINGDLL '(' aSTRING ')' { $$ = make_attrp(ATTR_HELPSTRINGDLL, $3); }
  475. | tHIDDEN { $$ = make_attr(ATTR_HIDDEN); }
  476. | tID '(' expr_int_const ')' { $$ = make_attrp(ATTR_ID, $3); }
  477. | tIDEMPOTENT { $$ = make_attr(ATTR_IDEMPOTENT); }
  478. | tIGNORE { $$ = make_attr(ATTR_IGNORE); }
  479. | tIIDIS '(' expr ')' { $$ = make_attrp(ATTR_IIDIS, $3); }
  480. | tIMMEDIATEBIND { $$ = make_attr(ATTR_IMMEDIATEBIND); }
  481. | tIMPLICITHANDLE '(' arg ')' { $$ = make_attrp(ATTR_IMPLICIT_HANDLE, $3); }
  482. | tIN { $$ = make_attr(ATTR_IN); }
  483. | tINPUTSYNC { $$ = make_attr(ATTR_INPUTSYNC); }
  484. | tLENGTHIS '(' m_exprs ')' { $$ = make_attrp(ATTR_LENGTHIS, $3); }
  485. | tLCID '(' expr_int_const ')' { $$ = make_attrp(ATTR_LIBLCID, $3); }
  486. | tLCID { $$ = make_attr(ATTR_PARAMLCID); }
  487. | tLICENSED { $$ = make_attr(ATTR_LICENSED); }
  488. | tLOCAL { $$ = make_attr(ATTR_LOCAL); }
  489. | tMAYBE { $$ = make_attr(ATTR_MAYBE); }
  490. | tMESSAGE { $$ = make_attr(ATTR_MESSAGE); }
  491. | tNOCODE { $$ = make_attr(ATTR_NOCODE); }
  492. | tNONBROWSABLE { $$ = make_attr(ATTR_NONBROWSABLE); }
  493. | tNONCREATABLE { $$ = make_attr(ATTR_NONCREATABLE); }
  494. | tNONEXTENSIBLE { $$ = make_attr(ATTR_NONEXTENSIBLE); }
  495. | tNOTIFY { $$ = make_attr(ATTR_NOTIFY); }
  496. | tNOTIFYFLAG { $$ = make_attr(ATTR_NOTIFYFLAG); }
  497. | tOBJECT { $$ = make_attr(ATTR_OBJECT); }
  498. | tODL { $$ = make_attr(ATTR_ODL); }
  499. | tOLEAUTOMATION { $$ = make_attr(ATTR_OLEAUTOMATION); }
  500. | tOPTIMIZE '(' aSTRING ')' { $$ = make_attrp(ATTR_OPTIMIZE, $3); }
  501. | tOPTIONAL { $$ = make_attr(ATTR_OPTIONAL); }
  502. | tOUT { $$ = make_attr(ATTR_OUT); }
  503. | tPARTIALIGNORE { $$ = make_attr(ATTR_PARTIALIGNORE); }
  504. | tPOINTERDEFAULT '(' pointer_type ')' { $$ = make_attrv(ATTR_POINTERDEFAULT, $3); }
  505. | tPROGID '(' aSTRING ')' { $$ = make_attrp(ATTR_PROGID, $3); }
  506. | tPROPGET { $$ = make_attr(ATTR_PROPGET); }
  507. | tPROPPUT { $$ = make_attr(ATTR_PROPPUT); }
  508. | tPROPPUTREF { $$ = make_attr(ATTR_PROPPUTREF); }
  509. | tPROXY { $$ = make_attr(ATTR_PROXY); }
  510. | tPUBLIC { $$ = make_attr(ATTR_PUBLIC); }
  511. | tRANGE '(' expr_int_const ',' expr_int_const ')'
  512. { expr_list_t *list = append_expr( NULL, $3 );
  513. list = append_expr( list, $5 );
  514. $$ = make_attrp(ATTR_RANGE, list); }
  515. | tREADONLY { $$ = make_attr(ATTR_READONLY); }
  516. | tREPRESENTAS '(' type ')' { $$ = make_attrp(ATTR_REPRESENTAS, $3); }
  517. | tREQUESTEDIT { $$ = make_attr(ATTR_REQUESTEDIT); }
  518. | tRESTRICTED { $$ = make_attr(ATTR_RESTRICTED); }
  519. | tRETVAL { $$ = make_attr(ATTR_RETVAL); }
  520. | tSIZEIS '(' m_exprs ')' { $$ = make_attrp(ATTR_SIZEIS, $3); }
  521. | tSOURCE { $$ = make_attr(ATTR_SOURCE); }
  522. | tSTRICTCONTEXTHANDLE { $$ = make_attr(ATTR_STRICTCONTEXTHANDLE); }
  523. | tSTRING { $$ = make_attr(ATTR_STRING); }
  524. | tSWITCHIS '(' expr ')' { $$ = make_attrp(ATTR_SWITCHIS, $3); }
  525. | tSWITCHTYPE '(' type ')' { $$ = make_attrp(ATTR_SWITCHTYPE, $3); }
  526. | tTRANSMITAS '(' type ')' { $$ = make_attrp(ATTR_TRANSMITAS, $3); }
  527. | tTHREADING '(' threading_type ')' { $$ = make_attrv(ATTR_THREADING, $3); }
  528. | tUIDEFAULT { $$ = make_attr(ATTR_UIDEFAULT); }
  529. | tUSESGETLASTERROR { $$ = make_attr(ATTR_USESGETLASTERROR); }
  530. | tUSERMARSHAL '(' type ')' { $$ = make_attrp(ATTR_USERMARSHAL, $3); }
  531. | tUUID '(' uuid_string ')' { $$ = make_attrp(ATTR_UUID, $3); }
  532. | tV1ENUM { $$ = make_attr(ATTR_V1ENUM); }
  533. | tVARARG { $$ = make_attr(ATTR_VARARG); }
  534. | tVERSION '(' version ')' { $$ = make_attrv(ATTR_VERSION, $3); }
  535. | tVIPROGID '(' aSTRING ')' { $$ = make_attrp(ATTR_VIPROGID, $3); }
  536. | tWIREMARSHAL '(' type ')' { $$ = make_attrp(ATTR_WIREMARSHAL, $3); }
  537. | pointer_type { $$ = make_attrv(ATTR_POINTERTYPE, $1); }
  538. ;
  539. uuid_string:
  540. aUUID
  541. | aSTRING { if (!is_valid_uuid($1))
  542. error_loc("invalid UUID: %s\n", $1);
  543. $$ = parse_uuid($1); }
  544. ;
  545. callconv: tCDECL { $$ = xstrdup("__cdecl"); }
  546. | tFASTCALL { $$ = xstrdup("__fastcall"); }
  547. | tPASCAL { $$ = xstrdup("__pascal"); }
  548. | tSTDCALL { $$ = xstrdup("__stdcall"); }
  549. ;
  550. cases: { $$ = NULL; }
  551. | cases case { $$ = append_var( $1, $2 ); }
  552. ;
  553. case: tCASE expr_int_const ':' union_field { attr_t *a = make_attrp(ATTR_CASE, append_expr( NULL, $2 ));
  554. $$ = $4; if (!$$) $$ = make_var(NULL);
  555. $$->attrs = append_attr( $$->attrs, a );
  556. }
  557. | tDEFAULT ':' union_field { attr_t *a = make_attr(ATTR_DEFAULT);
  558. $$ = $3; if (!$$) $$ = make_var(NULL);
  559. $$->attrs = append_attr( $$->attrs, a );
  560. }
  561. ;
  562. enums: { $$ = NULL; }
  563. | enum_list ',' { $$ = $1; }
  564. | enum_list
  565. ;
  566. enum_list: enum { if (!$1->eval)
  567. $1->eval = make_exprl(EXPR_NUM, 0 /* default for first enum entry */);
  568. $$ = append_var( NULL, $1 );
  569. }
  570. | enum_list ',' enum { if (!$3->eval)
  571. {
  572. var_t *last = LIST_ENTRY( list_tail($$), var_t, entry );
  573. $3->eval = make_exprl(EXPR_NUM, last->eval->cval + 1);
  574. }
  575. $$ = append_var( $1, $3 );
  576. }
  577. ;
  578. enum: ident '=' expr_int_const { $$ = reg_const($1);
  579. $$->eval = $3;
  580. $$->type = type_new_int(TYPE_BASIC_INT, 0);
  581. }
  582. | ident { $$ = reg_const($1);
  583. $$->type = type_new_int(TYPE_BASIC_INT, 0);
  584. }
  585. ;
  586. enumdef: tENUM t_ident '{' enums '}' { $$ = type_new_enum($2, TRUE, $4); }
  587. ;
  588. m_exprs: m_expr { $$ = append_expr( NULL, $1 ); }
  589. | m_exprs ',' m_expr { $$ = append_expr( $1, $3 ); }
  590. ;
  591. m_expr: { $$ = make_expr(EXPR_VOID); }
  592. | expr
  593. ;
  594. expr: aNUM { $$ = make_exprl(EXPR_NUM, $1); }
  595. | aHEXNUM { $$ = make_exprl(EXPR_HEXNUM, $1); }
  596. | aDOUBLE { $$ = make_exprd(EXPR_DOUBLE, $1); }
  597. | tFALSE { $$ = make_exprl(EXPR_TRUEFALSE, 0); }
  598. | tNULL { $$ = make_exprl(EXPR_NUM, 0); }
  599. | tTRUE { $$ = make_exprl(EXPR_TRUEFALSE, 1); }
  600. | aSTRING { $$ = make_exprs(EXPR_STRLIT, $1); }
  601. | aWSTRING { $$ = make_exprs(EXPR_WSTRLIT, $1); }
  602. | aSQSTRING { $$ = make_exprs(EXPR_CHARCONST, $1); }
  603. | aIDENTIFIER { $$ = make_exprs(EXPR_IDENTIFIER, $1); }
  604. | expr '?' expr ':' expr { $$ = make_expr3(EXPR_COND, $1, $3, $5); }
  605. | expr LOGICALOR expr { $$ = make_expr2(EXPR_LOGOR, $1, $3); }
  606. | expr LOGICALAND expr { $$ = make_expr2(EXPR_LOGAND, $1, $3); }
  607. | expr '|' expr { $$ = make_expr2(EXPR_OR , $1, $3); }
  608. | expr '^' expr { $$ = make_expr2(EXPR_XOR, $1, $3); }
  609. | expr '&' expr { $$ = make_expr2(EXPR_AND, $1, $3); }
  610. | expr EQUALITY expr { $$ = make_expr2(EXPR_EQUALITY, $1, $3); }
  611. | expr INEQUALITY expr { $$ = make_expr2(EXPR_INEQUALITY, $1, $3); }
  612. | expr '>' expr { $$ = make_expr2(EXPR_GTR, $1, $3); }
  613. | expr '<' expr { $$ = make_expr2(EXPR_LESS, $1, $3); }
  614. | expr GREATEREQUAL expr { $$ = make_expr2(EXPR_GTREQL, $1, $3); }
  615. | expr LESSEQUAL expr { $$ = make_expr2(EXPR_LESSEQL, $1, $3); }
  616. | expr SHL expr { $$ = make_expr2(EXPR_SHL, $1, $3); }
  617. | expr SHR expr { $$ = make_expr2(EXPR_SHR, $1, $3); }
  618. | expr '+' expr { $$ = make_expr2(EXPR_ADD, $1, $3); }
  619. | expr '-' expr { $$ = make_expr2(EXPR_SUB, $1, $3); }
  620. | expr '%' expr { $$ = make_expr2(EXPR_MOD, $1, $3); }
  621. | expr '*' expr { $$ = make_expr2(EXPR_MUL, $1, $3); }
  622. | expr '/' expr { $$ = make_expr2(EXPR_DIV, $1, $3); }
  623. | '!' expr { $$ = make_expr1(EXPR_LOGNOT, $2); }
  624. | '~' expr { $$ = make_expr1(EXPR_NOT, $2); }
  625. | '+' expr %prec POS { $$ = make_expr1(EXPR_POS, $2); }
  626. | '-' expr %prec NEG { $$ = make_expr1(EXPR_NEG, $2); }
  627. | '&' expr %prec ADDRESSOF { $$ = make_expr1(EXPR_ADDRESSOF, $2); }
  628. | '*' expr %prec PPTR { $$ = make_expr1(EXPR_PPTR, $2); }
  629. | expr MEMBERPTR aIDENTIFIER { $$ = make_expr2(EXPR_MEMBER, make_expr1(EXPR_PPTR, $1), make_exprs(EXPR_IDENTIFIER, $3)); }
  630. | expr '.' aIDENTIFIER { $$ = make_expr2(EXPR_MEMBER, $1, make_exprs(EXPR_IDENTIFIER, $3)); }
  631. | '(' decl_spec m_abstract_declarator ')' expr %prec CAST
  632. { $$ = make_exprt(EXPR_CAST, declare_var(NULL, $2, $3, 0), $5); free($2); free($3); }
  633. | tSIZEOF '(' decl_spec m_abstract_declarator ')'
  634. { $$ = make_exprt(EXPR_SIZEOF, declare_var(NULL, $3, $4, 0), NULL); free($3); free($4); }
  635. | expr '[' expr ']' { $$ = make_expr2(EXPR_ARRAY, $1, $3); }
  636. | '(' expr ')' { $$ = $2; }
  637. ;
  638. expr_list_int_const: expr_int_const { $$ = append_expr( NULL, $1 ); }
  639. | expr_list_int_const ',' expr_int_const { $$ = append_expr( $1, $3 ); }
  640. ;
  641. expr_int_const: expr { $$ = $1;
  642. if (!$$->is_const)
  643. error_loc("expression is not an integer constant\n");
  644. }
  645. ;
  646. expr_const: expr { $$ = $1;
  647. if (!$$->is_const && $$->type != EXPR_STRLIT && $$->type != EXPR_WSTRLIT)
  648. error_loc("expression is not constant\n");
  649. }
  650. ;
  651. fields: { $$ = NULL; }
  652. | fields field { $$ = append_var_list($1, $2); }
  653. ;
  654. field: m_attributes decl_spec struct_declarator_list ';'
  655. { const char *first = LIST_ENTRY(list_head($3), declarator_t, entry)->var->name;
  656. check_field_attrs(first, $1);
  657. $$ = set_var_types($1, $2, $3);
  658. }
  659. | m_attributes uniondef ';' { var_t *v = make_var(NULL);
  660. v->type = $2; v->attrs = $1;
  661. $$ = append_var(NULL, v);
  662. }
  663. ;
  664. ne_union_field:
  665. s_field ';' { $$ = $1; }
  666. | attributes ';' { $$ = make_var(NULL); $$->attrs = $1; }
  667. ;
  668. ne_union_fields: { $$ = NULL; }
  669. | ne_union_fields ne_union_field { $$ = append_var( $1, $2 ); }
  670. ;
  671. union_field:
  672. s_field ';' { $$ = $1; }
  673. | ';' { $$ = NULL; }
  674. ;
  675. s_field: m_attributes decl_spec declarator { $$ = declare_var(check_field_attrs($3->var->name, $1),
  676. $2, $3, FALSE);
  677. free($3);
  678. }
  679. ;
  680. funcdef: declaration { $$ = $1;
  681. if (type_get_type($$->type) != TYPE_FUNCTION)
  682. error_loc("only methods may be declared inside the methods section of a dispinterface\n");
  683. check_function_attrs($$->name, $$->attrs);
  684. }
  685. ;
  686. declaration:
  687. attributes decl_spec init_declarator
  688. { $$ = declare_var($1, $2, $3, FALSE);
  689. free($3);
  690. }
  691. | decl_spec init_declarator { $$ = declare_var(NULL, $1, $2, FALSE);
  692. free($2);
  693. }
  694. ;
  695. m_ident: { $$ = NULL; }
  696. | ident
  697. ;
  698. t_ident: { $$ = NULL; }
  699. | aIDENTIFIER { $$ = $1; }
  700. | aKNOWNTYPE { $$ = $1; }
  701. ;
  702. ident: aIDENTIFIER { $$ = make_var($1); }
  703. /* some "reserved words" used in attributes are also used as field names in some MS IDL files */
  704. | aKNOWNTYPE { $$ = make_var($<str>1); }
  705. ;
  706. base_type: tBYTE { $$ = find_type_or_error($<str>1, 0); }
  707. | tWCHAR { $$ = find_type_or_error($<str>1, 0); }
  708. | int_std
  709. | tSIGNED int_std { $$ = type_new_int(type_basic_get_type($2), -1); }
  710. | tUNSIGNED int_std { $$ = type_new_int(type_basic_get_type($2), 1); }
  711. | tUNSIGNED { $$ = type_new_int(TYPE_BASIC_INT, 1); }
  712. | tFLOAT { $$ = find_type_or_error($<str>1, 0); }
  713. | tDOUBLE { $$ = find_type_or_error($<str>1, 0); }
  714. | tBOOLEAN { $$ = find_type_or_error($<str>1, 0); }
  715. | tERRORSTATUST { $$ = find_type_or_error($<str>1, 0); }
  716. | tHANDLET { $$ = find_type_or_error($<str>1, 0); }
  717. ;
  718. m_int:
  719. | tINT
  720. ;
  721. int_std: tINT { $$ = type_new_int(TYPE_BASIC_INT, 0); }
  722. | tSHORT m_int { $$ = type_new_int(TYPE_BASIC_INT16, 0); }
  723. | tSMALL { $$ = type_new_int(TYPE_BASIC_INT8, 0); }
  724. | tLONG m_int { $$ = type_new_int(TYPE_BASIC_INT32, 0); }
  725. | tHYPER m_int { $$ = type_new_int(TYPE_BASIC_HYPER, 0); }
  726. | tINT64 { $$ = type_new_int(TYPE_BASIC_INT64, 0); }
  727. | tCHAR { $$ = type_new_int(TYPE_BASIC_CHAR, 0); }
  728. | tINT3264 { $$ = type_new_int(TYPE_BASIC_INT3264, 0); }
  729. ;
  730. coclass: tCOCLASS aIDENTIFIER { $$ = type_new_coclass($2); }
  731. | tCOCLASS aKNOWNTYPE { $$ = find_type($2, 0);
  732. if (type_get_type_detect_alias($$) != TYPE_COCLASS)
  733. error_loc("%s was not declared a coclass at %s:%d\n",
  734. $2, $$->loc_info.input_name,
  735. $$->loc_info.line_number);
  736. }
  737. ;
  738. coclasshdr: attributes coclass { $$ = $2;
  739. check_def($$);
  740. $$->attrs = check_coclass_attrs($2->name, $1);
  741. }
  742. ;
  743. coclassdef: coclasshdr '{' coclass_ints '}' semicolon_opt
  744. { $$ = type_coclass_define($1, $3); }
  745. ;
  746. coclass_ints: { $$ = NULL; }
  747. | coclass_ints coclass_int { $$ = append_ifref( $1, $2 ); }
  748. ;
  749. coclass_int:
  750. m_attributes interfacedec { $$ = make_ifref($2); $$->attrs = $1; }
  751. ;
  752. dispinterface: tDISPINTERFACE aIDENTIFIER { $$ = get_type(TYPE_INTERFACE, $2, 0); }
  753. | tDISPINTERFACE aKNOWNTYPE { $$ = get_type(TYPE_INTERFACE, $2, 0); }
  754. ;
  755. dispinterfacehdr: attributes dispinterface { attr_t *attrs;
  756. $$ = $2;
  757. check_def($$);
  758. attrs = make_attr(ATTR_DISPINTERFACE);
  759. $$->attrs = append_attr( check_dispiface_attrs($2->name, $1), attrs );
  760. $$->defined = TRUE;
  761. }
  762. ;
  763. dispint_props: tPROPERTIES ':' { $$ = NULL; }
  764. | dispint_props s_field ';' { $$ = append_var( $1, $2 ); }
  765. ;
  766. dispint_meths: tMETHODS ':' { $$ = NULL; }
  767. | dispint_meths funcdef ';' { $$ = append_var( $1, $2 ); }
  768. ;
  769. dispinterfacedef: dispinterfacehdr '{'
  770. dispint_props
  771. dispint_meths
  772. '}' { $$ = $1;
  773. type_dispinterface_define($$, $3, $4);
  774. }
  775. | dispinterfacehdr
  776. '{' interface ';' '}' { $$ = $1;
  777. type_dispinterface_define_from_iface($$, $3);
  778. }
  779. ;
  780. inherit: { $$ = NULL; }
  781. | ':' aKNOWNTYPE { $$ = find_type_or_error2($2, 0); }
  782. ;
  783. interface: tINTERFACE aIDENTIFIER { $$ = get_type(TYPE_INTERFACE, $2, 0); }
  784. | tINTERFACE aKNOWNTYPE { $$ = get_type(TYPE_INTERFACE, $2, 0); }
  785. ;
  786. interfacehdr: attributes interface { $$.interface = $2;
  787. $$.old_pointer_default = pointer_default;
  788. if (is_attr($1, ATTR_POINTERDEFAULT))
  789. pointer_default = get_attrv($1, ATTR_POINTERDEFAULT);
  790. check_def($2);
  791. $2->attrs = check_iface_attrs($2->name, $1);
  792. $2->defined = TRUE;
  793. }
  794. ;
  795. interfacedef: interfacehdr inherit
  796. '{' int_statements '}' semicolon_opt { $$ = $1.interface;
  797. type_interface_define($$, $2, $4);
  798. pointer_default = $1.old_pointer_default;
  799. }
  800. /* MIDL is able to import the definition of a base class from inside the
  801. * definition of a derived class, I'll try to support it with this rule */
  802. | interfacehdr ':' aIDENTIFIER
  803. '{' import int_statements '}'
  804. semicolon_opt { $$ = $1.interface;
  805. type_interface_define($$, find_type_or_error2($3, 0), $6);
  806. pointer_default = $1.old_pointer_default;
  807. }
  808. | dispinterfacedef semicolon_opt { $$ = $1; }
  809. ;
  810. interfacedec:
  811. interface ';' { $$ = $1; }
  812. | dispinterface ';' { $$ = $1; }
  813. ;
  814. module: tMODULE aIDENTIFIER { $$ = type_new_module($2); }
  815. | tMODULE aKNOWNTYPE { $$ = type_new_module($2); }
  816. ;
  817. modulehdr: attributes module { $$ = $2;
  818. $$->attrs = check_module_attrs($2->name, $1);
  819. }
  820. ;
  821. moduledef: modulehdr '{' int_statements '}'
  822. semicolon_opt { $$ = $1;
  823. type_module_define($$, $3);
  824. }
  825. ;
  826. storage_cls_spec:
  827. tEXTERN { $$ = STG_EXTERN; }
  828. | tSTATIC { $$ = STG_STATIC; }
  829. | tREGISTER { $$ = STG_REGISTER; }
  830. ;
  831. function_specifier:
  832. tINLINE { $$ = make_attr(ATTR_INLINE); }
  833. ;
  834. type_qualifier:
  835. tCONST { $$ = make_attr(ATTR_CONST); }
  836. ;
  837. m_type_qual_list: { $$ = NULL; }
  838. | m_type_qual_list type_qualifier { $$ = append_attr($1, $2); }
  839. ;
  840. decl_spec: type m_decl_spec_no_type { $$ = make_decl_spec($1, $2, NULL, NULL, STG_NONE); }
  841. | decl_spec_no_type type m_decl_spec_no_type
  842. { $$ = make_decl_spec($2, $1, $3, NULL, STG_NONE); }
  843. ;
  844. m_decl_spec_no_type: { $$ = NULL; }
  845. | decl_spec_no_type
  846. ;
  847. decl_spec_no_type:
  848. type_qualifier m_decl_spec_no_type { $$ = make_decl_spec(NULL, $2, NULL, $1, STG_NONE); }
  849. | function_specifier m_decl_spec_no_type { $$ = make_decl_spec(NULL, $2, NULL, $1, STG_NONE); }
  850. | storage_cls_spec m_decl_spec_no_type { $$ = make_decl_spec(NULL, $2, NULL, NULL, $1); }
  851. ;
  852. declarator:
  853. '*' m_type_qual_list declarator %prec PPTR
  854. { $$ = $3; $$->type = append_ptrchain_type($$->type, type_new_pointer(pointer_default, NULL, $2)); }
  855. | callconv declarator { $$ = $2; if ($$->func_type) $$->func_type->attrs = append_attr($$->func_type->attrs, make_attrp(ATTR_CALLCONV, $1));
  856. else if ($$->type) $$->type->attrs = append_attr($$->type->attrs, make_attrp(ATTR_CALLCONV, $1)); }
  857. | direct_declarator
  858. ;
  859. direct_declarator:
  860. ident { $$ = make_declarator($1); }
  861. | '(' declarator ')' { $$ = $2; }
  862. | direct_declarator array { $$ = $1; $$->array = append_array($$->array, $2); }
  863. | direct_declarator '(' m_args ')' { $$ = $1;
  864. $$->func_type = append_ptrchain_type($$->type, type_new_function($3));
  865. $$->type = NULL;
  866. }
  867. ;
  868. /* abstract declarator */
  869. abstract_declarator:
  870. '*' m_type_qual_list m_abstract_declarator %prec PPTR
  871. { $$ = $3; $$->type = append_ptrchain_type($$->type, type_new_pointer(pointer_default, NULL, $2)); }
  872. | callconv m_abstract_declarator { $$ = $2; if ($$->func_type) $$->func_type->attrs = append_attr($$->func_type->attrs, make_attrp(ATTR_CALLCONV, $1));
  873. else if ($$->type) $$->type->attrs = append_attr($$->type->attrs, make_attrp(ATTR_CALLCONV, $1)); }
  874. | abstract_direct_declarator
  875. ;
  876. /* abstract declarator without accepting direct declarator */
  877. abstract_declarator_no_direct:
  878. '*' m_type_qual_list m_any_declarator %prec PPTR
  879. { $$ = $3; $$->type = append_ptrchain_type($$->type, type_new_pointer(pointer_default, NULL, $2)); }
  880. | callconv m_any_declarator { $$ = $2; if ($$->func_type) $$->func_type->attrs = append_attr($$->func_type->attrs, make_attrp(ATTR_CALLCONV, $1));
  881. else if ($$->type) $$->type->attrs = append_attr($$->type->attrs, make_attrp(ATTR_CALLCONV, $1)); }
  882. ;
  883. /* abstract declarator or empty */
  884. m_abstract_declarator: { $$ = make_declarator(NULL); }
  885. | abstract_declarator
  886. ;
  887. /* abstract direct declarator */
  888. abstract_direct_declarator:
  889. '(' abstract_declarator_no_direct ')' { $$ = $2; }
  890. | abstract_direct_declarator array { $$ = $1; $$->array = append_array($$->array, $2); }
  891. | array { $$ = make_declarator(NULL); $$->array = append_array($$->array, $1); }
  892. | '(' m_args ')'
  893. { $$ = make_declarator(NULL);
  894. $$->func_type = append_ptrchain_type($$->type, type_new_function($2));
  895. $$->type = NULL;
  896. }
  897. | abstract_direct_declarator '(' m_args ')'
  898. { $$ = $1;
  899. $$->func_type = append_ptrchain_type($$->type, type_new_function($3));
  900. $$->type = NULL;
  901. }
  902. ;
  903. /* abstract or non-abstract declarator */
  904. any_declarator:
  905. '*' m_type_qual_list m_any_declarator %prec PPTR
  906. { $$ = $3; $$->type = append_ptrchain_type($$->type, type_new_pointer(pointer_default, NULL, $2)); }
  907. | callconv m_any_declarator { $$ = $2; $$->type->attrs = append_attr($$->type->attrs, make_attrp(ATTR_CALLCONV, $1)); }
  908. | any_direct_declarator
  909. ;
  910. /* abstract or non-abstract declarator without accepting direct declarator */
  911. any_declarator_no_direct:
  912. '*' m_type_qual_list m_any_declarator %prec PPTR
  913. { $$ = $3; $$->type = append_ptrchain_type($$->type, type_new_pointer(pointer_default, NULL, $2)); }
  914. | callconv m_any_declarator { $$ = $2; $$->type->attrs = append_attr($$->type->attrs, make_attrp(ATTR_CALLCONV, $1)); }
  915. ;
  916. /* abstract or non-abstract declarator or empty */
  917. m_any_declarator: { $$ = make_declarator(NULL); }
  918. | any_declarator
  919. ;
  920. /* abstract or non-abstract direct declarator. note: direct declarators
  921. * aren't accepted inside brackets to avoid ambiguity with the rule for
  922. * function arguments */
  923. any_direct_declarator:
  924. ident { $$ = make_declarator($1); }
  925. | '(' any_declarator_no_direct ')' { $$ = $2; }
  926. | any_direct_declarator array { $$ = $1; $$->array = append_array($$->array, $2); }
  927. | array { $$ = make_declarator(NULL); $$->array = append_array($$->array, $1); }
  928. | '(' m_args ')'
  929. { $$ = make_declarator(NULL);
  930. $$->func_type = append_ptrchain_type($$->type, type_new_function($2));
  931. $$->type = NULL;
  932. }
  933. | any_direct_declarator '(' m_args ')'
  934. { $$ = $1;
  935. $$->func_type = append_ptrchain_type($$->type, type_new_function($3));
  936. $$->type = NULL;
  937. }
  938. ;
  939. declarator_list:
  940. declarator { $$ = append_declarator( NULL, $1 ); }
  941. | declarator_list ',' declarator { $$ = append_declarator( $1, $3 ); }
  942. ;
  943. m_bitfield: { $$ = NULL; }
  944. | ':' expr_const { $$ = $2; }
  945. ;
  946. struct_declarator: any_declarator m_bitfield { $$ = $1; $$->bits = $2;
  947. if (!$$->bits && !$$->var->name)
  948. error_loc("unnamed fields are not allowed\n");
  949. }
  950. ;
  951. struct_declarator_list:
  952. struct_declarator { $$ = append_declarator( NULL, $1 ); }
  953. | struct_declarator_list ',' struct_declarator
  954. { $$ = append_declarator( $1, $3 ); }
  955. ;
  956. init_declarator:
  957. declarator { $$ = $1; }
  958. | declarator '=' expr_const { $$ = $1; $1->var->eval = $3; }
  959. ;
  960. threading_type:
  961. tAPARTMENT { $$ = THREADING_APARTMENT; }
  962. | tNEUTRAL { $$ = THREADING_NEUTRAL; }
  963. | tSINGLE { $$ = THREADING_SINGLE; }
  964. | tFREE { $$ = THREADING_FREE; }
  965. | tBOTH { $$ = THREADING_BOTH; }
  966. ;
  967. pointer_type:
  968. tREF { $$ = RPC_FC_RP; }
  969. | tUNIQUE { $$ = RPC_FC_UP; }
  970. | tPTR { $$ = RPC_FC_FP; }
  971. ;
  972. structdef: tSTRUCT t_ident '{' fields '}' { $$ = type_new_struct($2, TRUE, $4); }
  973. ;
  974. type: tVOID { $$ = type_new_void(); }
  975. | aKNOWNTYPE { $$ = find_type_or_error($1, 0); }
  976. | base_type { $$ = $1; }
  977. | enumdef { $$ = $1; }
  978. | tENUM aIDENTIFIER { $$ = type_new_enum($2, FALSE, NULL); }
  979. | structdef { $$ = $1; }
  980. | tSTRUCT aIDENTIFIER { $$ = type_new_struct($2, FALSE, NULL); }
  981. | uniondef { $$ = $1; }
  982. | tUNION aIDENTIFIER { $$ = type_new_nonencapsulated_union($2, FALSE, NULL); }
  983. | tSAFEARRAY '(' type ')' { $$ = make_safearray($3); }
  984. ;
  985. typedef: tTYPEDEF m_attributes decl_spec declarator_list
  986. { reg_typedefs($3, $4, check_typedef_attrs($2));
  987. $$ = make_statement_typedef($4);
  988. }
  989. ;
  990. uniondef: tUNION t_ident '{' ne_union_fields '}'
  991. { $$ = type_new_nonencapsulated_union($2, TRUE, $4); }
  992. | tUNION t_ident
  993. tSWITCH '(' s_field ')'
  994. m_ident '{' cases '}' { $$ = type_new_encapsulated_union($2, $5, $7, $9); }
  995. ;
  996. version:
  997. aNUM { $$ = MAKEVERSION($1, 0); }
  998. | aNUM '.' aNUM { $$ = MAKEVERSION($1, $3); }
  999. ;
  1000. %%
  1001. static void decl_builtin_basic(const char *name, enum type_basic_type type)
  1002. {
  1003. type_t *t = type_new_basic(type);
  1004. reg_type(t, name, 0);
  1005. }
  1006. static void decl_builtin_alias(const char *name, type_t *t)
  1007. {
  1008. reg_type(type_new_alias(t, name), name, 0);
  1009. }
  1010. void init_types(void)
  1011. {
  1012. decl_builtin_basic("byte", TYPE_BASIC_BYTE);
  1013. decl_builtin_basic("wchar_t", TYPE_BASIC_WCHAR);
  1014. decl_builtin_basic("float", TYPE_BASIC_FLOAT);
  1015. decl_builtin_basic("double", TYPE_BASIC_DOUBLE);
  1016. decl_builtin_basic("error_status_t", TYPE_BASIC_ERROR_STATUS_T);
  1017. decl_builtin_basic("handle_t", TYPE_BASIC_HANDLE);
  1018. decl_builtin_alias("boolean", type_new_basic(TYPE_BASIC_BYTE));
  1019. }
  1020. static str_list_t *append_str(str_list_t *list, char *str)
  1021. {
  1022. struct str_list_entry_t *entry;
  1023. if (!str) return list;
  1024. if (!list)
  1025. {
  1026. list = xmalloc( sizeof(*list) );
  1027. list_init( list );
  1028. }
  1029. entry = xmalloc( sizeof(*entry) );
  1030. entry->str = str;
  1031. list_add_tail( list, &entry->entry );
  1032. return list;
  1033. }
  1034. static attr_list_t *append_attr(attr_list_t *list, attr_t *attr)
  1035. {
  1036. attr_t *attr_existing;
  1037. if (!attr) return list;
  1038. if (!list)
  1039. {
  1040. list = xmalloc( sizeof(*list) );
  1041. list_init( list );
  1042. }
  1043. LIST_FOR_EACH_ENTRY(attr_existing, list, attr_t, entry)
  1044. if (attr_existing->type == attr->type)
  1045. {
  1046. parser_warning("duplicate attribute %s\n", get_attr_display_name(attr->type));
  1047. /* use the last attribute, like MIDL does */
  1048. list_remove(&attr_existing->entry);
  1049. break;
  1050. }
  1051. list_add_tail( list, &attr->entry );
  1052. return list;
  1053. }
  1054. static attr_list_t *move_attr(attr_list_t *dst, attr_list_t *src, enum attr_type type)
  1055. {
  1056. attr_t *attr;
  1057. if (!src) return dst;
  1058. LIST_FOR_EACH_ENTRY(attr, src, attr_t, entry)
  1059. if (attr->type == type)
  1060. {
  1061. list_remove(&attr->entry);
  1062. return append_attr(dst, attr);
  1063. }
  1064. return dst;
  1065. }
  1066. static attr_list_t *append_attr_list(attr_list_t *new_list, attr_list_t *old_list)
  1067. {
  1068. struct list *entry;
  1069. if (!old_list) return new_list;
  1070. while ((entry = list_head(old_list)))
  1071. {
  1072. attr_t *attr = LIST_ENTRY(entry, attr_t, entry);
  1073. list_remove(entry);
  1074. new_list = append_attr(new_list, attr);
  1075. }
  1076. return new_list;
  1077. }
  1078. static attr_list_t *dupattrs(const attr_list_t *list)
  1079. {
  1080. attr_list_t *new_list;
  1081. const attr_t *attr;
  1082. if (!list) return NULL;
  1083. new_list = xmalloc( sizeof(*list) );
  1084. list_init( new_list );
  1085. LIST_FOR_EACH_ENTRY(attr, list, const attr_t, entry)
  1086. {
  1087. attr_t *new_attr = xmalloc(sizeof(*new_attr));
  1088. *new_attr = *attr;
  1089. list_add_tail(new_list, &new_attr->entry);
  1090. }
  1091. return new_list;
  1092. }
  1093. 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)
  1094. {
  1095. decl_spec_t *declspec = left ? left : right;
  1096. if (!declspec)
  1097. {
  1098. declspec = xmalloc(sizeof(*declspec));
  1099. declspec->type = NULL;
  1100. declspec->attrs = NULL;
  1101. declspec->stgclass = STG_NONE;
  1102. }
  1103. declspec->type = type;
  1104. if (left && declspec != left)
  1105. {
  1106. declspec->attrs = append_attr_list(declspec->attrs, left->attrs);
  1107. if (declspec->stgclass == STG_NONE)
  1108. declspec->stgclass = left->stgclass;
  1109. else if (left->stgclass != STG_NONE)
  1110. error_loc("only one storage class can be specified\n");
  1111. assert(!left->type);
  1112. free(left);
  1113. }
  1114. if (right && declspec != right)
  1115. {
  1116. declspec->attrs = append_attr_list(declspec->attrs, right->attrs);
  1117. if (declspec->stgclass == STG_NONE)
  1118. declspec->stgclass = right->stgclass;
  1119. else if (right->stgclass != STG_NONE)
  1120. error_loc("only one storage class can be specified\n");
  1121. assert(!right->type);
  1122. free(right);
  1123. }
  1124. declspec->attrs = append_attr(declspec->attrs, attr);
  1125. if (declspec->stgclass == STG_NONE)
  1126. declspec->stgclass = stgclass;
  1127. else if (stgclass != STG_NONE)
  1128. error_loc("only one storage class can be specified\n");
  1129. /* apply attributes to type */
  1130. if (type && declspec->attrs)
  1131. {
  1132. attr_list_t *attrs;
  1133. declspec->type = duptype(type, 1);
  1134. attrs = dupattrs(type->attrs);
  1135. declspec->type->attrs = append_attr_list(attrs, declspec->attrs);
  1136. declspec->attrs = NULL;
  1137. }
  1138. return declspec;
  1139. }
  1140. static attr_t *make_attr(enum attr_type type)
  1141. {
  1142. attr_t *a = xmalloc(sizeof(attr_t));
  1143. a->type = type;
  1144. a->u.ival = 0;
  1145. return a;
  1146. }
  1147. static attr_t *make_attrv(enum attr_type type, unsigned int val)
  1148. {
  1149. attr_t *a = xmalloc(sizeof(attr_t));
  1150. a->type = type;
  1151. a->u.ival = val;
  1152. return a;
  1153. }
  1154. static attr_t *make_attrp(enum attr_type type, void *val)
  1155. {
  1156. attr_t *a = xmalloc(sizeof(attr_t));
  1157. a->type = type;
  1158. a->u.pval = val;
  1159. return a;
  1160. }
  1161. static expr_list_t *append_expr(expr_list_t *list, expr_t *expr)
  1162. {
  1163. if (!expr) return list;
  1164. if (!list)
  1165. {
  1166. list = xmalloc( sizeof(*list) );
  1167. list_init( list );
  1168. }
  1169. list_add_tail( list, &expr->entry );
  1170. return list;
  1171. }
  1172. static array_dims_t *append_array(array_dims_t *list, expr_t *expr)
  1173. {
  1174. if (!expr) return list;
  1175. if (!list)
  1176. {
  1177. list = xmalloc( sizeof(*list) );
  1178. list_init( list );
  1179. }
  1180. list_add_tail( list, &expr->entry );
  1181. return list;
  1182. }
  1183. static struct list type_pool = LIST_INIT(type_pool);
  1184. typedef struct
  1185. {
  1186. type_t data;
  1187. struct list link;
  1188. } type_pool_node_t;
  1189. type_t *alloc_type(void)
  1190. {
  1191. type_pool_node_t *node = xmalloc(sizeof *node);
  1192. list_add_tail(&type_pool, &node->link);
  1193. return &node->data;
  1194. }
  1195. void set_all_tfswrite(int val)
  1196. {
  1197. type_pool_node_t *node;
  1198. LIST_FOR_EACH_ENTRY(node, &type_pool, type_pool_node_t, link)
  1199. node->data.tfswrite = val;
  1200. }
  1201. void clear_all_offsets(void)
  1202. {
  1203. type_pool_node_t *node;
  1204. LIST_FOR_EACH_ENTRY(node, &type_pool, type_pool_node_t, link)
  1205. node->data.typestring_offset = node->data.ptrdesc = 0;
  1206. }
  1207. static void type_function_add_head_arg(type_t *type, var_t *arg)
  1208. {
  1209. if (!type->details.function->args)
  1210. {
  1211. type->details.function->args = xmalloc( sizeof(*type->details.function->args) );
  1212. list_init( type->details.function->args );
  1213. }
  1214. list_add_head( type->details.function->args, &arg->entry );
  1215. }
  1216. static int is_allowed_range_type(const type_t *type)
  1217. {
  1218. switch (type_get_type(type))
  1219. {
  1220. case TYPE_ENUM:
  1221. return TRUE;
  1222. case TYPE_BASIC:
  1223. switch (type_basic_get_type(type))
  1224. {
  1225. case TYPE_BASIC_INT8:
  1226. case TYPE_BASIC_INT16:
  1227. case TYPE_BASIC_INT32:
  1228. case TYPE_BASIC_INT64:
  1229. case TYPE_BASIC_INT:
  1230. case TYPE_BASIC_INT3264:
  1231. case TYPE_BASIC_BYTE:
  1232. case TYPE_BASIC_CHAR:
  1233. case TYPE_BASIC_WCHAR:
  1234. case TYPE_BASIC_HYPER:
  1235. return TRUE;
  1236. case TYPE_BASIC_FLOAT:
  1237. case TYPE_BASIC_DOUBLE:
  1238. case TYPE_BASIC_ERROR_STATUS_T:
  1239. case TYPE_BASIC_HANDLE:
  1240. return FALSE;
  1241. }
  1242. return FALSE;
  1243. default:
  1244. return FALSE;
  1245. }
  1246. }
  1247. static type_t *append_ptrchain_type(type_t *ptrchain, type_t *type)
  1248. {
  1249. type_t *ptrchain_type;
  1250. if (!ptrchain)
  1251. return type;
  1252. for (ptrchain_type = ptrchain; type_pointer_get_ref(ptrchain_type); ptrchain_type = type_pointer_get_ref(ptrchain_type))
  1253. ;
  1254. assert(ptrchain_type->type_type == TYPE_POINTER);
  1255. ptrchain_type->details.pointer.ref = type;
  1256. return ptrchain;
  1257. }
  1258. static var_t *declare_var(attr_list_t *attrs, decl_spec_t *decl_spec, const declarator_t *decl,
  1259. int top)
  1260. {
  1261. var_t *v = decl->var;
  1262. expr_list_t *sizes = get_attrp(attrs, ATTR_SIZEIS);
  1263. expr_list_t *lengs = get_attrp(attrs, ATTR_LENGTHIS);
  1264. int sizeless;
  1265. expr_t *dim;
  1266. type_t **ptype;
  1267. array_dims_t *arr = decl ? decl->array : NULL;
  1268. type_t *func_type = decl ? decl->func_type : NULL;
  1269. type_t *type = decl_spec->type;
  1270. /* In case of a range attribute, duplicate the type to keep track of
  1271. * the min/max values in the type format string */
  1272. if(is_attr(attrs, ATTR_RANGE))
  1273. type = duptype(type, 1);
  1274. if (is_attr(type->attrs, ATTR_INLINE))
  1275. {
  1276. if (!func_type)
  1277. error_loc("inline attribute applied to non-function type\n");
  1278. else
  1279. {
  1280. type_t *t;
  1281. /* move inline attribute from return type node to function node */
  1282. for (t = func_type; is_ptr(t); t = type_pointer_get_ref(t))
  1283. ;
  1284. t->attrs = move_attr(t->attrs, type->attrs, ATTR_INLINE);
  1285. }
  1286. }
  1287. /* add type onto the end of the pointers in pident->type */
  1288. v->type = append_ptrchain_type(decl ? decl->type : NULL, type);
  1289. v->stgclass = decl_spec->stgclass;
  1290. v->attrs = attrs;
  1291. /* check for pointer attribute being applied to non-pointer, non-array
  1292. * type */
  1293. if (!arr)
  1294. {
  1295. int ptr_attr = get_attrv(v->attrs, ATTR_POINTERTYPE);
  1296. const type_t *ptr = NULL;
  1297. /* pointer attributes on the left side of the type belong to the function
  1298. * poi…

Large files files are truncated, but you can click here to view the full file