PageRenderTime 89ms CodeModel.GetById 33ms RepoModel.GetById 1ms app.codeStats 0ms

/tools/widl/parser.y

https://github.com/diosmosis/wine
Happy | 2819 lines | 2534 code | 285 blank | 0 comment | 0 complexity | 681f50f3c736b42d1b264fd1a1d31d79 MD5 | raw file
Possible License(s): LGPL-2.1, LGPL-2.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(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: '[' m_expr ']' { $$ = $2; }
  417. | '[' '*' ']' { $$ = make_expr(EXPR_VOID); }
  418. ;
  419. m_attributes: { $$ = NULL; }
  420. | attributes
  421. ;
  422. attributes:
  423. '[' attrib_list ']' { $$ = $2; }
  424. ;
  425. attrib_list: attribute { $$ = append_attr( NULL, $1 ); }
  426. | attrib_list ',' attribute { $$ = append_attr( $1, $3 ); }
  427. | attrib_list ']' '[' attribute { $$ = append_attr( $1, $4 ); }
  428. ;
  429. str_list: aSTRING { $$ = append_str( NULL, $1 ); }
  430. | str_list ',' aSTRING { $$ = append_str( $1, $3 ); }
  431. ;
  432. attribute: { $$ = NULL; }
  433. | tAGGREGATABLE { $$ = make_attr(ATTR_AGGREGATABLE); }
  434. | tANNOTATION '(' aSTRING ')' { $$ = make_attrp(ATTR_ANNOTATION, $3); }
  435. | tAPPOBJECT { $$ = make_attr(ATTR_APPOBJECT); }
  436. | tASYNC { $$ = make_attr(ATTR_ASYNC); }
  437. | tAUTOHANDLE { $$ = make_attr(ATTR_AUTO_HANDLE); }
  438. | tBINDABLE { $$ = make_attr(ATTR_BINDABLE); }
  439. | tBROADCAST { $$ = make_attr(ATTR_BROADCAST); }
  440. | tCALLAS '(' ident ')' { $$ = make_attrp(ATTR_CALLAS, $3); }
  441. | tCASE '(' expr_list_int_const ')' { $$ = make_attrp(ATTR_CASE, $3); }
  442. | tCODE { $$ = make_attr(ATTR_CODE); }
  443. | tCOMMSTATUS { $$ = make_attr(ATTR_COMMSTATUS); }
  444. | tCONTEXTHANDLE { $$ = make_attrv(ATTR_CONTEXTHANDLE, 0); }
  445. | tCONTEXTHANDLENOSERIALIZE { $$ = make_attrv(ATTR_CONTEXTHANDLE, 0); /* RPC_CONTEXT_HANDLE_DONT_SERIALIZE */ }
  446. | tCONTEXTHANDLESERIALIZE { $$ = make_attrv(ATTR_CONTEXTHANDLE, 0); /* RPC_CONTEXT_HANDLE_SERIALIZE */ }
  447. | tCONTROL { $$ = make_attr(ATTR_CONTROL); }
  448. | tDECODE { $$ = make_attr(ATTR_DECODE); }
  449. | tDEFAULT { $$ = make_attr(ATTR_DEFAULT); }
  450. | tDEFAULTBIND { $$ = make_attr(ATTR_DEFAULTBIND); }
  451. | tDEFAULTCOLLELEM { $$ = make_attr(ATTR_DEFAULTCOLLELEM); }
  452. | tDEFAULTVALUE '(' expr_const ')' { $$ = make_attrp(ATTR_DEFAULTVALUE, $3); }
  453. | tDEFAULTVTABLE { $$ = make_attr(ATTR_DEFAULTVTABLE); }
  454. | tDISABLECONSISTENCYCHECK { $$ = make_attr(ATTR_DISABLECONSISTENCYCHECK); }
  455. | tDISPLAYBIND { $$ = make_attr(ATTR_DISPLAYBIND); }
  456. | tDLLNAME '(' aSTRING ')' { $$ = make_attrp(ATTR_DLLNAME, $3); }
  457. | tDUAL { $$ = make_attr(ATTR_DUAL); }
  458. | tENABLEALLOCATE { $$ = make_attr(ATTR_ENABLEALLOCATE); }
  459. | tENCODE { $$ = make_attr(ATTR_ENCODE); }
  460. | tENDPOINT '(' str_list ')' { $$ = make_attrp(ATTR_ENDPOINT, $3); }
  461. | tENTRY '(' expr_const ')' { $$ = make_attrp(ATTR_ENTRY, $3); }
  462. | tEXPLICITHANDLE { $$ = make_attr(ATTR_EXPLICIT_HANDLE); }
  463. | tFAULTSTATUS { $$ = make_attr(ATTR_FAULTSTATUS); }
  464. | tFORCEALLOCATE { $$ = make_attr(ATTR_FORCEALLOCATE); }
  465. | tHANDLE { $$ = make_attr(ATTR_HANDLE); }
  466. | tHELPCONTEXT '(' expr_int_const ')' { $$ = make_attrp(ATTR_HELPCONTEXT, $3); }
  467. | tHELPFILE '(' aSTRING ')' { $$ = make_attrp(ATTR_HELPFILE, $3); }
  468. | tHELPSTRING '(' aSTRING ')' { $$ = make_attrp(ATTR_HELPSTRING, $3); }
  469. | tHELPSTRINGCONTEXT '(' expr_int_const ')' { $$ = make_attrp(ATTR_HELPSTRINGCONTEXT, $3); }
  470. | tHELPSTRINGDLL '(' aSTRING ')' { $$ = make_attrp(ATTR_HELPSTRINGDLL, $3); }
  471. | tHIDDEN { $$ = make_attr(ATTR_HIDDEN); }
  472. | tID '(' expr_int_const ')' { $$ = make_attrp(ATTR_ID, $3); }
  473. | tIDEMPOTENT { $$ = make_attr(ATTR_IDEMPOTENT); }
  474. | tIGNORE { $$ = make_attr(ATTR_IGNORE); }
  475. | tIIDIS '(' expr ')' { $$ = make_attrp(ATTR_IIDIS, $3); }
  476. | tIMMEDIATEBIND { $$ = make_attr(ATTR_IMMEDIATEBIND); }
  477. | tIMPLICITHANDLE '(' tHANDLET aIDENTIFIER ')' { $$ = make_attrp(ATTR_IMPLICIT_HANDLE, $4); }
  478. | tIN { $$ = make_attr(ATTR_IN); }
  479. | tINPUTSYNC { $$ = make_attr(ATTR_INPUTSYNC); }
  480. | tLENGTHIS '(' m_exprs ')' { $$ = make_attrp(ATTR_LENGTHIS, $3); }
  481. | tLCID '(' expr_int_const ')' { $$ = make_attrp(ATTR_LIBLCID, $3); }
  482. | tLCID { $$ = make_attr(ATTR_PARAMLCID); }
  483. | tLICENSED { $$ = make_attr(ATTR_LICENSED); }
  484. | tLOCAL { $$ = make_attr(ATTR_LOCAL); }
  485. | tMAYBE { $$ = make_attr(ATTR_MAYBE); }
  486. | tMESSAGE { $$ = make_attr(ATTR_MESSAGE); }
  487. | tNOCODE { $$ = make_attr(ATTR_NOCODE); }
  488. | tNONBROWSABLE { $$ = make_attr(ATTR_NONBROWSABLE); }
  489. | tNONCREATABLE { $$ = make_attr(ATTR_NONCREATABLE); }
  490. | tNONEXTENSIBLE { $$ = make_attr(ATTR_NONEXTENSIBLE); }
  491. | tNOTIFY { $$ = make_attr(ATTR_NOTIFY); }
  492. | tNOTIFYFLAG { $$ = make_attr(ATTR_NOTIFYFLAG); }
  493. | tOBJECT { $$ = make_attr(ATTR_OBJECT); }
  494. | tODL { $$ = make_attr(ATTR_ODL); }
  495. | tOLEAUTOMATION { $$ = make_attr(ATTR_OLEAUTOMATION); }
  496. | tOPTIMIZE '(' aSTRING ')' { $$ = make_attrp(ATTR_OPTIMIZE, $3); }
  497. | tOPTIONAL { $$ = make_attr(ATTR_OPTIONAL); }
  498. | tOUT { $$ = make_attr(ATTR_OUT); }
  499. | tPARTIALIGNORE { $$ = make_attr(ATTR_PARTIALIGNORE); }
  500. | tPOINTERDEFAULT '(' pointer_type ')' { $$ = make_attrv(ATTR_POINTERDEFAULT, $3); }
  501. | tPROGID '(' aSTRING ')' { $$ = make_attrp(ATTR_PROGID, $3); }
  502. | tPROPGET { $$ = make_attr(ATTR_PROPGET); }
  503. | tPROPPUT { $$ = make_attr(ATTR_PROPPUT); }
  504. | tPROPPUTREF { $$ = make_attr(ATTR_PROPPUTREF); }
  505. | tPROXY { $$ = make_attr(ATTR_PROXY); }
  506. | tPUBLIC { $$ = make_attr(ATTR_PUBLIC); }
  507. | tRANGE '(' expr_int_const ',' expr_int_const ')'
  508. { expr_list_t *list = append_expr( NULL, $3 );
  509. list = append_expr( list, $5 );
  510. $$ = make_attrp(ATTR_RANGE, list); }
  511. | tREADONLY { $$ = make_attr(ATTR_READONLY); }
  512. | tREPRESENTAS '(' type ')' { $$ = make_attrp(ATTR_REPRESENTAS, $3); }
  513. | tREQUESTEDIT { $$ = make_attr(ATTR_REQUESTEDIT); }
  514. | tRESTRICTED { $$ = make_attr(ATTR_RESTRICTED); }
  515. | tRETVAL { $$ = make_attr(ATTR_RETVAL); }
  516. | tSIZEIS '(' m_exprs ')' { $$ = make_attrp(ATTR_SIZEIS, $3); }
  517. | tSOURCE { $$ = make_attr(ATTR_SOURCE); }
  518. | tSTRICTCONTEXTHANDLE { $$ = make_attr(ATTR_STRICTCONTEXTHANDLE); }
  519. | tSTRING { $$ = make_attr(ATTR_STRING); }
  520. | tSWITCHIS '(' expr ')' { $$ = make_attrp(ATTR_SWITCHIS, $3); }
  521. | tSWITCHTYPE '(' type ')' { $$ = make_attrp(ATTR_SWITCHTYPE, $3); }
  522. | tTRANSMITAS '(' type ')' { $$ = make_attrp(ATTR_TRANSMITAS, $3); }
  523. | tTHREADING '(' threading_type ')' { $$ = make_attrv(ATTR_THREADING, $3); }
  524. | tUIDEFAULT { $$ = make_attr(ATTR_UIDEFAULT); }
  525. | tUSESGETLASTERROR { $$ = make_attr(ATTR_USESGETLASTERROR); }
  526. | tUSERMARSHAL '(' type ')' { $$ = make_attrp(ATTR_USERMARSHAL, $3); }
  527. | tUUID '(' uuid_string ')' { $$ = make_attrp(ATTR_UUID, $3); }
  528. | tV1ENUM { $$ = make_attr(ATTR_V1ENUM); }
  529. | tVARARG { $$ = make_attr(ATTR_VARARG); }
  530. | tVERSION '(' version ')' { $$ = make_attrv(ATTR_VERSION, $3); }
  531. | tVIPROGID '(' aSTRING ')' { $$ = make_attrp(ATTR_VIPROGID, $3); }
  532. | tWIREMARSHAL '(' type ')' { $$ = make_attrp(ATTR_WIREMARSHAL, $3); }
  533. | pointer_type { $$ = make_attrv(ATTR_POINTERTYPE, $1); }
  534. ;
  535. uuid_string:
  536. aUUID
  537. | aSTRING { if (!is_valid_uuid($1))
  538. error_loc("invalid UUID: %s\n", $1);
  539. $$ = parse_uuid($1); }
  540. ;
  541. callconv: tCDECL { $$ = $<str>1; }
  542. | tFASTCALL { $$ = $<str>1; }
  543. | tPASCAL { $$ = $<str>1; }
  544. | tSTDCALL { $$ = $<str>1; }
  545. ;
  546. cases: { $$ = NULL; }
  547. | cases case { $$ = append_var( $1, $2 ); }
  548. ;
  549. case: tCASE expr_int_const ':' union_field { attr_t *a = make_attrp(ATTR_CASE, append_expr( NULL, $2 ));
  550. $$ = $4; if (!$$) $$ = make_var(NULL);
  551. $$->attrs = append_attr( $$->attrs, a );
  552. }
  553. | tDEFAULT ':' union_field { attr_t *a = make_attr(ATTR_DEFAULT);
  554. $$ = $3; if (!$$) $$ = make_var(NULL);
  555. $$->attrs = append_attr( $$->attrs, a );
  556. }
  557. ;
  558. enums: { $$ = NULL; }
  559. | enum_list ',' { $$ = $1; }
  560. | enum_list
  561. ;
  562. enum_list: enum { if (!$1->eval)
  563. $1->eval = make_exprl(EXPR_NUM, 0 /* default for first enum entry */);
  564. $$ = append_var( NULL, $1 );
  565. }
  566. | enum_list ',' enum { if (!$3->eval)
  567. {
  568. var_t *last = LIST_ENTRY( list_tail($$), var_t, entry );
  569. $3->eval = make_exprl(EXPR_NUM, last->eval->cval + 1);
  570. }
  571. $$ = append_var( $1, $3 );
  572. }
  573. ;
  574. enum: ident '=' expr_int_const { $$ = reg_const($1);
  575. $$->eval = $3;
  576. $$->type = type_new_int(TYPE_BASIC_INT, 0);
  577. }
  578. | ident { $$ = reg_const($1);
  579. $$->type = type_new_int(TYPE_BASIC_INT, 0);
  580. }
  581. ;
  582. enumdef: tENUM t_ident '{' enums '}' { $$ = type_new_enum($2, TRUE, $4); }
  583. ;
  584. m_exprs: m_expr { $$ = append_expr( NULL, $1 ); }
  585. | m_exprs ',' m_expr { $$ = append_expr( $1, $3 ); }
  586. ;
  587. /*
  588. exprs: { $$ = make_expr(EXPR_VOID); }
  589. | expr_list
  590. ;
  591. expr_list: expr
  592. | expr_list ',' expr { LINK($3, $1); $$ = $3; }
  593. ;
  594. */
  595. m_expr: { $$ = make_expr(EXPR_VOID); }
  596. | expr
  597. ;
  598. expr: aNUM { $$ = make_exprl(EXPR_NUM, $1); }
  599. | aHEXNUM { $$ = make_exprl(EXPR_HEXNUM, $1); }
  600. | aDOUBLE { $$ = make_exprd(EXPR_DOUBLE, $1); }
  601. | tFALSE { $$ = make_exprl(EXPR_TRUEFALSE, 0); }
  602. | tNULL { $$ = make_exprl(EXPR_NUM, 0); }
  603. | tTRUE { $$ = make_exprl(EXPR_TRUEFALSE, 1); }
  604. | aSTRING { $$ = make_exprs(EXPR_STRLIT, $1); }
  605. | aWSTRING { $$ = make_exprs(EXPR_WSTRLIT, $1); }
  606. | aSQSTRING { $$ = make_exprs(EXPR_CHARCONST, $1); }
  607. | aIDENTIFIER { $$ = make_exprs(EXPR_IDENTIFIER, $1); }
  608. | expr '?' expr ':' expr { $$ = make_expr3(EXPR_COND, $1, $3, $5); }
  609. | expr LOGICALOR expr { $$ = make_expr2(EXPR_LOGOR, $1, $3); }
  610. | expr LOGICALAND expr { $$ = make_expr2(EXPR_LOGAND, $1, $3); }
  611. | expr '|' expr { $$ = make_expr2(EXPR_OR , $1, $3); }
  612. | expr '^' expr { $$ = make_expr2(EXPR_XOR, $1, $3); }
  613. | expr '&' expr { $$ = make_expr2(EXPR_AND, $1, $3); }
  614. | expr EQUALITY expr { $$ = make_expr2(EXPR_EQUALITY, $1, $3); }
  615. | expr INEQUALITY expr { $$ = make_expr2(EXPR_INEQUALITY, $1, $3); }
  616. | expr '>' expr { $$ = make_expr2(EXPR_GTR, $1, $3); }
  617. | expr '<' expr { $$ = make_expr2(EXPR_LESS, $1, $3); }
  618. | expr GREATEREQUAL expr { $$ = make_expr2(EXPR_GTREQL, $1, $3); }
  619. | expr LESSEQUAL expr { $$ = make_expr2(EXPR_LESSEQL, $1, $3); }
  620. | expr SHL expr { $$ = make_expr2(EXPR_SHL, $1, $3); }
  621. | expr SHR expr { $$ = make_expr2(EXPR_SHR, $1, $3); }
  622. | expr '+' expr { $$ = make_expr2(EXPR_ADD, $1, $3); }
  623. | expr '-' expr { $$ = make_expr2(EXPR_SUB, $1, $3); }
  624. | expr '%' expr { $$ = make_expr2(EXPR_MOD, $1, $3); }
  625. | expr '*' expr { $$ = make_expr2(EXPR_MUL, $1, $3); }
  626. | expr '/' expr { $$ = make_expr2(EXPR_DIV, $1, $3); }
  627. | '!' expr { $$ = make_expr1(EXPR_LOGNOT, $2); }
  628. | '~' expr { $$ = make_expr1(EXPR_NOT, $2); }
  629. | '+' expr %prec POS { $$ = make_expr1(EXPR_POS, $2); }
  630. | '-' expr %prec NEG { $$ = make_expr1(EXPR_NEG, $2); }
  631. | '&' expr %prec ADDRESSOF { $$ = make_expr1(EXPR_ADDRESSOF, $2); }
  632. | '*' expr %prec PPTR { $$ = make_expr1(EXPR_PPTR, $2); }
  633. | expr MEMBERPTR aIDENTIFIER { $$ = make_expr2(EXPR_MEMBER, make_expr1(EXPR_PPTR, $1), make_exprs(EXPR_IDENTIFIER, $3)); }
  634. | expr '.' aIDENTIFIER { $$ = make_expr2(EXPR_MEMBER, $1, make_exprs(EXPR_IDENTIFIER, $3)); }
  635. | '(' decl_spec m_abstract_declarator ')' expr %prec CAST
  636. { $$ = make_exprt(EXPR_CAST, declare_var(NULL, $2, $3, 0), $5); free($2); free($3); }
  637. | tSIZEOF '(' decl_spec m_abstract_declarator ')'
  638. { $$ = make_exprt(EXPR_SIZEOF, declare_var(NULL, $3, $4, 0), NULL); free($3); free($4); }
  639. | expr '[' expr ']' { $$ = make_expr2(EXPR_ARRAY, $1, $3); }
  640. | '(' expr ')' { $$ = $2; }
  641. ;
  642. expr_list_int_const: expr_int_const { $$ = append_expr( NULL, $1 ); }
  643. | expr_list_int_const ',' expr_int_const { $$ = append_expr( $1, $3 ); }
  644. ;
  645. expr_int_const: expr { $$ = $1;
  646. if (!$$->is_const)
  647. error_loc("expression is not an integer constant\n");
  648. }
  649. ;
  650. expr_const: expr { $$ = $1;
  651. if (!$$->is_const && $$->type != EXPR_STRLIT && $$->type != EXPR_WSTRLIT)
  652. error_loc("expression is not constant\n");
  653. }
  654. ;
  655. fields: { $$ = NULL; }
  656. | fields field { $$ = append_var_list($1, $2); }
  657. ;
  658. field: m_attributes decl_spec struct_declarator_list ';'
  659. { const char *first = LIST_ENTRY(list_head($3), declarator_t, entry)->var->name;
  660. check_field_attrs(first, $1);
  661. $$ = set_var_types($1, $2, $3);
  662. }
  663. | m_attributes uniondef ';' { var_t *v = make_var(NULL);
  664. v->type = $2; v->attrs = $1;
  665. $$ = append_var(NULL, v);
  666. }
  667. ;
  668. ne_union_field:
  669. s_field ';' { $$ = $1; }
  670. | attributes ';' { $$ = make_var(NULL); $$->attrs = $1; }
  671. ;
  672. ne_union_fields: { $$ = NULL; }
  673. | ne_union_fields ne_union_field { $$ = append_var( $1, $2 ); }
  674. ;
  675. union_field:
  676. s_field ';' { $$ = $1; }
  677. | ';' { $$ = NULL; }
  678. ;
  679. s_field: m_attributes decl_spec declarator { $$ = declare_var(check_field_attrs($3->var->name, $1),
  680. $2, $3, FALSE);
  681. free($3);
  682. }
  683. ;
  684. funcdef: declaration { $$ = $1;
  685. if (type_get_type($$->type) != TYPE_FUNCTION)
  686. error_loc("only methods may be declared inside the methods section of a dispinterface\n");
  687. check_function_attrs($$->name, $$->attrs);
  688. }
  689. ;
  690. declaration:
  691. attributes decl_spec init_declarator
  692. { $$ = declare_var($1, $2, $3, FALSE);
  693. free($3);
  694. }
  695. | decl_spec init_declarator { $$ = declare_var(NULL, $1, $2, FALSE);
  696. free($2);
  697. }
  698. ;
  699. m_ident: { $$ = NULL; }
  700. | ident
  701. ;
  702. t_ident: { $$ = NULL; }
  703. | aIDENTIFIER { $$ = $1; }
  704. | aKNOWNTYPE { $$ = $1; }
  705. ;
  706. ident: aIDENTIFIER { $$ = make_var($1); }
  707. /* some "reserved words" used in attributes are also used as field names in some MS IDL files */
  708. | aKNOWNTYPE { $$ = make_var($<str>1); }
  709. ;
  710. base_type: tBYTE { $$ = find_type_or_error($<str>1, 0); }
  711. | tWCHAR { $$ = find_type_or_error($<str>1, 0); }
  712. | int_std
  713. | tSIGNED int_std { $$ = type_new_int(type_basic_get_type($2), -1); }
  714. | tUNSIGNED int_std { $$ = type_new_int(type_basic_get_type($2), 1); }
  715. | tUNSIGNED { $$ = type_new_int(TYPE_BASIC_INT, 1); }
  716. | tFLOAT { $$ = find_type_or_error($<str>1, 0); }
  717. | tDOUBLE { $$ = find_type_or_error($<str>1, 0); }
  718. | tBOOLEAN { $$ = find_type_or_error($<str>1, 0); }
  719. | tERRORSTATUST { $$ = find_type_or_error($<str>1, 0); }
  720. | tHANDLET { $$ = find_type_or_error($<str>1, 0); }
  721. ;
  722. m_int:
  723. | tINT
  724. ;
  725. int_std: tINT { $$ = type_new_int(TYPE_BASIC_INT, 0); }
  726. | tSHORT m_int { $$ = type_new_int(TYPE_BASIC_INT16, 0); }
  727. | tSMALL { $$ = type_new_int(TYPE_BASIC_INT8, 0); }
  728. | tLONG m_int { $$ = type_new_int(TYPE_BASIC_INT32, 0); }
  729. | tHYPER m_int { $$ = type_new_int(TYPE_BASIC_HYPER, 0); }
  730. | tINT64 { $$ = type_new_int(TYPE_BASIC_INT64, 0); }
  731. | tCHAR { $$ = type_new_int(TYPE_BASIC_CHAR, 0); }
  732. | tINT3264 { $$ = type_new_int(TYPE_BASIC_INT3264, 0); }
  733. ;
  734. coclass: tCOCLASS aIDENTIFIER { $$ = type_new_coclass($2); }
  735. | tCOCLASS aKNOWNTYPE { $$ = find_type($2, 0);
  736. if (type_get_type_detect_alias($$) != TYPE_COCLASS)
  737. error_loc("%s was not declared a coclass at %s:%d\n",
  738. $2, $$->loc_info.input_name,
  739. $$->loc_info.line_number);
  740. }
  741. ;
  742. coclasshdr: attributes coclass { $$ = $2;
  743. check_def($$);
  744. $$->attrs = check_coclass_attrs($2->name, $1);
  745. }
  746. ;
  747. coclassdef: coclasshdr '{' coclass_ints '}' semicolon_opt
  748. { $$ = type_coclass_define($1, $3); }
  749. ;
  750. coclass_ints: { $$ = NULL; }
  751. | coclass_ints coclass_int { $$ = append_ifref( $1, $2 ); }
  752. ;
  753. coclass_int:
  754. m_attributes interfacedec { $$ = make_ifref($2); $$->attrs = $1; }
  755. ;
  756. dispinterface: tDISPINTERFACE aIDENTIFIER { $$ = get_type(TYPE_INTERFACE, $2, 0); }
  757. | tDISPINTERFACE aKNOWNTYPE { $$ = get_type(TYPE_INTERFACE, $2, 0); }
  758. ;
  759. dispinterfacehdr: attributes dispinterface { attr_t *attrs;
  760. $$ = $2;
  761. check_def($$);
  762. attrs = make_attr(ATTR_DISPINTERFACE);
  763. $$->attrs = append_attr( check_dispiface_attrs($2->name, $1), attrs );
  764. $$->defined = TRUE;
  765. }
  766. ;
  767. dispint_props: tPROPERTIES ':' { $$ = NULL; }
  768. | dispint_props s_field ';' { $$ = append_var( $1, $2 ); }
  769. ;
  770. dispint_meths: tMETHODS ':' { $$ = NULL; }
  771. | dispint_meths funcdef ';' { $$ = append_var( $1, $2 ); }
  772. ;
  773. dispinterfacedef: dispinterfacehdr '{'
  774. dispint_props
  775. dispint_meths
  776. '}' { $$ = $1;
  777. type_dispinterface_define($$, $3, $4);
  778. }
  779. | dispinterfacehdr
  780. '{' interface ';' '}' { $$ = $1;
  781. type_dispinterface_define_from_iface($$, $3);
  782. }
  783. ;
  784. inherit: { $$ = NULL; }
  785. | ':' aKNOWNTYPE { $$ = find_type_or_error2($2, 0); }
  786. ;
  787. interface: tINTERFACE aIDENTIFIER { $$ = get_type(TYPE_INTERFACE, $2, 0); }
  788. | tINTERFACE aKNOWNTYPE { $$ = get_type(TYPE_INTERFACE, $2, 0); }
  789. ;
  790. interfacehdr: attributes interface { $$.interface = $2;
  791. $$.old_pointer_default = pointer_default;
  792. if (is_attr($1, ATTR_POINTERDEFAULT))
  793. pointer_default = get_attrv($1, ATTR_POINTERDEFAULT);
  794. check_def($2);
  795. $2->attrs = check_iface_attrs($2->name, $1);
  796. $2->defined = TRUE;
  797. }
  798. ;
  799. interfacedef: interfacehdr inherit
  800. '{' int_statements '}' semicolon_opt { $$ = $1.interface;
  801. type_interface_define($$, $2, $4);
  802. pointer_default = $1.old_pointer_default;
  803. }
  804. /* MIDL is able to import the definition of a base class from inside the
  805. * definition of a derived class, I'll try to support it with this rule */
  806. | interfacehdr ':' aIDENTIFIER
  807. '{' import int_statements '}'
  808. semicolon_opt { $$ = $1.interface;
  809. type_interface_define($$, find_type_or_error2($3, 0), $6);
  810. pointer_default = $1.old_pointer_default;
  811. }
  812. | dispinterfacedef semicolon_opt { $$ = $1; }
  813. ;
  814. interfacedec:
  815. interface ';' { $$ = $1; }
  816. | dispinterface ';' { $$ = $1; }
  817. ;
  818. module: tMODULE aIDENTIFIER { $$ = type_new_module($2); }
  819. | tMODULE aKNOWNTYPE { $$ = type_new_module($2); }
  820. ;
  821. modulehdr: attributes module { $$ = $2;
  822. $$->attrs = check_module_attrs($2->name, $1);
  823. }
  824. ;
  825. moduledef: modulehdr '{' int_statements '}'
  826. semicolon_opt { $$ = $1;
  827. type_module_define($$, $3);
  828. }
  829. ;
  830. storage_cls_spec:
  831. tEXTERN { $$ = STG_EXTERN; }
  832. | tSTATIC { $$ = STG_STATIC; }
  833. | tREGISTER { $$ = STG_REGISTER; }
  834. ;
  835. function_specifier:
  836. tINLINE { $$ = make_attr(ATTR_INLINE); }
  837. ;
  838. type_qualifier:
  839. tCONST { $$ = make_attr(ATTR_CONST); }
  840. ;
  841. m_type_qual_list: { $$ = NULL; }
  842. | m_type_qual_list type_qualifier { $$ = append_attr($1, $2); }
  843. ;
  844. decl_spec: type m_decl_spec_no_type { $$ = make_decl_spec($1, $2, NULL, NULL, STG_NONE); }
  845. | decl_spec_no_type type m_decl_spec_no_type
  846. { $$ = make_decl_spec($2, $1, $3, NULL, STG_NONE); }
  847. ;
  848. m_decl_spec_no_type: { $$ = NULL; }
  849. | decl_spec_no_type
  850. ;
  851. decl_spec_no_type:
  852. type_qualifier m_decl_spec_no_type { $$ = make_decl_spec(NULL, $2, NULL, $1, STG_NONE); }
  853. | function_specifier m_decl_spec_no_type { $$ = make_decl_spec(NULL, $2, NULL, $1, STG_NONE); }
  854. | storage_cls_spec m_decl_spec_no_type { $$ = make_decl_spec(NULL, $2, NULL, NULL, $1); }
  855. ;
  856. declarator:
  857. '*' m_type_qual_list declarator %prec PPTR
  858. { $$ = $3; $$->type = append_ptrchain_type($$->type, type_new_pointer(pointer_default, NULL, $2)); }
  859. | callconv declarator { $$ = $2; if ($$->func_type) $$->func_type->attrs = append_attr($$->func_type->attrs, make_attrp(ATTR_CALLCONV, $1));
  860. else if ($$->type) $$->type->attrs = append_attr($$->type->attrs, make_attrp(ATTR_CALLCONV, $1)); }
  861. | direct_declarator
  862. ;
  863. direct_declarator:
  864. ident { $$ = make_declarator($1); }
  865. | '(' declarator ')' { $$ = $2; }
  866. | direct_declarator array { $$ = $1; $$->array = append_array($$->array, $2); }
  867. | direct_declarator '(' m_args ')' { $$ = $1;
  868. $$->func_type = append_ptrchain_type($$->type, type_new_function($3));
  869. $$->type = NULL;
  870. }
  871. ;
  872. /* abstract declarator */
  873. abstract_declarator:
  874. '*' m_type_qual_list m_abstract_declarator %prec PPTR
  875. { $$ = $3; $$->type = append_ptrchain_type($$->type, type_new_pointer(pointer_default, NULL, $2)); }
  876. | callconv m_abstract_declarator { $$ = $2; if ($$->func_type) $$->func_type->attrs = append_attr($$->func_type->attrs, make_attrp(ATTR_CALLCONV, $1));
  877. else if ($$->type) $$->type->attrs = append_attr($$->type->attrs, make_attrp(ATTR_CALLCONV, $1)); }
  878. | abstract_direct_declarator
  879. ;
  880. /* abstract declarator without accepting direct declarator */
  881. abstract_declarator_no_direct:
  882. '*' m_type_qual_list m_any_declarator %prec PPTR
  883. { $$ = $3; $$->type = append_ptrchain_type($$->type, type_new_pointer(pointer_default, NULL, $2)); }
  884. | callconv m_any_declarator { $$ = $2; if ($$->func_type) $$->func_type->attrs = append_attr($$->func_type->attrs, make_attrp(ATTR_CALLCONV, $1));
  885. else if ($$->type) $$->type->attrs = append_attr($$->type->attrs, make_attrp(ATTR_CALLCONV, $1)); }
  886. ;
  887. /* abstract declarator or empty */
  888. m_abstract_declarator: { $$ = make_declarator(NULL); }
  889. | abstract_declarator
  890. ;
  891. /* abstract direct declarator */
  892. abstract_direct_declarator:
  893. '(' abstract_declarator_no_direct ')' { $$ = $2; }
  894. | abstract_direct_declarator array { $$ = $1; $$->array = append_array($$->array, $2); }
  895. | array { $$ = make_declarator(NULL); $$->array = append_array($$->array, $1); }
  896. | '(' m_args ')'
  897. { $$ = make_declarator(NULL);
  898. $$->func_type = append_ptrchain_type($$->type, type_new_function($2));
  899. $$->type = NULL;
  900. }
  901. | abstract_direct_declarator '(' m_args ')'
  902. { $$ = $1;
  903. $$->func_type = append_ptrchain_type($$->type, type_new_function($3));
  904. $$->type = NULL;
  905. }
  906. ;
  907. /* abstract or non-abstract declarator */
  908. any_declarator:
  909. '*' m_type_qual_list m_any_declarator %prec PPTR
  910. { $$ = $3; $$->type = append_ptrchain_type($$->type, type_new_pointer(pointer_default, NULL, $2)); }
  911. | callconv m_any_declarator { $$ = $2; $$->type->attrs = append_attr($$->type->attrs, make_attrp(ATTR_CALLCONV, $1)); }
  912. | any_direct_declarator
  913. ;
  914. /* abstract or non-abstract declarator without accepting direct declarator */
  915. any_declarator_no_direct:
  916. '*' m_type_qual_list m_any_declarator %prec PPTR
  917. { $$ = $3; $$->type = append_ptrchain_type($$->type, type_new_pointer(pointer_default, NULL, $2)); }
  918. | callconv m_any_declarator { $$ = $2; $$->type->attrs = append_attr($$->type->attrs, make_attrp(ATTR_CALLCONV, $1)); }
  919. ;
  920. /* abstract or non-abstract declarator or empty */
  921. m_any_declarator: { $$ = make_declarator(NULL); }
  922. | any_declarator
  923. ;
  924. /* abstract or non-abstract direct declarator. note: direct declarators
  925. * aren't accepted inside brackets to avoid ambiguity with the rule for
  926. * function arguments */
  927. any_direct_declarator:
  928. ident { $$ = make_declarator($1); }
  929. | '(' any_declarator_no_direct ')' { $$ = $2; }
  930. | any_direct_declarator array { $$ = $1; $$->array = append_array($$->array, $2); }
  931. | array { $$ = make_declarator(NULL); $$->array = append_array($$->array, $1); }
  932. | '(' m_args ')'
  933. { $$ = make_declarator(NULL);
  934. $$->func_type = append_ptrchain_type($$->type, type_new_function($2));
  935. $$->type = NULL;
  936. }
  937. | any_direct_declarator '(' m_args ')'
  938. { $$ = $1;
  939. $$->func_type = append_ptrchain_type($$->type, type_new_function($3));
  940. $$->type = NULL;
  941. }
  942. ;
  943. declarator_list:
  944. declarator { $$ = append_declarator( NULL, $1 ); }
  945. | declarator_list ',' declarator { $$ = append_declarator( $1, $3 ); }
  946. ;
  947. m_bitfield: { $$ = NULL; }
  948. | ':' expr_const { $$ = $2; }
  949. ;
  950. struct_declarator: any_declarator m_bitfield { $$ = $1; $$->bits = $2;
  951. if (!$$->bits && !$$->var->name)
  952. error_loc("unnamed fields are not allowed\n");
  953. }
  954. ;
  955. struct_declarator_list:
  956. struct_declarator { $$ = append_declarator( NULL, $1 ); }
  957. | struct_declarator_list ',' struct_declarator
  958. { $$ = append_declarator( $1, $3 ); }
  959. ;
  960. init_declarator:
  961. declarator { $$ = $1; }
  962. | declarator '=' expr_const { $$ = $1; $1->var->eval = $3; }
  963. ;
  964. threading_type:
  965. tAPARTMENT { $$ = THREADING_APARTMENT; }
  966. | tNEUTRAL { $$ = THREADING_NEUTRAL; }
  967. | tSINGLE { $$ = THREADING_SINGLE; }
  968. | tFREE { $$ = THREADING_FREE; }
  969. | tBOTH { $$ = THREADING_BOTH; }
  970. ;
  971. pointer_type:
  972. tREF { $$ = RPC_FC_RP; }
  973. | tUNIQUE { $$ = RPC_FC_UP; }
  974. | tPTR { $$ = RPC_FC_FP; }
  975. ;
  976. structdef: tSTRUCT t_ident '{' fields '}' { $$ = type_new_struct($2, TRUE, $4); }
  977. ;
  978. type: tVOID { $$ = type_new_void(); }
  979. | aKNOWNTYPE { $$ = find_type_or_error($1, 0); }
  980. | base_type { $$ = $1; }
  981. | enumdef { $$ = $1; }
  982. | tENUM aIDENTIFIER { $$ = type_new_enum($2, FALSE, NULL); }
  983. | structdef { $$ = $1; }
  984. | tSTRUCT aIDENTIFIER { $$ = type_new_struct($2, FALSE, NULL); }
  985. | uniondef { $$ = $1; }
  986. | tUNION aIDENTIFIER { $$ = type_new_nonencapsulated_union($2, FALSE, NULL); }
  987. | tSAFEARRAY '(' type ')' { $$ = make_safearray($3); }
  988. ;
  989. typedef: tTYPEDEF m_attributes decl_spec declarator_list
  990. { reg_typedefs($3, $4, check_typedef_attrs($2));
  991. $$ = make_statement_typedef($4);
  992. }
  993. ;
  994. uniondef: tUNION t_ident '{' ne_union_fields '}'
  995. { $$ = type_new_nonencapsulated_union($2, TRUE, $4); }
  996. | tUNION t_ident
  997. tSWITCH '(' s_field ')'
  998. m_ident '{' cases '}' { $$ = type_new_encapsulated_union($2, $5, $7, $9); }
  999. ;
  1000. version:
  1001. aNUM { $$ = MAKEVERSION($1, 0); }
  1002. | aNUM '.' aNUM { $$ = MAKEVERSION($1, $3); }
  1003. ;
  1004. %%
  1005. static void decl_builtin_basic(const char *name, enum type_basic_type type)
  1006. {
  1007. type_t *t = type_new_basic(type);
  1008. reg_type(t, name, 0);
  1009. }
  1010. static void decl_builtin_alias(const char *name, type_t *t)
  1011. {
  1012. reg_type(type_new_alias(t, name), name, 0);
  1013. }
  1014. void init_types(void)
  1015. {
  1016. decl_builtin_basic("byte", TYPE_BASIC_BYTE);
  1017. decl_builtin_basic("wchar_t", TYPE_BASIC_WCHAR);
  1018. decl_builtin_basic("float", TYPE_BASIC_FLOAT);
  1019. decl_builtin_basic("double", TYPE_BASIC_DOUBLE);
  1020. decl_builtin_basic("error_status_t", TYPE_BASIC_ERROR_STATUS_T);
  1021. decl_builtin_basic("handle_t", TYPE_BASIC_HANDLE);
  1022. decl_builtin_alias("boolean", type_new_basic(TYPE_BASIC_BYTE));
  1023. }
  1024. static str_list_t *append_str(str_list_t *list, char *str)
  1025. {
  1026. struct str_list_entry_t *entry;
  1027. if (!str) return list;
  1028. if (!list)
  1029. {
  1030. list = xmalloc( sizeof(*list) );
  1031. list_init( list );
  1032. }
  1033. entry = xmalloc( sizeof(*entry) );
  1034. entry->str = str;
  1035. list_add_tail( list, &entry->entry );
  1036. return list;
  1037. }
  1038. static attr_list_t *append_attr(attr_list_t *list, attr_t *attr)
  1039. {
  1040. attr_t *attr_existing;
  1041. if (!attr) return list;
  1042. if (!list)
  1043. {
  1044. list = xmalloc( sizeof(*list) );
  1045. list_init( list );
  1046. }
  1047. LIST_FOR_EACH_ENTRY(attr_existing, list, attr_t, entry)
  1048. if (attr_existing->type == attr->type)
  1049. {
  1050. parser_warning("duplicate attribute %s\n", get_attr_display_name(attr->type));
  1051. /* use the last attribute, like MIDL does */
  1052. list_remove(&attr_existing->entry);
  1053. break;
  1054. }
  1055. list_add_tail( list, &attr->entry );
  1056. return list;
  1057. }
  1058. static attr_list_t *move_attr(attr_list_t *dst, attr_list_t *src, enum attr_type type)
  1059. {
  1060. attr_t *attr;
  1061. if (!src) return dst;
  1062. LIST_FOR_EACH_ENTRY(attr, src, attr_t, entry)
  1063. if (attr->type == type)
  1064. {
  1065. list_remove(&attr->entry);
  1066. return append_attr(dst, attr);
  1067. }
  1068. return dst;
  1069. }
  1070. static attr_list_t *append_attr_list(attr_list_t *new_list, attr_list_t *old_list)
  1071. {
  1072. struct list *entry;
  1073. if (!old_list) return new_list;
  1074. while ((entry = list_head(old_list)))
  1075. {
  1076. attr_t *attr = LIST_ENTRY(entry, attr_t, entry);
  1077. list_remove(entry);
  1078. new_list = append_attr(new_list, attr);
  1079. }
  1080. return new_list;
  1081. }
  1082. static attr_list_t *dupattrs(const attr_list_t *list)
  1083. {
  1084. attr_list_t *new_list;
  1085. const attr_t *attr;
  1086. if (!list) return NULL;
  1087. new_list = xmalloc( sizeof(*list) );
  1088. list_init( new_list );
  1089. LIST_FOR_EACH_ENTRY(attr, list, const attr_t, entry)
  1090. {
  1091. attr_t *new_attr = xmalloc(sizeof(*new_attr));
  1092. *new_attr = *attr;
  1093. list_add_tail(new_list, &new_attr->entry);
  1094. }
  1095. return new_list;
  1096. }
  1097. 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)
  1098. {
  1099. decl_spec_t *declspec = left ? left : right;
  1100. if (!declspec)
  1101. {
  1102. declspec = xmalloc(sizeof(*declspec));
  1103. declspec->type = NULL;
  1104. declspec->attrs = NULL;
  1105. declspec->stgclass = STG_NONE;
  1106. }
  1107. declspec->type = type;
  1108. if (left && declspec != left)
  1109. {
  1110. declspec->attrs = append_attr_list(declspec->attrs, left->attrs);
  1111. if (declspec->stgclass == STG_NONE)
  1112. declspec->stgclass = left->stgclass;
  1113. else if (left->stgclass != STG_NONE)
  1114. error_loc("only one storage class can be specified\n");
  1115. assert(!left->type);
  1116. free(left);
  1117. }
  1118. if (right && declspec != right)
  1119. {
  1120. declspec->attrs = append_attr_list(declspec->attrs, right->attrs);
  1121. if (declspec->stgclass == STG_NONE)
  1122. declspec->stgclass = right->stgclass;
  1123. else if (right->stgclass != STG_NONE)
  1124. error_loc("only one storage class can be specified\n");
  1125. assert(!right->type);
  1126. free(right);
  1127. }
  1128. declspec->attrs = append_attr(declspec->attrs, attr);
  1129. if (declspec->stgclass == STG_NONE)
  1130. declspec->stgclass = stgclass;
  1131. else if (stgclass != STG_NONE)
  1132. error_loc("only one storage class can be specified\n");
  1133. /* apply attributes to type */
  1134. if (type && declspec->attrs)
  1135. {
  1136. attr_list_t *attrs;
  1137. declspec->type = duptype(type, 1);
  1138. attrs = dupattrs(type->attrs);
  1139. declspec->type->attrs = append_attr_list(attrs, declspec->attrs);
  1140. declspec->attrs = NULL;
  1141. }
  1142. return declspec;
  1143. }
  1144. static attr_t *make_attr(enum attr_type type)
  1145. {
  1146. attr_t *a = xmalloc(sizeof(attr_t));
  1147. a->type = type;
  1148. a->u.ival = 0;
  1149. return a;
  1150. }
  1151. static attr_t *make_attrv(enum attr_type type, unsigned int val)
  1152. {
  1153. attr_t *a = xmalloc(sizeof(attr_t));
  1154. a->type = type;
  1155. a->u.ival = val;
  1156. return a;
  1157. }
  1158. static attr_t *make_attrp(enum attr_type type, void *val)
  1159. {
  1160. attr_t *a = xmalloc(sizeof(attr_t));
  1161. a->type = type;
  1162. a->u.pval = val;
  1163. return a;
  1164. }
  1165. static expr_list_t *append_expr(expr_list_t *list, expr_t *expr)
  1166. {
  1167. if (!expr) return list;
  1168. if (!list)
  1169. {
  1170. list = xmalloc( sizeof(*list) );
  1171. list_init( list );
  1172. }
  1173. list_add_tail( list, &expr->entry );
  1174. return list;
  1175. }
  1176. static array_dims_t *append_array(array_dims_t *list, expr_t *expr)
  1177. {
  1178. if (!expr) return list;
  1179. if (!list)
  1180. {
  1181. list = xmalloc( sizeof(*list) );
  1182. list_init( list );
  1183. }
  1184. list_add_tail( list, &expr->entry );
  1185. return list;
  1186. }
  1187. static struct list type_pool = LIST_INIT(type_pool);
  1188. typedef struct
  1189. {
  1190. type_t data;
  1191. struct list link;
  1192. } type_pool_node_t;
  1193. type_t *alloc_type(void)
  1194. {
  1195. type_pool_node_t *node = xmalloc(sizeof *node);
  1196. list_add_tail(&type_pool, &node->link);
  1197. return &node->data;
  1198. }
  1199. void set_all_tfswrite(int val)
  1200. {
  1201. type_pool_node_t *node;
  1202. LIST_FOR_EACH_ENTRY(node, &type_pool, type_pool_node_t, link)
  1203. node->data.tfswrite = val;
  1204. }
  1205. void clear_all_offsets(void)
  1206. {
  1207. type_pool_node_t *node;
  1208. LIST_FOR_EACH_ENTRY(node, &type_pool, type_pool_node_t, link)
  1209. node->data.typestring_offset = node->data.ptrdesc = 0;
  1210. }
  1211. static void type_function_add_head_arg(type_t *type, var_t *arg)
  1212. {
  1213. if (!type->details.function->args)
  1214. {
  1215. type->details.function->args = xmalloc( sizeof(*type->details.function->args) );
  1216. list_init( type->details.function->args );
  1217. }
  1218. list_add_head( type->details.function->args, &arg->entry );
  1219. }
  1220. static int is_allowed_range_type(const type_t *type)
  1221. {
  1222. switch (type_get_type(type))
  1223. {
  1224. case TYPE_ENUM:
  1225. return TRUE;
  1226. case TYPE_BASIC:
  1227. switch (type_basic_get_type(type))
  1228. {
  1229. case TYPE_BASIC_INT8:
  1230. case TYPE_BASIC_INT16:
  1231. case TYPE_BASIC_INT32:
  1232. case TYPE_BASIC_INT64:
  1233. case TYPE_BASIC_INT:
  1234. case TYPE_BASIC_INT3264:
  1235. case TYPE_BASIC_BYTE:
  1236. case TYPE_BASIC_CHAR:
  1237. case TYPE_BASIC_WCHAR:
  1238. case TYPE_BASIC_HYPER:
  1239. return TRUE;
  1240. case TYPE_BASIC_FLOAT:
  1241. case TYPE_BASIC_DOUBLE:
  1242. case TYPE_BASIC_ERROR_STATUS_T:
  1243. case TYPE_BASIC_HANDLE:
  1244. return FALSE;
  1245. }
  1246. return FALSE;
  1247. default:
  1248. return FALSE;
  1249. }
  1250. }
  1251. static type_t *append_ptrchain_type(type_t *ptrchain, type_t *type)
  1252. {
  1253. type_t *ptrchain_type;
  1254. if (!ptrchain)
  1255. return type;
  1256. for (ptrchain_type = ptrchain; type_pointer_get_ref(ptrchain_type); ptrchain_type = type_pointer_get_ref(ptrchain_type))
  1257. ;
  1258. assert(ptrchain_type->type_type == TYPE_POINTER);
  1259. ptrchain_type->details.pointer.ref = type;
  1260. return ptrchain;
  1261. }
  1262. static var_t *declare_var(attr_list_t *attrs, decl_spec_t *decl_spec, const declarator_t *decl,
  1263. int top)
  1264. {
  1265. var_t *v = decl->var;
  1266. expr_list_t *sizes = get_attrp(attrs, ATTR_SIZEIS);
  1267. expr_list_t *lengs = get_attrp(attrs, ATTR_LENGTHIS);
  1268. int sizeless;
  1269. expr_t *dim;
  1270. type_t **ptype;
  1271. array_dims_t *arr = decl ? decl->array : NULL;
  1272. type_t *func_type = decl ? decl->func_type : NULL;
  1273. type_t *type = decl_spec->type;
  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. * pointer, if one is being declared */
  1299. type_t **pt = func_type ? &func_type : &v->type;
  1300. for (ptr = *pt; ptr && !ptr_attr; )
  1301. {
  1302. ptr_attr = get_attrv(ptr->attrs, ATTR_POINTERTYPE);
  1303. if (!ptr_attr && type_is_alias(ptr))
  1304. ptr = type_al

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