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