* ILParser.jay: Set size and packing information for types
[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 using System.Globalization;\r
10 \r
11 namespace Mono.ILASM {\r
12 \r
13         public class ILParser {\r
14 \r
15                 private CodeGen codegen;\r
16 \r
17                 public ILParser (CodeGen codegen) {\r
18                         this.codegen = codegen;\r
19                 }\r
20 \r
21                 public CodeGen CodeGen {\r
22                         get { return codegen; }\r
23                 }\r
24                 \r
25 %}\r
26 \r
27 %token EOF\r
28 \r
29 /* ID - alpha-numeric identifier */\r
30 %token ID\r
31 \r
32 /* QSTRING - quoted string */\r
33 %token QSTRING\r
34 \r
35 /* SQSTRING - single quoted string */\r
36 %token SQSTRING\r
37 \r
38 /* INT32 - 32 bit integer */\r
39 %token INT32\r
40 \r
41 /* INT64 - 64 bit integer */\r
42 %token INT64\r
43 \r
44 /* FLOAT64 - floating point number */\r
45 %token FLOAT64\r
46 \r
47 /* HEXBYTE - two digit hex number */\r
48 %token HEXBYTE\r
49 \r
50 \r
51 /* Punctuation */\r
52 %token DOT           "."\r
53 %token OPEN_BRACE    "{"\r
54 %token CLOSE_BRACE   "}"\r
55 %token OPEN_BRACKET  "["\r
56 %token CLOSE_BRACKET "]"\r
57 %token OPEN_PARENS   "("\r
58 %token CLOSE_PARENS  ")"\r
59 %token COMMA         ","\r
60 %token COLON         ":"\r
61 %token DOUBLE_COLON  "::"\r
62 %token SEMICOLON     ";"\r
63 %token ASSIGN        "="\r
64 %token STAR          "*"\r
65 %token AMPERSAND     "&"\r
66 %token PLUS          "+"\r
67 %token SLASH         "/"\r
68 %token BANG          "!"\r
69 %token ELLIPSIS      "..."\r
70 %token DASH          "-"\r
71 %token OPEN_ANGLE_BRACKET   "<"\r
72 %token CLOSE_ANGLE_BRACKET  ">"\r
73 \r
74 \r
75 \r
76 %token UNKNOWN\r
77 \r
78 \r
79 /* INSTR_* instruction types */\r
80 %token INSTR_NONE\r
81 %token INSTR_VAR\r
82 %token INSTR_I\r
83 %token INSTR_I8\r
84 %token INSTR_R\r
85 %token INSTR_BRTARGET\r
86 %token INSTR_METHOD\r
87 %token INSTR_NEWOBJ\r
88 %token INSTR_FIELD\r
89 %token INSTR_TYPE\r
90 %token INSTR_STRING\r
91 %token INSTR_SIG\r
92 %token INSTR_RVA\r
93 %token INSTR_TOK\r
94 %token INSTR_SWITCH\r
95 %token INSTR_PHI\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 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 CLOSE_BRACE\r
423                           {\r
424                                 codegen.EndTypeDef ();\r
425                           }\r
426                         ;\r
427 \r
428 class_head              : D_CLASS class_attr id typars_clause extends_clause\r
429                           impl_clause\r
430                           {\r
431                                 codegen.BeginTypeDef ((TypeAttr) $2, (string) $3, \r
432                                                 $5 as IClassRef, $6 as ArrayList, null);\r
433 \r
434                                 /*\r
435                                 // Lets not worry about generics for now :p\r
436                                 if ($4 != null) {\r
437                                         ArrayList typars_list = (ArrayList) $4;\r
438                                         int index = 0;\r
439                                         foreach (DictionaryEntry entry in typars_list) {\r
440                                                 TypeRef type = (TypeRef) entry.Key;\r
441                                                 string name = (string) entry.Value;\r
442                                                 codegen.CurrentClass.AddGenericParameter ((short) index++, type.Type, name);\r
443                                         }\r
444                                 }\r
445                                 */\r
446                           }\r
447                         ;\r
448 \r
449 class_attrs             : class_attrs class_attr\r
450                         ;\r
451 \r
452 class_attr              : /* EMPTY */                           { $$ = new TypeAttr (); }\r
453                         | class_attr K_PUBLIC                   { $$ = (TypeAttr)$1 | TypeAttr.Public; }        \r
454                         | class_attr K_PRIVATE                  { $$ = (TypeAttr)$1 | TypeAttr.Private; }\r
455                         | class_attr K_NESTED K_PRIVATE         { $$ = (TypeAttr)$1 | TypeAttr.NestedPrivate; }\r
456                         | class_attr K_NESTED K_PUBLIC          { $$ = (TypeAttr)$1 | TypeAttr.NestedPublic; }\r
457                         | class_attr K_NESTED K_FAMILY          { $$ = (TypeAttr)$1 | TypeAttr.NestedFamily; }\r
458                         | class_attr K_NESTED K_ASSEMBLY        { $$ = (TypeAttr)$1 | TypeAttr.NestedAssembly;}\r
459                         | class_attr K_NESTED K_FAMANDASSEM     { $$ = (TypeAttr)$1 | TypeAttr.NestedFamAndAssem; }\r
460                         | class_attr K_NESTED K_FAMORASSEM      { $$ = (TypeAttr)$1 | TypeAttr.NestedFamOrAssem; }\r
461                         | class_attr K_VALUE                    {  }\r
462                         | class_attr K_ENUM                     {  }\r
463                         | class_attr K_INTERFACE                { $$ = (TypeAttr)$1 | TypeAttr.Interface; }\r
464                         | class_attr K_SEALED                   { $$ = (TypeAttr)$1 | TypeAttr.Sealed; }\r
465                         | class_attr K_ABSTRACT                 { $$ = (TypeAttr)$1 | TypeAttr.Abstract; }\r
466                         | class_attr K_AUTO                     {  }\r
467                         | class_attr K_SEQUENTIAL               { $$ = (TypeAttr)$1 | TypeAttr.SequentialLayout; }\r
468                         | class_attr K_EXPLICIT                 { $$ = (TypeAttr)$1 | TypeAttr.ExplicitLayout; }\r
469                         | class_attr K_ANSI                     {  }\r
470                         | class_attr K_UNICODE                  { $$ = (TypeAttr)$1 | TypeAttr.UnicodeClass; }\r
471                         | class_attr K_AUTOCHAR                 { $$ = (TypeAttr)$1 | TypeAttr.AutoClass; }\r
472                         | class_attr K_IMPORT                   { $$ = (TypeAttr)$1 | TypeAttr.Import; }\r
473                         | class_attr K_SERIALIZABLE             { $$ = (TypeAttr)$1 | TypeAttr.Serializable; }\r
474                         | class_attr K_BEFOREFIELDINIT          { $$ = (TypeAttr)$1 | TypeAttr.BeforeFieldInit; }\r
475                         | class_attr K_SPECIALNAME              { $$ = (TypeAttr)$1 | TypeAttr.SpecialName; }\r
476                         | class_attr K_RTSPECIALNAME            { $$ = (TypeAttr)$1 | TypeAttr.RTSpecialName; }\r
477                         ;\r
478 \r
479 extends_clause          : /* EMPTY */\r
480                         | K_EXTENDS class_ref\r
481                           {\r
482                                 $$ = $2;\r
483                           }\r
484                         ;\r
485 \r
486 impl_clause             : /* EMPTY */\r
487                         | K_IMPLEMENTS class_refs\r
488                           {\r
489                                 $$ = $2;\r
490                           }\r
491                         ;\r
492 \r
493 typars_clause           : /* EMPTY */\r
494                         | OPEN_ANGLE_BRACKET formal_typars CLOSE_ANGLE_BRACKET\r
495                           {\r
496                                 $$ = $2;\r
497                           }\r
498                         ;\r
499 \r
500 typars                  : type\r
501                           {\r
502                                 ArrayList typars_list = new ArrayList ();\r
503                                 typars_list.Add ($1);\r
504                                 $$ = typars_list;\r
505                           }\r
506                         | typars COMMA type\r
507                           {\r
508                                 ArrayList typars_list = (ArrayList) $1;\r
509                                 typars_list.Add ($3);\r
510                                 $$ = typars_list;\r
511                           }\r
512                         ;\r
513 \r
514 formal_typars           : formal_typar\r
515                           {\r
516                                 ArrayList formal_list = new ArrayList ();\r
517                                 formal_list.Add ($1);\r
518                                 $$ = formal_list;\r
519                           }\r
520                         | formal_typars COMMA formal_typar\r
521                           {\r
522                                 ArrayList formal_list = (ArrayList) $1;\r
523                                 formal_list.Add ($3);\r
524                                 $$ = formal_list;\r
525                           }\r
526                         ;\r
527 \r
528 \r
529 formal_typar            : type          { $$ = new DictionaryEntry ($1, null); }\r
530                         | type id       { $$ = new DictionaryEntry ($1, $2); }\r
531                         ;\r
532                         \r
533 class_refs              : class_ref\r
534                           {\r
535                                 ArrayList class_list = new ArrayList ();\r
536                                 class_list.Add ($1);\r
537                                 $$ = class_list; \r
538                           }\r
539                         | class_refs COMMA class_ref\r
540                           {\r
541                                 ArrayList class_list = (ArrayList) $1;\r
542                                 class_list.Add ($3);\r
543                           }\r
544                         ;\r
545 \r
546 slashed_name            : comp_name\r
547                         | slashed_name SLASH comp_name\r
548                           {\r
549                                 $$ = String.Format ("{0}/{1}", $1, $3);\r
550                           }\r
551                         ;\r
552 \r
553 class_ref               : OPEN_BRACKET comp_name CLOSE_BRACKET slashed_name\r
554                           {\r
555                                 ClassRef klass = codegen.ExternTable.GetClass ((string) $2, (string)$4);\r
556                                 $$ = new ExternTypeRef (klass, (string) $4);\r
557                           }\r
558                         | OPEN_BRACKET D_MODULE comp_name CLOSE_BRACKET slashed_name\r
559                         | slashed_name\r
560                           {\r
561                                 $$ = new TypeRef ((string) $1, null);\r
562                           }\r
563                         ;\r
564 \r
565 class_decls             : /* EMPTY */\r
566                         | class_decls class_decl\r
567                         ;\r
568 \r
569 class_decl              : method_all\r
570                         | class_all\r
571                         | event_all\r
572                         | prop_all\r
573                         | field_decl\r
574                         | data_decl\r
575                         | sec_decl\r
576                         | extsource_spec\r
577                         | customattr_decl\r
578                         | D_SIZE int32\r
579                           {\r
580                                 codegen.CurrentTypeDef.SetSize ((int) $2);\r
581                           }\r
582                         | D_PACK int32\r
583                           {\r
584                                 codegen.CurrentTypeDef.SetPack ((int) $2);\r
585                           }\r
586                         | D_OVERRIDE type_spec DOUBLE_COLON method_name\r
587                           K_WITH call_conv type type_spec DOUBLE_COLON method_name\r
588                           OPEN_PARENS sig_args CLOSE_PARENS\r
589                         | language_decl\r
590                         ;\r
591 \r
592 type                    : K_CLASS class_ref\r
593                           {\r
594                                 $$ = $2;\r
595                           }\r
596                         | K_OBJECT\r
597                           {\r
598                                 $$ = new PrimitiveTypeRef (PrimitiveType.Object, "System.Object");\r
599                           }\r
600                         | K_STRING\r
601                           {\r
602                                 $$ = new PrimitiveTypeRef (PrimitiveType.String, "System.String");\r
603                           }\r
604                         | K_VALUE K_CLASS class_ref\r
605                           {\r
606                                 $$ = $3;\r
607                           }\r
608                         | K_VALUETYPE class_ref\r
609                           {\r
610                                 $$ = $2;\r
611                           }\r
612                         | type OPEN_BRACKET CLOSE_BRACKET\r
613                           {\r
614                                 ITypeRef base_type = (ITypeRef) $1;\r
615                                 base_type.MakeArray ();\r
616                           }\r
617                         | type OPEN_BRACKET bounds CLOSE_BRACKET\r
618                           {\r
619                                 ITypeRef base_type = (ITypeRef) $1;\r
620                                 ArrayList bound_list = (ArrayList) $3;\r
621                                 base_type.MakeBoundArray (bound_list);\r
622                           }\r
623                         | type AMPERSAND\r
624                           {\r
625                                 ITypeRef base_type = (ITypeRef) $1;\r
626                                 base_type.MakeManagedPointer ();\r
627                           }\r
628                         | type STAR\r
629                           {\r
630                                 ITypeRef base_type = (ITypeRef) $1;\r
631                                 base_type.MakeUnmanagedPointer ();\r
632                           }\r
633                         | type K_PINNED\r
634                           {\r
635                                 ITypeRef base_type = (ITypeRef) $1;\r
636                                 base_type.MakePinned ();\r
637                           }\r
638                         | type K_MODREQ OPEN_PARENS class_ref CLOSE_PARENS\r
639                           {\r
640                                 /*\r
641                                 ITypeRef base_type = (ITypeRef) $1;\r
642                                 ITypeRef class_ref = (ITypeRef) $4;\r
643 \r
644                                 $$ = new CustomModifiedType (base_type.Type,\r
645                                         CustomModifier.modreq, (Class) class_ref.Type);\r
646                                 */\r
647                           }\r
648                         | type K_MODOPT OPEN_PARENS class_ref CLOSE_PARENS\r
649                           {\r
650                                 /*\r
651                                 TypeRef base_type = (TypeRef) $1;\r
652                                 TypeRef class_ref = (TypeRef) $4;\r
653 \r
654                                 $$ = new CustomModifiedType (base_type.Type,\r
655                                         CustomModifier.modopt, (Class) class_ref.Type);\r
656                                 */\r
657                           }\r
658                         | K_METHOD call_conv type STAR OPEN_PARENS sig_args CLOSE_PARENS\r
659                         | K_TYPEDREF\r
660                           {\r
661                                 $$ = new PrimitiveTypeRef (PrimitiveType.TypedRef,\r
662                                         "System.TypedReference");\r
663                           }\r
664                         | K_CHAR\r
665                           {\r
666                                 $$ = new PrimitiveTypeRef (PrimitiveType.Char, "System.Char");\r
667                           }\r
668                         | K_VOID\r
669                           {\r
670                                 $$ = new PrimitiveTypeRef (PrimitiveType.Void, "System.Void");\r
671                           }\r
672                         | K_BOOL\r
673                           {\r
674                                 $$ = new PrimitiveTypeRef (PrimitiveType.Boolean, "System.Bool");\r
675                           }\r
676                         | K_INT8\r
677                           {\r
678                                 $$ = new PrimitiveTypeRef (PrimitiveType.Int8, "System.Int8");\r
679                           }\r
680                         | K_INT16\r
681                           {\r
682                                 $$ = new PrimitiveTypeRef (PrimitiveType.Int16, "System.Int16");\r
683                           }\r
684                         | K_INT32\r
685                           {\r
686                                 $$ = new PrimitiveTypeRef (PrimitiveType.Int32, "System.Int32");\r
687                           }\r
688                         | K_INT64\r
689                           {\r
690                                 $$ = new PrimitiveTypeRef (PrimitiveType.Int64, "System.Int64");\r
691                           }\r
692                         | K_FLOAT32\r
693                           {\r
694                                 $$ = new PrimitiveTypeRef (PrimitiveType.Float32, "System.Float32");\r
695                           }\r
696                         | K_FLOAT64\r
697                           {\r
698                                 $$ = new PrimitiveTypeRef (PrimitiveType.Float64, "System.Float64");\r
699                           }\r
700                         | K_UNSIGNED K_INT8\r
701                           {\r
702                                 $$ = new PrimitiveTypeRef (PrimitiveType.UInt8, "System.UInt8");\r
703                           }\r
704                         | K_UNSIGNED K_INT16\r
705                           {\r
706                                 $$ = new PrimitiveTypeRef (PrimitiveType.UInt16, "System.UInt16");     \r
707                           }\r
708                         | K_UNSIGNED K_INT32\r
709                           {\r
710                                 $$ = new PrimitiveTypeRef (PrimitiveType.UInt32, "System.UInt32");\r
711                           }\r
712                         | K_UNSIGNED K_INT64\r
713                           {\r
714                                 $$ = new PrimitiveTypeRef (PrimitiveType.UInt64, "System.UInt64");\r
715                           }\r
716                         | K_NATIVE K_INT\r
717                           {\r
718                                 // TODO: Is this the proper full name\r
719                                 $$ = new PrimitiveTypeRef (PrimitiveType.NativeInt, "System.IntPtr");\r
720                           }\r
721                         \r
722                         | K_NATIVE K_UNSIGNED K_INT\r
723                           {\r
724                                 $$ = new PrimitiveTypeRef (PrimitiveType.NativeUInt, "System.UIntPtr");\r
725                           }\r
726                         | BANG int32\r
727                           {\r
728                                 // access class type parameter by number\r
729                           }\r
730                         | BANG BANG int32\r
731                           {\r
732                                 // access method type parameter by number\r
733                           }\r
734                         ;\r
735 \r
736 bounds                  : bound\r
737                           {\r
738                                 ArrayList bound_list = new ArrayList ();\r
739                                 bound_list.Add ($1);\r
740                                 $$ = bound_list;\r
741                           }\r
742                         | bounds COMMA bound\r
743                           {\r
744                                 ArrayList bound_list = (ArrayList) $1;\r
745                                 bound_list.Add ($3);\r
746                           }\r
747                         ;\r
748 \r
749 bound                   : /* EMPTY */\r
750                         | ELLIPSIS\r
751                           {\r
752                                 // No lower bound or size\r
753                                 $$ = new DictionaryEntry (null,null);\r
754                           }\r
755                         | int32\r
756                           {\r
757                                 // ******** Not sure what this is?\r
758                                 // For now I will say it is size because there\r
759                                 // is allready a way to set lower\r
760                                 $$ = new DictionaryEntry (null, $1);\r
761                           }\r
762                         | int32 ELLIPSIS int32\r
763                           {\r
764                                 // lower bound and size\r
765                                 $$ = new DictionaryEntry ($1, $3);\r
766                           }\r
767                         | int32 ELLIPSIS\r
768                           {\r
769                                 // Just lower bound\r
770                                 $$ = new DictionaryEntry ($1, null);\r
771                           }\r
772                         ;\r
773 \r
774 call_conv               : K_INSTANCE call_conv\r
775                           {\r
776                                 $$ = (CallConv) $2 | CallConv.Instance;\r
777                           }\r
778                         | K_EXPLICIT call_conv\r
779                           {\r
780                                 $$ = (CallConv) $2 | CallConv.InstanceExplicit;\r
781                           }\r
782                         | call_kind\r
783                         ;\r
784 \r
785 call_kind               : /* EMPTY */\r
786                           {\r
787                                 $$ = new CallConv ();\r
788                           }\r
789                         | K_DEFAULT\r
790                           {\r
791                                 $$ = CallConv.Default;\r
792                           }\r
793                         | K_VARARG\r
794                           {\r
795                                 $$ = CallConv.Vararg;\r
796                           }\r
797                         | K_UNMANAGED K_CDECL\r
798                           {\r
799                                 $$ = CallConv.Cdecl;\r
800                           }\r
801                         | K_UNMANAGED K_STDCALL\r
802                           {\r
803                                 $$ = CallConv.Stdcall;\r
804                           }\r
805                         | K_UNMANAGED K_THISCALL\r
806                           {\r
807                                 $$ = CallConv.Thiscall;\r
808                           }\r
809                         | K_UNMANAGED K_FASTCALL\r
810                           {\r
811                                 $$ = CallConv.Fastcall;\r
812                           }\r
813                         ;\r
814 \r
815 native_type             : /* EMPTY */\r
816                         | K_CUSTOM OPEN_PARENS comp_qstring COMMA comp_qstring CLOSE_PARENS\r
817                         | K_FIXED K_SYSSTRING OPEN_BRACKET int32 CLOSE_BRACKET\r
818                           {\r
819                                 $$ = NativeType.FixedSysString;\r
820                           }\r
821                         | K_FIXED K_ARRAY OPEN_BRACKET int32 CLOSE_BRACKET\r
822                         | K_VARIANT\r
823                         | K_CURRENCY\r
824                           {\r
825                                 $$ = NativeType.Currency;\r
826                           }\r
827                         | K_SYSCHAR\r
828                         | K_VOID\r
829                           {\r
830                                 $$ = NativeType.Void;\r
831                           }\r
832                         | K_BOOL\r
833                           {\r
834                                 $$ = NativeType.Boolean;\r
835                           }\r
836                         | K_INT8\r
837                           {\r
838                                 $$ = NativeType.Int8;\r
839                           }\r
840                         | K_INT16\r
841                           {\r
842                                 $$ = NativeType.Int16;\r
843                           }\r
844                         | K_INT32\r
845                           {\r
846                                 $$ = NativeType.Int32;\r
847                           }\r
848                         | K_INT64\r
849                           {\r
850                                 $$ = NativeType.Int64;\r
851                           }\r
852                         | K_FLOAT32\r
853                           {\r
854                                 $$ = NativeType.Float32;\r
855                           }\r
856                         | K_FLOAT64\r
857                           {\r
858                                 $$ = NativeType.Float64;\r
859                           }\r
860                         | K_ERROR\r
861                         | K_UNSIGNED K_INT8\r
862                           {\r
863                                 $$ = NativeType.UInt8;\r
864                           }\r
865                         | K_UNSIGNED K_INT16\r
866                           {\r
867                                 $$ = NativeType.UInt16;\r
868                           }\r
869                         | K_UNSIGNED K_INT32\r
870                           {\r
871                                 $$ = NativeType.UInt32;\r
872                           }\r
873                         | K_UNSIGNED K_INT64\r
874                           {\r
875                                 $$ = NativeType.UInt64;\r
876                           }\r
877                         | native_type STAR\r
878                         | native_type OPEN_BRACKET CLOSE_BRACKET\r
879                         | native_type OPEN_BRACKET int32 CLOSE_BRACKET\r
880                         | native_type OPEN_BRACKET int32 PLUS int32 CLOSE_BRACKET\r
881                         | native_type OPEN_BRACKET PLUS int32 CLOSE_BRACKET\r
882                         | K_DECIMAL\r
883                         | K_DATE\r
884                         | K_BSTR\r
885                           {\r
886                                 $$ = NativeType.BStr;\r
887                           }\r
888                         | K_LPSTR\r
889                           {\r
890                                 $$ = NativeType.LPStr;\r
891                           }\r
892                         | K_LPWSTR\r
893                           {\r
894                                 $$ = NativeType.LPWStr;\r
895                           }\r
896                         | K_LPTSTR\r
897                           {\r
898                                 $$ = NativeType.LPTStr;\r
899                           }\r
900                         | K_OBJECTREF\r
901                         | K_IUNKNOWN\r
902                           {\r
903                                 $$ = NativeType.IUnknown;\r
904                           }\r
905                         | K_IDISPATCH\r
906                           {\r
907                                 $$ = NativeType.IDispatch;\r
908                           }\r
909                         | K_STRUCT\r
910                           {\r
911                                 $$ = NativeType.Struct;\r
912                           }\r
913                         | K_INTERFACE\r
914                           {\r
915                                 $$ = NativeType.Interface;\r
916                           }\r
917                         | K_SAFEARRAY variant_type\r
918                         | K_SAFEARRAY variant_type COMMA comp_qstring\r
919                         | K_INT\r
920                           {\r
921                                 $$ = NativeType.Int;\r
922                           }\r
923                         | K_UNSIGNED K_INT\r
924                           {\r
925                                 $$ = NativeType.UInt;\r
926                           }\r
927                         | K_NESTED K_STRUCT\r
928                         | K_BYVALSTR\r
929                           {\r
930                                 $$ = NativeType.ByValStr;\r
931                           }\r
932                         | K_ANSI K_BSTR\r
933                           {\r
934                                 $$ = NativeType.AnsiBStr;\r
935                           }\r
936                         | K_TBSTR\r
937                           {\r
938                                 $$ = NativeType.TBstr;\r
939                           }\r
940                         | K_VARIANT K_BOOL\r
941                           {\r
942                                 $$ = NativeType.VariantBool;\r
943                           }\r
944                         | K_METHOD\r
945                         | K_AS K_ANY\r
946                           {\r
947                                 $$ = NativeType.AsAny;\r
948                           }\r
949                         | K_LPSTRUCT\r
950                         ;\r
951 \r
952 variant_type            : /* EMPTY */\r
953                         | K_NULL\r
954                         | K_VARIANT\r
955                         | K_CURRENCY\r
956                         | K_VOID\r
957                         | K_BOOL\r
958                         | K_INT8\r
959                         | K_INT16\r
960                         | K_INT32\r
961                         | K_INT64\r
962                         | K_FLOAT32\r
963                         | K_FLOAT64\r
964                         | K_UNSIGNED K_INT8\r
965                         | K_UNSIGNED K_INT16\r
966                         | K_UNSIGNED K_INT32\r
967                         | K_UNSIGNED K_INT64\r
968                         | STAR\r
969                         | variant_type OPEN_BRACKET CLOSE_BRACKET\r
970                         | variant_type K_VECTOR\r
971                         | variant_type AMPERSAND\r
972                         | K_DECIMAL\r
973                         | K_DATE\r
974                         | K_BSTR\r
975                         | K_LPSTR\r
976                         | K_LPWSTR\r
977                         | K_IUNKNOWN\r
978                         | K_IDISPATCH\r
979                         | K_SAFEARRAY\r
980                         | K_INT\r
981                         | K_UNSIGNED K_INT\r
982                         | K_ERROR\r
983                         | K_HRESULT\r
984                         | K_CARRAY\r
985                         | K_USERDEFINED\r
986                         | K_RECORD\r
987                         | K_FILETIME\r
988                         | K_BLOB\r
989                         | K_STREAM\r
990                         | K_STORAGE\r
991                         | K_STREAMED_OBJECT\r
992                         | K_STORED_OBJECT\r
993                         | K_BLOB_OBJECT\r
994                         | K_CF\r
995                         | K_CLSID\r
996                         ;\r
997 \r
998 field_decl              : D_FIELD repeat_opt field_attr type id at_opt init_opt\r
999                           {\r
1000                                 FieldDef field_def = new FieldDef((FieldAttr) $3, \r
1001                                         (string) $5, (ITypeRef) $4);\r
1002                                 codegen.AddFieldDef (field_def);\r
1003                                 \r
1004                                 if ($2 != null) {\r
1005                                         field_def.SetOffset ((uint) $2);\r
1006                                 }\r
1007                                 /*\r
1008                                 if ($6 != null) {\r
1009                                         field_def.AddDataValue ((DataConstant) $6);\r
1010                                 }\r
1011                                 */\r
1012                                 if ($7 != null) {\r
1013                                         field_def.SetValue ((Constant) $7);\r
1014                                 }\r
1015                           }\r
1016                         ;\r
1017 \r
1018 repeat_opt              : /* EMPTY */\r
1019                         | OPEN_BRACKET int32 CLOSE_BRACKET\r
1020                           {\r
1021                                 $$ = $2;\r
1022                           }\r
1023                         ;\r
1024 \r
1025 field_attr              : /* EMPTY */\r
1026                           {\r
1027                                 $$ = new FieldAttr ();\r
1028                           }\r
1029                         | field_attr K_PUBLIC\r
1030                           {\r
1031                                 $$ = (FieldAttr) $1 | FieldAttr.Public;\r
1032                           }\r
1033                         | field_attr K_PRIVATE\r
1034                           {\r
1035                                 $$ = (FieldAttr) $1 | FieldAttr.Private;\r
1036                           }\r
1037                         | field_attr K_FAMILY\r
1038                           {\r
1039                                 $$ = (FieldAttr) $1 | FieldAttr.Family;\r
1040                           }\r
1041                         | field_attr K_ASSEMBLY\r
1042                           {\r
1043                                 $$ = (FieldAttr) $1 | FieldAttr.Assembly;\r
1044                           }\r
1045                         | field_attr K_FAMANDASSEM\r
1046                           {\r
1047                                 $$ = (FieldAttr) $1 | FieldAttr.FamAndAssem;\r
1048                           }\r
1049                         | field_attr K_FAMORASSEM\r
1050                           {\r
1051                                 $$ = (FieldAttr) $1 | FieldAttr.FamOrAssem;\r
1052                           }\r
1053                         | field_attr K_PRIVATESCOPE\r
1054                           {\r
1055                                 // This is just 0x0000\r
1056                           }\r
1057                         | field_attr K_STATIC\r
1058                           {\r
1059                                 $$ = (FieldAttr) $1 | FieldAttr.Static;\r
1060                           }\r
1061                         | field_attr K_INITONLY\r
1062                           {\r
1063                                 $$ = (FieldAttr) $1 | FieldAttr.Initonly;\r
1064                           }\r
1065                         | field_attr K_RTSPECIALNAME\r
1066                           {\r
1067                                 $$ = (FieldAttr) $1 | FieldAttr.RTSpecialName;\r
1068                           }\r
1069                         | field_attr K_SPECIALNAME\r
1070                           {\r
1071                                 $$ = (FieldAttr) $1 | FieldAttr.SpecialName;\r
1072                           }\r
1073                         | field_attr K_MARSHAL OPEN_PARENS native_type CLOSE_PARENS\r
1074                           {\r
1075                                 \r
1076                           }\r
1077                         | field_attr K_LITERAL\r
1078                           {\r
1079                                 $$ = (FieldAttr) $1 | FieldAttr.Literal;\r
1080                           }\r
1081                         | field_attr K_NOTSERIALIZED\r
1082                           {\r
1083                                 $$ = (FieldAttr) $1 | FieldAttr.Notserialized;\r
1084                           }\r
1085                         ;\r
1086 \r
1087 at_opt                  : /* EMPTY */\r
1088                         | K_AT id\r
1089                           {\r
1090                                 // TODO: Implement DataTable\r
1091                                 // $$ = new DataConstant (DataTable.GetOffset ((string) $2));\r
1092                           }\r
1093                         ;\r
1094 \r
1095 init_opt                : /* EMPTY */\r
1096                         | ASSIGN field_init\r
1097                           {\r
1098                                 $$ = $2;\r
1099                           }\r
1100                         ;\r
1101 \r
1102 field_init              : K_FLOAT32 OPEN_PARENS float64 CLOSE_PARENS\r
1103                           {\r
1104                                 $$ = new FloatConst (Convert.ToSingle ($3));\r
1105                           }\r
1106                         | K_FLOAT64 OPEN_PARENS float64 CLOSE_PARENS\r
1107                           {\r
1108                                 $$ = new DoubleConst (Convert.ToDouble ($3));\r
1109                           }\r
1110                         | K_FLOAT32 OPEN_PARENS int64 CLOSE_PARENS\r
1111                           {\r
1112                                 $$ = new FloatConst (Convert.ToSingle ($3));\r
1113                           }\r
1114                         | K_FLOAT64 OPEN_PARENS int64 CLOSE_PARENS\r
1115                           {\r
1116                                 $$ = new DoubleConst (Convert.ToDouble (3));\r
1117                           }\r
1118                         | K_INT64 OPEN_PARENS int64 CLOSE_PARENS\r
1119                           {\r
1120                                 $$ = new IntConst (Convert.ToInt64 ($3));\r
1121                           }\r
1122                         | K_INT32 OPEN_PARENS int64 CLOSE_PARENS\r
1123                           {\r
1124                                 $$ = new IntConst (Convert.ToUInt32 ($3));\r
1125                           }\r
1126                         | K_INT16 OPEN_PARENS int64 CLOSE_PARENS\r
1127                           {\r
1128                                 $$ = new IntConst (Convert.ToUInt16 ($3));\r
1129                           }\r
1130                         | K_CHAR OPEN_PARENS int64 CLOSE_PARENS\r
1131                           {\r
1132                                 $$ = new CharConst (Convert.ToChar ($3));\r
1133                           }\r
1134                         | K_INT8 OPEN_PARENS int64 CLOSE_PARENS\r
1135                           {\r
1136                                 $$ = new IntConst (Convert.ToByte ($3));\r
1137                           }\r
1138                         | K_BOOL OPEN_PARENS truefalse CLOSE_PARENS\r
1139                           {\r
1140                                 $$ = new BoolConst ((bool) $3);\r
1141                           }\r
1142                         | K_BYTEARRAY OPEN_PARENS bytes CLOSE_PARENS\r
1143                           {\r
1144                                 $$ = new ByteArrConst ((byte[]) $3);\r
1145                           }\r
1146                         | comp_qstring\r
1147                           {\r
1148                                 // ******** THIS IS NOT IN THE DOCUMENTATION ******** //\r
1149                                 $$ = new StringConst ((string) $1);\r
1150                           }\r
1151                         | K_NULLREF\r
1152                           {\r
1153                                 $$ = new NullConst ();\r
1154                           }\r
1155                         ;\r
1156 \r
1157 data_decl               : data_head data_body\r
1158                           {\r
1159                                 /*\r
1160                                 Console.WriteLine ("Creating data decl: '{0}' '{1}'", $1, $2);\r
1161 \r
1162                                 DataDef datadef = (DataDef) $1;\r
1163                                 \r
1164                                 if ($2 is ArrayList) {\r
1165                                         ArrayList const_list = (ArrayList) $2;\r
1166                                         DataConstant[] const_arr = new DataConstant[const_list.Count];\r
1167                                         \r
1168                                         for (int i=0; i<const_arr.Length; i++)\r
1169                                                 const_arr[i] = (DataConstant) const_list[i];\r
1170 \r
1171                                         datadef.PeapiConstant = new ArrayConstant (const_arr);\r
1172                                 } else {\r
1173                                         datadef.PeapiConstant = (PEAPI.Constant) $2;\r
1174                                 }\r
1175                                 */\r
1176                           }\r
1177                         ;\r
1178 \r
1179 data_head               : D_DATA tls id ASSIGN\r
1180                           {\r
1181                                 $$ = new DataDef ((string) $3, (bool) $2);    \r
1182                           } \r
1183                         | D_DATA tls\r
1184                           {\r
1185                                 $$ = new DataDef (String.Empty, (bool) $2);\r
1186                           }\r
1187                         ;\r
1188 \r
1189 tls                     : /* EMPTY */   { $$ = false; }\r
1190                         | K_TLS         { $$ = true; }\r
1191                         ;\r
1192 \r
1193 data_body               : OPEN_BRACE dataitem_list CLOSE_BRACE\r
1194                         | dataitem\r
1195                         ;\r
1196 \r
1197 dataitem_list           : dataitem\r
1198                         | dataitem_list COMMA dataitem\r
1199                         ;\r
1200 \r
1201 dataitem                : K_CHAR STAR OPEN_PARENS comp_qstring CLOSE_PARENS\r
1202                         | AMPERSAND OPEN_PARENS id CLOSE_PARENS\r
1203                         | K_BYTEARRAY ASSIGN OPEN_PARENS bytes CLOSE_PARENS\r
1204                           {\r
1205                                 $$ = new ByteArrConst ((byte[]) $4);\r
1206                           }\r
1207                         | K_BYTEARRAY OPEN_PARENS bytes CLOSE_PARENS\r
1208                           {\r
1209                                 // ******** THIS IS NOT IN THE SPECIFICATION ******** //\r
1210                                 $$ = new ByteArrConst ((byte[]) $3);\r
1211                           }\r
1212                         | K_FLOAT32 OPEN_PARENS float64 CLOSE_PARENS repeat_opt\r
1213                           {\r
1214                                 FloatConst float_const = new FloatConst ((float) $3);\r
1215 \r
1216                                 if ($5 != null)\r
1217                                         $$ = new RepeatedConstant (float_const, (int) $5);\r
1218                                 else\r
1219                                         $$ = float_const;\r
1220                           }\r
1221                         | K_FLOAT64 OPEN_PARENS float64 CLOSE_PARENS repeat_opt\r
1222                           {\r
1223                                 DoubleConst double_const = new DoubleConst ((double) $3);\r
1224 \r
1225                                 if ($5 != null)\r
1226                                         $$ = new RepeatedConstant (double_const, (int) $5);\r
1227                                 else\r
1228                                         $$ = double_const;\r
1229                           }\r
1230                         | K_INT64 OPEN_PARENS int64 CLOSE_PARENS repeat_opt\r
1231                           {\r
1232                                 IntConst int_const = new IntConst ((long) $3);\r
1233 \r
1234                                 if ($5 != null)\r
1235                                         $$ = new RepeatedConstant (int_const, (int) $5);\r
1236                                 else\r
1237                                         $$ = int_const;\r
1238                           }\r
1239                         | K_INT32 OPEN_PARENS int32 CLOSE_PARENS repeat_opt\r
1240                           {\r
1241                                 IntConst int_const = new IntConst ((int) $3);\r
1242 \r
1243                                 if ($5 != null)\r
1244                                         $$ = new RepeatedConstant (int_const, (int) $5);\r
1245                                 else\r
1246                                         $$ = int_const;\r
1247                           }\r
1248                         | K_INT16 OPEN_PARENS int32 CLOSE_PARENS repeat_opt\r
1249                           {\r
1250                                 IntConst int_const = new IntConst ((short) $3);\r
1251 \r
1252                                 if ($5 != null)\r
1253                                         $$ = new RepeatedConstant (int_const, (int) $5);\r
1254                                 else\r
1255                                         $$ = int_const;\r
1256                           }\r
1257                         | K_INT8 OPEN_PARENS int32 CLOSE_PARENS repeat_opt\r
1258                           {\r
1259                                 IntConst int_const = new IntConst ((sbyte) $3);\r
1260 \r
1261                                 if ($5 != null)\r
1262                                         $$ = new RepeatedConstant (int_const, (int) $5);\r
1263                                 else\r
1264                                         $$ = int_const;\r
1265                           }\r
1266                         | K_FLOAT32 repeat_opt\r
1267                           {\r
1268                                 FloatConst float_const = new FloatConst (0F);\r
1269 \r
1270                                 if ($2 != null)\r
1271                                         $$ = new RepeatedConstant (float_const, (int) $2);\r
1272                                 else\r
1273                                         $$ = float_const;\r
1274                           }\r
1275                         | K_FLOAT64 repeat_opt\r
1276                           {\r
1277                                 DoubleConst double_const = new DoubleConst (0);\r
1278 \r
1279                                 if ($2 != null)\r
1280                                         $$ = new RepeatedConstant (double_const, (int) $2);\r
1281                                 else\r
1282                                         $$ = double_const;\r
1283                           }\r
1284                         | K_INT64 repeat_opt\r
1285                           {\r
1286                                 IntConst int_const = new IntConst ((long) 0);\r
1287 \r
1288                                 if ($2 != null)\r
1289                                         $$ = new RepeatedConstant (int_const, (int) $2);\r
1290                                 else\r
1291                                         $$ = int_const;\r
1292                           }\r
1293                         | K_INT32 repeat_opt\r
1294                           {\r
1295                                 IntConst int_const = new IntConst ((int) 0);\r
1296 \r
1297                                 if ($2 != null)\r
1298                                         $$ = new RepeatedConstant (int_const, (int) $2);\r
1299                                 else\r
1300                                         $$ = int_const;\r
1301                           }\r
1302                         | K_INT16 repeat_opt\r
1303                           {\r
1304                                 IntConst int_const = new IntConst ((short) 0);\r
1305 \r
1306                                 if ($2 != null)\r
1307                                         $$ = new RepeatedConstant (int_const, (int) $2);\r
1308                                 else\r
1309                                         $$ = int_const;\r
1310                           }\r
1311                         | K_INT8 repeat_opt\r
1312                           {\r
1313                                 IntConst int_const = new IntConst ((sbyte) 0);\r
1314 \r
1315                                 if ($2 != null)\r
1316                                         $$ = new RepeatedConstant (int_const, (int) $2);\r
1317                                 else\r
1318                                         $$ = int_const;\r
1319                           }\r
1320                         ;\r
1321 \r
1322 method_all              : method_head OPEN_BRACE method_decls CLOSE_BRACE\r
1323                           {\r
1324                                 codegen.EndMethodDef ();\r
1325                           }\r
1326                         ;\r
1327 \r
1328 method_head             : D_METHOD meth_attr call_conv param_attr type method_name\r
1329                           typars_clause OPEN_PARENS sig_args CLOSE_PARENS impl_attr\r
1330                           {\r
1331                                 MethodDef methdef = new MethodDef ((MethAttr) $2,\r
1332                                         (ImplAttr) $11, (string) $6, (ITypeRef) $5,\r
1333                                         (ArrayList) $9);\r
1334                                 codegen.BeginMethodDef (methdef);\r
1335                           }\r
1336                         | D_METHOD meth_attr call_conv param_attr type \r
1337                           K_MARSHAL OPEN_PARENS native_type CLOSE_PARENS method_name\r
1338                           OPEN_PARENS sig_args CLOSE_PARENS impl_attr\r
1339                         ;\r
1340 \r
1341 meth_attr               : /* EMPTY */                   { $$ = new MethAttr (); }\r
1342                         | meth_attr K_STATIC            { $$ = (MethAttr) $1 | MethAttr.Static; }\r
1343                         | meth_attr K_PUBLIC            { $$ = (MethAttr) $1 | MethAttr.Public; }\r
1344                         | meth_attr K_PRIVATE           { $$ = (MethAttr) $1 | MethAttr.Private; }\r
1345                         | meth_attr K_FAMILY            { $$ = (MethAttr) $1 | MethAttr.Family; }\r
1346                         | meth_attr K_ASSEMBLY          { $$ = (MethAttr) $1 | MethAttr.Assembly; }\r
1347                         | meth_attr K_FAMANDASSEM       { $$ = (MethAttr) $1 | MethAttr.FamAndAssem; } \r
1348                         | meth_attr K_FAMORASSEM        { $$ = (MethAttr) $1 | MethAttr.FamOrAssem; } \r
1349                         | meth_attr K_PRIVATESCOPE      { /* CHECK HEADERS */ }\r
1350                         | meth_attr K_FINAL             { $$ = (MethAttr) $1 | MethAttr.Final; } \r
1351                         | meth_attr K_VIRTUAL           { $$ = (MethAttr) $1 | MethAttr.Virtual; }\r
1352                         | meth_attr K_ABSTRACT          { $$ = (MethAttr) $1 | MethAttr.Abstract; }\r
1353                         | meth_attr K_HIDEBYSIG         { $$ = (MethAttr) $1 | MethAttr.HideBySig; }\r
1354                         | meth_attr K_NEWSLOT           { $$ = (MethAttr) $1 | MethAttr.NewSlot; }\r
1355                         | meth_attr K_REQSECOBJ         { $$ = (MethAttr) $1 | MethAttr.RequireSecObject; }\r
1356                         | meth_attr K_SPECIALNAME       { $$ = (MethAttr) $1 | MethAttr.SpecialName; }\r
1357                         | meth_attr K_RTSPECIALNAME     { $$ = (MethAttr) $1 | MethAttr.RTSpecialName; }\r
1358                         | meth_attr K_UNMANAGEDEXP      \r
1359                         | meth_attr K_PINVOKEIMPL OPEN_PARENS comp_qstring K_AS\r
1360                                 comp_qstring pinv_attr CLOSE_PARENS\r
1361                         | meth_attr K_PINVOKEIMPL OPEN_PARENS comp_qstring pinv_attr CLOSE_PARENS\r
1362                         | meth_attr K_PINVOKEIMPL OPEN_PARENS pinv_attr CLOSE_PARENS\r
1363                         ;\r
1364 \r
1365 pinv_attr               : /* EMPTY */\r
1366                         | pinv_attr K_NOMANGLE\r
1367                         | pinv_attr K_ANSI\r
1368                         | pinv_attr K_UNICODE\r
1369                         | pinv_attr K_AUTOCHAR\r
1370                         | pinv_attr K_LASTERR\r
1371                         | pinv_attr K_WINAPI\r
1372                         | pinv_attr K_CDECL\r
1373                         | pinv_attr K_STDCALL\r
1374                         | pinv_attr K_THISCALL\r
1375                         | pinv_attr K_FASTCALL\r
1376                         ;\r
1377 \r
1378 method_name             : D_CTOR\r
1379                         | D_CCTOR\r
1380                         | comp_name\r
1381                         ;\r
1382 \r
1383 param_attr              : /* EMPTY */                                   { $$ = new ParamAttr (); }\r
1384                         | param_attr OPEN_BRACKET K_IN CLOSE_BRACKET    { $$ = (ParamAttr) $1 | ParamAttr.In; }\r
1385                         | param_attr OPEN_BRACKET K_OUT CLOSE_BRACKET   { $$ = (ParamAttr) $1 | ParamAttr.Out; }\r
1386                         | param_attr OPEN_BRACKET K_OPT CLOSE_BRACKET   { $$ = (ParamAttr) $1 | ParamAttr.Opt; }\r
1387                         ;\r
1388 \r
1389 impl_attr               : /* EMPTY */                   { $$ = new ImplAttr (); }\r
1390                         | impl_attr K_NATIVE            { $$ = (ImplAttr) $1 | ImplAttr.Native; }\r
1391                         | impl_attr K_CIL               { $$ = (ImplAttr) $1 | ImplAttr.IL; }\r
1392                         | impl_attr K_OPTIL             { $$ = (ImplAttr) $1 | ImplAttr.Optil; }\r
1393                         | impl_attr K_MANAGED           { /* should this reset? */ }\r
1394                         | impl_attr K_UNMANAGED         { $$ = (ImplAttr) $1 | ImplAttr.Unmanaged; }\r
1395                         | impl_attr K_FORWARDREF        { $$ = (ImplAttr) $1 | ImplAttr.ForwardRef; }\r
1396                         | impl_attr K_PRESERVESIG       { $$ = (ImplAttr) $1 | ImplAttr.PreserveSig; }\r
1397                         | impl_attr K_RUNTIME           { $$ = (ImplAttr) $1 | ImplAttr.Runtime; }\r
1398                         | impl_attr K_INTERNALCALL      { $$ = (ImplAttr) $1 | ImplAttr.InternalCall; }\r
1399                         | impl_attr K_SYNCHRONIZED      { $$ = (ImplAttr) $1 | ImplAttr.Synchronised; }\r
1400                         | impl_attr K_NOINLINING        { $$ = (ImplAttr) $1 | ImplAttr.NoInLining; }\r
1401                         ;\r
1402 \r
1403 sig_args                :               { $$ = new ArrayList (); }\r
1404                         | sig_arg_list\r
1405                         ;\r
1406 \r
1407 sig_arg_list            : sig_arg\r
1408                           {\r
1409                                 ArrayList sig_list = new ArrayList ();\r
1410                                 sig_list.Add ($1);\r
1411                                 $$ = sig_list;\r
1412                           }\r
1413                         | sig_arg_list COMMA sig_arg\r
1414                           {\r
1415                                 ArrayList sig_list = (ArrayList) $1;\r
1416                                 sig_list.Add ($3);\r
1417                                 $$ = sig_list;\r
1418                           }\r
1419                         ;\r
1420 \r
1421 sig_arg                 : param_attr type\r
1422                           {\r
1423                                 $$ = new ParamDef ((ParamAttr) $1, null, (ITypeRef) $2);\r
1424                           }\r
1425                         | param_attr type id\r
1426                           {\r
1427                                 $$ = new ParamDef ((ParamAttr) $1, (string) $3, (ITypeRef) $2);\r
1428                           }\r
1429                         | param_attr type K_MARSHAL OPEN_PARENS native_type CLOSE_PARENS\r
1430                         | param_attr type K_MARSHAL OPEN_PARENS native_type CLOSE_PARENS id\r
1431                         ;\r
1432 \r
1433 type_list               : /* EMPTY */   { $$ = new ArrayList (); }\r
1434                         | type\r
1435                           {\r
1436                                 ArrayList type_list = new ArrayList ();\r
1437                                 type_list.Add ($1);\r
1438                                 $$ = type_list;\r
1439                           }\r
1440                         | type_list COMMA type\r
1441                           {\r
1442                                 ArrayList type_list = (ArrayList) $1;\r
1443                                 type_list.Add ($3);\r
1444                           }\r
1445                         ;\r
1446 \r
1447 method_decls            : /* EMPTY */\r
1448                         | method_decls method_decl\r
1449                         ;\r
1450 \r
1451 method_decl             : D_EMITBYTE int32\r
1452                         | D_MAXSTACK int32\r
1453                         | D_LOCALS OPEN_PARENS local_list CLOSE_PARENS\r
1454                           {\r
1455                                 codegen.CurrentMethodDef.AddLocals (\r
1456                                         (ArrayList) $3);\r
1457                           }\r
1458                         | D_LOCALS K_INIT OPEN_PARENS local_list CLOSE_PARENS\r
1459                           {\r
1460                                 codegen.CurrentMethodDef.AddLocals (\r
1461                                         (ArrayList) $4);\r
1462                                 codegen.CurrentMethodDef.InitLocals ();\r
1463                           }\r
1464                         | D_ENTRYPOINT\r
1465                           {\r
1466                                 codegen.CurrentMethodDef.EntryPoint ();\r
1467                           }\r
1468                         | D_ZEROINIT\r
1469                         | D_EXPORT OPEN_BRACKET int32 CLOSE_BRACKET\r
1470                         | D_EXPORT OPEN_BRACKET int32 CLOSE_BRACKET K_AS id\r
1471                         | D_VTENTRY int32 COLON int32 \r
1472                         | D_OVERRIDE type_spec DOUBLE_COLON method_name\r
1473                         | scope_block\r
1474                         | D_PARAM OPEN_BRACKET int32 CLOSE_BRACKET init_opt\r
1475                         | id COLON\r
1476                           {\r
1477                                 codegen.CurrentMethodDef.AddLabel ((string) $1);\r
1478                           }\r
1479                         | seh_block\r
1480                         | instr\r
1481                         | sec_decl\r
1482                         | extsource_spec\r
1483                         | language_decl\r
1484                         | customattr_decl\r
1485                         | data_decl\r
1486                         ;\r
1487 \r
1488 local_list              : /* EMPTY */\r
1489                         | local\r
1490                           {\r
1491                                 ArrayList local_list = new ArrayList ();\r
1492                                 local_list.Add ($1);\r
1493                                 $$ = local_list;\r
1494                           }\r
1495                         | local_list COMMA local\r
1496                           {\r
1497                                 ArrayList local_list = (ArrayList) $1;\r
1498                                 local_list.Add ($3);\r
1499                           }\r
1500                         ;\r
1501 \r
1502 local                   : type\r
1503                           {\r
1504                                 $$ = new Local (-1, (ITypeRef) $1);\r
1505                           }\r
1506                         | type id\r
1507                           {\r
1508                                 $$ = new Local (-1, (string) $2, (ITypeRef) $1);\r
1509                           }\r
1510                         | OPEN_BRACKET int32 CLOSE_BRACKET type\r
1511                           {\r
1512                                 $$ = new Local ((int) $2, (ITypeRef) $4);\r
1513                           }\r
1514                         | OPEN_BRACKET int32 CLOSE_BRACKET type id\r
1515                           {\r
1516                                 $$ = new Local ((int) $2, (string) $5, (ITypeRef) $4);\r
1517                           }\r
1518                         ;\r
1519 \r
1520 type_spec               : class_ref\r
1521                         | OPEN_BRACKET comp_name CLOSE_BRACKET\r
1522                         | OPEN_BRACKET D_MODULE comp_name CLOSE_BRACKET\r
1523                         | type\r
1524                         ;\r
1525 \r
1526 scope_block             : OPEN_BRACE method_decls CLOSE_BRACE\r
1527                         ;\r
1528 \r
1529 seh_block               : try_block seh_clauses\r
1530                         ;\r
1531 \r
1532 try_block               : D_TRY scope_block\r
1533                         | D_TRY id K_TO id\r
1534                         | D_TRY int32 K_TO int32\r
1535                         ;\r
1536 \r
1537 seh_clauses             : seh_clause\r
1538                         | seh_clauses seh_clause\r
1539                         ;\r
1540 \r
1541 seh_clause              : K_CATCH class_ref handler_block\r
1542                         | K_FINALLY handler_block\r
1543                         | K_FAULT handler_block\r
1544                         | filter_clause handler_block\r
1545                         ;\r
1546 \r
1547 filter_clause           : K_FILTER scope_block\r
1548                         | K_FILTER id\r
1549                         | K_FILTER int32\r
1550                         ;\r
1551 \r
1552 handler_block           : scope_block\r
1553                         | K_HANDLER id K_TO id\r
1554                         | K_HANDLER int32 K_TO int32\r
1555                         ;\r
1556 \r
1557 instr                   : INSTR_NONE\r
1558                           {\r
1559                                 codegen.CurrentMethodDef.AddInstr (\r
1560                                         new SimpInstr ((Op) $1));\r
1561                           }\r
1562                         | INSTR_VAR int32\r
1563                           {\r
1564                                \r
1565                           }\r
1566                         | INSTR_I int32\r
1567                           {\r
1568                                 codegen.CurrentMethodDef.AddInstr (new\r
1569                                         IntInstr ((IntOp) $1, (int) $2));\r
1570                           }\r
1571                         | INSTR_I id /* Allow variable names */\r
1572                         | INSTR_I8 int64\r
1573                           {\r
1574                                 codegen.CurrentMethodDef.AddInstr (new\r
1575                                         IntInstr ((IntOp) $1, (int) $2));\r
1576                           }\r
1577                         | INSTR_R float64\r
1578                           {\r
1579                                 switch ((MiscInstr) $1) {\r
1580                                 case MiscInstr.ldc_r4:\r
1581                                 case MiscInstr.ldc_r8:\r
1582                                          codegen.CurrentMethodDef.AddInstr (new LdcInstr ((MiscInstr) $1, (double) $2));\r
1583                                          break;\r
1584                                 }\r
1585                           }\r
1586                         | INSTR_R int64\r
1587                           {\r
1588                                 switch ((MiscInstr) $1) {\r
1589                                         case MiscInstr.ldc_r8:\r
1590                                         codegen.CurrentMethodDef.AddInstr (new LdcInstr ((MiscInstr) $1, (double) $2));\r
1591                                         break;\r
1592                                 }\r
1593                           }\r
1594                         | INSTR_R OPEN_PARENS bytes CLOSE_PARENS\r
1595                         | INSTR_BRTARGET int32\r
1596                           {\r
1597                                 // Need to add this to PEAPI        \r
1598                           }\r
1599                         | INSTR_BRTARGET id\r
1600                           {\r
1601                                 codegen.CurrentMethodDef.AddInstr (new BranchInstr ((BranchOp) $1,\r
1602                                         codegen.CurrentMethodDef, (string) $2));\r
1603                           }\r
1604                         | INSTR_METHOD method_ref\r
1605                           {\r
1606                                 codegen.CurrentMethodDef.AddInstr (new MethodInstr ((MethodOp) $1,\r
1607                                         (IMethodRef) $2));\r
1608                           }\r
1609                         | INSTR_FIELD type type_spec DOUBLE_COLON id\r
1610                           {\r
1611                                 IClassRef owner = (IClassRef) $3;\r
1612                                 IFieldRef fieldref = owner.GetFieldRef ((ITypeRef) $2, (string) $5);\r
1613 \r
1614                                 codegen.CurrentMethodDef.AddInstr (new FieldInstr ((FieldOp) $1, fieldref));\r
1615                           }\r
1616                         | INSTR_FIELD type id\r
1617                           {\r
1618                                 GlobalFieldRef fieldref = new GlobalFieldRef ((ITypeRef) $2, (string) $3);\r
1619 \r
1620                                 codegen.CurrentMethodDef.AddInstr (new FieldInstr ((FieldOp) $1, fieldref));\r
1621                           }\r
1622                         | INSTR_TYPE type_spec\r
1623                           {\r
1624                                 codegen.CurrentMethodDef.AddInstr (new TypeInstr ((TypeOp) $1,\r
1625                                         (ITypeRef) $2));\r
1626                           }\r
1627                         | INSTR_STRING comp_qstring\r
1628                           {\r
1629                                 if ((MiscInstr) $1 == MiscInstr.ldstr)\r
1630                                         codegen.CurrentMethodDef.AddInstr (new LdstrInstr ((string) $2));\r
1631                           }\r
1632                         | INSTR_STRING K_BYTEARRAY ASSIGN OPEN_PARENS bytes CLOSE_PARENS\r
1633                         | INSTR_STRING K_BYTEARRAY OPEN_PARENS bytes CLOSE_PARENS               // ****** ADDED\r
1634                         | INSTR_SIG call_conv type OPEN_PARENS sig_args CLOSE_PARENS\r
1635                         | INSTR_TOK owner_type\r
1636                         | INSTR_SWITCH OPEN_PARENS labels CLOSE_PARENS\r
1637                           {\r
1638                                 codegen.CurrentMethodDef.AddInstr (new SwitchInstr ((ArrayList) $3,\r
1639                                         codegen.CurrentMethodDef));\r
1640                           }\r
1641                         ;\r
1642 \r
1643 method_ref              : call_conv type type_spec DOUBLE_COLON method_name \r
1644                           OPEN_PARENS type_list CLOSE_PARENS\r
1645                           {\r
1646                                 IClassRef owner = (IClassRef) $3;\r
1647                                 ArrayList arg_list = (ArrayList) $7;\r
1648                                 \r
1649                                 $$ = owner.GetMethodRef ((ITypeRef) $2, (string) $5,\r
1650                                         (ITypeRef[]) arg_list.ToArray (typeof (ITypeRef)));\r
1651                           }\r
1652                         | call_conv type method_name \r
1653                           OPEN_PARENS type_list CLOSE_PARENS\r
1654                           {\r
1655                                 ArrayList arg_list = (ArrayList) $5;\r
1656 \r
1657                                 $$ = new GlobalMethodRef ((ITypeRef) $2, (string) $3,\r
1658                                         (ITypeRef[]) arg_list.ToArray (typeof (ITypeRef)));\r
1659                           }\r
1660                         ;\r
1661 \r
1662 labels                  : /* EMPTY */\r
1663                         | id\r
1664                           {\r
1665                                 ArrayList label_list = new ArrayList ();\r
1666                                 label_list.Add ($1);\r
1667                                 $$ = label_list;\r
1668                           }\r
1669                         | int32\r
1670                           {\r
1671                                 ArrayList label_list = new ArrayList ();\r
1672                                 label_list.Add ($1);\r
1673                                 $$ = label_list;\r
1674                           }\r
1675                         | labels COMMA id\r
1676                           {\r
1677                                 ArrayList label_list = (ArrayList) $1;\r
1678                                 label_list.Add ($3);\r
1679                           }\r
1680                         | labels COMMA int32\r
1681                           {\r
1682                                 ArrayList label_list = (ArrayList) $1;\r
1683                                 label_list.Add ($3);\r
1684                           }\r
1685                         ;\r
1686 \r
1687 owner_type              : type_spec\r
1688                         | member_ref\r
1689                         ;\r
1690 \r
1691 member_ref              : K_METHOD member_ref\r
1692                         | K_FIELD type type_spec DOUBLE_COLON id\r
1693                         | K_FIELD type id\r
1694                         ;\r
1695 \r
1696 event_all               : event_head OPEN_BRACE event_decls CLOSE_BRACE\r
1697                         ;\r
1698 \r
1699 event_head              : D_EVENT event_attr type_spec id\r
1700                         | D_EVENT event_attr id\r
1701                         ;\r
1702 \r
1703 event_attr              : /* EMPTY */\r
1704                         | event_attr K_RTSPECIALNAME\r
1705                         | event_attr K_SPECIALNAME\r
1706                         ;\r
1707 \r
1708 event_decls             : /* EMPTY */\r
1709                         | event_decls event_decl\r
1710                         ;\r
1711 \r
1712 event_decl              : D_ADDON method_ref\r
1713                         | D_REMOVEON method_ref\r
1714                         | D_FIRE method_ref\r
1715                         | D_OTHER method_ref\r
1716                         | customattr_decl\r
1717                         | extsource_spec\r
1718                         | language_decl\r
1719                         ;\r
1720 \r
1721 prop_all                : prop_head OPEN_BRACE prop_decls CLOSE_BRACE\r
1722                         ;\r
1723 \r
1724 prop_head               : D_PROPERTY prop_attr type id OPEN_PARENS sig_args CLOSE_PARENS init_opt\r
1725                         ;\r
1726 \r
1727 prop_attr               : /* EMPTY */\r
1728                         | prop_attr K_RTSPECIALNAME\r
1729                         | prop_attr K_SPECIALNAME\r
1730                         ;\r
1731 \r
1732 prop_decls              : /* EMPTY */\r
1733                         | prop_decls prop_decl\r
1734                         ;\r
1735 \r
1736 prop_decl               : D_SET method_ref\r
1737                         | D_GET method_ref\r
1738                         | D_OTHER method_ref\r
1739                         | customattr_decl\r
1740                         | extsource_spec\r
1741                         | language_decl\r
1742                         ;\r
1743 \r
1744 customattr_decl         : D_CUSTOM custom_type\r
1745                         | D_CUSTOM custom_type ASSIGN comp_qstring\r
1746                         | D_CUSTOM custom_type ASSIGN OPEN_PARENS bytes CLOSE_PARENS\r
1747                         | D_CUSTOM OPEN_PARENS owner_type CLOSE_PARENS custom_type\r
1748                         | D_CUSTOM OPEN_PARENS owner_type CLOSE_PARENS custom_type ASSIGN comp_qstring\r
1749                         | D_CUSTOM OPEN_PARENS owner_type CLOSE_PARENS custom_type ASSIGN\r
1750                           OPEN_PARENS bytes CLOSE_PARENS\r
1751                         ;\r
1752                         \r
1753 custom_type             : call_conv type type_spec DOUBLE_COLON D_CTOR OPEN_PARENS sig_args CLOSE_PARENS\r
1754                         | call_conv type D_CTOR OPEN_PARENS sig_args CLOSE_PARENS\r
1755                         ;\r
1756 \r
1757 sec_decl                : D_PERMISSION sec_action type_spec OPEN_PARENS nameval_pairs CLOSE_PARENS\r
1758                         | D_PERMISSION sec_action type_spec\r
1759                         | D_PERMISSIONSET sec_action ASSIGN OPEN_PARENS bytes CLOSE_PARENS\r
1760                         ;\r
1761 \r
1762 nameval_pairs           : nameval_pair \r
1763                         | nameval_pairs COMMA nameval_pair\r
1764                         ;\r
1765 \r
1766 nameval_pair            : comp_qstring ASSIGN cavalue\r
1767                         ;\r
1768 \r
1769 cavalue                 : truefalse\r
1770                         | int32\r
1771                         | int32 OPEN_PARENS int32 CLOSE_PARENS\r
1772                         | comp_qstring \r
1773                         | class_ref OPEN_PARENS K_INT8 COLON int32 CLOSE_PARENS\r
1774                         | class_ref OPEN_PARENS K_INT16 COLON int32 CLOSE_PARENS\r
1775                         | class_ref OPEN_PARENS K_INT32 COLON int32 CLOSE_PARENS\r
1776                         | class_ref OPEN_PARENS int32 CLOSE_PARENS\r
1777                         ;\r
1778 \r
1779 sec_action              : K_REQUEST\r
1780                         | K_DEMAND\r
1781                         | K_ASSERT\r
1782                         | K_DENY\r
1783                         | K_PERMITONLY\r
1784                         | K_LINKCHECK\r
1785                         | K_INHERITCHECK\r
1786                         | K_REQMIN\r
1787                         | K_REQOPT\r
1788                         | K_REQREFUSE\r
1789                         | K_PREJITGRANT\r
1790                         | K_PREJITDENY\r
1791                         | K_NONCASDEMAND\r
1792                         | K_NONCASLINKDEMAND\r
1793                         | K_NONCASINHERITANCE\r
1794                         ;\r
1795 \r
1796 module_head             : D_MODULE\r
1797                         | D_MODULE comp_name\r
1798                         | D_MODULE K_EXTERN comp_name\r
1799                         ;\r
1800 \r
1801 file_decl               : D_FILE file_attr comp_name file_entry D_HASH ASSIGN\r
1802                           OPEN_PARENS bytes CLOSE_PARENS file_entry\r
1803                         | D_FILE file_attr comp_name file_entry\r
1804                         ;\r
1805 \r
1806 file_attr               : /* EMPTY */\r
1807                         | file_attr K_NOMETADATA\r
1808                         ;\r
1809 \r
1810 file_entry              : /* EMPTY */\r
1811                         | D_ENTRYPOINT\r
1812                         ;\r
1813 \r
1814 assembly_all            : assembly_head OPEN_BRACE assembly_decls CLOSE_BRACE\r
1815                         ;\r
1816 \r
1817 assembly_head           : D_ASSEMBLY asm_attr comp_name\r
1818                         ;\r
1819 \r
1820 asm_attr                : /* EMPTY */\r
1821                         | asm_attr K_NOAPPDOMAIN\r
1822                         | asm_attr K_NOPROCESS\r
1823                         | asm_attr K_NOMACHINE\r
1824                         ;\r
1825 \r
1826 assembly_decls          : /* EMPTY */\r
1827                         | assembly_decls assembly_decl\r
1828                         ;\r
1829 \r
1830 assembly_decl           : D_HASH K_ALGORITHM int32\r
1831                         | sec_decl\r
1832                         | asm_or_ref_decl\r
1833                         ;\r
1834 \r
1835 asm_or_ref_decl         : D_PUBLICKEY ASSIGN OPEN_PARENS bytes CLOSE_PARENS\r
1836                         | D_VER int32 COLON int32 COLON int32 COLON int32 \r
1837                         | D_LOCALE comp_qstring\r
1838                         | D_LOCALE ASSIGN OPEN_PARENS bytes CLOSE_PARENS\r
1839                         | customattr_decl\r
1840                         ;\r
1841 \r
1842 assemblyref_all         : assemblyref_head OPEN_BRACE assemblyref_decls CLOSE_BRACE\r
1843                         ;\r
1844 \r
1845 assemblyref_head        : D_ASSEMBLY K_EXTERN comp_name\r
1846                           {\r
1847                                 System.Reflection.AssemblyName asmb_name = \r
1848                                         new System.Reflection.AssemblyName ();\r
1849                                 asmb_name.Name = (string) $3;\r
1850                                 codegen.ExternTable.AddAssembly ((string) $3, asmb_name);\r
1851                           }\r
1852                         | D_ASSEMBLY K_EXTERN comp_name K_AS comp_name\r
1853                           {\r
1854                                 System.Reflection.AssemblyName asmb_name = \r
1855                                         new System.Reflection.AssemblyName ();\r
1856                                 asmb_name.Name = (string) $3;\r
1857                                 codegen.ExternTable.AddAssembly ((string) $5, asmb_name);\r
1858                           }\r
1859                         ;\r
1860 \r
1861 assemblyref_decls       : /* EMPTY */\r
1862                         | assemblyref_decls assemblyref_decl\r
1863                         ;\r
1864 \r
1865 assemblyref_decl        : D_HASH ASSIGN OPEN_PARENS bytes CLOSE_PARENS\r
1866                         | asm_or_ref_decl\r
1867                         | D_PUBLICKEYTOKEN ASSIGN OPEN_PARENS bytes CLOSE_PARENS\r
1868                         ;\r
1869 \r
1870 exptype_all             : exptype_head OPEN_BRACE exptype_decls CLOSE_BRACE\r
1871                         ;\r
1872 \r
1873 exptype_head            : D_CLASS K_EXTERN expt_attr comp_name\r
1874                         ;\r
1875 \r
1876 expt_attr               : /* EMPTY */\r
1877                         | expt_attr K_PRIVATE\r
1878                         | expt_attr K_PUBLIC \r
1879                         | expt_attr K_NESTED K_PUBLIC\r
1880                         | expt_attr K_NESTED K_PRIVATE\r
1881                         | expt_attr K_NESTED K_FAMILY\r
1882                         | expt_attr K_NESTED K_ASSEMBLY\r
1883                         | expt_attr K_NESTED K_FAMANDASSEM\r
1884                         | expt_attr K_NESTED K_FAMORASSEM\r
1885                         ;\r
1886 \r
1887 exptype_decls           : /* EMPTY */\r
1888                         | exptype_decls exptype_decl\r
1889                         ;\r
1890 \r
1891 exptype_decl            : D_FILE comp_name\r
1892                         | D_CLASS K_EXTERN comp_name\r
1893                         | D_CLASS int32\r
1894                         | customattr_decl\r
1895                         ;\r
1896 \r
1897 manifestres_all         : manifestres_head OPEN_BRACE manifestres_decls CLOSE_BRACE\r
1898                         ;\r
1899 \r
1900 manifestres_head        : D_MRESOURCE manres_attr comp_name     \r
1901                         ;\r
1902 \r
1903 manres_attr             : /* EMPTY */\r
1904                         | manres_attr K_PUBLIC\r
1905                         | manres_attr K_PRIVATE\r
1906                         ;\r
1907 \r
1908 manifestres_decls       : /* EMPTY */\r
1909                         | manifestres_decls manifestres_decl\r
1910                         ;\r
1911 \r
1912 manifestres_decl        : D_FILE comp_name K_AT int32\r
1913                         | D_ASSEMBLY K_EXTERN comp_name\r
1914                         | customattr_decl\r
1915                         ;\r
1916 \r
1917 comp_qstring            : QSTRING\r
1918                         | comp_qstring PLUS QSTRING     { $$ = String.Format ("{0}{1}", $1, $3); }\r
1919                         ;\r
1920 \r
1921 int32                   : INT32\r
1922                         | INT64\r
1923                           {\r
1924                                 Int64 int64 = (Int64) $1;\r
1925 \r
1926                                 if (int64 > Int32.MaxValue)\r
1927                                         $$ = Int32.MaxValue;\r
1928                                 else if (int64 < Int32.MinValue)\r
1929                                         $$ = Int32.MinValue;  \r
1930                           }\r
1931                         ;\r
1932 \r
1933 int64                   : INT64\r
1934                         | INT32\r
1935                         ;\r
1936 \r
1937 float64                 : FLOAT64\r
1938                         | K_FLOAT32 OPEN_PARENS int32 CLOSE_PARENS\r
1939                         | K_FLOAT64 OPEN_PARENS int64 CLOSE_PARENS\r
1940                         ;\r
1941 \r
1942 hexbyte                 : HEXBYTE\r
1943                         | INT32         { $$ = Convert.ToByte ($1); }\r
1944                         | ID\r
1945                           {\r
1946                                 $$ = Byte.Parse ((string) $1, NumberStyles.HexNumber);\r
1947                           }\r
1948                         ;\r
1949 \r
1950 bytes                   : /* EMPTY */   { $$ = new byte[0]; }\r
1951                         | hexbytes\r
1952                           {\r
1953                                 ArrayList byte_list = (ArrayList) $1;\r
1954                                 $$ = byte_list.ToArray (typeof (byte));\r
1955                           }\r
1956                         ;\r
1957 \r
1958 hexbytes                : hexbyte\r
1959                           {\r
1960                                 ArrayList byte_list = new ArrayList ();\r
1961                                 byte_list.Add (Convert.ToByte ($1));\r
1962                                 $$ = byte_list;\r
1963                           }\r
1964                         | hexbytes hexbyte\r
1965                           {\r
1966                                 ArrayList byte_list = (ArrayList) $1;\r
1967                                 byte_list.Add (Convert.ToByte ($2));\r
1968                           }\r
1969                         ;\r
1970 \r
1971 truefalse               : K_TRUE\r
1972                         | K_FALSE\r
1973                         ;\r
1974 \r
1975 id                      : ID\r
1976                         | SQSTRING\r
1977                         ;\r
1978 \r
1979 comp_name               : id\r
1980                         | comp_name DOT id\r
1981                           {\r
1982                                 $$ = (string) $1 + '.' + (string) $3;\r
1983                           }\r
1984                         ;\r
1985 \r
1986 \r
1987 %%\r
1988 \r
1989 }\r
1990 \r