* ILParser.jay: Add parameterized types to classes.
[mono.git] / mcs / ilasm / parser / ILParser.jay
1 %{\r
2 // Mono::ILASM::ILParser\r
3 //\r
4 // (C) Sergey Chaban (serge@wildwestsoftware.com)\r
5 \r
6 using PEAPI;\r
7 using System;\r
8 using System.Collections;\r
9 \r
10 namespace Mono.ILASM {\r
11 \r
12         public class ILParser {\r
13 \r
14                 private CodeGen codegen;\r
15 \r
16                 public ILParser (CodeGen codegen) {\r
17                         this.codegen = codegen;\r
18                 }\r
19 \r
20                 public CodeGen CodeGen {\r
21                         get { return codegen; }\r
22                 }\r
23                 \r
24 %}\r
25 \r
26 %token EOF\r
27 \r
28 /* ID - alpha-numeric identifier */\r
29 %token ID\r
30 \r
31 /* QSTRING - quoted string */\r
32 %token QSTRING\r
33 \r
34 /* SQSTRING - single quoted string */\r
35 %token SQSTRING\r
36 \r
37 /* INT32 - 32 bit integer */\r
38 %token INT32\r
39 \r
40 /* INT64 - 64 bit integer */\r
41 %token INT64\r
42 \r
43 /* FLOAT64 - floating point number */\r
44 %token FLOAT64\r
45 \r
46 /* HEXBYTE - two digit hex number */\r
47 %token HEXBYTE\r
48 \r
49 \r
50 /* Punctuation */\r
51 %token DOT           "."\r
52 %token OPEN_BRACE    "{"\r
53 %token CLOSE_BRACE   "}"\r
54 %token OPEN_BRACKET  "["\r
55 %token CLOSE_BRACKET "]"\r
56 %token OPEN_PARENS   "("\r
57 %token CLOSE_PARENS  ")"\r
58 %token COMMA         ","\r
59 %token COLON         ":"\r
60 %token DOUBLE_COLON  "::"\r
61 %token SEMICOLON     ";"\r
62 %token ASSIGN        "="\r
63 %token STAR          "*"\r
64 %token AMPERSAND     "&"\r
65 %token PLUS          "+"\r
66 %token SLASH         "/"\r
67 %token BANG          "!"\r
68 %token ELLIPSIS      "..."\r
69 %token DASH          "-"\r
70 %token OPEN_ANGLE_BRACKET   "<"\r
71 %token CLOSE_ANGLE_BRACKET  ">"\r
72 \r
73 \r
74 \r
75 %token UNKNOWN\r
76 \r
77 \r
78 /* INSTR_* instruction types */\r
79 %token INSTR_NONE\r
80 %token INSTR_VAR\r
81 %token INSTR_I\r
82 %token INSTR_I8\r
83 %token INSTR_R\r
84 %token INSTR_BRTARGET\r
85 %token INSTR_METHOD\r
86 %token INSTR_NEWOBJ\r
87 %token INSTR_FIELD\r
88 %token INSTR_TYPE\r
89 %token INSTR_STRING\r
90 %token INSTR_SIG\r
91 %token INSTR_RVA\r
92 %token INSTR_TOK\r
93 %token INSTR_SWITCH\r
94 %token INSTR_PHI\r
95 \r
96 \r
97 \r
98 \r
99 \r
100 \r
101 \r
102 /* Mechanically generated  - DO NOT EDIT! */\r
103 \r
104 \r
105 /* Directives */\r
106 %token D_ADDON\r
107 %token D_ALGORITHM\r
108 %token D_ASSEMBLY\r
109 %token D_BACKING\r
110 %token D_BLOB\r
111 %token D_CAPABILITY\r
112 %token D_CCTOR\r
113 %token D_CLASS\r
114 %token D_COMTYPE\r
115 %token D_CONFIG\r
116 %token D_CORFLAGS\r
117 %token D_CTOR\r
118 %token D_CUSTOM\r
119 %token D_DATA\r
120 %token D_EMITBYTE\r
121 %token D_ENTRYPOINT\r
122 %token D_EVENT\r
123 %token D_EXELOC\r
124 %token D_EXPORT\r
125 %token D_FIELD\r
126 %token D_FILE\r
127 %token D_FIRE\r
128 %token D_GET\r
129 %token D_HASH\r
130 %token D_IMPLICITCOM\r
131 %token D_LANGUAGE\r
132 %token D_LINE\r
133 %token D_XLINE\r
134 %token D_LOCALE\r
135 %token D_LOCALS\r
136 %token D_MANIFESTRES\r
137 %token D_MAXSTACK\r
138 %token D_METHOD\r
139 %token D_MIME\r
140 %token D_MODULE\r
141 %token D_MRESOURCE\r
142 %token D_NAMESPACE\r
143 %token D_ORIGINATOR\r
144 %token D_OS\r
145 %token D_OTHER\r
146 %token D_OVERRIDE\r
147 %token D_PACK\r
148 %token D_PARAM\r
149 %token D_PERMISSION\r
150 %token D_PERMISSIONSET\r
151 %token D_PROCESSOR\r
152 %token D_PROPERTY\r
153 %token D_PUBLICKEY\r
154 %token D_PUBLICKEYTOKEN\r
155 %token D_REMOVEON\r
156 %token D_SET\r
157 %token D_SIZE\r
158 %token D_SUBSYSTEM\r
159 %token D_TITLE\r
160 %token D_TRY\r
161 %token D_VER\r
162 %token D_VTABLE\r
163 %token D_VTENTRY\r
164 %token D_VTFIXUP\r
165 %token D_ZEROINIT\r
166 \r
167 \r
168 /* Keywords */\r
169 %token K_AT\r
170 %token K_AS\r
171 %token K_IMPLICITCOM\r
172 %token K_IMPLICITRES\r
173 %token K_NOAPPDOMAIN\r
174 %token K_NOPROCESS\r
175 %token K_NOMACHINE\r
176 %token K_EXTERN\r
177 %token K_INSTANCE\r
178 %token K_EXPLICIT\r
179 %token K_DEFAULT\r
180 %token K_VARARG\r
181 %token K_UNMANAGED\r
182 %token K_CDECL\r
183 %token K_STDCALL\r
184 %token K_THISCALL\r
185 %token K_FASTCALL\r
186 %token K_MARSHAL\r
187 %token K_IN\r
188 %token K_OUT\r
189 %token K_OPT\r
190 %token K_LCID\r
191 %token K_RETVAL\r
192 %token K_STATIC\r
193 %token K_PUBLIC\r
194 %token K_PRIVATE\r
195 %token K_FAMILY\r
196 %token K_INITONLY\r
197 %token K_RTSPECIALNAME\r
198 %token K_SPECIALNAME\r
199 %token K_ASSEMBLY\r
200 %token K_FAMANDASSEM\r
201 %token K_FAMORASSEM\r
202 %token K_PRIVATESCOPE\r
203 %token K_LITERAL\r
204 %token K_NOTSERIALIZED\r
205 %token K_VALUE\r
206 %token K_NOT_IN_GC_HEAP\r
207 %token K_INTERFACE\r
208 %token K_SEALED\r
209 %token K_ABSTRACT\r
210 %token K_AUTO\r
211 %token K_SEQUENTIAL\r
212 %token K_ANSI\r
213 %token K_UNICODE\r
214 %token K_AUTOCHAR\r
215 %token K_IMPORT\r
216 %token K_SERIALIZABLE\r
217 %token K_NESTED\r
218 %token K_LATEINIT\r
219 %token K_EXTENDS\r
220 %token K_IMPLEMENTS\r
221 %token K_FINAL\r
222 %token K_VIRTUAL\r
223 %token K_HIDEBYSIG\r
224 %token K_NEWSLOT\r
225 %token K_UNMANAGEDEXP\r
226 %token K_PINVOKEIMPL\r
227 %token K_NOMANGLE\r
228 %token K_OLE\r
229 %token K_LASTERR\r
230 %token K_WINAPI\r
231 %token K_NATIVE\r
232 %token K_IL\r
233 %token K_CIL\r
234 %token K_OPTIL\r
235 %token K_MANAGED\r
236 %token K_FORWARDREF\r
237 %token K_RUNTIME\r
238 %token K_INTERNALCALL\r
239 %token K_SYNCHRONIZED\r
240 %token K_NOINLINING\r
241 %token K_CUSTOM\r
242 %token K_FIXED\r
243 %token K_SYSSTRING\r
244 %token K_ARRAY\r
245 %token K_VARIANT\r
246 %token K_CURRENCY\r
247 %token K_SYSCHAR\r
248 %token K_VOID\r
249 %token K_BOOL\r
250 %token K_INT8\r
251 %token K_INT16\r
252 %token K_INT32\r
253 %token K_INT64\r
254 %token K_FLOAT32\r
255 %token K_FLOAT64\r
256 %token K_ERROR\r
257 %token K_UNSIGNED\r
258 %token K_DECIMAL\r
259 %token K_DATE\r
260 %token K_BSTR\r
261 %token K_LPSTR\r
262 %token K_LPWSTR\r
263 %token K_LPTSTR\r
264 %token K_OBJECTREF\r
265 %token K_IUNKNOWN\r
266 %token K_IDISPATCH\r
267 %token K_STRUCT\r
268 %token K_SAFEARRAY\r
269 %token K_INT\r
270 %token K_BYVALSTR\r
271 %token K_TBSTR\r
272 %token K_LPVOID\r
273 %token K_ANY\r
274 %token K_FLOAT\r
275 %token K_LPSTRUCT\r
276 %token K_NULL\r
277 %token K_PTR\r
278 %token K_VECTOR\r
279 %token K_HRESULT\r
280 %token K_CARRAY\r
281 %token K_USERDEFINED\r
282 %token K_RECORD\r
283 %token K_FILETIME\r
284 %token K_BLOB\r
285 %token K_STREAM\r
286 %token K_STORAGE\r
287 %token K_STREAMED_OBJECT\r
288 %token K_STORED_OBJECT\r
289 %token K_BLOB_OBJECT\r
290 %token K_CF\r
291 %token K_CLSID\r
292 %token K_METHOD\r
293 %token K_CLASS\r
294 %token K_PINNED\r
295 %token K_MODREQ\r
296 %token K_MODOPT\r
297 %token K_TYPEDREF\r
298 %token K_WCHAR\r
299 %token K_CHAR\r
300 %token K_FROMUNMANAGED\r
301 %token K_CALLMOSTDERIVED\r
302 %token K_BYTEARRAY\r
303 %token K_WITH\r
304 %token K_INIT\r
305 %token K_TO\r
306 %token K_CATCH\r
307 %token K_FILTER\r
308 %token K_FINALLY\r
309 %token K_FAULT\r
310 %token K_HANDLER\r
311 %token K_TLS\r
312 %token K_FIELD\r
313 %token K_REQUEST\r
314 %token K_DEMAND\r
315 %token K_ASSERT\r
316 %token K_DENY\r
317 %token K_PERMITONLY\r
318 %token K_LINKCHECK\r
319 %token K_INHERITCHECK\r
320 %token K_REQMIN\r
321 %token K_REQOPT\r
322 %token K_REQREFUSE\r
323 %token K_PREJITGRANT\r
324 %token K_PREJITDENY\r
325 %token K_NONCASDEMAND\r
326 %token K_NONCASLINKDEMAND\r
327 %token K_NONCASINHERITANCE\r
328 %token K_READONLY\r
329 %token K_NOMETADATA\r
330 %token K_ALGORITHM\r
331 %token K_FULLORIGIN\r
332 %token K_NAN\r
333 %token K_INF\r
334 %token K_PUBLICKEY\r
335 %token K_ENABLEJITTRACKING\r
336 %token K_DISABLEJITOPTIMIZER\r
337 %token K_PRESERVESIG\r
338 %token K_BEFOREFIELDINIT\r
339 %token K_ALIGNMENT\r
340 %token K_NULLREF\r
341 %token K_VALUETYPE\r
342 %token K_COMPILERCONTROLLED\r
343 %token K_REQSECOBJ\r
344 %token K_ENUM\r
345 %token K_OBJECT\r
346 %token K_STRING\r
347 %token K_TRUE\r
348 %token K_FALSE\r
349 \r
350 /* end generated */\r
351 \r
352 \r
353 \r
354 \r
355 \r
356 %start il_file\r
357 \r
358 %%\r
359 \r
360 il_file                 : decls\r
361                         ;\r
362 \r
363 decls                   : /* EMPTY */\r
364                         | decls decl\r
365                         ;\r
366 \r
367 decl                    : class_all\r
368                         | namespace_all\r
369                         | method_all\r
370                         | field_decl\r
371                         | data_decl\r
372                         | vtfixup_decl\r
373                         | file_decl\r
374                         | assembly_all\r
375                         | assemblyref_all\r
376                         | exptype_all\r
377                         | manifestres_all\r
378                         | module_head\r
379                         | sec_decl\r
380                         | customattr_decl\r
381                         | D_SUBSYSTEM int32\r
382                         | D_CORFLAGS int32\r
383                         | D_FILE K_ALIGNMENT int32\r
384                 /*      | D_IMAGEBASE int64     */\r
385                         | extsource_spec\r
386                         | language_decl\r
387                         ;\r
388 \r
389 extsource_spec          : D_LINE int32 SQSTRING\r
390                         | D_LINE int32\r
391                         | D_LINE int32 COLON int32 SQSTRING\r
392                         | D_LINE int32 COLON int32\r
393                         ;\r
394 \r
395 language_decl           : D_LANGUAGE SQSTRING\r
396                         | D_LANGUAGE SQSTRING COMMA SQSTRING\r
397                         | D_LANGUAGE SQSTRING COMMA SQSTRING COMMA SQSTRING\r
398                         ;\r
399 \r
400 vtfixup_decl            : D_VTFIXUP OPEN_BRACKET int32 CLOSE_BRACKET \r
401                           vtfixup_attr K_AT id\r
402                         ;\r
403 \r
404 vtfixup_attr            : /* EMPTY */\r
405                         | vtfixup_attr int32\r
406                         | vtfixup_attr int64\r
407                         | vtfixup_attr K_FROMUNMANAGED\r
408                         | vtfixup_attr K_CALLMOSTDERIVED\r
409                         ;\r
410 \r
411 namespace_all           : namespace_head OPEN_BRACE decls CLOSE_BRACE\r
412                           {\r
413                                 codegen.CurrentNameSpace = null;\r
414                           }\r
415                         ;\r
416 \r
417 namespace_head          : D_NAMESPACE comp_name\r
418                           {\r
419                                 codegen.CurrentNameSpace = (string) $2;\r
420                           }\r
421                         ;\r
422 \r
423 class_all               : class_head OPEN_BRACE class_decls\r
424                           CLOSE_BRACE\r
425                           {\r
426                                 codegen.CompleteClass ();\r
427                           }\r
428                         ;\r
429 \r
430 class_head              : D_CLASS class_attr id typars_clause extends_clause\r
431                           impl_clause\r
432                           {\r
433                                 if ($4 != null) {\r
434                                         codegen.AddClass ((TypeAttr) $2, (string) $3, \r
435                                                 ((TypeRef)$5).Type as Class, null);\r
436                                 } else {\r
437                                         codegen.AddClass ((TypeAttr)$2, (string) $3, null);\r
438                                 }\r
439                                 \r
440                                 ArrayList impl_list = (ArrayList) $6;\r
441                                 if (impl_list != null) {\r
442                                         foreach (TypeRef type_ref in impl_list)\r
443                                                 codegen.CurrentClass.AddImplementedInterface (type_ref.Type as Class);\r
444                                 }\r
445                           }\r
446                         ;\r
447 \r
448 class_attrs             : class_attrs class_attr\r
449                         ;\r
450 \r
451 class_attr              : /* EMPTY */                           { $$ = new TypeAttr (); }\r
452                         | class_attr K_PUBLIC                   { $$ = (TypeAttr)$1 | TypeAttr.Public; }        \r
453                         | class_attr K_PRIVATE                  { $$ = (TypeAttr)$1 | TypeAttr.Private; }\r
454                         | class_attr K_NESTED K_PRIVATE         { $$ = (TypeAttr)$1 | TypeAttr.NestedPrivate; }\r
455                         | class_attr K_NESTED K_PUBLIC          { $$ = (TypeAttr)$1 | TypeAttr.NestedPublic; }\r
456                         | class_attr K_NESTED K_FAMILY          { $$ = (TypeAttr)$1 | TypeAttr.NestedFamily; }\r
457                         | class_attr K_NESTED K_ASSEMBLY        { $$ = (TypeAttr)$1 | TypeAttr.NestedAssembly;}\r
458                         | class_attr K_NESTED K_FAMANDASSEM     { $$ = (TypeAttr)$1 | TypeAttr.NestedFamAndAssem; }\r
459                         | class_attr K_NESTED K_FAMORASSEM      { $$ = (TypeAttr)$1 | TypeAttr.NestedFamOrAssem; }\r
460                         | class_attr K_VALUE                    {  }\r
461                         | class_attr K_ENUM                     {  }\r
462                         | class_attr K_INTERFACE                { $$ = (TypeAttr)$1 | TypeAttr.Interface; }\r
463                         | class_attr K_SEALED                   { $$ = (TypeAttr)$1 | TypeAttr.Sealed; }\r
464                         | class_attr K_ABSTRACT                 { $$ = (TypeAttr)$1 | TypeAttr.Abstract; }\r
465                         | class_attr K_AUTO                     {  }\r
466                         | class_attr K_SEQUENTIAL               { $$ = (TypeAttr)$1 | TypeAttr.SequentialLayout; }\r
467                         | class_attr K_EXPLICIT                 { $$ = (TypeAttr)$1 | TypeAttr.ExplicitLayout; }\r
468                         | class_attr K_ANSI                     {  }\r
469                         | class_attr K_UNICODE                  { $$ = (TypeAttr)$1 | TypeAttr.UnicodeClass; }\r
470                         | class_attr K_AUTOCHAR                 { $$ = (TypeAttr)$1 | TypeAttr.AutoClass; }\r
471                         | class_attr K_IMPORT                   { $$ = (TypeAttr)$1 | TypeAttr.Import; }\r
472                         | class_attr K_SERIALIZABLE             { $$ = (TypeAttr)$1 | TypeAttr.Serializable; }\r
473                         | class_attr K_BEFOREFIELDINIT          { $$ = (TypeAttr)$1 | TypeAttr.BeforeFieldInit; }\r
474                         | class_attr K_SPECIALNAME              { $$ = (TypeAttr)$1 | TypeAttr.SpecialName; }\r
475                         | class_attr K_RTSPECIALNAME            { $$ = (TypeAttr)$1 | TypeAttr.RTSpecialName; }\r
476                         ;\r
477 \r
478 extends_clause          : /* EMPTY */\r
479                         | K_EXTENDS class_ref\r
480                           {\r
481                                 $$ = $2;\r
482                           }\r
483                         ;\r
484 \r
485 impl_clause             : /* EMPTY */\r
486                         | K_IMPLEMENTS class_refs\r
487                           {\r
488                                 $$ = $2;\r
489                           }\r
490                         ;\r
491 \r
492 typars_clause           : /* EMPTY */\r
493                         | OPEN_ANGLE_BRACKET formal_typars CLOSE_ANGLE_BRACKET\r
494                           {\r
495                                 $$ = $2;\r
496                           }\r
497                         ;\r
498 \r
499 typars                  : type\r
500                           {\r
501                                 ArrayList typars_list = new ArrayList ();\r
502                                 typars_list.Add ($1);\r
503                                 $$ = typars_list;\r
504                           }\r
505                         | typars COMMA type\r
506                           {\r
507                                 ArrayList typars_list = (ArrayList) $1;\r
508                                 typars_list.Add ($3);\r
509                                 $$ = typars_list;\r
510                           }\r
511                         ;\r
512 \r
513 formal_typars           : formal_typar\r
514                           {\r
515                                 ArrayList formal_list = new ArrayList ();\r
516                                 formal_list.Add ($1);\r
517                                 $$ = formal_list;\r
518                           }\r
519                         | formal_typars COMMA formal_typar\r
520                           {\r
521                                 ArrayList formal_list = (ArrayList) $1;\r
522                                 formal_list.Add ($3);\r
523                                 $$ = formal_list;\r
524                           }\r
525                         ;\r
526 \r
527 \r
528 formal_typar            : type\r
529                         | type id\r
530                         ;\r
531                         \r
532 class_refs              : class_ref\r
533                           {\r
534                                 ArrayList class_list = new ArrayList ();\r
535                                 class_list.Add ($1);\r
536                                 $$ = class_list; \r
537                           }\r
538                         | class_refs COMMA class_ref\r
539                           {\r
540                                 ArrayList class_list = (ArrayList) $1;\r
541                                 class_list.Add ($3);\r
542                           }\r
543                         ;\r
544 \r
545 slashed_name            : comp_name\r
546                         | slashed_name SLASH comp_name\r
547                           {\r
548                                 $$ = String.Format ("{0}/{1}", $1, $3);\r
549                           }\r
550                         ;\r
551 \r
552 class_ref               : OPEN_BRACKET comp_name CLOSE_BRACKET slashed_name\r
553                           {\r
554                                 PEAPI.Type type = codegen.ExternTable.GetClass ((string) $2, (string)$4);\r
555                                 $$ = new TypeRef (type, (string) $4);\r
556                           }\r
557                         | OPEN_BRACKET D_MODULE comp_name CLOSE_BRACKET slashed_name\r
558                         | slashed_name\r
559                           {\r
560                                 $$ = new TypeRef (codegen.ClassTable.GetReference ((string) $1, null),\r
561                                         (string) $1);\r
562                           }\r
563                         ;\r
564 \r
565 class_decls             : /* EMPTY */\r
566                         | class_decls class_decl\r
567                         ;\r
568 \r
569 class_decl              : method_all\r
570                         | class_all\r
571                         | event_all\r
572                         | prop_all\r
573                         | field_decl\r
574                         | data_decl\r
575                         | sec_decl\r
576                         | extsource_spec\r
577                         | customattr_decl\r
578                         | D_SIZE int32\r
579                           {\r
580                                 \r
581                           }\r
582                         | D_PACK int32\r
583                         | D_OVERRIDE type_spec DOUBLE_COLON method_name\r
584                           K_WITH call_conv type type_spec DOUBLE_COLON method_name\r
585                           OPEN_PARENS sig_args CLOSE_PARENS\r
586                         | language_decl\r
587                         ;\r
588 \r
589 type                    : K_CLASS class_ref\r
590                           {\r
591                                 $$ = $2;\r
592                           }\r
593                         | K_OBJECT\r
594                           {\r
595                                 $$ = new TypeRef (PrimitiveType.Object, "System.Object");\r
596                           }\r
597                         | K_STRING\r
598                           {\r
599                                 $$ = new TypeRef (PrimitiveType.String, "System.String");\r
600                           }\r
601                         | K_VALUE K_CLASS class_ref\r
602                           {\r
603                                 $$ = $3;\r
604                           }\r
605                         | K_VALUETYPE class_ref\r
606                           {\r
607                                 $$ = $2;\r
608                           }\r
609                         | type OPEN_BRACKET CLOSE_BRACKET\r
610                           {\r
611                                 TypeRef base_type = (TypeRef) $1;\r
612                                 PEAPI.Type arr_type = new ZeroBasedArray (base_type.Type);\r
613                                 $$ = new TypeRef (arr_type, base_type.FullName + "[]");\r
614                           }\r
615                         | type OPEN_BRACKET bounds CLOSE_BRACKET\r
616                           {\r
617                                 TypeRef base_type = (TypeRef) $1;\r
618                                 ArrayList bound_list = (ArrayList) $3;\r
619                                 int dimen = bound_list.Count;\r
620                                 int[] lower_array = new int[dimen];\r
621                                 int[] size_array = new int[dimen];\r
622                                 bool lower_set = false;\r
623                                 bool size_set = false;\r
624                                 bool prev_lower_set = true;\r
625                                 bool prev_size_set = true;\r
626 \r
627                                 // TODO: There should probably be an error reported if\r
628                                 // something like [3...,3...5] is done\r
629                                 for (int i=0; i<dimen; i++) {\r
630                                         DictionaryEntry bound = (DictionaryEntry) bound_list[i];\r
631                                         \r
632                                         if (bound.Key != null && prev_lower_set) {\r
633                                                 lower_array[i] = (int) bound.Key;\r
634                                                 lower_set = true;\r
635                                         } else {\r
636                                                 prev_lower_set = false;\r
637                                         }       \r
638                                         if (bound.Value != null && prev_size_set) {\r
639                                                 size_array[i] = (int) bound.Value;\r
640                                                 size_set = true;\r
641                                         } else {\r
642                                                 prev_size_set = false;\r
643                                         }\r
644                                 }\r
645                                 if (lower_set && size_set) {\r
646                                         $$ = new BoundArray (base_type.Type,\r
647                                                 (uint) dimen, lower_array, size_array);\r
648                                 } else if (size_set) {\r
649                                         $$ = new BoundArray (base_type.Type,\r
650                                                 (uint) dimen, size_array);\r
651                                 } else {\r
652                                         $$ = new BoundArray (base_type.Type, (uint) dimen);\r
653                                 }\r
654                           }\r
655                         | type AMPERSAND\r
656                           {\r
657                                 TypeRef base_type = $1 as TypeRef;\r
658                                 PEAPI.Type ref_type = new ManagedPointer (base_type.Type);\r
659                                 $$ = new TypeRef (ref_type, base_type.FullName + '&');\r
660                           }\r
661                         | type STAR\r
662                           {\r
663                                 TypeRef base_type = (TypeRef) $1;\r
664                                 PEAPI.Type ptr_type = new UnmanagedPointer (base_type.Type);\r
665                                 $$ = new TypeRef (ptr_type, base_type.FullName + '&');\r
666                           }\r
667                         | type K_PINNED\r
668                           {\r
669                                 TypeRef type = (TypeRef) $1;\r
670                                 type.Pinned = true;\r
671                           }\r
672                         | type K_MODREQ OPEN_PARENS class_ref CLOSE_PARENS\r
673                           {\r
674                                 TypeRef base_type = (TypeRef) $1;\r
675                                 TypeRef class_ref = (TypeRef) $4;\r
676 \r
677                                 $$ = new CustomModifiedType (base_type.Type,\r
678                                         CustomModifier.modreq, (Class) class_ref.Type);\r
679                           }\r
680                         | type K_MODOPT OPEN_PARENS class_ref CLOSE_PARENS\r
681                           {\r
682                                 TypeRef base_type = (TypeRef) $1;\r
683                                 TypeRef class_ref = (TypeRef) $4;\r
684 \r
685                                 $$ = new CustomModifiedType (base_type.Type,\r
686                                         CustomModifier.modopt, (Class) class_ref.Type);\r
687                           }\r
688                         | K_METHOD call_conv type STAR OPEN_PARENS sig_args CLOSE_PARENS\r
689                         | K_TYPEDREF\r
690                           {\r
691                                 $$ = new TypeRef (PrimitiveType.TypedRef,\r
692                                         "System.TypedReference");\r
693                           }\r
694                         | K_CHAR\r
695                           {\r
696                                 $$ = new TypeRef (PrimitiveType.Char, "System.Char");\r
697                           }\r
698                         | K_VOID\r
699                           {\r
700                                 $$ = new TypeRef (PrimitiveType.Void, "System.Void");\r
701                           }\r
702                         | K_BOOL\r
703                           {\r
704                                 $$ = new TypeRef (PrimitiveType.Boolean, "System.Bool");\r
705                           }\r
706                         | K_INT8\r
707                           {\r
708                                 $$ = new TypeRef (PrimitiveType.Int8, "System.Int8");\r
709                           }\r
710                         | K_INT16\r
711                           {\r
712                                 $$ = new TypeRef (PrimitiveType.Int16, "System.Int16");\r
713                           }\r
714                         | K_INT32\r
715                           {\r
716                                 $$ = new TypeRef (PrimitiveType.Int32, "System.Int32");\r
717                           }\r
718                         | K_INT64\r
719                           {\r
720                                 $$ = new TypeRef (PrimitiveType.Int64, "System.Int64");\r
721                           }\r
722                         | K_FLOAT32\r
723                           {\r
724                                 $$ = new TypeRef (PrimitiveType.Float32, "System.Float32");\r
725                           }\r
726                         | K_FLOAT64\r
727                           {\r
728                                 $$ = new TypeRef (PrimitiveType.Float64, "System.Float64");\r
729                           }\r
730                         | K_UNSIGNED K_INT8\r
731                           {\r
732                                 $$ = new TypeRef (PrimitiveType.UInt8, "System.UInt8");\r
733                           }\r
734                         | K_UNSIGNED K_INT16\r
735                           {\r
736                                 $$ = new TypeRef (PrimitiveType.UInt16, "System.UInt16");     \r
737                           }\r
738                         | K_UNSIGNED K_INT32\r
739                           {\r
740                                 $$ = new TypeRef (PrimitiveType.UInt32, "System.UInt32");\r
741                           }\r
742                         | K_UNSIGNED K_INT64\r
743                           {\r
744                                 $$ = new TypeRef (PrimitiveType.UInt64, "System.UInt64");\r
745                           }\r
746                         | K_NATIVE K_INT\r
747                           {\r
748                                 // TODO: Is this the proper full name\r
749                                 $$ = new TypeRef (PrimitiveType.NativeInt, "System.IntPtr");\r
750                           }\r
751                         \r
752                         | K_NATIVE K_UNSIGNED K_INT\r
753                           {\r
754                                 // TODO: Is this the proper full name\r
755                                 $$ = new TypeRef (PrimitiveType.NativeUInt, "System.UIntPtr");\r
756                           }\r
757                         | BANG int32\r
758                           {\r
759                                 // access class type parameter by number\r
760                           }\r
761                         | BANG BANG int32\r
762                           {\r
763                                 // access method type parameter by number\r
764                           }\r
765                         ;\r
766 \r
767 bounds                  : bound\r
768                           {\r
769                                 ArrayList bound_list = new ArrayList ();\r
770                                 bound_list.Add ($1);\r
771                                 $$ = bound_list;\r
772                           }\r
773                         | bounds COMMA bound\r
774                           {\r
775                                 ArrayList bound_list = (ArrayList) $1;\r
776                                 bound_list.Add ($3);\r
777                           }\r
778                         ;\r
779 \r
780 bound                   : /* EMPTY */\r
781                         | ELLIPSIS\r
782                           {\r
783                                 // No lower bound or size\r
784                                 $$ = new DictionaryEntry (null,null);\r
785                           }\r
786                         | int32\r
787                           {\r
788                                 // ******** Not sure what this is?\r
789                                 // For now I will say it is size because there\r
790                                 // is allready a way to set lower\r
791                                 $$ = new DictionaryEntry (null, $1);\r
792                           }\r
793                         | int32 ELLIPSIS int32\r
794                           {\r
795                                 // lower bound and size\r
796                                 $$ = new DictionaryEntry ($1, $3);\r
797                           }\r
798                         | int32 ELLIPSIS\r
799                           {\r
800                                 // Just lower bound\r
801                                 $$ = new DictionaryEntry ($1, null);\r
802                           }\r
803                         ;\r
804 \r
805 call_conv               : K_INSTANCE call_conv\r
806                           {\r
807                                 $$ = (CallConv) $2 | CallConv.Instance;\r
808                           }\r
809                         | K_EXPLICIT call_conv\r
810                           {\r
811                                 $$ = (CallConv) $2 | CallConv.InstanceExplicit;\r
812                           }\r
813                         | call_kind\r
814                         ;\r
815 \r
816 call_kind               : /* EMPTY */\r
817                           {\r
818                                 $$ = new CallConv ();\r
819                           }\r
820                         | K_DEFAULT\r
821                           {\r
822                                 $$ = CallConv.Default;\r
823                           }\r
824                         | K_VARARG\r
825                           {\r
826                                 $$ = CallConv.Vararg;\r
827                           }\r
828                         | K_UNMANAGED K_CDECL\r
829                           {\r
830                                 $$ = CallConv.Cdecl;\r
831                           }\r
832                         | K_UNMANAGED K_STDCALL\r
833                           {\r
834                                 $$ = CallConv.Stdcall;\r
835                           }\r
836                         | K_UNMANAGED K_THISCALL\r
837                           {\r
838                                 $$ = CallConv.Thiscall;\r
839                           }\r
840                         | K_UNMANAGED K_FASTCALL\r
841                           {\r
842                                 $$ = CallConv.Fastcall;\r
843                           }\r
844                         ;\r
845 \r
846 native_type             : /* EMPTY */\r
847                         | K_CUSTOM OPEN_PARENS comp_qstring COMMA comp_qstring CLOSE_PARENS\r
848                         | K_FIXED K_SYSSTRING OPEN_BRACKET int32 CLOSE_BRACKET\r
849                           {\r
850                                 $$ = NativeType.FixedSysString;\r
851                           }\r
852                         | K_FIXED K_ARRAY OPEN_BRACKET int32 CLOSE_BRACKET\r
853                         | K_VARIANT\r
854                         | K_CURRENCY\r
855                           {\r
856                                 $$ = NativeType.Currency;\r
857                           }\r
858                         | K_SYSCHAR\r
859                         | K_VOID\r
860                           {\r
861                                 $$ = NativeType.Void;\r
862                           }\r
863                         | K_BOOL\r
864                           {\r
865                                 $$ = NativeType.Boolean;\r
866                           }\r
867                         | K_INT8\r
868                           {\r
869                                 $$ = NativeType.Int8;\r
870                           }\r
871                         | K_INT16\r
872                           {\r
873                                 $$ = NativeType.Int16;\r
874                           }\r
875                         | K_INT32\r
876                           {\r
877                                 $$ = NativeType.Int32;\r
878                           }\r
879                         | K_INT64\r
880                           {\r
881                                 $$ = NativeType.Int64;\r
882                           }\r
883                         | K_FLOAT32\r
884                           {\r
885                                 $$ = NativeType.Float32;\r
886                           }\r
887                         | K_FLOAT64\r
888                           {\r
889                                 $$ = NativeType.Float64;\r
890                           }\r
891                         | K_ERROR\r
892                         | K_UNSIGNED K_INT8\r
893                           {\r
894                                 $$ = NativeType.UInt8;\r
895                           }\r
896                         | K_UNSIGNED K_INT16\r
897                           {\r
898                                 $$ = NativeType.UInt16;\r
899                           }\r
900                         | K_UNSIGNED K_INT32\r
901                           {\r
902                                 $$ = NativeType.UInt32;\r
903                           }\r
904                         | K_UNSIGNED K_INT64\r
905                           {\r
906                                 $$ = NativeType.UInt64;\r
907                           }\r
908                         | native_type STAR\r
909                         | native_type OPEN_BRACKET CLOSE_BRACKET\r
910                         | native_type OPEN_BRACKET int32 CLOSE_BRACKET\r
911                         | native_type OPEN_BRACKET int32 PLUS int32 CLOSE_BRACKET\r
912                         | native_type OPEN_BRACKET PLUS int32 CLOSE_BRACKET\r
913                         | K_DECIMAL\r
914                         | K_DATE\r
915                         | K_BSTR\r
916                           {\r
917                                 $$ = NativeType.BStr;\r
918                           }\r
919                         | K_LPSTR\r
920                           {\r
921                                 $$ = NativeType.LPStr;\r
922                           }\r
923                         | K_LPWSTR\r
924                           {\r
925                                 $$ = NativeType.LPWStr;\r
926                           }\r
927                         | K_LPTSTR\r
928                           {\r
929                                 $$ = NativeType.LPTStr;\r
930                           }\r
931                         | K_OBJECTREF\r
932                         | K_IUNKNOWN\r
933                           {\r
934                                 $$ = NativeType.IUnknown;\r
935                           }\r
936                         | K_IDISPATCH\r
937                           {\r
938                                 $$ = NativeType.IDispatch;\r
939                           }\r
940                         | K_STRUCT\r
941                           {\r
942                                 $$ = NativeType.Struct;\r
943                           }\r
944                         | K_INTERFACE\r
945                           {\r
946                                 $$ = NativeType.Interface;\r
947                           }\r
948                         | K_SAFEARRAY variant_type\r
949                         | K_SAFEARRAY variant_type COMMA comp_qstring\r
950                         | K_INT\r
951                           {\r
952                                 $$ = NativeType.Int;\r
953                           }\r
954                         | K_UNSIGNED K_INT\r
955                           {\r
956                                 $$ = NativeType.UInt;\r
957                           }\r
958                         | K_NESTED K_STRUCT\r
959                         | K_BYVALSTR\r
960                           {\r
961                                 $$ = NativeType.ByValStr;\r
962                           }\r
963                         | K_ANSI K_BSTR\r
964                           {\r
965                                 $$ = NativeType.AnsiBStr;\r
966                           }\r
967                         | K_TBSTR\r
968                           {\r
969                                 $$ = NativeType.TBstr;\r
970                           }\r
971                         | K_VARIANT K_BOOL\r
972                           {\r
973                                 $$ = NativeType.VariantBool;\r
974                           }\r
975                         | K_METHOD\r
976                         | K_AS K_ANY\r
977                           {\r
978                                 $$ = NativeType.AsAny;\r
979                           }\r
980                         | K_LPSTRUCT\r
981                         ;\r
982 \r
983 variant_type            : /* EMPTY */\r
984                         | K_NULL\r
985                         | K_VARIANT\r
986                         | K_CURRENCY\r
987                         | K_VOID\r
988                         | K_BOOL\r
989                         | K_INT8\r
990                         | K_INT16\r
991                         | K_INT32\r
992                         | K_INT64\r
993                         | K_FLOAT32\r
994                         | K_FLOAT64\r
995                         | K_UNSIGNED K_INT8\r
996                         | K_UNSIGNED K_INT16\r
997                         | K_UNSIGNED K_INT32\r
998                         | K_UNSIGNED K_INT64\r
999                         | STAR\r
1000                         | variant_type OPEN_BRACKET CLOSE_BRACKET\r
1001                         | variant_type K_VECTOR\r
1002                         | variant_type AMPERSAND\r
1003                         | K_DECIMAL\r
1004                         | K_DATE\r
1005                         | K_BSTR\r
1006                         | K_LPSTR\r
1007                         | K_LPWSTR\r
1008                         | K_IUNKNOWN\r
1009                         | K_IDISPATCH\r
1010                         | K_SAFEARRAY\r
1011                         | K_INT\r
1012                         | K_UNSIGNED K_INT\r
1013                         | K_ERROR\r
1014                         | K_HRESULT\r
1015                         | K_CARRAY\r
1016                         | K_USERDEFINED\r
1017                         | K_RECORD\r
1018                         | K_FILETIME\r
1019                         | K_BLOB\r
1020                         | K_STREAM\r
1021                         | K_STORAGE\r
1022                         | K_STREAMED_OBJECT\r
1023                         | K_STORED_OBJECT\r
1024                         | K_BLOB_OBJECT\r
1025                         | K_CF\r
1026                         | K_CLSID\r
1027                         ;\r
1028 \r
1029 field_decl              : D_FIELD repeat_opt field_attr type id at_opt init_opt\r
1030                         ;\r
1031 \r
1032 repeat_opt              : /* EMPTY */\r
1033                         | OPEN_BRACKET int32 CLOSE_BRACKET\r
1034                         ;\r
1035 \r
1036 field_attr              : /* EMPTY */\r
1037                         | field_attr K_PUBLIC\r
1038                         | field_attr K_PRIVATE\r
1039                         | field_attr K_FAMILY\r
1040                         | field_attr K_ASSEMBLY\r
1041                         | field_attr K_FAMANDASSEM\r
1042                         | field_attr K_FAMORASSEM\r
1043                         | field_attr K_PRIVATESCOPE\r
1044                         | field_attr K_STATIC\r
1045                         | field_attr K_INITONLY\r
1046                         | field_attr K_RTSPECIALNAME\r
1047                         | field_attr K_SPECIALNAME\r
1048                         | field_attr K_MARSHAL OPEN_PARENS native_type CLOSE_PARENS\r
1049                         | field_attr K_LITERAL\r
1050                         | field_attr K_NOTSERIALIZED\r
1051                         ;\r
1052 \r
1053 at_opt                  : /* EMPTY */\r
1054                         | K_AT id\r
1055                         ;\r
1056 \r
1057 init_opt                : /* EMPTY */\r
1058                         | ASSIGN field_init\r
1059                         ;\r
1060 \r
1061 field_init              : K_FLOAT32 OPEN_PARENS float64 CLOSE_PARENS\r
1062                         | K_FLOAT64 OPEN_PARENS float64 CLOSE_PARENS\r
1063                         | K_FLOAT32 OPEN_PARENS int64 CLOSE_PARENS\r
1064                         | K_FLOAT64 OPEN_PARENS int64 CLOSE_PARENS\r
1065                         | K_INT64 OPEN_PARENS int64 CLOSE_PARENS\r
1066                         | K_INT32 OPEN_PARENS int64 CLOSE_PARENS\r
1067                         | K_INT16 OPEN_PARENS int64 CLOSE_PARENS\r
1068                         | K_CHAR OPEN_PARENS int64 CLOSE_PARENS\r
1069                         | K_INT8 OPEN_PARENS int64 CLOSE_PARENS\r
1070                         | K_BOOL OPEN_PARENS truefalse CLOSE_PARENS\r
1071                         | K_BYTEARRAY OPEN_PARENS bytes CLOSE_PARENS\r
1072                         | comp_qstring                                          // ******** ADDED\r
1073                         | K_NULLREF\r
1074                         ;\r
1075 \r
1076 data_decl               : data_head data_body\r
1077                         ;\r
1078 \r
1079 data_head               : D_DATA tls id ASSIGN \r
1080                         | D_DATA tls\r
1081                         ;\r
1082 \r
1083 tls                     : /* EMPTY */\r
1084                         | K_TLS\r
1085                         ;\r
1086 \r
1087 data_body               : OPEN_BRACE dataitem_list CLOSE_BRACE\r
1088                         | dataitem\r
1089                         ;\r
1090 \r
1091 dataitem_list           : dataitem\r
1092                         | dataitem_list COMMA dataitem\r
1093                         ;\r
1094 \r
1095 dataitem                : K_CHAR STAR OPEN_PARENS comp_qstring CLOSE_PARENS\r
1096                         | AMPERSAND OPEN_PARENS id CLOSE_PARENS\r
1097                         | K_BYTEARRAY ASSIGN OPEN_PARENS bytes CLOSE_PARENS\r
1098                         | K_BYTEARRAY OPEN_PARENS bytes CLOSE_PARENS                    // ******** ADDED\r
1099                         | K_FLOAT32 OPEN_PARENS float64 CLOSE_PARENS repeat_opt\r
1100                         | K_FLOAT64 OPEN_PARENS float64 CLOSE_PARENS repeat_opt\r
1101                         | K_INT64 OPEN_PARENS int64 CLOSE_PARENS repeat_opt\r
1102                         | K_INT32 OPEN_PARENS int32 CLOSE_PARENS repeat_opt\r
1103                         | K_INT16 OPEN_PARENS int32 CLOSE_PARENS repeat_opt\r
1104                         | K_INT8 OPEN_PARENS int32 CLOSE_PARENS repeat_opt\r
1105                         | K_FLOAT32 repeat_opt\r
1106                         | K_FLOAT64 repeat_opt\r
1107                         | K_INT64 repeat_opt\r
1108                         | K_INT32 repeat_opt\r
1109                         | K_INT16 repeat_opt\r
1110                         | K_INT8 repeat_opt\r
1111                         ;\r
1112 \r
1113 method_all              : method_head OPEN_BRACE method_decls CLOSE_BRACE\r
1114                         ;\r
1115 \r
1116 method_head             : D_METHOD meth_attr call_conv param_attr type method_name\r
1117                           OPEN_PARENS sig_args CLOSE_PARENS impl_attr\r
1118                         | D_METHOD meth_attr call_conv param_attr type \r
1119                           K_MARSHAL OPEN_PARENS native_type CLOSE_PARENS method_name\r
1120                           OPEN_PARENS sig_args CLOSE_PARENS impl_attr\r
1121                         ;\r
1122 \r
1123 meth_attr               : /* EMPTY */\r
1124                         | meth_attr K_STATIC\r
1125                         | meth_attr K_PUBLIC\r
1126                         | meth_attr K_PRIVATE\r
1127                         | meth_attr K_FAMILY\r
1128                         | meth_attr K_ASSEMBLY\r
1129                         | meth_attr K_FAMANDASSEM\r
1130                         | meth_attr K_FAMORASSEM\r
1131                         | meth_attr K_PRIVATESCOPE\r
1132                         | meth_attr K_FINAL\r
1133                         | meth_attr K_VIRTUAL\r
1134                         | meth_attr K_ABSTRACT\r
1135                         | meth_attr K_HIDEBYSIG\r
1136                         | meth_attr K_NEWSLOT\r
1137                         | meth_attr K_REQSECOBJ\r
1138                         | meth_attr K_SPECIALNAME\r
1139                         | meth_attr K_RTSPECIALNAME\r
1140                         | meth_attr K_UNMANAGEDEXP\r
1141                         | meth_attr K_PINVOKEIMPL OPEN_PARENS comp_qstring K_AS\r
1142                                 comp_qstring pinv_attr CLOSE_PARENS\r
1143                         | meth_attr K_PINVOKEIMPL OPEN_PARENS comp_qstring pinv_attr CLOSE_PARENS\r
1144                         | meth_attr K_PINVOKEIMPL OPEN_PARENS pinv_attr CLOSE_PARENS\r
1145                         ;\r
1146 \r
1147 pinv_attr               : /* EMPTY */\r
1148                         | pinv_attr K_NOMANGLE\r
1149                         | pinv_attr K_ANSI\r
1150                         | pinv_attr K_UNICODE\r
1151                         | pinv_attr K_AUTOCHAR\r
1152                         | pinv_attr K_LASTERR\r
1153                         | pinv_attr K_WINAPI\r
1154                         | pinv_attr K_CDECL\r
1155                         | pinv_attr K_STDCALL\r
1156                         | pinv_attr K_THISCALL\r
1157                         | pinv_attr K_FASTCALL\r
1158                         ;\r
1159 \r
1160 method_name             : D_CTOR\r
1161                         | D_CCTOR\r
1162                         | comp_name\r
1163                         ;\r
1164 \r
1165 param_attr              : /* EMPTY */\r
1166                         | param_attr OPEN_BRACKET K_IN CLOSE_BRACKET\r
1167                         | param_attr OPEN_BRACKET K_OUT CLOSE_BRACKET\r
1168                         | param_attr OPEN_BRACKET K_OPT CLOSE_BRACKET\r
1169                         ;\r
1170 \r
1171 impl_attr               : /* EMPTY */\r
1172                         | impl_attr K_NATIVE\r
1173                         | impl_attr K_CIL\r
1174                         | impl_attr K_OPTIL\r
1175                         | impl_attr K_MANAGED\r
1176                         | impl_attr K_UNMANAGED\r
1177                         | impl_attr K_FORWARDREF\r
1178                         | impl_attr K_PRESERVESIG\r
1179                         | impl_attr K_RUNTIME\r
1180                         | impl_attr K_INTERNALCALL\r
1181                         | impl_attr K_SYNCHRONIZED\r
1182                         | impl_attr K_NOINLINING\r
1183                         ;\r
1184 \r
1185 sig_args                : /* EMPTY */\r
1186                         | sig_arg_list\r
1187                         ;\r
1188 \r
1189 sig_arg_list            : sig_arg\r
1190                         | sig_arg_list COMMA sig_arg\r
1191                         ;\r
1192 \r
1193 sig_arg                 : param_attr type\r
1194                         | param_attr type id\r
1195                         | param_attr type K_MARSHAL OPEN_PARENS native_type CLOSE_PARENS\r
1196                         | param_attr type K_MARSHAL OPEN_PARENS native_type CLOSE_PARENS id\r
1197                         ;\r
1198 \r
1199 method_decls            : /* EMPTY */\r
1200                         | method_decls method_decl\r
1201                         ;\r
1202 \r
1203 method_decl             : D_EMITBYTE int32\r
1204                         | D_MAXSTACK int32\r
1205                         | D_LOCALS OPEN_PARENS sig_args CLOSE_PARENS\r
1206                         | D_LOCALS K_INIT OPEN_PARENS sig_args CLOSE_PARENS\r
1207                         | D_ENTRYPOINT\r
1208                         | D_ZEROINIT\r
1209                         | D_EXPORT OPEN_BRACKET int32 CLOSE_BRACKET\r
1210                         | D_EXPORT OPEN_BRACKET int32 CLOSE_BRACKET K_AS id\r
1211                         | D_VTENTRY int32 COLON int32 \r
1212                         | D_OVERRIDE type_spec DOUBLE_COLON method_name\r
1213                         | scope_block\r
1214                         | D_PARAM OPEN_BRACKET int32 CLOSE_BRACKET init_opt\r
1215                         | id COLON\r
1216                         | seh_block\r
1217                         | instr\r
1218                         | sec_decl\r
1219                         | extsource_spec\r
1220                         | language_decl\r
1221                         | customattr_decl\r
1222                         | data_decl\r
1223                         ;\r
1224 \r
1225 type_spec               : class_ref\r
1226                         | OPEN_BRACKET comp_name CLOSE_BRACKET\r
1227                         | OPEN_BRACKET D_MODULE comp_name CLOSE_BRACKET\r
1228                         | type\r
1229                         ;\r
1230 \r
1231 scope_block             : OPEN_BRACE method_decls CLOSE_BRACE\r
1232                         ;\r
1233 \r
1234 seh_block               : try_block seh_clauses\r
1235                         ;\r
1236 \r
1237 try_block               : D_TRY scope_block\r
1238                         | D_TRY id K_TO id\r
1239                         | D_TRY int32 K_TO int32\r
1240                         ;\r
1241 \r
1242 seh_clauses             : seh_clause\r
1243                         | seh_clauses seh_clause\r
1244                         ;\r
1245 \r
1246 seh_clause              : K_CATCH class_ref handler_block\r
1247                         | K_FINALLY handler_block\r
1248                         | K_FAULT handler_block\r
1249                         | filter_clause handler_block\r
1250                         ;\r
1251 \r
1252 filter_clause           : K_FILTER scope_block\r
1253                         | K_FILTER id\r
1254                         | K_FILTER int32\r
1255                         ;\r
1256 \r
1257 handler_block           : scope_block\r
1258                         | K_HANDLER id K_TO id\r
1259                         | K_HANDLER int32 K_TO int32\r
1260                         ;\r
1261 \r
1262 instr                   : INSTR_NONE\r
1263                         | INSTR_VAR int32\r
1264                         | INSTR_I int32\r
1265                         | INSTR_I id /* Allow variable names :p */\r
1266                         | INSTR_I8 int64\r
1267                         | INSTR_R float64\r
1268                         | INSTR_R int64\r
1269                         | INSTR_R OPEN_PARENS bytes CLOSE_PARENS\r
1270                         | INSTR_BRTARGET int32\r
1271                         | INSTR_BRTARGET id\r
1272                         | INSTR_METHOD method_ref\r
1273                         | INSTR_FIELD type type_spec DOUBLE_COLON id\r
1274                         | INSTR_FIELD type id\r
1275                         | INSTR_TYPE K_FIELD type type_spec DOUBLE_COLON id                     // ****** ADDED\r
1276                         | INSTR_TYPE K_FIELD type id                                            // ****** ADDED\r
1277                         | INSTR_TYPE type_spec\r
1278                         | INSTR_STRING comp_qstring\r
1279                         | INSTR_STRING K_BYTEARRAY ASSIGN OPEN_PARENS bytes CLOSE_PARENS\r
1280                         | INSTR_STRING K_BYTEARRAY OPEN_PARENS bytes CLOSE_PARENS               // ****** ADDED\r
1281                         | INSTR_SIG call_conv type OPEN_PARENS sig_args CLOSE_PARENS\r
1282                         | INSTR_TOK owner_type\r
1283                         | INSTR_SWITCH OPEN_PARENS labels CLOSE_PARENS\r
1284                         ;\r
1285 \r
1286 method_ref              : call_conv type type_spec DOUBLE_COLON method_name \r
1287                           OPEN_PARENS sig_args CLOSE_PARENS\r
1288                         | call_conv type method_name \r
1289                           OPEN_PARENS sig_args CLOSE_PARENS\r
1290                         ;\r
1291 \r
1292 labels                  : /* EMPTY */\r
1293                         | id\r
1294                         | int32\r
1295                         | labels COMMA id\r
1296                         | labels COMMA int32\r
1297                         ;\r
1298 \r
1299 owner_type              : type_spec\r
1300                         | member_ref\r
1301                         ;\r
1302 \r
1303 member_ref              : K_METHOD member_ref\r
1304                         | K_FIELD type type_spec DOUBLE_COLON id\r
1305                         | K_FIELD type id\r
1306                         ;\r
1307 \r
1308 event_all               : event_head OPEN_BRACE event_decls CLOSE_BRACE\r
1309                         ;\r
1310 \r
1311 event_head              : D_EVENT event_attr type_spec id\r
1312                         | D_EVENT event_attr id\r
1313                         ;\r
1314 \r
1315 event_attr              : /* EMPTY */\r
1316                         | event_attr K_RTSPECIALNAME\r
1317                         | event_attr K_SPECIALNAME\r
1318                         ;\r
1319 \r
1320 event_decls             : /* EMPTY */\r
1321                         | event_decls event_decl\r
1322                         ;\r
1323 \r
1324 event_decl              : D_ADDON method_ref\r
1325                         | D_REMOVEON method_ref\r
1326                         | D_FIRE method_ref\r
1327                         | D_OTHER method_ref\r
1328                         | customattr_decl\r
1329                         | extsource_spec\r
1330                         | language_decl\r
1331                         ;\r
1332 \r
1333 prop_all                : prop_head OPEN_BRACE prop_decls CLOSE_BRACE\r
1334                         ;\r
1335 \r
1336 prop_head               : D_PROPERTY prop_attr type id OPEN_PARENS sig_args CLOSE_PARENS init_opt\r
1337                         ;\r
1338 \r
1339 prop_attr               : /* EMPTY */\r
1340                         | prop_attr K_RTSPECIALNAME\r
1341                         | prop_attr K_SPECIALNAME\r
1342                         ;\r
1343 \r
1344 prop_decls              : /* EMPTY */\r
1345                         | prop_decls prop_decl\r
1346                         ;\r
1347 \r
1348 prop_decl               : D_SET method_ref\r
1349                         | D_GET method_ref\r
1350                         | D_OTHER method_ref\r
1351                         | customattr_decl\r
1352                         | extsource_spec\r
1353                         | language_decl\r
1354                         ;\r
1355 \r
1356 customattr_decl         : D_CUSTOM custom_type\r
1357                         | D_CUSTOM custom_type ASSIGN comp_qstring\r
1358                         | D_CUSTOM custom_type ASSIGN OPEN_PARENS bytes CLOSE_PARENS\r
1359                         | D_CUSTOM OPEN_PARENS owner_type CLOSE_PARENS custom_type\r
1360                         | D_CUSTOM OPEN_PARENS owner_type CLOSE_PARENS custom_type ASSIGN comp_qstring\r
1361                         | D_CUSTOM OPEN_PARENS owner_type CLOSE_PARENS custom_type ASSIGN\r
1362                           OPEN_PARENS bytes CLOSE_PARENS\r
1363                         ;\r
1364                         \r
1365 custom_type             : call_conv type type_spec DOUBLE_COLON D_CTOR OPEN_PARENS sig_args CLOSE_PARENS\r
1366                         | call_conv type D_CTOR OPEN_PARENS sig_args CLOSE_PARENS\r
1367                         ;\r
1368 \r
1369 sec_decl                : D_PERMISSION sec_action type_spec OPEN_PARENS nameval_pairs CLOSE_PARENS\r
1370                         | D_PERMISSION sec_action type_spec\r
1371                         | D_PERMISSIONSET sec_action ASSIGN OPEN_PARENS bytes CLOSE_PARENS\r
1372                         ;\r
1373 \r
1374 nameval_pairs           : nameval_pair \r
1375                         | nameval_pairs COMMA nameval_pair\r
1376                         ;\r
1377 \r
1378 nameval_pair            : comp_qstring ASSIGN cavalue\r
1379                         ;\r
1380 \r
1381 cavalue                 : truefalse\r
1382                         | int32\r
1383                         | int32 OPEN_PARENS int32 CLOSE_PARENS\r
1384                         | comp_qstring \r
1385                         | class_ref OPEN_PARENS K_INT8 COLON int32 CLOSE_PARENS\r
1386                         | class_ref OPEN_PARENS K_INT16 COLON int32 CLOSE_PARENS\r
1387                         | class_ref OPEN_PARENS K_INT32 COLON int32 CLOSE_PARENS\r
1388                         | class_ref OPEN_PARENS int32 CLOSE_PARENS\r
1389                         ;\r
1390 \r
1391 sec_action              : K_REQUEST\r
1392                         | K_DEMAND\r
1393                         | K_ASSERT\r
1394                         | K_DENY\r
1395                         | K_PERMITONLY\r
1396                         | K_LINKCHECK\r
1397                         | K_INHERITCHECK\r
1398                         | K_REQMIN\r
1399                         | K_REQOPT\r
1400                         | K_REQREFUSE\r
1401                         | K_PREJITGRANT\r
1402                         | K_PREJITDENY\r
1403                         | K_NONCASDEMAND\r
1404                         | K_NONCASLINKDEMAND\r
1405                         | K_NONCASINHERITANCE\r
1406                         ;\r
1407 \r
1408 module_head             : D_MODULE\r
1409                         | D_MODULE comp_name\r
1410                         | D_MODULE K_EXTERN comp_name\r
1411                         ;\r
1412 \r
1413 file_decl               : D_FILE file_attr comp_name file_entry D_HASH ASSIGN\r
1414                           OPEN_PARENS bytes CLOSE_PARENS file_entry\r
1415                         | D_FILE file_attr comp_name file_entry\r
1416                         ;\r
1417 \r
1418 file_attr               : /* EMPTY */\r
1419                         | file_attr K_NOMETADATA\r
1420                         ;\r
1421 \r
1422 file_entry              : /* EMPTY */\r
1423                         | D_ENTRYPOINT\r
1424                         ;\r
1425 \r
1426 assembly_all            : assembly_head OPEN_BRACE assembly_decls CLOSE_BRACE\r
1427                         ;\r
1428 \r
1429 assembly_head           : D_ASSEMBLY asm_attr comp_name\r
1430                         ;\r
1431 \r
1432 asm_attr                : /* EMPTY */\r
1433                         | asm_attr K_NOAPPDOMAIN\r
1434                         | asm_attr K_NOPROCESS\r
1435                         | asm_attr K_NOMACHINE\r
1436                         ;\r
1437 \r
1438 assembly_decls          : /* EMPTY */\r
1439                         | assembly_decls assembly_decl\r
1440                         ;\r
1441 \r
1442 assembly_decl           : D_HASH K_ALGORITHM int32\r
1443                         | sec_decl\r
1444                         | asm_or_ref_decl\r
1445                         ;\r
1446 \r
1447 asm_or_ref_decl         : D_PUBLICKEY ASSIGN OPEN_PARENS bytes CLOSE_PARENS\r
1448                         | D_VER int32 COLON int32 COLON int32 COLON int32 \r
1449                         | D_LOCALE comp_qstring\r
1450                         | D_LOCALE ASSIGN OPEN_PARENS bytes CLOSE_PARENS\r
1451                         | customattr_decl\r
1452                         ;\r
1453 \r
1454 assemblyref_all         : assemblyref_head OPEN_BRACE assemblyref_decls CLOSE_BRACE\r
1455                         ;\r
1456 \r
1457 assemblyref_head        : D_ASSEMBLY K_EXTERN comp_name\r
1458                         | D_ASSEMBLY K_EXTERN comp_name K_AS comp_name\r
1459                         ;\r
1460 \r
1461 assemblyref_decls       : /* EMPTY */\r
1462                         | assemblyref_decls assemblyref_decl\r
1463                         ;\r
1464 \r
1465 assemblyref_decl        : D_HASH ASSIGN OPEN_PARENS bytes CLOSE_PARENS\r
1466                         | asm_or_ref_decl\r
1467                         | D_PUBLICKEYTOKEN ASSIGN OPEN_PARENS bytes CLOSE_PARENS\r
1468                         ;\r
1469 \r
1470 exptype_all             : exptype_head OPEN_BRACE exptype_decls CLOSE_BRACE\r
1471                         ;\r
1472 \r
1473 exptype_head            : D_CLASS K_EXTERN expt_attr comp_name\r
1474                         ;\r
1475 \r
1476 expt_attr               : /* EMPTY */\r
1477                         | expt_attr K_PRIVATE\r
1478                         | expt_attr K_PUBLIC \r
1479                         | expt_attr K_NESTED K_PUBLIC\r
1480                         | expt_attr K_NESTED K_PRIVATE\r
1481                         | expt_attr K_NESTED K_FAMILY\r
1482                         | expt_attr K_NESTED K_ASSEMBLY\r
1483                         | expt_attr K_NESTED K_FAMANDASSEM\r
1484                         | expt_attr K_NESTED K_FAMORASSEM\r
1485                         ;\r
1486 \r
1487 exptype_decls           : /* EMPTY */\r
1488                         | exptype_decls exptype_decl\r
1489                         ;\r
1490 \r
1491 exptype_decl            : D_FILE comp_name\r
1492                         | D_CLASS K_EXTERN comp_name\r
1493                         | D_CLASS int32\r
1494                         | customattr_decl\r
1495                         ;\r
1496 \r
1497 manifestres_all         : manifestres_head OPEN_BRACE manifestres_decls CLOSE_BRACE\r
1498                         ;\r
1499 \r
1500 manifestres_head        : D_MRESOURCE manres_attr comp_name     \r
1501                         ;\r
1502 \r
1503 manres_attr             : /* EMPTY */\r
1504                         | manres_attr K_PUBLIC\r
1505                         | manres_attr K_PRIVATE\r
1506                         ;\r
1507 \r
1508 manifestres_decls       : /* EMPTY */\r
1509                         | manifestres_decls manifestres_decl\r
1510                         ;\r
1511 \r
1512 manifestres_decl        : D_FILE comp_name K_AT int32\r
1513                         | D_ASSEMBLY K_EXTERN comp_name\r
1514                         | customattr_decl\r
1515                         ;\r
1516 \r
1517 dotted_name             : id\r
1518                         | dotted_name DOT id    { $$ = String.Format ("{0}.{1}", $1, $3); }\r
1519                         ;\r
1520 \r
1521 comp_qstring            : QSTRING\r
1522                         | comp_qstring PLUS QSTRING     { $$ = String.Format ("{0}{1}", $1, $3); }\r
1523                         ;\r
1524 \r
1525 int32                   : INT32\r
1526                         | INT64\r
1527                         ;\r
1528 \r
1529 int64                   : INT32\r
1530                         | INT64\r
1531                         ;\r
1532 \r
1533 float64                 : FLOAT64\r
1534                         | K_FLOAT32 OPEN_PARENS int32 CLOSE_PARENS\r
1535                         | K_FLOAT64 OPEN_PARENS int64 CLOSE_PARENS\r
1536                         ;\r
1537 \r
1538 hexbyte                 : HEXBYTE\r
1539                         | INT32                                 // ******** ADDED\r
1540                         | ID                                    // ******** ADDED\r
1541                         ;\r
1542 \r
1543 bytes                   : /* EMPTY */\r
1544                         | hexbytes\r
1545                         ;\r
1546 \r
1547 hexbytes                : hexbyte\r
1548                         | hexbytes hexbyte\r
1549                         ;\r
1550 \r
1551 truefalse               : K_TRUE\r
1552                         | K_FALSE\r
1553                         ;\r
1554 \r
1555 id                      : ID\r
1556                         | SQSTRING\r
1557                         ;\r
1558 \r
1559 comp_name               : id\r
1560                         | dotted_name\r
1561                         ;\r
1562 \r
1563 dotted_name             : id\r
1564                         | dotted_name DOT id\r
1565                         ;\r
1566 \r
1567 \r
1568 %%\r
1569 \r
1570 }\r
1571 \r