* ILParser.jay: Implement most field features
[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 CLOSE_BRACE\r
424                           {\r
425                                 codegen.CompleteClass ();\r
426                           }\r
427                         ;\r
428 \r
429 class_head              : D_CLASS class_attr id typars_clause extends_clause\r
430                           impl_clause\r
431                           {\r
432                                 if ($5 != null) {\r
433                                         codegen.AddClass ((TypeAttr) $2, (string) $3, \r
434                                                 ((TypeRef)$5).Type as Class, null);\r
435                                 } else {\r
436                                         codegen.AddClass ((TypeAttr)$2, (string) $3, null);\r
437                                 }\r
438                                 \r
439                                 ArrayList impl_list = (ArrayList) $6;\r
440                                 if (impl_list != null) {\r
441                                         foreach (TypeRef type_ref in impl_list)\r
442                                                 codegen.CurrentClass.AddImplementedInterface (type_ref.Type as Class);\r
443                                 }\r
444                                 \r
445                                 if ($4 != null) {\r
446                                         ArrayList typars_list = (ArrayList) $4;\r
447                                         int index = 0;\r
448                                         foreach (DictionaryEntry entry in typars_list) {\r
449                                                 TypeRef type = (TypeRef) entry.Key;\r
450                                                 string name = (string) entry.Value;\r
451                                                 codegen.CurrentClass.AddGenericParameter ((short) index++, type.Type, name);\r
452                                         }\r
453                                 }\r
454                           }\r
455                         ;\r
456 \r
457 class_attrs             : class_attrs class_attr\r
458                         ;\r
459 \r
460 class_attr              : /* EMPTY */                           { $$ = new TypeAttr (); }\r
461                         | class_attr K_PUBLIC                   { $$ = (TypeAttr)$1 | TypeAttr.Public; }        \r
462                         | class_attr K_PRIVATE                  { $$ = (TypeAttr)$1 | TypeAttr.Private; }\r
463                         | class_attr K_NESTED K_PRIVATE         { $$ = (TypeAttr)$1 | TypeAttr.NestedPrivate; }\r
464                         | class_attr K_NESTED K_PUBLIC          { $$ = (TypeAttr)$1 | TypeAttr.NestedPublic; }\r
465                         | class_attr K_NESTED K_FAMILY          { $$ = (TypeAttr)$1 | TypeAttr.NestedFamily; }\r
466                         | class_attr K_NESTED K_ASSEMBLY        { $$ = (TypeAttr)$1 | TypeAttr.NestedAssembly;}\r
467                         | class_attr K_NESTED K_FAMANDASSEM     { $$ = (TypeAttr)$1 | TypeAttr.NestedFamAndAssem; }\r
468                         | class_attr K_NESTED K_FAMORASSEM      { $$ = (TypeAttr)$1 | TypeAttr.NestedFamOrAssem; }\r
469                         | class_attr K_VALUE                    {  }\r
470                         | class_attr K_ENUM                     {  }\r
471                         | class_attr K_INTERFACE                { $$ = (TypeAttr)$1 | TypeAttr.Interface; }\r
472                         | class_attr K_SEALED                   { $$ = (TypeAttr)$1 | TypeAttr.Sealed; }\r
473                         | class_attr K_ABSTRACT                 { $$ = (TypeAttr)$1 | TypeAttr.Abstract; }\r
474                         | class_attr K_AUTO                     {  }\r
475                         | class_attr K_SEQUENTIAL               { $$ = (TypeAttr)$1 | TypeAttr.SequentialLayout; }\r
476                         | class_attr K_EXPLICIT                 { $$ = (TypeAttr)$1 | TypeAttr.ExplicitLayout; }\r
477                         | class_attr K_ANSI                     {  }\r
478                         | class_attr K_UNICODE                  { $$ = (TypeAttr)$1 | TypeAttr.UnicodeClass; }\r
479                         | class_attr K_AUTOCHAR                 { $$ = (TypeAttr)$1 | TypeAttr.AutoClass; }\r
480                         | class_attr K_IMPORT                   { $$ = (TypeAttr)$1 | TypeAttr.Import; }\r
481                         | class_attr K_SERIALIZABLE             { $$ = (TypeAttr)$1 | TypeAttr.Serializable; }\r
482                         | class_attr K_BEFOREFIELDINIT          { $$ = (TypeAttr)$1 | TypeAttr.BeforeFieldInit; }\r
483                         | class_attr K_SPECIALNAME              { $$ = (TypeAttr)$1 | TypeAttr.SpecialName; }\r
484                         | class_attr K_RTSPECIALNAME            { $$ = (TypeAttr)$1 | TypeAttr.RTSpecialName; }\r
485                         ;\r
486 \r
487 extends_clause          : /* EMPTY */\r
488                         | K_EXTENDS class_ref\r
489                           {\r
490                                 $$ = $2;\r
491                           }\r
492                         ;\r
493 \r
494 impl_clause             : /* EMPTY */\r
495                         | K_IMPLEMENTS class_refs\r
496                           {\r
497                                 $$ = $2;\r
498                           }\r
499                         ;\r
500 \r
501 typars_clause           : /* EMPTY */\r
502                         | OPEN_ANGLE_BRACKET formal_typars CLOSE_ANGLE_BRACKET\r
503                           {\r
504                                 $$ = $2;\r
505                           }\r
506                         ;\r
507 \r
508 typars                  : type\r
509                           {\r
510                                 ArrayList typars_list = new ArrayList ();\r
511                                 typars_list.Add ($1);\r
512                                 $$ = typars_list;\r
513                           }\r
514                         | typars COMMA type\r
515                           {\r
516                                 ArrayList typars_list = (ArrayList) $1;\r
517                                 typars_list.Add ($3);\r
518                                 $$ = typars_list;\r
519                           }\r
520                         ;\r
521 \r
522 formal_typars           : formal_typar\r
523                           {\r
524                                 ArrayList formal_list = new ArrayList ();\r
525                                 formal_list.Add ($1);\r
526                                 $$ = formal_list;\r
527                           }\r
528                         | formal_typars COMMA formal_typar\r
529                           {\r
530                                 ArrayList formal_list = (ArrayList) $1;\r
531                                 formal_list.Add ($3);\r
532                                 $$ = formal_list;\r
533                           }\r
534                         ;\r
535 \r
536 \r
537 formal_typar            : type          { $$ = new DictionaryEntry ($1, null); }\r
538                         | type id       { $$ = new DictionaryEntry ($1, $2); }\r
539                         ;\r
540                         \r
541 class_refs              : class_ref\r
542                           {\r
543                                 ArrayList class_list = new ArrayList ();\r
544                                 class_list.Add ($1);\r
545                                 $$ = class_list; \r
546                           }\r
547                         | class_refs COMMA class_ref\r
548                           {\r
549                                 ArrayList class_list = (ArrayList) $1;\r
550                                 class_list.Add ($3);\r
551                           }\r
552                         ;\r
553 \r
554 slashed_name            : comp_name\r
555                         | slashed_name SLASH comp_name\r
556                           {\r
557                                 $$ = String.Format ("{0}/{1}", $1, $3);\r
558                           }\r
559                         ;\r
560 \r
561 class_ref               : OPEN_BRACKET comp_name CLOSE_BRACKET slashed_name\r
562                           {\r
563                                 Class klass = codegen.ExternTable.GetClass ((string) $2, (string)$4);\r
564                                 $$ = new TypeRef (klass, (string) $4);\r
565                           }\r
566                         | OPEN_BRACKET D_MODULE comp_name CLOSE_BRACKET slashed_name\r
567                         | slashed_name\r
568                           {\r
569                                 $$ = new TypeRef (codegen.ClassTable.GetReference ((string) $1, null),\r
570                                         (string) $1);\r
571                           }\r
572                         ;\r
573 \r
574 class_decls             : /* EMPTY */\r
575                         | class_decls class_decl\r
576                         ;\r
577 \r
578 class_decl              : method_all\r
579                         | class_all\r
580                         | event_all\r
581                         | prop_all\r
582                         | field_decl\r
583                         | data_decl\r
584                         | sec_decl\r
585                         | extsource_spec\r
586                         | customattr_decl\r
587                         | D_SIZE int32\r
588                           {\r
589                                 \r
590                           }\r
591                         | D_PACK int32\r
592                         | D_OVERRIDE type_spec DOUBLE_COLON method_name\r
593                           K_WITH call_conv type type_spec DOUBLE_COLON method_name\r
594                           OPEN_PARENS sig_args CLOSE_PARENS\r
595                         | language_decl\r
596                         ;\r
597 \r
598 type                    : K_CLASS class_ref\r
599                           {\r
600                                 $$ = $2;\r
601                           }\r
602                         | K_OBJECT\r
603                           {\r
604                                 $$ = new TypeRef (PrimitiveType.Object, "System.Object");\r
605                           }\r
606                         | K_STRING\r
607                           {\r
608                                 $$ = new TypeRef (PrimitiveType.String, "System.String");\r
609                           }\r
610                         | K_VALUE K_CLASS class_ref\r
611                           {\r
612                                 $$ = $3;\r
613                           }\r
614                         | K_VALUETYPE class_ref\r
615                           {\r
616                                 $$ = $2;\r
617                           }\r
618                         | type OPEN_BRACKET CLOSE_BRACKET\r
619                           {\r
620                                 TypeRef base_type = (TypeRef) $1;\r
621                                 PEAPI.Type arr_type = new ZeroBasedArray (base_type.Type);\r
622                                 $$ = new TypeRef (arr_type, base_type.FullName + "[]");\r
623                           }\r
624                         | type OPEN_BRACKET bounds CLOSE_BRACKET\r
625                           {\r
626                                 TypeRef base_type = (TypeRef) $1;\r
627                                 ArrayList bound_list = (ArrayList) $3;\r
628                                 int dimen = bound_list.Count;\r
629                                 int[] lower_array = new int[dimen];\r
630                                 int[] size_array = new int[dimen];\r
631                                 bool lower_set = false;\r
632                                 bool size_set = false;\r
633                                 bool prev_lower_set = true;\r
634                                 bool prev_size_set = true;\r
635 \r
636                                 // TODO: There should probably be an error reported if\r
637                                 // something like [3...,3...5] is done\r
638                                 for (int i=0; i<dimen; i++) {\r
639                                         DictionaryEntry bound = (DictionaryEntry) bound_list[i];\r
640                                         \r
641                                         if (bound.Key != null && prev_lower_set) {\r
642                                                 lower_array[i] = (int) bound.Key;\r
643                                                 lower_set = true;\r
644                                         } else {\r
645                                                 prev_lower_set = false;\r
646                                         }       \r
647                                         if (bound.Value != null && prev_size_set) {\r
648                                                 size_array[i] = (int) bound.Value;\r
649                                                 size_set = true;\r
650                                         } else {\r
651                                                 prev_size_set = false;\r
652                                         }\r
653                                 }\r
654                                 if (lower_set && size_set) {\r
655                                         $$ = new BoundArray (base_type.Type,\r
656                                                 (uint) dimen, lower_array, size_array);\r
657                                 } else if (size_set) {\r
658                                         $$ = new BoundArray (base_type.Type,\r
659                                                 (uint) dimen, size_array);\r
660                                 } else {\r
661                                         $$ = new BoundArray (base_type.Type, (uint) dimen);\r
662                                 }\r
663                           }\r
664                         | type AMPERSAND\r
665                           {\r
666                                 TypeRef base_type = $1 as TypeRef;\r
667                                 PEAPI.Type ref_type = new ManagedPointer (base_type.Type);\r
668                                 $$ = new TypeRef (ref_type, base_type.FullName + '&');\r
669                           }\r
670                         | type STAR\r
671                           {\r
672                                 TypeRef base_type = (TypeRef) $1;\r
673                                 PEAPI.Type ptr_type = new UnmanagedPointer (base_type.Type);\r
674                                 $$ = new TypeRef (ptr_type, base_type.FullName + '&');\r
675                           }\r
676                         | type K_PINNED\r
677                           {\r
678                                 TypeRef type = (TypeRef) $1;\r
679                                 type.Pinned = true;\r
680                           }\r
681                         | type K_MODREQ OPEN_PARENS class_ref CLOSE_PARENS\r
682                           {\r
683                                 TypeRef base_type = (TypeRef) $1;\r
684                                 TypeRef class_ref = (TypeRef) $4;\r
685 \r
686                                 $$ = new CustomModifiedType (base_type.Type,\r
687                                         CustomModifier.modreq, (Class) class_ref.Type);\r
688                           }\r
689                         | type K_MODOPT OPEN_PARENS class_ref CLOSE_PARENS\r
690                           {\r
691                                 TypeRef base_type = (TypeRef) $1;\r
692                                 TypeRef class_ref = (TypeRef) $4;\r
693 \r
694                                 $$ = new CustomModifiedType (base_type.Type,\r
695                                         CustomModifier.modopt, (Class) class_ref.Type);\r
696                           }\r
697                         | K_METHOD call_conv type STAR OPEN_PARENS sig_args CLOSE_PARENS\r
698                         | K_TYPEDREF\r
699                           {\r
700                                 $$ = new TypeRef (PrimitiveType.TypedRef,\r
701                                         "System.TypedReference");\r
702                           }\r
703                         | K_CHAR\r
704                           {\r
705                                 $$ = new TypeRef (PrimitiveType.Char, "System.Char");\r
706                           }\r
707                         | K_VOID\r
708                           {\r
709                                 $$ = new TypeRef (PrimitiveType.Void, "System.Void");\r
710                           }\r
711                         | K_BOOL\r
712                           {\r
713                                 $$ = new TypeRef (PrimitiveType.Boolean, "System.Bool");\r
714                           }\r
715                         | K_INT8\r
716                           {\r
717                                 $$ = new TypeRef (PrimitiveType.Int8, "System.Int8");\r
718                           }\r
719                         | K_INT16\r
720                           {\r
721                                 $$ = new TypeRef (PrimitiveType.Int16, "System.Int16");\r
722                           }\r
723                         | K_INT32\r
724                           {\r
725                                 $$ = new TypeRef (PrimitiveType.Int32, "System.Int32");\r
726                           }\r
727                         | K_INT64\r
728                           {\r
729                                 $$ = new TypeRef (PrimitiveType.Int64, "System.Int64");\r
730                           }\r
731                         | K_FLOAT32\r
732                           {\r
733                                 $$ = new TypeRef (PrimitiveType.Float32, "System.Float32");\r
734                           }\r
735                         | K_FLOAT64\r
736                           {\r
737                                 $$ = new TypeRef (PrimitiveType.Float64, "System.Float64");\r
738                           }\r
739                         | K_UNSIGNED K_INT8\r
740                           {\r
741                                 $$ = new TypeRef (PrimitiveType.UInt8, "System.UInt8");\r
742                           }\r
743                         | K_UNSIGNED K_INT16\r
744                           {\r
745                                 $$ = new TypeRef (PrimitiveType.UInt16, "System.UInt16");     \r
746                           }\r
747                         | K_UNSIGNED K_INT32\r
748                           {\r
749                                 $$ = new TypeRef (PrimitiveType.UInt32, "System.UInt32");\r
750                           }\r
751                         | K_UNSIGNED K_INT64\r
752                           {\r
753                                 $$ = new TypeRef (PrimitiveType.UInt64, "System.UInt64");\r
754                           }\r
755                         | K_NATIVE K_INT\r
756                           {\r
757                                 // TODO: Is this the proper full name\r
758                                 $$ = new TypeRef (PrimitiveType.NativeInt, "System.IntPtr");\r
759                           }\r
760                         \r
761                         | K_NATIVE K_UNSIGNED K_INT\r
762                           {\r
763                                 // TODO: Is this the proper full name\r
764                                 $$ = new TypeRef (PrimitiveType.NativeUInt, "System.UIntPtr");\r
765                           }\r
766                         | BANG int32\r
767                           {\r
768                                 // access class type parameter by number\r
769                           }\r
770                         | BANG BANG int32\r
771                           {\r
772                                 // access method type parameter by number\r
773                           }\r
774                         ;\r
775 \r
776 bounds                  : bound\r
777                           {\r
778                                 ArrayList bound_list = new ArrayList ();\r
779                                 bound_list.Add ($1);\r
780                                 $$ = bound_list;\r
781                           }\r
782                         | bounds COMMA bound\r
783                           {\r
784                                 ArrayList bound_list = (ArrayList) $1;\r
785                                 bound_list.Add ($3);\r
786                           }\r
787                         ;\r
788 \r
789 bound                   : /* EMPTY */\r
790                         | ELLIPSIS\r
791                           {\r
792                                 // No lower bound or size\r
793                                 $$ = new DictionaryEntry (null,null);\r
794                           }\r
795                         | int32\r
796                           {\r
797                                 // ******** Not sure what this is?\r
798                                 // For now I will say it is size because there\r
799                                 // is allready a way to set lower\r
800                                 $$ = new DictionaryEntry (null, $1);\r
801                           }\r
802                         | int32 ELLIPSIS int32\r
803                           {\r
804                                 // lower bound and size\r
805                                 $$ = new DictionaryEntry ($1, $3);\r
806                           }\r
807                         | int32 ELLIPSIS\r
808                           {\r
809                                 // Just lower bound\r
810                                 $$ = new DictionaryEntry ($1, null);\r
811                           }\r
812                         ;\r
813 \r
814 call_conv               : K_INSTANCE call_conv\r
815                           {\r
816                                 $$ = (CallConv) $2 | CallConv.Instance;\r
817                           }\r
818                         | K_EXPLICIT call_conv\r
819                           {\r
820                                 $$ = (CallConv) $2 | CallConv.InstanceExplicit;\r
821                           }\r
822                         | call_kind\r
823                         ;\r
824 \r
825 call_kind               : /* EMPTY */\r
826                           {\r
827                                 $$ = new CallConv ();\r
828                           }\r
829                         | K_DEFAULT\r
830                           {\r
831                                 $$ = CallConv.Default;\r
832                           }\r
833                         | K_VARARG\r
834                           {\r
835                                 $$ = CallConv.Vararg;\r
836                           }\r
837                         | K_UNMANAGED K_CDECL\r
838                           {\r
839                                 $$ = CallConv.Cdecl;\r
840                           }\r
841                         | K_UNMANAGED K_STDCALL\r
842                           {\r
843                                 $$ = CallConv.Stdcall;\r
844                           }\r
845                         | K_UNMANAGED K_THISCALL\r
846                           {\r
847                                 $$ = CallConv.Thiscall;\r
848                           }\r
849                         | K_UNMANAGED K_FASTCALL\r
850                           {\r
851                                 $$ = CallConv.Fastcall;\r
852                           }\r
853                         ;\r
854 \r
855 native_type             : /* EMPTY */\r
856                         | K_CUSTOM OPEN_PARENS comp_qstring COMMA comp_qstring CLOSE_PARENS\r
857                         | K_FIXED K_SYSSTRING OPEN_BRACKET int32 CLOSE_BRACKET\r
858                           {\r
859                                 $$ = NativeType.FixedSysString;\r
860                           }\r
861                         | K_FIXED K_ARRAY OPEN_BRACKET int32 CLOSE_BRACKET\r
862                         | K_VARIANT\r
863                         | K_CURRENCY\r
864                           {\r
865                                 $$ = NativeType.Currency;\r
866                           }\r
867                         | K_SYSCHAR\r
868                         | K_VOID\r
869                           {\r
870                                 $$ = NativeType.Void;\r
871                           }\r
872                         | K_BOOL\r
873                           {\r
874                                 $$ = NativeType.Boolean;\r
875                           }\r
876                         | K_INT8\r
877                           {\r
878                                 $$ = NativeType.Int8;\r
879                           }\r
880                         | K_INT16\r
881                           {\r
882                                 $$ = NativeType.Int16;\r
883                           }\r
884                         | K_INT32\r
885                           {\r
886                                 $$ = NativeType.Int32;\r
887                           }\r
888                         | K_INT64\r
889                           {\r
890                                 $$ = NativeType.Int64;\r
891                           }\r
892                         | K_FLOAT32\r
893                           {\r
894                                 $$ = NativeType.Float32;\r
895                           }\r
896                         | K_FLOAT64\r
897                           {\r
898                                 $$ = NativeType.Float64;\r
899                           }\r
900                         | K_ERROR\r
901                         | K_UNSIGNED K_INT8\r
902                           {\r
903                                 $$ = NativeType.UInt8;\r
904                           }\r
905                         | K_UNSIGNED K_INT16\r
906                           {\r
907                                 $$ = NativeType.UInt16;\r
908                           }\r
909                         | K_UNSIGNED K_INT32\r
910                           {\r
911                                 $$ = NativeType.UInt32;\r
912                           }\r
913                         | K_UNSIGNED K_INT64\r
914                           {\r
915                                 $$ = NativeType.UInt64;\r
916                           }\r
917                         | native_type STAR\r
918                         | native_type OPEN_BRACKET CLOSE_BRACKET\r
919                         | native_type OPEN_BRACKET int32 CLOSE_BRACKET\r
920                         | native_type OPEN_BRACKET int32 PLUS int32 CLOSE_BRACKET\r
921                         | native_type OPEN_BRACKET PLUS int32 CLOSE_BRACKET\r
922                         | K_DECIMAL\r
923                         | K_DATE\r
924                         | K_BSTR\r
925                           {\r
926                                 $$ = NativeType.BStr;\r
927                           }\r
928                         | K_LPSTR\r
929                           {\r
930                                 $$ = NativeType.LPStr;\r
931                           }\r
932                         | K_LPWSTR\r
933                           {\r
934                                 $$ = NativeType.LPWStr;\r
935                           }\r
936                         | K_LPTSTR\r
937                           {\r
938                                 $$ = NativeType.LPTStr;\r
939                           }\r
940                         | K_OBJECTREF\r
941                         | K_IUNKNOWN\r
942                           {\r
943                                 $$ = NativeType.IUnknown;\r
944                           }\r
945                         | K_IDISPATCH\r
946                           {\r
947                                 $$ = NativeType.IDispatch;\r
948                           }\r
949                         | K_STRUCT\r
950                           {\r
951                                 $$ = NativeType.Struct;\r
952                           }\r
953                         | K_INTERFACE\r
954                           {\r
955                                 $$ = NativeType.Interface;\r
956                           }\r
957                         | K_SAFEARRAY variant_type\r
958                         | K_SAFEARRAY variant_type COMMA comp_qstring\r
959                         | K_INT\r
960                           {\r
961                                 $$ = NativeType.Int;\r
962                           }\r
963                         | K_UNSIGNED K_INT\r
964                           {\r
965                                 $$ = NativeType.UInt;\r
966                           }\r
967                         | K_NESTED K_STRUCT\r
968                         | K_BYVALSTR\r
969                           {\r
970                                 $$ = NativeType.ByValStr;\r
971                           }\r
972                         | K_ANSI K_BSTR\r
973                           {\r
974                                 $$ = NativeType.AnsiBStr;\r
975                           }\r
976                         | K_TBSTR\r
977                           {\r
978                                 $$ = NativeType.TBstr;\r
979                           }\r
980                         | K_VARIANT K_BOOL\r
981                           {\r
982                                 $$ = NativeType.VariantBool;\r
983                           }\r
984                         | K_METHOD\r
985                         | K_AS K_ANY\r
986                           {\r
987                                 $$ = NativeType.AsAny;\r
988                           }\r
989                         | K_LPSTRUCT\r
990                         ;\r
991 \r
992 variant_type            : /* EMPTY */\r
993                         | K_NULL\r
994                         | K_VARIANT\r
995                         | K_CURRENCY\r
996                         | K_VOID\r
997                         | K_BOOL\r
998                         | K_INT8\r
999                         | K_INT16\r
1000                         | K_INT32\r
1001                         | K_INT64\r
1002                         | K_FLOAT32\r
1003                         | K_FLOAT64\r
1004                         | K_UNSIGNED K_INT8\r
1005                         | K_UNSIGNED K_INT16\r
1006                         | K_UNSIGNED K_INT32\r
1007                         | K_UNSIGNED K_INT64\r
1008                         | STAR\r
1009                         | variant_type OPEN_BRACKET CLOSE_BRACKET\r
1010                         | variant_type K_VECTOR\r
1011                         | variant_type AMPERSAND\r
1012                         | K_DECIMAL\r
1013                         | K_DATE\r
1014                         | K_BSTR\r
1015                         | K_LPSTR\r
1016                         | K_LPWSTR\r
1017                         | K_IUNKNOWN\r
1018                         | K_IDISPATCH\r
1019                         | K_SAFEARRAY\r
1020                         | K_INT\r
1021                         | K_UNSIGNED K_INT\r
1022                         | K_ERROR\r
1023                         | K_HRESULT\r
1024                         | K_CARRAY\r
1025                         | K_USERDEFINED\r
1026                         | K_RECORD\r
1027                         | K_FILETIME\r
1028                         | K_BLOB\r
1029                         | K_STREAM\r
1030                         | K_STORAGE\r
1031                         | K_STREAMED_OBJECT\r
1032                         | K_STORED_OBJECT\r
1033                         | K_BLOB_OBJECT\r
1034                         | K_CF\r
1035                         | K_CLSID\r
1036                         ;\r
1037 \r
1038 field_decl              : D_FIELD repeat_opt field_attr type id at_opt init_opt\r
1039                           {\r
1040                                 FieldDef field_def = codegen.AddField ((FieldAttr) $3, \r
1041                                         (string) $5, (TypeRef) $4, null);\r
1042                                 codegen.AddField (0, "test_field", (TypeRef) $4, null);\r
1043                                 if ($2 != null) {\r
1044                                         field_def.SetOffset ((uint) $2);\r
1045                                 }\r
1046                                 if ($6 != null) {\r
1047                                         field_def.AddDataValue ((DataConstant) $6);\r
1048                                 }\r
1049                                 if ($7 != null) {\r
1050                                         field_def.AddValue ((Constant) $7);\r
1051                                 }\r
1052                           }\r
1053                         ;\r
1054 \r
1055 repeat_opt              : /* EMPTY */\r
1056                         | OPEN_BRACKET int32 CLOSE_BRACKET\r
1057                           {\r
1058                                 $$ = $2;\r
1059                           }\r
1060                         ;\r
1061 \r
1062 field_attr              : /* EMPTY */\r
1063                           {\r
1064                                 $$ = new FieldAttr ();\r
1065                           }\r
1066                         | field_attr K_PUBLIC\r
1067                           {\r
1068                                 $$ = (FieldAttr) $1 | FieldAttr.Public;\r
1069                           }\r
1070                         | field_attr K_PRIVATE\r
1071                           {\r
1072                                 $$ = (FieldAttr) $1 | FieldAttr.Private;\r
1073                           }\r
1074                         | field_attr K_FAMILY\r
1075                           {\r
1076                                 $$ = (FieldAttr) $1 | FieldAttr.Family;\r
1077                           }\r
1078                         | field_attr K_ASSEMBLY\r
1079                           {\r
1080                                 $$ = (FieldAttr) $1 | FieldAttr.Assembly;\r
1081                           }\r
1082                         | field_attr K_FAMANDASSEM\r
1083                           {\r
1084                                 $$ = (FieldAttr) $1 | FieldAttr.FamAndAssem;\r
1085                           }\r
1086                         | field_attr K_FAMORASSEM\r
1087                           {\r
1088                                 $$ = (FieldAttr) $1 | FieldAttr.FamOrAssem;\r
1089                           }\r
1090                         | field_attr K_PRIVATESCOPE\r
1091                           {\r
1092                                 // This is just 0x0000\r
1093                           }\r
1094                         | field_attr K_STATIC\r
1095                           {\r
1096                                 $$ = (FieldAttr) $1 | FieldAttr.Static;\r
1097                           }\r
1098                         | field_attr K_INITONLY\r
1099                           {\r
1100                                 $$ = (FieldAttr) $1 | FieldAttr.Initonly;\r
1101                           }\r
1102                         | field_attr K_RTSPECIALNAME\r
1103                           {\r
1104                                 $$ = (FieldAttr) $1 | FieldAttr.RTSpecialName;\r
1105                           }\r
1106                         | field_attr K_SPECIALNAME\r
1107                           {\r
1108                                 $$ = (FieldAttr) $1 | FieldAttr.SpecialName;\r
1109                           }\r
1110                         | field_attr K_MARSHAL OPEN_PARENS native_type CLOSE_PARENS\r
1111                           {\r
1112                                 \r
1113                           }\r
1114                         | field_attr K_LITERAL\r
1115                           {\r
1116                                 $$ = (FieldAttr) $1 | FieldAttr.Literal;\r
1117                           }\r
1118                         | field_attr K_NOTSERIALIZED\r
1119                           {\r
1120                                 $$ = (FieldAttr) $1 | FieldAttr.Notserialized;\r
1121                           }\r
1122                         ;\r
1123 \r
1124 at_opt                  : /* EMPTY */\r
1125                         | K_AT id\r
1126                           {\r
1127                                 // TODO: Implement DataTable\r
1128                                 // $$ = new DataConstant (DataTable.GetOffset ((string) $2));\r
1129                           }\r
1130                         ;\r
1131 \r
1132 init_opt                : /* EMPTY */\r
1133                         | ASSIGN field_init\r
1134                           {\r
1135                                 $$ = $2;\r
1136                           }\r
1137                         ;\r
1138 \r
1139 field_init              : K_FLOAT32 OPEN_PARENS float64 CLOSE_PARENS\r
1140                           {\r
1141                                 $$ = new FloatConst ((float) $3);\r
1142                           }\r
1143                         | K_FLOAT64 OPEN_PARENS float64 CLOSE_PARENS\r
1144                           {\r
1145                                 $$ = new DoubleConst ((double) $3);\r
1146                           }\r
1147                         | K_FLOAT32 OPEN_PARENS int64 CLOSE_PARENS\r
1148                           {\r
1149                                 $$ = new FloatConst ((float) $3);\r
1150                           }\r
1151                         | K_FLOAT64 OPEN_PARENS int64 CLOSE_PARENS\r
1152                           {\r
1153                                 $$ = new DoubleConst ((float) $3);\r
1154                           }\r
1155                         | K_INT64 OPEN_PARENS int64 CLOSE_PARENS\r
1156                           {\r
1157                                 $$ = new IntConst ((long) $3);\r
1158                           }\r
1159                         | K_INT32 OPEN_PARENS int64 CLOSE_PARENS\r
1160                           {\r
1161                                 $$ = new IntConst ((int) $3);\r
1162                           }\r
1163                         | K_INT16 OPEN_PARENS int64 CLOSE_PARENS\r
1164                           {\r
1165                                 $$ = new IntConst ((short) $3);\r
1166                           }\r
1167                         | K_CHAR OPEN_PARENS int64 CLOSE_PARENS\r
1168                           {\r
1169                                 $$ = new CharConst ((char) $3);\r
1170                           }\r
1171                         | K_INT8 OPEN_PARENS int64 CLOSE_PARENS\r
1172                           {\r
1173                                 $$ = new IntConst ((sbyte) $3);\r
1174                           }\r
1175                         | K_BOOL OPEN_PARENS truefalse CLOSE_PARENS\r
1176                           {\r
1177                                 $$ = new BoolConst ((bool) $3);\r
1178                           }\r
1179                         | K_BYTEARRAY OPEN_PARENS bytes CLOSE_PARENS\r
1180                           {\r
1181                                 $$ = new ByteArrConst ((byte[]) $3);\r
1182                           }\r
1183                         | comp_qstring\r
1184                           {\r
1185                                 // ******** THIS IS NOT IN THE DOCUMENTATION ******** //\r
1186                                 $$ = new StringConst ((string) $1);\r
1187                           }\r
1188                         | K_NULLREF\r
1189                           {\r
1190                                 $$ = new NullConst ();\r
1191                           }\r
1192                         ;\r
1193 \r
1194 data_decl               : data_head data_body\r
1195                         ;\r
1196 \r
1197 data_head               : D_DATA tls id ASSIGN \r
1198                         | D_DATA tls\r
1199                         ;\r
1200 \r
1201 tls                     : /* EMPTY */\r
1202                         | K_TLS\r
1203                         ;\r
1204 \r
1205 data_body               : OPEN_BRACE dataitem_list CLOSE_BRACE\r
1206                         | dataitem\r
1207                         ;\r
1208 \r
1209 dataitem_list           : dataitem\r
1210                         | dataitem_list COMMA dataitem\r
1211                         ;\r
1212 \r
1213 dataitem                : K_CHAR STAR OPEN_PARENS comp_qstring CLOSE_PARENS\r
1214                         | AMPERSAND OPEN_PARENS id CLOSE_PARENS\r
1215                         | K_BYTEARRAY ASSIGN OPEN_PARENS bytes CLOSE_PARENS\r
1216                         | K_BYTEARRAY OPEN_PARENS bytes CLOSE_PARENS                    // ******** ADDED\r
1217                         | K_FLOAT32 OPEN_PARENS float64 CLOSE_PARENS repeat_opt\r
1218                         | K_FLOAT64 OPEN_PARENS float64 CLOSE_PARENS repeat_opt\r
1219                         | K_INT64 OPEN_PARENS int64 CLOSE_PARENS repeat_opt\r
1220                         | K_INT32 OPEN_PARENS int32 CLOSE_PARENS repeat_opt\r
1221                         | K_INT16 OPEN_PARENS int32 CLOSE_PARENS repeat_opt\r
1222                         | K_INT8 OPEN_PARENS int32 CLOSE_PARENS repeat_opt\r
1223                         | K_FLOAT32 repeat_opt\r
1224                         | K_FLOAT64 repeat_opt\r
1225                         | K_INT64 repeat_opt\r
1226                         | K_INT32 repeat_opt\r
1227                         | K_INT16 repeat_opt\r
1228                         | K_INT8 repeat_opt\r
1229                         ;\r
1230 \r
1231 method_all              : method_head OPEN_BRACE method_decls CLOSE_BRACE\r
1232                         ;\r
1233 \r
1234 method_head             : D_METHOD meth_attr call_conv param_attr type method_name\r
1235                           typars_clause OPEN_PARENS sig_args CLOSE_PARENS impl_attr\r
1236                         | D_METHOD meth_attr call_conv param_attr type \r
1237                           K_MARSHAL OPEN_PARENS native_type CLOSE_PARENS method_name\r
1238                           OPEN_PARENS sig_args CLOSE_PARENS impl_attr\r
1239                         ;\r
1240 \r
1241 meth_attr               : /* EMPTY */\r
1242                         | meth_attr K_STATIC\r
1243                         | meth_attr K_PUBLIC\r
1244                         | meth_attr K_PRIVATE\r
1245                         | meth_attr K_FAMILY\r
1246                         | meth_attr K_ASSEMBLY\r
1247                         | meth_attr K_FAMANDASSEM\r
1248                         | meth_attr K_FAMORASSEM\r
1249                         | meth_attr K_PRIVATESCOPE\r
1250                         | meth_attr K_FINAL\r
1251                         | meth_attr K_VIRTUAL\r
1252                         | meth_attr K_ABSTRACT\r
1253                         | meth_attr K_HIDEBYSIG\r
1254                         | meth_attr K_NEWSLOT\r
1255                         | meth_attr K_REQSECOBJ\r
1256                         | meth_attr K_SPECIALNAME\r
1257                         | meth_attr K_RTSPECIALNAME\r
1258                         | meth_attr K_UNMANAGEDEXP\r
1259                         | meth_attr K_PINVOKEIMPL OPEN_PARENS comp_qstring K_AS\r
1260                                 comp_qstring pinv_attr CLOSE_PARENS\r
1261                         | meth_attr K_PINVOKEIMPL OPEN_PARENS comp_qstring pinv_attr CLOSE_PARENS\r
1262                         | meth_attr K_PINVOKEIMPL OPEN_PARENS pinv_attr CLOSE_PARENS\r
1263                         ;\r
1264 \r
1265 pinv_attr               : /* EMPTY */\r
1266                         | pinv_attr K_NOMANGLE\r
1267                         | pinv_attr K_ANSI\r
1268                         | pinv_attr K_UNICODE\r
1269                         | pinv_attr K_AUTOCHAR\r
1270                         | pinv_attr K_LASTERR\r
1271                         | pinv_attr K_WINAPI\r
1272                         | pinv_attr K_CDECL\r
1273                         | pinv_attr K_STDCALL\r
1274                         | pinv_attr K_THISCALL\r
1275                         | pinv_attr K_FASTCALL\r
1276                         ;\r
1277 \r
1278 method_name             : D_CTOR\r
1279                         | D_CCTOR\r
1280                         | comp_name\r
1281                         ;\r
1282 \r
1283 param_attr              : /* EMPTY */\r
1284                         | param_attr OPEN_BRACKET K_IN CLOSE_BRACKET\r
1285                         | param_attr OPEN_BRACKET K_OUT CLOSE_BRACKET\r
1286                         | param_attr OPEN_BRACKET K_OPT CLOSE_BRACKET\r
1287                         ;\r
1288 \r
1289 impl_attr               : /* EMPTY */\r
1290                         | impl_attr K_NATIVE\r
1291                         | impl_attr K_CIL\r
1292                         | impl_attr K_OPTIL\r
1293                         | impl_attr K_MANAGED\r
1294                         | impl_attr K_UNMANAGED\r
1295                         | impl_attr K_FORWARDREF\r
1296                         | impl_attr K_PRESERVESIG\r
1297                         | impl_attr K_RUNTIME\r
1298                         | impl_attr K_INTERNALCALL\r
1299                         | impl_attr K_SYNCHRONIZED\r
1300                         | impl_attr K_NOINLINING\r
1301                         ;\r
1302 \r
1303 sig_args                : /* EMPTY */\r
1304                         | sig_arg_list\r
1305                         ;\r
1306 \r
1307 sig_arg_list            : sig_arg\r
1308                         | sig_arg_list COMMA sig_arg\r
1309                         ;\r
1310 \r
1311 sig_arg                 : param_attr type\r
1312                         | param_attr type id\r
1313                         | param_attr type K_MARSHAL OPEN_PARENS native_type CLOSE_PARENS\r
1314                         | param_attr type K_MARSHAL OPEN_PARENS native_type CLOSE_PARENS id\r
1315                         ;\r
1316 \r
1317 method_decls            : /* EMPTY */\r
1318                         | method_decls method_decl\r
1319                         ;\r
1320 \r
1321 method_decl             : D_EMITBYTE int32\r
1322                         | D_MAXSTACK int32\r
1323                         | D_LOCALS OPEN_PARENS sig_args CLOSE_PARENS\r
1324                         | D_LOCALS K_INIT OPEN_PARENS sig_args CLOSE_PARENS\r
1325                         | D_ENTRYPOINT\r
1326                         | D_ZEROINIT\r
1327                         | D_EXPORT OPEN_BRACKET int32 CLOSE_BRACKET\r
1328                         | D_EXPORT OPEN_BRACKET int32 CLOSE_BRACKET K_AS id\r
1329                         | D_VTENTRY int32 COLON int32 \r
1330                         | D_OVERRIDE type_spec DOUBLE_COLON method_name\r
1331                         | scope_block\r
1332                         | D_PARAM OPEN_BRACKET int32 CLOSE_BRACKET init_opt\r
1333                         | id COLON\r
1334                         | seh_block\r
1335                         | instr\r
1336                         | sec_decl\r
1337                         | extsource_spec\r
1338                         | language_decl\r
1339                         | customattr_decl\r
1340                         | data_decl\r
1341                         ;\r
1342 \r
1343 type_spec               : class_ref\r
1344                         | OPEN_BRACKET comp_name CLOSE_BRACKET\r
1345                         | OPEN_BRACKET D_MODULE comp_name CLOSE_BRACKET\r
1346                         | type\r
1347                         ;\r
1348 \r
1349 scope_block             : OPEN_BRACE method_decls CLOSE_BRACE\r
1350                         ;\r
1351 \r
1352 seh_block               : try_block seh_clauses\r
1353                         ;\r
1354 \r
1355 try_block               : D_TRY scope_block\r
1356                         | D_TRY id K_TO id\r
1357                         | D_TRY int32 K_TO int32\r
1358                         ;\r
1359 \r
1360 seh_clauses             : seh_clause\r
1361                         | seh_clauses seh_clause\r
1362                         ;\r
1363 \r
1364 seh_clause              : K_CATCH class_ref handler_block\r
1365                         | K_FINALLY handler_block\r
1366                         | K_FAULT handler_block\r
1367                         | filter_clause handler_block\r
1368                         ;\r
1369 \r
1370 filter_clause           : K_FILTER scope_block\r
1371                         | K_FILTER id\r
1372                         | K_FILTER int32\r
1373                         ;\r
1374 \r
1375 handler_block           : scope_block\r
1376                         | K_HANDLER id K_TO id\r
1377                         | K_HANDLER int32 K_TO int32\r
1378                         ;\r
1379 \r
1380 instr                   : INSTR_NONE\r
1381                         | INSTR_VAR int32\r
1382                         | INSTR_I int32\r
1383                         | INSTR_I id /* Allow variable names :p */\r
1384                         | INSTR_I8 int64\r
1385                         | INSTR_R float64\r
1386                         | INSTR_R int64\r
1387                         | INSTR_R OPEN_PARENS bytes CLOSE_PARENS\r
1388                         | INSTR_BRTARGET int32\r
1389                         | INSTR_BRTARGET id\r
1390                         | INSTR_METHOD method_ref\r
1391                         | INSTR_FIELD type type_spec DOUBLE_COLON id\r
1392                         | INSTR_FIELD type id\r
1393                         | INSTR_TYPE K_FIELD type type_spec DOUBLE_COLON id                     // ****** ADDED\r
1394                         | INSTR_TYPE K_FIELD type id                                            // ****** ADDED\r
1395                         | INSTR_TYPE type_spec\r
1396                         | INSTR_STRING comp_qstring\r
1397                         | INSTR_STRING K_BYTEARRAY ASSIGN OPEN_PARENS bytes CLOSE_PARENS\r
1398                         | INSTR_STRING K_BYTEARRAY OPEN_PARENS bytes CLOSE_PARENS               // ****** ADDED\r
1399                         | INSTR_SIG call_conv type OPEN_PARENS sig_args CLOSE_PARENS\r
1400                         | INSTR_TOK owner_type\r
1401                         | INSTR_SWITCH OPEN_PARENS labels CLOSE_PARENS\r
1402                         ;\r
1403 \r
1404 method_ref              : call_conv type type_spec DOUBLE_COLON method_name \r
1405                           OPEN_PARENS sig_args CLOSE_PARENS\r
1406                         | call_conv type method_name \r
1407                           OPEN_PARENS sig_args CLOSE_PARENS\r
1408                         ;\r
1409 \r
1410 labels                  : /* EMPTY */\r
1411                         | id\r
1412                         | int32\r
1413                         | labels COMMA id\r
1414                         | labels COMMA int32\r
1415                         ;\r
1416 \r
1417 owner_type              : type_spec\r
1418                         | member_ref\r
1419                         ;\r
1420 \r
1421 member_ref              : K_METHOD member_ref\r
1422                         | K_FIELD type type_spec DOUBLE_COLON id\r
1423                         | K_FIELD type id\r
1424                         ;\r
1425 \r
1426 event_all               : event_head OPEN_BRACE event_decls CLOSE_BRACE\r
1427                         ;\r
1428 \r
1429 event_head              : D_EVENT event_attr type_spec id\r
1430                         | D_EVENT event_attr id\r
1431                         ;\r
1432 \r
1433 event_attr              : /* EMPTY */\r
1434                         | event_attr K_RTSPECIALNAME\r
1435                         | event_attr K_SPECIALNAME\r
1436                         ;\r
1437 \r
1438 event_decls             : /* EMPTY */\r
1439                         | event_decls event_decl\r
1440                         ;\r
1441 \r
1442 event_decl              : D_ADDON method_ref\r
1443                         | D_REMOVEON method_ref\r
1444                         | D_FIRE method_ref\r
1445                         | D_OTHER method_ref\r
1446                         | customattr_decl\r
1447                         | extsource_spec\r
1448                         | language_decl\r
1449                         ;\r
1450 \r
1451 prop_all                : prop_head OPEN_BRACE prop_decls CLOSE_BRACE\r
1452                         ;\r
1453 \r
1454 prop_head               : D_PROPERTY prop_attr type id OPEN_PARENS sig_args CLOSE_PARENS init_opt\r
1455                         ;\r
1456 \r
1457 prop_attr               : /* EMPTY */\r
1458                         | prop_attr K_RTSPECIALNAME\r
1459                         | prop_attr K_SPECIALNAME\r
1460                         ;\r
1461 \r
1462 prop_decls              : /* EMPTY */\r
1463                         | prop_decls prop_decl\r
1464                         ;\r
1465 \r
1466 prop_decl               : D_SET method_ref\r
1467                         | D_GET method_ref\r
1468                         | D_OTHER method_ref\r
1469                         | customattr_decl\r
1470                         | extsource_spec\r
1471                         | language_decl\r
1472                         ;\r
1473 \r
1474 customattr_decl         : D_CUSTOM custom_type\r
1475                         | D_CUSTOM custom_type ASSIGN comp_qstring\r
1476                         | D_CUSTOM custom_type ASSIGN OPEN_PARENS bytes CLOSE_PARENS\r
1477                         | D_CUSTOM OPEN_PARENS owner_type CLOSE_PARENS custom_type\r
1478                         | D_CUSTOM OPEN_PARENS owner_type CLOSE_PARENS custom_type ASSIGN comp_qstring\r
1479                         | D_CUSTOM OPEN_PARENS owner_type CLOSE_PARENS custom_type ASSIGN\r
1480                           OPEN_PARENS bytes CLOSE_PARENS\r
1481                         ;\r
1482                         \r
1483 custom_type             : call_conv type type_spec DOUBLE_COLON D_CTOR OPEN_PARENS sig_args CLOSE_PARENS\r
1484                         | call_conv type D_CTOR OPEN_PARENS sig_args CLOSE_PARENS\r
1485                         ;\r
1486 \r
1487 sec_decl                : D_PERMISSION sec_action type_spec OPEN_PARENS nameval_pairs CLOSE_PARENS\r
1488                         | D_PERMISSION sec_action type_spec\r
1489                         | D_PERMISSIONSET sec_action ASSIGN OPEN_PARENS bytes CLOSE_PARENS\r
1490                         ;\r
1491 \r
1492 nameval_pairs           : nameval_pair \r
1493                         | nameval_pairs COMMA nameval_pair\r
1494                         ;\r
1495 \r
1496 nameval_pair            : comp_qstring ASSIGN cavalue\r
1497                         ;\r
1498 \r
1499 cavalue                 : truefalse\r
1500                         | int32\r
1501                         | int32 OPEN_PARENS int32 CLOSE_PARENS\r
1502                         | comp_qstring \r
1503                         | class_ref OPEN_PARENS K_INT8 COLON int32 CLOSE_PARENS\r
1504                         | class_ref OPEN_PARENS K_INT16 COLON int32 CLOSE_PARENS\r
1505                         | class_ref OPEN_PARENS K_INT32 COLON int32 CLOSE_PARENS\r
1506                         | class_ref OPEN_PARENS int32 CLOSE_PARENS\r
1507                         ;\r
1508 \r
1509 sec_action              : K_REQUEST\r
1510                         | K_DEMAND\r
1511                         | K_ASSERT\r
1512                         | K_DENY\r
1513                         | K_PERMITONLY\r
1514                         | K_LINKCHECK\r
1515                         | K_INHERITCHECK\r
1516                         | K_REQMIN\r
1517                         | K_REQOPT\r
1518                         | K_REQREFUSE\r
1519                         | K_PREJITGRANT\r
1520                         | K_PREJITDENY\r
1521                         | K_NONCASDEMAND\r
1522                         | K_NONCASLINKDEMAND\r
1523                         | K_NONCASINHERITANCE\r
1524                         ;\r
1525 \r
1526 module_head             : D_MODULE\r
1527                         | D_MODULE comp_name\r
1528                         | D_MODULE K_EXTERN comp_name\r
1529                         ;\r
1530 \r
1531 file_decl               : D_FILE file_attr comp_name file_entry D_HASH ASSIGN\r
1532                           OPEN_PARENS bytes CLOSE_PARENS file_entry\r
1533                         | D_FILE file_attr comp_name file_entry\r
1534                         ;\r
1535 \r
1536 file_attr               : /* EMPTY */\r
1537                         | file_attr K_NOMETADATA\r
1538                         ;\r
1539 \r
1540 file_entry              : /* EMPTY */\r
1541                         | D_ENTRYPOINT\r
1542                         ;\r
1543 \r
1544 assembly_all            : assembly_head OPEN_BRACE assembly_decls CLOSE_BRACE\r
1545                         ;\r
1546 \r
1547 assembly_head           : D_ASSEMBLY asm_attr comp_name\r
1548                         ;\r
1549 \r
1550 asm_attr                : /* EMPTY */\r
1551                         | asm_attr K_NOAPPDOMAIN\r
1552                         | asm_attr K_NOPROCESS\r
1553                         | asm_attr K_NOMACHINE\r
1554                         ;\r
1555 \r
1556 assembly_decls          : /* EMPTY */\r
1557                         | assembly_decls assembly_decl\r
1558                         ;\r
1559 \r
1560 assembly_decl           : D_HASH K_ALGORITHM int32\r
1561                         | sec_decl\r
1562                         | asm_or_ref_decl\r
1563                         ;\r
1564 \r
1565 asm_or_ref_decl         : D_PUBLICKEY ASSIGN OPEN_PARENS bytes CLOSE_PARENS\r
1566                         | D_VER int32 COLON int32 COLON int32 COLON int32 \r
1567                         | D_LOCALE comp_qstring\r
1568                         | D_LOCALE ASSIGN OPEN_PARENS bytes CLOSE_PARENS\r
1569                         | customattr_decl\r
1570                         ;\r
1571 \r
1572 assemblyref_all         : assemblyref_head OPEN_BRACE assemblyref_decls CLOSE_BRACE\r
1573                         ;\r
1574 \r
1575 assemblyref_head        : D_ASSEMBLY K_EXTERN comp_name\r
1576                         | D_ASSEMBLY K_EXTERN comp_name K_AS comp_name\r
1577                         ;\r
1578 \r
1579 assemblyref_decls       : /* EMPTY */\r
1580                         | assemblyref_decls assemblyref_decl\r
1581                         ;\r
1582 \r
1583 assemblyref_decl        : D_HASH ASSIGN OPEN_PARENS bytes CLOSE_PARENS\r
1584                         | asm_or_ref_decl\r
1585                         | D_PUBLICKEYTOKEN ASSIGN OPEN_PARENS bytes CLOSE_PARENS\r
1586                         ;\r
1587 \r
1588 exptype_all             : exptype_head OPEN_BRACE exptype_decls CLOSE_BRACE\r
1589                         ;\r
1590 \r
1591 exptype_head            : D_CLASS K_EXTERN expt_attr comp_name\r
1592                         ;\r
1593 \r
1594 expt_attr               : /* EMPTY */\r
1595                         | expt_attr K_PRIVATE\r
1596                         | expt_attr K_PUBLIC \r
1597                         | expt_attr K_NESTED K_PUBLIC\r
1598                         | expt_attr K_NESTED K_PRIVATE\r
1599                         | expt_attr K_NESTED K_FAMILY\r
1600                         | expt_attr K_NESTED K_ASSEMBLY\r
1601                         | expt_attr K_NESTED K_FAMANDASSEM\r
1602                         | expt_attr K_NESTED K_FAMORASSEM\r
1603                         ;\r
1604 \r
1605 exptype_decls           : /* EMPTY */\r
1606                         | exptype_decls exptype_decl\r
1607                         ;\r
1608 \r
1609 exptype_decl            : D_FILE comp_name\r
1610                         | D_CLASS K_EXTERN comp_name\r
1611                         | D_CLASS int32\r
1612                         | customattr_decl\r
1613                         ;\r
1614 \r
1615 manifestres_all         : manifestres_head OPEN_BRACE manifestres_decls CLOSE_BRACE\r
1616                         ;\r
1617 \r
1618 manifestres_head        : D_MRESOURCE manres_attr comp_name     \r
1619                         ;\r
1620 \r
1621 manres_attr             : /* EMPTY */\r
1622                         | manres_attr K_PUBLIC\r
1623                         | manres_attr K_PRIVATE\r
1624                         ;\r
1625 \r
1626 manifestres_decls       : /* EMPTY */\r
1627                         | manifestres_decls manifestres_decl\r
1628                         ;\r
1629 \r
1630 manifestres_decl        : D_FILE comp_name K_AT int32\r
1631                         | D_ASSEMBLY K_EXTERN comp_name\r
1632                         | customattr_decl\r
1633                         ;\r
1634 \r
1635 dotted_name             : id\r
1636                         | dotted_name DOT id    { $$ = String.Format ("{0}.{1}", $1, $3); }\r
1637                         ;\r
1638 \r
1639 comp_qstring            : QSTRING\r
1640                         | comp_qstring PLUS QSTRING     { $$ = String.Format ("{0}{1}", $1, $3); }\r
1641                         ;\r
1642 \r
1643 int32                   : INT32\r
1644                         | INT64\r
1645                         ;\r
1646 \r
1647 int64                   : INT32\r
1648                         | INT64\r
1649                         ;\r
1650 \r
1651 float64                 : FLOAT64\r
1652                         | K_FLOAT32 OPEN_PARENS int32 CLOSE_PARENS\r
1653                         | K_FLOAT64 OPEN_PARENS int64 CLOSE_PARENS\r
1654                         ;\r
1655 \r
1656 hexbyte                 : HEXBYTE\r
1657                         | INT32                                 // ******** ADDED\r
1658                         | ID                                    // ******** ADDED\r
1659                         ;\r
1660 \r
1661 bytes                   : /* EMPTY */\r
1662                         | hexbytes\r
1663                         ;\r
1664 \r
1665 hexbytes                : hexbyte\r
1666                         | hexbytes hexbyte\r
1667                         ;\r
1668 \r
1669 truefalse               : K_TRUE\r
1670                         | K_FALSE\r
1671                         ;\r
1672 \r
1673 id                      : ID\r
1674                         | SQSTRING\r
1675                         ;\r
1676 \r
1677 comp_name               : id\r
1678                         | dotted_name\r
1679                         ;\r
1680 \r
1681 dotted_name             : id\r
1682                         | dotted_name DOT id\r
1683                         ;\r
1684 \r
1685 \r
1686 %%\r
1687 \r
1688 }\r
1689 \r