* ILParser.jay: Add module refs, allow them to be referenced.
[mono.git] / mcs / ilasm / parser / ILParser.jay
1 %{\r
2 //\r
3 // Mono::ILASM::ILParser\r
4 // \r
5 // (C) Sergey Chaban (serge@wildwestsoftware.com)\r
6 // (C) 2003 Jackson Harper, All rights reserved\r
7 //\r
8 \r
9 using PEAPI;\r
10 using System;\r
11 using System.IO;\r
12 using System.Collections;\r
13 using System.Globalization;\r
14 \r
15 namespace Mono.ILASM {\r
16 \r
17         public class ILParser {\r
18 \r
19                 private CodeGen codegen;\r
20 \r
21                 private bool is_value_class;\r
22                 private bool is_enum_class;\r
23                 private bool pinvoke_info;\r
24                 private string pinvoke_mod;\r
25                 private string pinvoke_meth;\r
26                 private PEAPI.PInvokeAttr pinvoke_attr;\r
27                 private ILTokenizer tokenizer;\r
28                                 \r
29                 public ILParser (CodeGen codegen, ILTokenizer tokenizer)\r
30                 {\r
31                         this.codegen = codegen;\r
32                         this.tokenizer = tokenizer;\r
33                 }\r
34 \r
35                 public CodeGen CodeGen {\r
36                         get { return codegen; }\r
37                 }\r
38                 \r
39 %}\r
40 \r
41 %token EOF\r
42 \r
43 /* ID - alpha-numeric identifier */\r
44 %token ID\r
45 \r
46 /* QSTRING - quoted string */\r
47 %token QSTRING\r
48 \r
49 /* SQSTRING - single quoted string */\r
50 %token SQSTRING\r
51 \r
52 /* COMP_NAME - A name with dots */\r
53 %token COMP_NAME\r
54 \r
55 /* INT32 - 32 bit integer */\r
56 %token INT32\r
57 \r
58 /* INT64 - 64 bit integer */\r
59 %token INT64\r
60 \r
61 /* FLOAT64 - floating point number */\r
62 %token FLOAT64\r
63 \r
64 /* HEXBYTE - two digit hex number */\r
65 %token HEXBYTE\r
66 \r
67 \r
68 /* Punctuation */\r
69 %token DOT           "."\r
70 %token OPEN_BRACE    "{"\r
71 %token CLOSE_BRACE   "}"\r
72 %token OPEN_BRACKET  "["\r
73 %token CLOSE_BRACKET "]"\r
74 %token OPEN_PARENS   "("\r
75 %token CLOSE_PARENS  ")"\r
76 %token COMMA         ","\r
77 %token COLON         ":"\r
78 %token DOUBLE_COLON  "::"\r
79 %token SEMICOLON     ";"\r
80 %token ASSIGN        "="\r
81 %token STAR          "*"\r
82 %token AMPERSAND     "&"\r
83 %token PLUS          "+"\r
84 %token SLASH         "/"\r
85 %token BANG          "!"\r
86 %token ELLIPSIS      "..."\r
87 %token DASH          "-"\r
88 %token OPEN_ANGLE_BRACKET   "<"\r
89 %token CLOSE_ANGLE_BRACKET  ">"\r
90 \r
91 \r
92 \r
93 %token UNKNOWN\r
94 \r
95 \r
96 /* INSTR_* instruction types */\r
97 %token INSTR_NONE\r
98 %token INSTR_VAR\r
99 %token INSTR_I\r
100 %token INSTR_I8\r
101 %token INSTR_R\r
102 %token INSTR_BRTARGET\r
103 %token INSTR_METHOD\r
104 %token INSTR_NEWOBJ\r
105 %token INSTR_FIELD\r
106 %token INSTR_TYPE\r
107 %token INSTR_STRING\r
108 %token INSTR_SIG\r
109 %token INSTR_RVA\r
110 %token INSTR_TOK\r
111 %token INSTR_SWITCH\r
112 %token INSTR_PHI\r
113 %token INSTR_LOCAL\r
114 %token INSTR_PARAM\r
115 \r
116 \r
117 \r
118 \r
119 \r
120 /* Mechanically generated  - DO NOT EDIT! */\r
121 \r
122 \r
123 /* Directives */\r
124 %token D_ADDON\r
125 %token D_ALGORITHM\r
126 %token D_ASSEMBLY\r
127 %token D_BACKING\r
128 %token D_BLOB\r
129 %token D_CAPABILITY\r
130 %token D_CCTOR\r
131 %token D_CLASS\r
132 %token D_COMTYPE\r
133 %token D_CONFIG\r
134 %token D_CONSTRAINT\r
135 %token D_IMAGEBASE\r
136 %token D_CORFLAGS\r
137 %token D_CTOR\r
138 %token D_CUSTOM\r
139 %token D_DATA\r
140 %token D_EMITBYTE\r
141 %token D_ENTRYPOINT\r
142 %token D_EVENT\r
143 %token D_EXELOC\r
144 %token D_EXPORT\r
145 %token D_FIELD\r
146 %token D_FILE\r
147 %token D_FIRE\r
148 %token D_GET\r
149 %token D_HASH\r
150 %token D_IMPLICITCOM\r
151 %token D_LANGUAGE\r
152 %token D_LINE\r
153 %token D_XLINE\r
154 %token D_LOCALE\r
155 %token D_LOCALS\r
156 %token D_MANIFESTRES\r
157 %token D_MAXSTACK\r
158 %token D_METHOD\r
159 %token D_MIME\r
160 %token D_MODULE\r
161 %token D_MRESOURCE\r
162 %token D_NAMESPACE\r
163 %token D_ORIGINATOR\r
164 %token D_OS\r
165 %token D_OTHER\r
166 %token D_OVERRIDE\r
167 %token D_PACK\r
168 %token D_PARAM\r
169 %token D_PERMISSION\r
170 %token D_PERMISSIONSET\r
171 %token D_PROCESSOR\r
172 %token D_PROPERTY\r
173 %token D_PUBLICKEY\r
174 %token D_PUBLICKEYTOKEN\r
175 %token D_REMOVEON\r
176 %token D_SET\r
177 %token D_SIZE\r
178 %token D_SUBSYSTEM\r
179 %token D_TITLE\r
180 %token D_TRY\r
181 %token D_VER\r
182 %token D_VTABLE\r
183 %token D_VTENTRY\r
184 %token D_VTFIXUP\r
185 %token D_ZEROINIT\r
186 \r
187 \r
188 /* Keywords */\r
189 %token K_AT\r
190 %token K_AS\r
191 %token K_IMPLICITCOM\r
192 %token K_IMPLICITRES\r
193 %token K_NOAPPDOMAIN\r
194 %token K_NOPROCESS\r
195 %token K_NOMACHINE\r
196 %token K_EXTERN\r
197 %token K_INSTANCE\r
198 %token K_EXPLICIT\r
199 %token K_DEFAULT\r
200 %token K_VARARG\r
201 %token K_UNMANAGED\r
202 %token K_CDECL\r
203 %token K_STDCALL\r
204 %token K_THISCALL\r
205 %token K_FASTCALL\r
206 %token K_MARSHAL\r
207 %token K_IN\r
208 %token K_OUT\r
209 %token K_OPT\r
210 %token K_LCID\r
211 %token K_RETVAL\r
212 %token K_STATIC\r
213 %token K_PUBLIC\r
214 %token K_PRIVATE\r
215 %token K_FAMILY\r
216 %token K_INITONLY\r
217 %token K_RTSPECIALNAME\r
218 %token K_SPECIALNAME\r
219 %token K_ASSEMBLY\r
220 %token K_FAMANDASSEM\r
221 %token K_FAMORASSEM\r
222 %token K_PRIVATESCOPE\r
223 %token K_LITERAL\r
224 %token K_NOTSERIALIZED\r
225 %token K_VALUE\r
226 %token K_NOT_IN_GC_HEAP\r
227 %token K_INTERFACE\r
228 %token K_SEALED\r
229 %token K_ABSTRACT\r
230 %token K_AUTO\r
231 %token K_SEQUENTIAL\r
232 %token K_ANSI\r
233 %token K_UNICODE\r
234 %token K_AUTOCHAR\r
235 %token K_IMPORT\r
236 %token K_SERIALIZABLE\r
237 %token K_NESTED\r
238 %token K_LATEINIT\r
239 %token K_EXTENDS\r
240 %token K_IMPLEMENTS\r
241 %token K_FINAL\r
242 %token K_VIRTUAL\r
243 %token K_HIDEBYSIG\r
244 %token K_NEWSLOT\r
245 %token K_UNMANAGEDEXP\r
246 %token K_PINVOKEIMPL\r
247 %token K_NOMANGLE\r
248 %token K_OLE\r
249 %token K_LASTERR\r
250 %token K_WINAPI\r
251 %token K_NATIVE\r
252 %token K_IL\r
253 %token K_CIL\r
254 %token K_OPTIL\r
255 %token K_MANAGED\r
256 %token K_FORWARDREF\r
257 %token K_RUNTIME\r
258 %token K_INTERNALCALL\r
259 %token K_SYNCHRONIZED\r
260 %token K_NOINLINING\r
261 %token K_CUSTOM\r
262 %token K_FIXED\r
263 %token K_SYSSTRING\r
264 %token K_ARRAY\r
265 %token K_VARIANT\r
266 %token K_CURRENCY\r
267 %token K_SYSCHAR\r
268 %token K_VOID\r
269 %token K_BOOL\r
270 %token K_INT8\r
271 %token K_INT16\r
272 %token K_INT32\r
273 %token K_INT64\r
274 %token K_FLOAT32\r
275 %token K_FLOAT64\r
276 %token K_ERROR\r
277 %token K_UNSIGNED\r
278 %token K_DECIMAL\r
279 %token K_DATE\r
280 %token K_BSTR\r
281 %token K_LPSTR\r
282 %token K_LPWSTR\r
283 %token K_LPTSTR\r
284 %token K_OBJECTREF\r
285 %token K_IUNKNOWN\r
286 %token K_IDISPATCH\r
287 %token K_STRUCT\r
288 %token K_SAFEARRAY\r
289 %token K_INT\r
290 %token K_BYVALSTR\r
291 %token K_TBSTR\r
292 %token K_LPVOID\r
293 %token K_ANY\r
294 %token K_FLOAT\r
295 %token K_LPSTRUCT\r
296 %token K_NULL\r
297 %token K_PTR\r
298 %token K_VECTOR\r
299 %token K_HRESULT\r
300 %token K_CARRAY\r
301 %token K_USERDEFINED\r
302 %token K_RECORD\r
303 %token K_FILETIME\r
304 %token K_BLOB\r
305 %token K_STREAM\r
306 %token K_STORAGE\r
307 %token K_STREAMED_OBJECT\r
308 %token K_STORED_OBJECT\r
309 %token K_BLOB_OBJECT\r
310 %token K_CF\r
311 %token K_CLSID\r
312 %token K_METHOD\r
313 %token K_CLASS\r
314 %token K_PINNED\r
315 %token K_MODREQ\r
316 %token K_MODOPT\r
317 %token K_TYPEDREF\r
318 %token K_WCHAR\r
319 %token K_CHAR\r
320 %token K_FROMUNMANAGED\r
321 %token K_CALLMOSTDERIVED\r
322 %token K_BYTEARRAY\r
323 %token K_WITH\r
324 %token K_INIT\r
325 %token K_TO\r
326 %token K_CATCH\r
327 %token K_FILTER\r
328 %token K_FINALLY\r
329 %token K_FAULT\r
330 %token K_HANDLER\r
331 %token K_TLS\r
332 %token K_FIELD\r
333 %token K_REQUEST\r
334 %token K_DEMAND\r
335 %token K_ASSERT\r
336 %token K_DENY\r
337 %token K_PERMITONLY\r
338 %token K_LINKCHECK\r
339 %token K_INHERITCHECK\r
340 %token K_REQMIN\r
341 %token K_REQOPT\r
342 %token K_REQREFUSE\r
343 %token K_PREJITGRANT\r
344 %token K_PREJITDENY\r
345 %token K_NONCASDEMAND\r
346 %token K_NONCASLINKDEMAND\r
347 %token K_NONCASINHERITANCE\r
348 %token K_READONLY\r
349 %token K_NOMETADATA\r
350 %token K_ALGORITHM\r
351 %token K_FULLORIGIN\r
352 // %token K_NAN\r
353 // %token K_INF\r
354 %token K_PUBLICKEY\r
355 %token K_ENABLEJITTRACKING\r
356 %token K_DISABLEJITOPTIMIZER\r
357 %token K_PRESERVESIG\r
358 %token K_BEFOREFIELDINIT\r
359 %token K_ALIGNMENT\r
360 %token K_NULLREF\r
361 %token K_VALUETYPE\r
362 %token K_COMPILERCONTROLLED\r
363 %token K_REQSECOBJ\r
364 %token K_ENUM\r
365 %token K_OBJECT\r
366 %token K_STRING\r
367 %token K_TRUE\r
368 %token K_FALSE\r
369 %token K_IS\r
370 \r
371 /* end generated */\r
372 \r
373 \r
374 \r
375 \r
376 \r
377 %start il_file\r
378 \r
379 %%\r
380 \r
381 il_file                 : decls\r
382                         ;\r
383 \r
384 decls                   : /* EMPTY */\r
385                         | decls decl\r
386                         ;\r
387 \r
388 decl                    : class_all\r
389                         | namespace_all\r
390                         | method_all\r
391                         | field_decl\r
392                         | data_decl\r
393                         | vtfixup_decl\r
394                         | file_decl\r
395                         | assembly_all\r
396                         | assemblyref_all\r
397                         | exptype_all\r
398                         | manifestres_all\r
399                         | module_head\r
400                         | sec_decl\r
401                         | customattr_decl\r
402                         | D_SUBSYSTEM int32\r
403                           {\r
404                                 codegen.SetSubSystem ((int) $2);\r
405                           }\r
406                         | D_CORFLAGS int32\r
407                           {\r
408                                 codegen.SetCorFlags ((int) $2);\r
409                           }\r
410                         | D_FILE K_ALIGNMENT int32\r
411                         | D_IMAGEBASE int64\r
412                           {\r
413                                 codegen.SetImageBase ((long) $2);\r
414                           }\r
415                         | extsource_spec\r
416                         | language_decl\r
417                         ;\r
418 \r
419 extsource_spec          : D_LINE int32 SQSTRING\r
420                         | D_LINE int32\r
421                         | D_LINE int32 COLON int32 SQSTRING\r
422                         | D_LINE int32 COLON int32\r
423                         ;\r
424 \r
425 language_decl           : D_LANGUAGE SQSTRING\r
426                         | D_LANGUAGE SQSTRING COMMA SQSTRING\r
427                         | D_LANGUAGE SQSTRING COMMA SQSTRING COMMA SQSTRING\r
428                         ;\r
429 \r
430 constraint_decl         : D_CONSTRAINT BANG int32 K_IS type\r
431                           {\r
432                                 codegen.CurrentTypeDef.AddGenericConstraint ((int) $3, (ITypeRef) $5);\r
433                           }\r
434                         ;\r
435                         \r
436 vtfixup_decl            : D_VTFIXUP OPEN_BRACKET int32 CLOSE_BRACKET \r
437                           vtfixup_attr K_AT id\r
438                         ;\r
439 \r
440 vtfixup_attr            : /* EMPTY */\r
441                         | vtfixup_attr int32\r
442                         | vtfixup_attr int64\r
443                         | vtfixup_attr K_FROMUNMANAGED\r
444                         | vtfixup_attr K_CALLMOSTDERIVED\r
445                         ;\r
446 \r
447 namespace_all           : namespace_head OPEN_BRACE decls CLOSE_BRACE\r
448                           {\r
449                                 codegen.CurrentNameSpace = null;\r
450                           }\r
451                         ;\r
452 \r
453 namespace_head          : D_NAMESPACE comp_name\r
454                           {\r
455                                 codegen.CurrentNameSpace = (string) $2;\r
456                           }\r
457                         ;\r
458 \r
459 class_all               : class_head OPEN_BRACE class_decls CLOSE_BRACE\r
460                           {\r
461                                 codegen.EndTypeDef ();\r
462                           }\r
463                         ;\r
464 \r
465 class_head              : D_CLASS class_attr id formal_typars_clause extends_clause\r
466                           impl_clause\r
467                           {\r
468                                 codegen.BeginTypeDef ((TypeAttr) $2, (string) $3, \r
469                                                 $5 as IClassRef, $6 as ArrayList, null);\r
470                                 \r
471                                 if (is_value_class)\r
472                                         codegen.CurrentTypeDef.MakeValueClass ();\r
473                                 if (is_enum_class)\r
474                                         codegen.CurrentTypeDef.MakeEnumClass ();\r
475 \r
476                                 if ($4 != null) {\r
477                                         ArrayList typars_list = (ArrayList) $4;\r
478                                         foreach (string id in typars_list)\r
479                                                 codegen.CurrentTypeDef.AddGenericParam (id);\r
480                                 }                                \r
481                           }\r
482                         ;\r
483 \r
484 class_attrs             : class_attrs class_attr\r
485                         ;\r
486 \r
487 class_attr              : /* EMPTY */                           \r
488                           { \r
489                                 // Reset some flags\r
490                                 is_value_class = false;\r
491                                 is_enum_class = false;\r
492                                 $$ = new TypeAttr ();\r
493                           }\r
494                         | class_attr K_PUBLIC                   { $$ = (TypeAttr)$1 | TypeAttr.Public; }        \r
495                         | class_attr K_PRIVATE                  { $$ = (TypeAttr)$1 | TypeAttr.Private; }\r
496                         | class_attr K_NESTED K_PRIVATE         { $$ = (TypeAttr)$1 | TypeAttr.NestedPrivate; }\r
497                         | class_attr K_NESTED K_PUBLIC          { $$ = (TypeAttr)$1 | TypeAttr.NestedPublic; }\r
498                         | class_attr K_NESTED K_FAMILY          { $$ = (TypeAttr)$1 | TypeAttr.NestedFamily; }\r
499                         | class_attr K_NESTED K_ASSEMBLY        { $$ = (TypeAttr)$1 | TypeAttr.NestedAssembly;}\r
500                         | class_attr K_NESTED K_FAMANDASSEM     { $$ = (TypeAttr)$1 | TypeAttr.NestedFamAndAssem; }\r
501                         | class_attr K_NESTED K_FAMORASSEM      { $$ = (TypeAttr)$1 | TypeAttr.NestedFamOrAssem; }\r
502                         | class_attr K_VALUE                    { is_value_class = true; }\r
503                         | class_attr K_ENUM                     { is_enum_class = true; is_value_class = true;\r
504                           }\r
505                         | class_attr K_INTERFACE                { $$ = (TypeAttr)$1 | TypeAttr.Interface; }\r
506                         | class_attr K_SEALED                   { $$ = (TypeAttr)$1 | TypeAttr.Sealed; }\r
507                         | class_attr K_ABSTRACT                 { $$ = (TypeAttr)$1 | TypeAttr.Abstract; }\r
508                         | class_attr K_AUTO                     {  }\r
509                         | class_attr K_SEQUENTIAL               { $$ = (TypeAttr)$1 | TypeAttr.SequentialLayout; }\r
510                         | class_attr K_EXPLICIT                 { $$ = (TypeAttr)$1 | TypeAttr.ExplicitLayout; }\r
511                         | class_attr K_ANSI                     {  }\r
512                         | class_attr K_UNICODE                  { $$ = (TypeAttr)$1 | TypeAttr.UnicodeClass; }\r
513                         | class_attr K_AUTOCHAR                 { $$ = (TypeAttr)$1 | TypeAttr.AutoClass; }\r
514                         | class_attr K_IMPORT                   { $$ = (TypeAttr)$1 | TypeAttr.Import; }\r
515                         | class_attr K_SERIALIZABLE             { $$ = (TypeAttr)$1 | TypeAttr.Serializable; }\r
516                         | class_attr K_BEFOREFIELDINIT          { $$ = (TypeAttr)$1 | TypeAttr.BeforeFieldInit; }\r
517                         | class_attr K_SPECIALNAME              { $$ = (TypeAttr)$1 | TypeAttr.SpecialName; }\r
518                         | class_attr K_RTSPECIALNAME            { $$ = (TypeAttr)$1 | TypeAttr.RTSpecialName; }\r
519                         ;\r
520 \r
521 extends_clause          : /* EMPTY */\r
522                         | K_EXTENDS class_ref\r
523                           {\r
524                                 $$ = $2;\r
525                           }\r
526                         ;\r
527 \r
528 impl_clause             : /* EMPTY */\r
529                         | K_IMPLEMENTS class_refs\r
530                           {\r
531                                 $$ = $2;\r
532                           }\r
533                         ;\r
534 \r
535 formal_typars_clause           : /* EMPTY */\r
536                         | OPEN_ANGLE_BRACKET formal_typars CLOSE_ANGLE_BRACKET\r
537                           {\r
538                                 $$ = $2;\r
539                           }\r
540                         ;\r
541 \r
542 typars_clause           : /* EMPTY */\r
543                         | OPEN_ANGLE_BRACKET typars CLOSE_ANGLE_BRACKET\r
544                           {\r
545                                 $$ = $2;\r
546                           }\r
547                         ;\r
548 \r
549 typars                  : type\r
550                           {\r
551                                 ArrayList typars_list = new ArrayList ();\r
552                                 typars_list.Add ($1);\r
553                                 $$ = typars_list;\r
554                           }\r
555                         | typars COMMA type\r
556                           {\r
557                                 ArrayList typars_list = (ArrayList) $1;\r
558                                 typars_list.Add ($3);\r
559                                 $$ = typars_list;\r
560                           }\r
561                         ;\r
562 \r
563 formal_typars           : formal_typar\r
564                           {\r
565                                 ArrayList formal_list = new ArrayList ();\r
566                                 formal_list.Add ($1);\r
567                                 $$ = formal_list;\r
568                           }\r
569                         | formal_typars COMMA formal_typar\r
570                           {\r
571                                 ArrayList formal_list = (ArrayList) $1;\r
572                                 formal_list.Add ($3);\r
573                                 $$ = formal_list;\r
574                           }\r
575                         ;\r
576 \r
577 \r
578 formal_typar            : id\r
579                           {\r
580                                 $$ = $1;\r
581                           }\r
582                         ;\r
583                         \r
584 class_refs              : class_ref\r
585                           {\r
586                                 ArrayList class_list = new ArrayList ();\r
587                                 class_list.Add ($1);\r
588                                 $$ = class_list; \r
589                           }\r
590                         | class_refs COMMA class_ref\r
591                           {\r
592                                 ArrayList class_list = (ArrayList) $1;\r
593                                 class_list.Add ($3);\r
594                           }\r
595                         ;\r
596 \r
597 slashed_name            : comp_name\r
598                         | slashed_name SLASH comp_name\r
599                           {\r
600                                 $$ = String.Format ("{0}/{1}", $1, $3);\r
601                           }\r
602                         ;\r
603 \r
604 class_ref               : OPEN_BRACKET slashed_name CLOSE_BRACKET slashed_name\r
605                           {\r
606                                 if (codegen.IsThisAssembly ((string) $2)) {\r
607                                         $$ = new TypeRef ((string) $4, false, null);\r
608                                 } else {\r
609                                         $$ = codegen.ExternTable.GetTypeRef ((string) $2, (string) $4, false);\r
610                                 }\r
611                           }\r
612                         | OPEN_BRACKET D_MODULE slashed_name CLOSE_BRACKET slashed_name\r
613                           {\r
614                                 if (codegen.IsThisModule ((string) $3)) {\r
615                                         $$ = new TypeRef ((string) $5, false, null);\r
616                                 } else {\r
617                                         $$ = codegen.ExternTable.GetModuleTypeRef ((string) $3, (string) $5, false);\r
618                                 }\r
619                           }\r
620                         | slashed_name\r
621                           {\r
622                                 PrimitiveTypeRef prim = PrimitiveTypeRef.GetPrimitiveType ((string) $1);\r
623 \r
624                                 if (prim != null)\r
625                                         $$ = prim;\r
626                                 else\r
627                                         $$ = new TypeRef ((string) $1, false, null);\r
628                           }\r
629                       \r
630                         ;\r
631 \r
632 class_decls             : /* EMPTY */\r
633                         | class_decls class_decl\r
634                         ;\r
635 \r
636 class_decl              : method_all\r
637                         | class_all\r
638                         | event_all\r
639                         | prop_all\r
640                         | field_decl\r
641                         | data_decl\r
642                         | sec_decl\r
643                         | extsource_spec\r
644                         | customattr_decl\r
645                           {\r
646                                 codegen.CurrentTypeDef.AddCustomAttribute ((CustomAttr) $1);\r
647                           }\r
648                         | D_SIZE int32\r
649                           {\r
650                                 codegen.CurrentTypeDef.SetSize ((int) $2);\r
651                           }\r
652                         | D_PACK int32\r
653                           {\r
654                                 codegen.CurrentTypeDef.SetPack ((int) $2);\r
655                           }\r
656                         | D_OVERRIDE type_spec DOUBLE_COLON method_name K_WITH call_conv type\r
657                           type_spec DOUBLE_COLON method_name type_list\r
658                           {\r
659                                 //\r
660                                 // My copy of the spec didn't have a type_list but\r
661                                 // it seems pretty crucial\r
662                                 //\r
663                                 ITypeRef owner = (ITypeRef) $2;\r
664                                 ArrayList arg_list = (ArrayList) $11;\r
665                                 ITypeRef[] param_list;\r
666                                 IMethodRef decl;\r
667 \r
668                                 if (arg_list != null)\r
669                                         param_list = (ITypeRef[]) arg_list.ToArray (typeof (ITypeRef));\r
670                                 else\r
671                                         param_list = new ITypeRef[0];\r
672 \r
673                                 decl = owner.GetMethodRef ((ITypeRef) $7,\r
674                                         (CallConv) $6, (string) $4, param_list);\r
675 \r
676                                 string sig = MethodDef.CreateSignature ((string) $10,\r
677                                                                         param_list);\r
678                                 codegen.CurrentTypeDef.AddOverride (sig, decl);                                        \r
679                           }\r
680                           OPEN_PARENS sig_args CLOSE_PARENS\r
681                         | language_decl\r
682                         | constraint_decl\r
683                         ;\r
684 \r
685 type                    : K_CLASS class_ref\r
686                           {\r
687                                 $$ = $2;\r
688                           }\r
689                         | K_OBJECT\r
690                           {\r
691                                 $$ = new PrimitiveTypeRef (PrimitiveType.Object, "System.Object");\r
692                           }\r
693                         | K_STRING\r
694                           {\r
695                                 $$ = new PrimitiveTypeRef (PrimitiveType.String, "System.String");\r
696                           }\r
697                         | K_VALUE K_CLASS class_ref\r
698                           {\r
699                                 IClassRef class_ref = (IClassRef) $3;\r
700                                 class_ref.MakeValueClass ();\r
701                                 $$ = class_ref;\r
702                           }\r
703                         | K_VALUETYPE OPEN_BRACKET slashed_name CLOSE_BRACKET slashed_name\r
704                           {\r
705                                 ExternTypeRef ext_ref = codegen.ExternTable.GetTypeRef ((string) $3, (string) $5, false);\r
706                                 ExternTypeRefInst inst = new ExternTypeRefInst (ext_ref, true);\r
707                                 $$ = inst;\r
708                           }\r
709                         | K_VALUETYPE slashed_name\r
710                           {\r
711                                 TypeRef t_ref = new TypeRef ((string) $2, true, null);\r
712                                 t_ref.MakeValueClass ();\r
713                                 $$ = t_ref;\r
714                           }\r
715                         | type OPEN_BRACKET CLOSE_BRACKET\r
716                           {\r
717                                 ITypeRef base_type = (ITypeRef) $1;\r
718                                 if (base_type is ExternTypeRef)\r
719                                         base_type = ((ExternTypeRef) base_type).Clone ();\r
720                                 base_type.MakeArray ();\r
721                                 $$ = base_type;\r
722                           }\r
723                         | type OPEN_BRACKET bounds CLOSE_BRACKET\r
724                           {\r
725                                 ITypeRef base_type = (ITypeRef) $1;\r
726                                 if (base_type is ExternTypeRef)\r
727                                         base_type = ((ExternTypeRef) base_type).Clone ();\r
728                                 ArrayList bound_list = (ArrayList) $3;\r
729                                 base_type.MakeBoundArray (bound_list);\r
730                                 $$ = base_type;\r
731                           }\r
732                         | type AMPERSAND\r
733                           {\r
734                                 ITypeRef base_type = (ITypeRef) $1;\r
735                                 if (base_type is ExternTypeRef)\r
736                                         base_type = ((ExternTypeRef) base_type).Clone ();\r
737                                 base_type.MakeManagedPointer ();\r
738                                 $$ = base_type;\r
739                           }\r
740                         | type STAR\r
741                           {\r
742                                 ITypeRef base_type = (ITypeRef) $1;\r
743                                 if (base_type is ExternTypeRef)\r
744                                         base_type = ((ExternTypeRef) base_type).Clone ();\r
745                                 base_type.MakeUnmanagedPointer ();\r
746                                 $$ = base_type;\r
747                           }\r
748                         | type K_PINNED\r
749                           {\r
750                                 ITypeRef base_type = (ITypeRef) $1;\r
751                                 if (base_type is ExternTypeRef)\r
752                                         base_type = ((ExternTypeRef) base_type).Clone ();\r
753                                 base_type.MakePinned ();\r
754                                 $$ = base_type;\r
755                           }\r
756                         | type K_MODREQ OPEN_PARENS class_ref CLOSE_PARENS\r
757                           {\r
758                                 ITypeRef base_type = (ITypeRef) $1;\r
759                                 if (base_type is ExternTypeRef)\r
760                                         base_type = ((ExternTypeRef) base_type).Clone ();\r
761                                 IClassRef class_ref = (IClassRef) $4;\r
762                                 base_type.MakeCustomModified (codegen,\r
763                                         CustomModifier.modopt, class_ref);\r
764                                 $$ = base_type;\r
765                           }\r
766                         | type K_MODOPT OPEN_PARENS class_ref CLOSE_PARENS\r
767                           {\r
768                                 ITypeRef base_type = (ITypeRef) $1;\r
769                                 if (base_type is ExternTypeRef)\r
770                                         base_type = ((ExternTypeRef) base_type).Clone ();\r
771                                 IClassRef class_ref = (IClassRef) $4;\r
772                                 base_type.MakeCustomModified (codegen,\r
773                                         CustomModifier.modopt, class_ref);\r
774                                 $$ = base_type;\r
775                           }\r
776                         | K_METHOD call_conv type STAR OPEN_PARENS sig_args CLOSE_PARENS\r
777                         | K_TYPEDREF\r
778                           {\r
779                                 $$ = new PrimitiveTypeRef (PrimitiveType.TypedRef,\r
780                                         "System.TypedReference");\r
781                           }\r
782                         | K_CHAR\r
783                           {\r
784                                 $$ = new PrimitiveTypeRef (PrimitiveType.Char, "System.Char");\r
785                           }\r
786                         | K_WCHAR\r
787                           {\r
788                                 $$ = new PrimitiveTypeRef (PrimitiveType.Char, "System.Char");\r
789                           }\r
790                         | K_VOID\r
791                           {\r
792                                 $$ = new PrimitiveTypeRef (PrimitiveType.Void, "System.Void");\r
793                           }\r
794                         | K_BOOL\r
795                           {\r
796                                 $$ = new PrimitiveTypeRef (PrimitiveType.Boolean, "System.Bool");\r
797                           }\r
798                         | K_INT8\r
799                           {\r
800                                 $$ = new PrimitiveTypeRef (PrimitiveType.Int8, "System.Int8");\r
801                           }\r
802                         | K_INT16\r
803                           {\r
804                                 $$ = new PrimitiveTypeRef (PrimitiveType.Int16, "System.Int16");\r
805                           }\r
806                         | K_INT32\r
807                           {\r
808                                 $$ = new PrimitiveTypeRef (PrimitiveType.Int32, "System.Int32");\r
809                           }\r
810                         | K_INT64\r
811                           {\r
812                                 $$ = new PrimitiveTypeRef (PrimitiveType.Int64, "System.Int64");\r
813                           }\r
814                         | K_FLOAT32\r
815                           {\r
816                                 $$ = new PrimitiveTypeRef (PrimitiveType.Float32, "System.Float32");\r
817                           }\r
818                         | K_FLOAT64\r
819                           {\r
820                                 $$ = new PrimitiveTypeRef (PrimitiveType.Float64, "System.Float64");\r
821                           }\r
822                         | K_UNSIGNED K_INT8\r
823                           {\r
824                                 $$ = new PrimitiveTypeRef (PrimitiveType.UInt8, "System.UInt8");\r
825                           }\r
826                         | K_UNSIGNED K_INT16\r
827                           {\r
828                                 $$ = new PrimitiveTypeRef (PrimitiveType.UInt16, "System.UInt16");     \r
829                           }\r
830                         | K_UNSIGNED K_INT32\r
831                           {\r
832                                 $$ = new PrimitiveTypeRef (PrimitiveType.UInt32, "System.UInt32");\r
833                           }\r
834                         | K_UNSIGNED K_INT64\r
835                           {\r
836                                 $$ = new PrimitiveTypeRef (PrimitiveType.UInt64, "System.UInt64");\r
837                           }\r
838                         | K_NATIVE K_INT\r
839                           {\r
840                                 // TODO: Is this the proper full name\r
841                                 $$ = new PrimitiveTypeRef (PrimitiveType.NativeInt, "System.IntPtr");\r
842                           }\r
843                         \r
844                         | K_NATIVE K_UNSIGNED K_INT\r
845                           {\r
846                                 $$ = new PrimitiveTypeRef (PrimitiveType.NativeUInt, "System.UIntPtr");\r
847                           }\r
848                         | BANG int32\r
849                           {\r
850                                 GenericTypeSpec spec = new GenericTypeSpec ((int) $2);\r
851                                 $$ = new GenericTypeRef (spec, $2.ToString ());\r
852                           }\r
853                         | BANG BANG int32\r
854                           {\r
855                                 MVar mvar = new MVar ((int) $3);\r
856                                 $$ = new GenericTypeRef (mvar, $3.ToString ());\r
857                           }\r
858                         | K_CLASS slashed_name OPEN_ANGLE_BRACKET BANG int32 CLOSE_ANGLE_BRACKET\r
859                           {\r
860                                 $$ = new TypeRef ((string) $2, false, null);\r
861                           }\r
862                         | K_CLASS slashed_name OPEN_ANGLE_BRACKET typars CLOSE_ANGLE_BRACKET\r
863                           {\r
864                                 ArrayList typar_list = (ArrayList) $4;\r
865                                 ITypeRef[] typar_array = (ITypeRef[]) typar_list.ToArray (typeof (ITypeRef));\r
866                                 \r
867                                 $$ = new GenericTypeInst ((string)$2, typar_array);\r
868                           }\r
869                         ;\r
870 \r
871 bounds                  : bound\r
872                           {\r
873                                 ArrayList bound_list = new ArrayList ();\r
874                                 bound_list.Add ($1);\r
875                                 $$ = bound_list;\r
876                           }\r
877                         | bounds COMMA bound\r
878                           {\r
879                                 ArrayList bound_list = (ArrayList) $1;\r
880                                 bound_list.Add ($3);\r
881                           }\r
882                         ;\r
883 \r
884 bound                   : /* EMPTY */\r
885                           {\r
886                                 // This is shortref for no lowerbound or size\r
887                                 $$ = new DictionaryEntry (TypeRef.Ellipsis, TypeRef.Ellipsis);\r
888                           }\r
889                         | ELLIPSIS\r
890                           {\r
891                                 // No lower bound or size\r
892                                 $$ = new DictionaryEntry (TypeRef.Ellipsis, TypeRef.Ellipsis);\r
893                           }\r
894                         | int32\r
895                           {\r
896                                 // ******** Not sure what this is?\r
897                                 // For now I will say it is size because there\r
898                                 // is allready a way to set lower\r
899                                 $$ = new DictionaryEntry (TypeRef.Ellipsis, $1);\r
900                           }\r
901                         | int32 ELLIPSIS int32\r
902                           {\r
903                                 // lower bound and size\r
904                                 $$ = new DictionaryEntry ($1, $3);\r
905                           }\r
906                         | int32 ELLIPSIS\r
907                           {\r
908                                 // Just lower bound\r
909                                 $$ = new DictionaryEntry ($1, TypeRef.Ellipsis);\r
910                           }\r
911                         ;\r
912 \r
913 call_conv               : K_INSTANCE call_conv\r
914                           {\r
915                                 $$ = (CallConv) $2 | CallConv.Instance;\r
916                           }\r
917                         | K_EXPLICIT call_conv\r
918                           {\r
919                                 $$ = (CallConv) $2 | CallConv.InstanceExplicit;\r
920                           }\r
921                         | call_kind\r
922                         ;\r
923 \r
924 call_kind               : /* EMPTY */\r
925                           {\r
926                                 $$ = new CallConv ();\r
927                           }\r
928                         | K_DEFAULT\r
929                           {\r
930                                 $$ = CallConv.Default;\r
931                           }\r
932                         | K_VARARG\r
933                           {\r
934                                 $$ = CallConv.Vararg;\r
935                           }\r
936                         | K_UNMANAGED K_CDECL\r
937                           {\r
938                                 $$ = CallConv.Cdecl;\r
939                           }\r
940                         | K_UNMANAGED K_STDCALL\r
941                           {\r
942                                 $$ = CallConv.Stdcall;\r
943                           }\r
944                         | K_UNMANAGED K_THISCALL\r
945                           {\r
946                                 $$ = CallConv.Thiscall;\r
947                           }\r
948                         | K_UNMANAGED K_FASTCALL\r
949                           {\r
950                                 $$ = CallConv.Fastcall;\r
951                           }\r
952                         ;\r
953 \r
954 native_type             : /* EMPTY */\r
955                         | K_CUSTOM OPEN_PARENS comp_qstring COMMA comp_qstring CLOSE_PARENS\r
956                         | K_FIXED K_SYSSTRING OPEN_BRACKET int32 CLOSE_BRACKET\r
957                           {\r
958                                 $$ = NativeType.FixedSysString;\r
959                           }\r
960                         | K_FIXED K_ARRAY OPEN_BRACKET int32 CLOSE_BRACKET\r
961                         | K_VARIANT\r
962                         | K_CURRENCY\r
963                           {\r
964                                 $$ = NativeType.Currency;\r
965                           }\r
966                         | K_SYSCHAR\r
967                         | K_VOID\r
968                           {\r
969                                 $$ = NativeType.Void;\r
970                           }\r
971                         | K_BOOL\r
972                           {\r
973                                 $$ = NativeType.Boolean;\r
974                           }\r
975                         | K_INT8\r
976                           {\r
977                                 $$ = NativeType.Int8;\r
978                           }\r
979                         | K_INT16\r
980                           {\r
981                                 $$ = NativeType.Int16;\r
982                           }\r
983                         | K_INT32\r
984                           {\r
985                                 $$ = NativeType.Int32;\r
986                           }\r
987                         | K_INT64\r
988                           {\r
989                                 $$ = NativeType.Int64;\r
990                           }\r
991                         | K_FLOAT32\r
992                           {\r
993                                 $$ = NativeType.Float32;\r
994                           }\r
995                         | K_FLOAT64\r
996                           {\r
997                                 $$ = NativeType.Float64;\r
998                           }\r
999                         | K_ERROR\r
1000                         | K_UNSIGNED K_INT8\r
1001                           {\r
1002                                 $$ = NativeType.UInt8;\r
1003                           }\r
1004                         | K_UNSIGNED K_INT16\r
1005                           {\r
1006                                 $$ = NativeType.UInt16;\r
1007                           }\r
1008                         | K_UNSIGNED K_INT32\r
1009                           {\r
1010                                 $$ = NativeType.UInt32;\r
1011                           }\r
1012                         | K_UNSIGNED K_INT64\r
1013                           {\r
1014                                 $$ = NativeType.UInt64;\r
1015                           }\r
1016                         | native_type STAR\r
1017                         | native_type OPEN_BRACKET CLOSE_BRACKET\r
1018                         | native_type OPEN_BRACKET int32 CLOSE_BRACKET\r
1019                         | native_type OPEN_BRACKET int32 PLUS int32 CLOSE_BRACKET\r
1020                         | native_type OPEN_BRACKET PLUS int32 CLOSE_BRACKET\r
1021                         | K_DECIMAL\r
1022                         | K_DATE\r
1023                         | K_BSTR\r
1024                           {\r
1025                                 $$ = NativeType.BStr;\r
1026                           }\r
1027                         | K_LPSTR\r
1028                           {\r
1029                                 $$ = NativeType.LPStr;\r
1030                           }\r
1031                         | K_LPWSTR\r
1032                           {\r
1033                                 $$ = NativeType.LPWStr;\r
1034                           }\r
1035                         | K_LPTSTR\r
1036                           {\r
1037                                 $$ = NativeType.LPTStr;\r
1038                           }\r
1039                         | K_OBJECTREF\r
1040                         | K_IUNKNOWN\r
1041                           {\r
1042                                 $$ = NativeType.IUnknown;\r
1043                           }\r
1044                         | K_IDISPATCH\r
1045                           {\r
1046                                 $$ = NativeType.IDispatch;\r
1047                           }\r
1048                         | K_STRUCT\r
1049                           {\r
1050                                 $$ = NativeType.Struct;\r
1051                           }\r
1052                         | K_INTERFACE\r
1053                           {\r
1054                                 $$ = NativeType.Interface;\r
1055                           }\r
1056                         | K_SAFEARRAY variant_type\r
1057                         | K_SAFEARRAY variant_type COMMA comp_qstring\r
1058                         | K_INT\r
1059                           {\r
1060                                 $$ = NativeType.Int;\r
1061                           }\r
1062                         | K_UNSIGNED K_INT\r
1063                           {\r
1064                                 $$ = NativeType.UInt;\r
1065                           }\r
1066                         | K_NESTED K_STRUCT\r
1067                         | K_BYVALSTR\r
1068                           {\r
1069                                 $$ = NativeType.ByValStr;\r
1070                           }\r
1071                         | K_ANSI K_BSTR\r
1072                           {\r
1073                                 $$ = NativeType.AnsiBStr;\r
1074                           }\r
1075                         | K_TBSTR\r
1076                           {\r
1077                                 $$ = NativeType.TBstr;\r
1078                           }\r
1079                         | K_VARIANT K_BOOL\r
1080                           {\r
1081                                 $$ = NativeType.VariantBool;\r
1082                           }\r
1083                         | K_METHOD\r
1084                         | K_AS K_ANY\r
1085                           {\r
1086                                 $$ = NativeType.AsAny;\r
1087                           }\r
1088                         | K_LPSTRUCT\r
1089                         ;\r
1090 \r
1091 variant_type            : /* EMPTY */\r
1092                         | K_NULL\r
1093                         | K_VARIANT\r
1094                         | K_CURRENCY\r
1095                         | K_VOID\r
1096                         | K_BOOL\r
1097                         | K_INT8\r
1098                         | K_INT16\r
1099                         | K_INT32\r
1100                         | K_INT64\r
1101                         | K_FLOAT32\r
1102                         | K_FLOAT64\r
1103                         | K_UNSIGNED K_INT8\r
1104                         | K_UNSIGNED K_INT16\r
1105                         | K_UNSIGNED K_INT32\r
1106                         | K_UNSIGNED K_INT64\r
1107                         | STAR\r
1108                         | variant_type OPEN_BRACKET CLOSE_BRACKET\r
1109                         | variant_type K_VECTOR\r
1110                         | variant_type AMPERSAND\r
1111                         | K_DECIMAL\r
1112                         | K_DATE\r
1113                         | K_BSTR\r
1114                         | K_LPSTR\r
1115                         | K_LPWSTR\r
1116                         | K_IUNKNOWN\r
1117                         | K_IDISPATCH\r
1118                         | K_SAFEARRAY\r
1119                         | K_INT\r
1120                         | K_UNSIGNED K_INT\r
1121                         | K_ERROR\r
1122                         | K_HRESULT\r
1123                         | K_CARRAY\r
1124                         | K_USERDEFINED\r
1125                         | K_RECORD\r
1126                         | K_FILETIME\r
1127                         | K_BLOB\r
1128                         | K_STREAM\r
1129                         | K_STORAGE\r
1130                         | K_STREAMED_OBJECT\r
1131                         | K_STORED_OBJECT\r
1132                         | K_BLOB_OBJECT\r
1133                         | K_CF\r
1134                         | K_CLSID\r
1135                         ;\r
1136 \r
1137 field_decl              : D_FIELD repeat_opt field_attr type id at_opt init_opt\r
1138                           {\r
1139                                 FieldDef field_def = new FieldDef((FieldAttr) $3, \r
1140                                         (string) $5, (ITypeRef) $4);\r
1141                                 codegen.AddFieldDef (field_def);\r
1142                                 \r
1143                                 if ($2 != null) {\r
1144                                         field_def.SetOffset ((uint) $2);\r
1145                                 }\r
1146 \r
1147                                 if ($6 != null) {\r
1148                                         field_def.AddDataValue ((string) $6);\r
1149                                 }\r
1150 \r
1151                                 if ($7 != null) {\r
1152                                         field_def.SetValue ((Constant) $7);\r
1153                                 }\r
1154                           }\r
1155                         ;\r
1156 \r
1157 repeat_opt              : /* EMPTY */\r
1158                         | OPEN_BRACKET int32 CLOSE_BRACKET\r
1159                           {\r
1160                                 $$ = $2;\r
1161                           }\r
1162                         ;\r
1163 \r
1164 field_attr              : /* EMPTY */\r
1165                           {\r
1166                                 $$ = new FieldAttr ();\r
1167                           }\r
1168                         | field_attr K_PUBLIC\r
1169                           {\r
1170                                 $$ = (FieldAttr) $1 | FieldAttr.Public;\r
1171                           }\r
1172                         | field_attr K_PRIVATE\r
1173                           {\r
1174                                 $$ = (FieldAttr) $1 | FieldAttr.Private;\r
1175                           }\r
1176                         | field_attr K_FAMILY\r
1177                           {\r
1178                                 $$ = (FieldAttr) $1 | FieldAttr.Family;\r
1179                           }\r
1180                         | field_attr K_ASSEMBLY\r
1181                           {\r
1182                                 $$ = (FieldAttr) $1 | FieldAttr.Assembly;\r
1183                           }\r
1184                         | field_attr K_FAMANDASSEM\r
1185                           {\r
1186                                 $$ = (FieldAttr) $1 | FieldAttr.FamAndAssem;\r
1187                           }\r
1188                         | field_attr K_FAMORASSEM\r
1189                           {\r
1190                                 $$ = (FieldAttr) $1 | FieldAttr.FamOrAssem;\r
1191                           }\r
1192                         | field_attr K_PRIVATESCOPE\r
1193                           {\r
1194                                 // This is just 0x0000\r
1195                           }\r
1196                         | field_attr K_STATIC\r
1197                           {\r
1198                                 $$ = (FieldAttr) $1 | FieldAttr.Static;\r
1199                           }\r
1200                         | field_attr K_INITONLY\r
1201                           {\r
1202                                 $$ = (FieldAttr) $1 | FieldAttr.Initonly;\r
1203                           }\r
1204                         | field_attr K_RTSPECIALNAME\r
1205                           {\r
1206                                 $$ = (FieldAttr) $1 | FieldAttr.RTSpecialName;\r
1207                           }\r
1208                         | field_attr K_SPECIALNAME\r
1209                           {\r
1210                                 $$ = (FieldAttr) $1 | FieldAttr.SpecialName;\r
1211                           }\r
1212                         | field_attr K_MARSHAL OPEN_PARENS native_type CLOSE_PARENS\r
1213                           {\r
1214                                 \r
1215                           }\r
1216                         | field_attr K_LITERAL\r
1217                           {\r
1218                                 $$ = (FieldAttr) $1 | FieldAttr.Literal;\r
1219                           }\r
1220                         | field_attr K_NOTSERIALIZED\r
1221                           {\r
1222                                 $$ = (FieldAttr) $1 | FieldAttr.Notserialized;\r
1223                           }\r
1224                         ;\r
1225 \r
1226 at_opt                  : /* EMPTY */\r
1227                         | K_AT id\r
1228                           {\r
1229                                 $$ = $2;\r
1230                           }\r
1231                         ;\r
1232 \r
1233 init_opt                : /* EMPTY */\r
1234                         | ASSIGN field_init\r
1235                           {\r
1236                                 $$ = $2;\r
1237                           }\r
1238                         ;\r
1239 \r
1240 field_init              : K_FLOAT32 OPEN_PARENS float64 CLOSE_PARENS\r
1241                           {\r
1242                                 $$ = new FloatConst (Convert.ToSingle ($3));\r
1243                           }\r
1244                         | K_FLOAT64 OPEN_PARENS float64 CLOSE_PARENS\r
1245                           {\r
1246                                 $$ = new DoubleConst (Convert.ToDouble ($3));\r
1247                           }\r
1248                         | K_FLOAT32 OPEN_PARENS int64 CLOSE_PARENS\r
1249                           {\r
1250                                 $$ = new FloatConst (Convert.ToSingle ($3));\r
1251                           }\r
1252                         | K_FLOAT64 OPEN_PARENS int64 CLOSE_PARENS\r
1253                           {\r
1254                                 $$ = new DoubleConst (Convert.ToDouble ($3));\r
1255                           }\r
1256                         | K_INT64 OPEN_PARENS int64 CLOSE_PARENS\r
1257                           {\r
1258                                 $$ = new IntConst (Convert.ToInt64 ($3));\r
1259                           }\r
1260                         | K_INT32 OPEN_PARENS int64 CLOSE_PARENS\r
1261                           {\r
1262                                 $$ = new IntConst (Convert.ToInt32 ($3));\r
1263                           }\r
1264                         | K_INT16 OPEN_PARENS int64 CLOSE_PARENS\r
1265                           {\r
1266                                 $$ = new IntConst (Convert.ToInt16 ($3));\r
1267                           }\r
1268                         | K_CHAR OPEN_PARENS int64 CLOSE_PARENS\r
1269                           {\r
1270                                 $$ = new CharConst (Convert.ToChar ($3));\r
1271                           }\r
1272                         | K_WCHAR OPEN_PARENS int64 CLOSE_PARENS\r
1273                           {\r
1274                                 $$ = new CharConst (Convert.ToChar ($3));\r
1275                           }\r
1276                         | K_INT8 OPEN_PARENS int64 CLOSE_PARENS\r
1277                           {\r
1278                                 $$ = new IntConst (Convert.ToByte ($3));\r
1279                           }\r
1280                         | K_BOOL OPEN_PARENS truefalse CLOSE_PARENS\r
1281                           {\r
1282                                 $$ = new BoolConst ((bool) $3);\r
1283                           }\r
1284                         | K_BYTEARRAY bytes_list\r
1285                           {\r
1286                                 $$ = new ByteArrConst ((byte[]) $2);\r
1287                           }\r
1288                         | comp_qstring\r
1289                           {\r
1290                                 // ******** THIS IS NOT IN THE DOCUMENTATION ******** //\r
1291                                 $$ = new StringConst ((string) $1);\r
1292                           }\r
1293                         | K_NULLREF\r
1294                           {\r
1295                                 $$ = new NullConst ();\r
1296                           }\r
1297                         ;\r
1298 \r
1299 data_decl               : data_head data_body\r
1300                           {\r
1301                                 DataDef datadef = (DataDef) $1;\r
1302                                 \r
1303                                 if ($2 is ArrayList) {\r
1304                                         ArrayList const_list = (ArrayList) $2;\r
1305                                         DataConstant[] const_arr = new DataConstant[const_list.Count];\r
1306                                         \r
1307                                         for (int i=0; i<const_arr.Length; i++)\r
1308                                                 const_arr[i] = (DataConstant) const_list[i];\r
1309 \r
1310                                         datadef.PeapiConstant = new ArrayConstant (const_arr);\r
1311                                 } else {\r
1312                                         datadef.PeapiConstant = (PEAPI.Constant) $2;\r
1313                                 }\r
1314                                 codegen.AddDataDef (datadef);\r
1315                           }\r
1316                         ;\r
1317 \r
1318 data_head               : D_DATA tls id ASSIGN\r
1319                           {\r
1320                                 $$ = new DataDef ((string) $3, (bool) $2);    \r
1321                           } \r
1322                         | D_DATA tls\r
1323                           {\r
1324                                 $$ = new DataDef (String.Empty, (bool) $2);\r
1325                           }\r
1326                         ;\r
1327 \r
1328 tls                     : /* EMPTY */   { $$ = false; }\r
1329                         | K_TLS         { $$ = true; }\r
1330                         ;\r
1331 \r
1332 data_body               : OPEN_BRACE dataitem_list CLOSE_BRACE\r
1333                         | dataitem\r
1334                         ;\r
1335 \r
1336 dataitem_list           : dataitem\r
1337                           {\r
1338                                 ArrayList dataitem_list = new ArrayList ();\r
1339                                 dataitem_list.Add ($1);\r
1340                                 $$ = dataitem_list;\r
1341                           }\r
1342                         | dataitem_list COMMA dataitem\r
1343                           {\r
1344                                 ArrayList list = (ArrayList) $1;\r
1345                                 list.Add ($3);\r
1346                           }\r
1347                         ;\r
1348 \r
1349 dataitem                : K_CHAR STAR OPEN_PARENS comp_qstring CLOSE_PARENS\r
1350                           {\r
1351                                 $$ = new StringConst ((string) $4);\r
1352                           }\r
1353                         | K_WCHAR STAR OPEN_PARENS comp_qstring CLOSE_PARENS\r
1354                           {\r
1355                                 $$ = new StringConst ((string) $4);\r
1356                           }\r
1357                         | AMPERSAND OPEN_PARENS id CLOSE_PARENS\r
1358                           {\r
1359                            //     DataDef def = codegen.CurrentTypeDef.GetDataDef ((string) $3);\r
1360                            //     $$ = new AddressConstant ((DataConstant) def.PeapiConstant);\r
1361                           }\r
1362                         | K_BYTEARRAY ASSIGN bytes_list\r
1363                           {\r
1364                                 $$ = new ByteArrConst ((byte[]) $3);\r
1365                           }\r
1366                         | K_BYTEARRAY bytes_list\r
1367                           {\r
1368                                 // ******** THIS IS NOT IN THE SPECIFICATION ******** //\r
1369                                 $$ = new ByteArrConst ((byte[]) $2);\r
1370                           }\r
1371                         | K_FLOAT32 OPEN_PARENS float64 CLOSE_PARENS repeat_opt\r
1372                           {\r
1373                                 double d = (double) $3;\r
1374                                 FloatConst float_const = new FloatConst ((float) d);\r
1375 \r
1376                                 if ($5 != null)\r
1377                                         $$ = new RepeatedConstant (float_const, (int) $5);\r
1378                                 else\r
1379                                         $$ = float_const;\r
1380                           }\r
1381                         | K_FLOAT64 OPEN_PARENS float64 CLOSE_PARENS repeat_opt\r
1382                           {\r
1383                                 DoubleConst double_const = new DoubleConst ((double) $3);\r
1384 \r
1385                                 if ($5 != null)\r
1386                                         $$ = new RepeatedConstant (double_const, (int) $5);\r
1387                                 else\r
1388                                         $$ = double_const;\r
1389                           }\r
1390                         | K_INT64 OPEN_PARENS int64 CLOSE_PARENS repeat_opt\r
1391                           {\r
1392                                 IntConst int_const = new IntConst ((long) $3);\r
1393 \r
1394                                 if ($5 != null)\r
1395                                         $$ = new RepeatedConstant (int_const, (int) $5);\r
1396                                 else\r
1397                                         $$ = int_const;\r
1398                           }\r
1399                         | K_INT32 OPEN_PARENS int32 CLOSE_PARENS repeat_opt\r
1400                           {\r
1401                                 IntConst int_const = new IntConst ((int) $3);\r
1402 \r
1403                                 if ($5 != null)\r
1404                                         $$ = new RepeatedConstant (int_const, (int) $5);\r
1405                                 else\r
1406                                         $$ = int_const;\r
1407                           }\r
1408                         | K_INT16 OPEN_PARENS int32 CLOSE_PARENS repeat_opt\r
1409                           {\r
1410                                 int i = (int) $3;\r
1411                                 IntConst int_const = new IntConst ((short) i);\r
1412 \r
1413                                 if ($5 != null)\r
1414                                         $$ = new RepeatedConstant (int_const, (int) $5);\r
1415                                 else\r
1416                                         $$ = int_const;\r
1417                           }\r
1418                         | K_INT8 OPEN_PARENS int32 CLOSE_PARENS repeat_opt\r
1419                           {\r
1420                                 int i = (int) $3;\r
1421                                 IntConst int_const = new IntConst ((sbyte) i);\r
1422 \r
1423                                 if ($5 != null)\r
1424                                         $$ = new RepeatedConstant (int_const, (int) $5);\r
1425                                 else\r
1426                                         $$ = int_const;\r
1427                           }\r
1428                         | K_FLOAT32 repeat_opt\r
1429                           {\r
1430                                 FloatConst float_const = new FloatConst (0F);\r
1431 \r
1432                                 if ($2 != null)\r
1433                                         $$ = new RepeatedConstant (float_const, (int) $2);\r
1434                                 else\r
1435                                         $$ = float_const;\r
1436                           }\r
1437                         | K_FLOAT64 repeat_opt\r
1438                           {\r
1439                                 DoubleConst double_const = new DoubleConst (0);\r
1440 \r
1441                                 if ($2 != null)\r
1442                                         $$ = new RepeatedConstant (double_const, (int) $2);\r
1443                                 else\r
1444                                         $$ = double_const;\r
1445                           }\r
1446                         | K_INT64 repeat_opt\r
1447                           {\r
1448                                 IntConst int_const = new IntConst ((long) 0);\r
1449 \r
1450                                 if ($2 != null)\r
1451                                         $$ = new RepeatedConstant (int_const, (int) $2);\r
1452                                 else\r
1453                                         $$ = int_const;\r
1454                           }\r
1455                         | K_INT32 repeat_opt\r
1456                           {\r
1457                                 IntConst int_const = new IntConst ((int) 0);\r
1458 \r
1459                                 if ($2 != null)\r
1460                                         $$ = new RepeatedConstant (int_const, (int) $2);\r
1461                                 else\r
1462                                         $$ = int_const;\r
1463                           }\r
1464                         | K_INT16 repeat_opt\r
1465                           {\r
1466                                 IntConst int_const = new IntConst ((short) 0);\r
1467 \r
1468                                 if ($2 != null)\r
1469                                         $$ = new RepeatedConstant (int_const, (int) $2);\r
1470                                 else\r
1471                                         $$ = int_const;\r
1472                           }\r
1473                         | K_INT8 repeat_opt\r
1474                           {\r
1475                                 IntConst int_const = new IntConst ((sbyte) 0);\r
1476 \r
1477                                 if ($2 != null)\r
1478                                         $$ = new RepeatedConstant (int_const, (int) $2);\r
1479                                 else\r
1480                                         $$ = int_const;\r
1481                           }\r
1482                         ;\r
1483 \r
1484 method_all              : method_head OPEN_BRACE method_decls CLOSE_BRACE\r
1485                           {\r
1486                                 codegen.EndMethodDef ();\r
1487                           }\r
1488                         ;\r
1489 \r
1490 method_head             : D_METHOD meth_attr call_conv param_attr type method_name\r
1491                           formal_typars_clause OPEN_PARENS sig_args CLOSE_PARENS impl_attr\r
1492                           {\r
1493                                 MethodDef methdef = new MethodDef ((MethAttr) $2, (CallConv) $3,\r
1494                                         (ImplAttr) $11, (string) $6, (ITypeRef) $5,\r
1495                                         (ArrayList) $9);\r
1496                                 codegen.BeginMethodDef (methdef);\r
1497 \r
1498                                 if (pinvoke_info) {\r
1499                                         methdef.AddPInvokeInfo (pinvoke_attr, pinvoke_mod, pinvoke_meth);\r
1500                                         pinvoke_info = false;\r
1501                                 }\r
1502 \r
1503                                 if ($7 != null) {\r
1504                                         ArrayList typars_list = (ArrayList) $7;\r
1505                                         foreach (string id in typars_list)\r
1506                                                 methdef.AddGenericParam (id);\r
1507                                 }\r
1508                           }\r
1509                         | D_METHOD meth_attr call_conv param_attr type \r
1510                           K_MARSHAL OPEN_PARENS native_type CLOSE_PARENS method_name\r
1511                           OPEN_PARENS sig_args CLOSE_PARENS impl_attr\r
1512                         ;\r
1513 \r
1514 meth_attr               : /* EMPTY */                   { $$ = new MethAttr (); }\r
1515                         | meth_attr K_STATIC            { $$ = (MethAttr) $1 | MethAttr.Static; }\r
1516                         | meth_attr K_PUBLIC            { $$ = (MethAttr) $1 | MethAttr.Public; }\r
1517                         | meth_attr K_PRIVATE           { $$ = (MethAttr) $1 | MethAttr.Private; }\r
1518                         | meth_attr K_FAMILY            { $$ = (MethAttr) $1 | MethAttr.Family; }\r
1519                         | meth_attr K_ASSEMBLY          { $$ = (MethAttr) $1 | MethAttr.Assembly; }\r
1520                         | meth_attr K_FAMANDASSEM       { $$ = (MethAttr) $1 | MethAttr.FamAndAssem; } \r
1521                         | meth_attr K_FAMORASSEM        { $$ = (MethAttr) $1 | MethAttr.FamOrAssem; } \r
1522                         | meth_attr K_PRIVATESCOPE      { /* CHECK HEADERS */ }\r
1523                         | meth_attr K_FINAL             { $$ = (MethAttr) $1 | MethAttr.Final; } \r
1524                         | meth_attr K_VIRTUAL           { $$ = (MethAttr) $1 | MethAttr.Virtual; }\r
1525                         | meth_attr K_ABSTRACT          { $$ = (MethAttr) $1 | MethAttr.Abstract; }\r
1526                         | meth_attr K_HIDEBYSIG         { $$ = (MethAttr) $1 | MethAttr.HideBySig; }\r
1527                         | meth_attr K_NEWSLOT           { $$ = (MethAttr) $1 | MethAttr.NewSlot; }\r
1528                         | meth_attr K_REQSECOBJ         { $$ = (MethAttr) $1 | MethAttr.RequireSecObject; }\r
1529                         | meth_attr K_SPECIALNAME       { $$ = (MethAttr) $1 | MethAttr.SpecialName; }\r
1530                         | meth_attr K_RTSPECIALNAME     { $$ = (MethAttr) $1 | MethAttr.RTSpecialName; }\r
1531                         | meth_attr K_COMPILERCONTROLLED { /* Do nothing */ }\r
1532                         | meth_attr K_UNMANAGEDEXP      \r
1533                         | meth_attr K_PINVOKEIMPL OPEN_PARENS comp_qstring K_AS\r
1534                                 comp_qstring pinv_attr CLOSE_PARENS\r
1535                           {\r
1536                                 pinvoke_info = true;\r
1537                                 pinvoke_mod = (string) $4;\r
1538                                 pinvoke_meth = (string) $6;\r
1539                                 pinvoke_attr = (PInvokeAttr) $7;\r
1540                           }\r
1541                         | meth_attr K_PINVOKEIMPL OPEN_PARENS comp_qstring pinv_attr CLOSE_PARENS\r
1542                           {\r
1543                                 pinvoke_info = true;\r
1544                                 pinvoke_mod = (string) $4;\r
1545                                 pinvoke_meth = null;\r
1546                                 pinvoke_attr = (PInvokeAttr) $5;\r
1547                           }\r
1548                         | meth_attr K_PINVOKEIMPL OPEN_PARENS pinv_attr CLOSE_PARENS\r
1549                           {\r
1550                                 pinvoke_info = true;\r
1551                                 pinvoke_mod = null;\r
1552                                 pinvoke_meth = null;\r
1553                                 pinvoke_attr = (PInvokeAttr) $4;\r
1554                           }\r
1555                         ;\r
1556 \r
1557 pinv_attr               : /* EMPTY */ { $$ = new PInvokeAttr (); }\r
1558                         | pinv_attr K_NOMANGLE { $$ = (PInvokeAttr) $1 | PInvokeAttr.nomangle; }\r
1559                         | pinv_attr K_ANSI { $$ = (PInvokeAttr) $1 | PInvokeAttr.ansi; }\r
1560                         | pinv_attr K_UNICODE { $$ = (PInvokeAttr) $1 | PInvokeAttr.unicode; }\r
1561                         | pinv_attr K_AUTOCHAR { $$ = (PInvokeAttr) $1 | PInvokeAttr.autochar; }\r
1562                         | pinv_attr K_LASTERR { $$ = (PInvokeAttr) $1 | PInvokeAttr.lasterr; }\r
1563                         | pinv_attr K_WINAPI { $$ = (PInvokeAttr) $1 | PInvokeAttr.winapi; }\r
1564                         | pinv_attr K_CDECL { $$ = (PInvokeAttr) $1 | PInvokeAttr.cdecl; }\r
1565                         | pinv_attr K_STDCALL { $$ = (PInvokeAttr) $1 | PInvokeAttr.stdcall; }\r
1566                         | pinv_attr K_THISCALL { $$ = (PInvokeAttr) $1 | PInvokeAttr.thiscall; }\r
1567                         | pinv_attr K_FASTCALL { $$ = (PInvokeAttr) $1 | PInvokeAttr.fastcall; }\r
1568                         ;\r
1569 \r
1570 method_name             : D_CTOR\r
1571                         | D_CCTOR\r
1572                         | comp_name\r
1573                         ;\r
1574 \r
1575 param_attr              : /* EMPTY */                                   { $$ = new ParamAttr (); }\r
1576                         | param_attr OPEN_BRACKET K_IN CLOSE_BRACKET    { $$ = (ParamAttr) $1 | ParamAttr.In; }\r
1577                         | param_attr OPEN_BRACKET K_OUT CLOSE_BRACKET   { $$ = (ParamAttr) $1 | ParamAttr.Out; }\r
1578                         | param_attr OPEN_BRACKET K_OPT CLOSE_BRACKET   { $$ = (ParamAttr) $1 | ParamAttr.Opt; }\r
1579                         ;\r
1580 \r
1581 impl_attr               : /* EMPTY */                   { $$ = new ImplAttr (); }\r
1582                         | impl_attr K_NATIVE            { $$ = (ImplAttr) $1 | ImplAttr.Native; }\r
1583                         | impl_attr K_CIL               { $$ = (ImplAttr) $1 | ImplAttr.IL; }\r
1584                         | impl_attr K_IL                { $$ = (ImplAttr) $1 | ImplAttr.IL; }\r
1585                         | impl_attr K_OPTIL             { $$ = (ImplAttr) $1 | ImplAttr.Optil; }\r
1586                         | impl_attr K_MANAGED           { /* should this reset? */ }\r
1587                         | impl_attr K_UNMANAGED         { $$ = (ImplAttr) $1 | ImplAttr.Unmanaged; }\r
1588                         | impl_attr K_FORWARDREF        { $$ = (ImplAttr) $1 | ImplAttr.ForwardRef; }\r
1589                         | impl_attr K_PRESERVESIG       { $$ = (ImplAttr) $1 | ImplAttr.PreserveSig; }\r
1590                         | impl_attr K_RUNTIME           { $$ = (ImplAttr) $1 | ImplAttr.Runtime; }\r
1591                         | impl_attr K_INTERNALCALL      { $$ = (ImplAttr) $1 | ImplAttr.InternalCall; }\r
1592                         | impl_attr K_SYNCHRONIZED      { $$ = (ImplAttr) $1 | ImplAttr.Synchronised; }\r
1593                         | impl_attr K_NOINLINING        { $$ = (ImplAttr) $1 | ImplAttr.NoInLining; }\r
1594                         ;\r
1595 \r
1596 sig_args                : /* EMPTY */\r
1597                         | sig_arg_list\r
1598                         ;\r
1599 \r
1600 sig_arg_list            : sig_arg\r
1601                           {\r
1602                                 ArrayList sig_list = new ArrayList ();\r
1603                                 sig_list.Add ($1);\r
1604                                 $$ = sig_list;\r
1605                           }\r
1606                         | sig_arg_list COMMA sig_arg\r
1607                           {\r
1608                                 ArrayList sig_list = (ArrayList) $1;\r
1609                                 sig_list.Add ($3);\r
1610                                 $$ = sig_list;\r
1611                           }\r
1612                         ;\r
1613 \r
1614 sig_arg                 : param_attr type\r
1615                           {\r
1616                                 $$ = new ParamDef ((ParamAttr) $1, null, (ITypeRef) $2);\r
1617                           }\r
1618                         | param_attr type id\r
1619                           {\r
1620                                 $$ = new ParamDef ((ParamAttr) $1, (string) $3, (ITypeRef) $2);\r
1621                           }\r
1622                         | ELLIPSIS\r
1623                           {\r
1624                                 $$ = new ParamDef ((ParamAttr) 0, "...", new SentinelTypeRef ());\r
1625                                 // $$ = ParamDef.Ellipsis;\r
1626                           }\r
1627                         | param_attr type K_MARSHAL OPEN_PARENS native_type CLOSE_PARENS\r
1628                         | param_attr type K_MARSHAL OPEN_PARENS native_type CLOSE_PARENS id\r
1629                         ;\r
1630 \r
1631 type_list               : /* EMPTY */\r
1632                           {\r
1633                                 $$ = new ArrayList (0);\r
1634                           }\r
1635                         | ELLIPSIS\r
1636                           {\r
1637                                 ArrayList type_list = new ArrayList ();\r
1638                                 // type_list.Add (TypeRef.Ellipsis);\r
1639                                 type_list.Add (new SentinelTypeRef ());\r
1640                                 $$ = type_list;\r
1641                           }\r
1642                         | type_list COMMA ELLIPSIS\r
1643                           {\r
1644                                 ArrayList type_list = (ArrayList) $1;\r
1645                                 // type_list.Add (TypeRef.Ellipsis);\r
1646                                 type_list.Add (new SentinelTypeRef ());\r
1647                                 $$ = type_list;\r
1648                           }\r
1649                         | param_attr type opt_id\r
1650                           {\r
1651                                 ArrayList type_list = new ArrayList ();\r
1652                                 type_list.Add ($2);\r
1653                                 $$ = type_list;\r
1654                           }\r
1655                         | type_list COMMA param_attr type opt_id\r
1656                           {\r
1657                                 ArrayList type_list = (ArrayList) $1;\r
1658                                 type_list.Add ($4);\r
1659                           }\r
1660                         ;\r
1661 \r
1662 opt_id                  : /* EMPTY */\r
1663                         | id\r
1664                         ;\r
1665 \r
1666 method_decls            : /* EMPTY */\r
1667                         | method_decls method_decl\r
1668                         ;\r
1669 \r
1670 method_decl             : D_EMITBYTE int32\r
1671                         | D_MAXSTACK int32\r
1672                           {\r
1673                                 codegen.CurrentMethodDef.SetMaxStack ((int) $2);\r
1674                           }\r
1675                         | D_LOCALS OPEN_PARENS local_list CLOSE_PARENS\r
1676                           {\r
1677                                 if ($3 != null) {\r
1678                                         codegen.CurrentMethodDef.AddLocals (\r
1679                                                 (ArrayList) $3);\r
1680                                 }\r
1681                           }\r
1682                         | D_LOCALS K_INIT OPEN_PARENS local_list CLOSE_PARENS\r
1683                           {\r
1684                                 if ($4 != null) {\r
1685                                         codegen.CurrentMethodDef.AddLocals (\r
1686                                                 (ArrayList) $4);\r
1687                                         codegen.CurrentMethodDef.InitLocals ();\r
1688                                 }\r
1689                           }\r
1690                         | D_ENTRYPOINT\r
1691                           {\r
1692                                 codegen.CurrentMethodDef.EntryPoint ();\r
1693                           }\r
1694                         | D_ZEROINIT\r
1695                           {\r
1696                                 codegen.CurrentMethodDef.ZeroInit ();\r
1697                           }\r
1698                         | D_EXPORT OPEN_BRACKET int32 CLOSE_BRACKET\r
1699                         | D_EXPORT OPEN_BRACKET int32 CLOSE_BRACKET K_AS id\r
1700                         | D_VTENTRY int32 COLON int32 \r
1701                         | D_OVERRIDE type_spec DOUBLE_COLON method_name\r
1702                           {\r
1703                                 codegen.CurrentTypeDef.AddOverride (codegen.CurrentMethodDef,\r
1704                                         (ITypeRef) $2, (string) $4);\r
1705                                 \r
1706                           }\r
1707                         | scope_block\r
1708                         | D_PARAM OPEN_BRACKET int32 CLOSE_BRACKET init_opt\r
1709                         | id COLON\r
1710                           {\r
1711                                 codegen.CurrentMethodDef.AddLabel ((string) $1);\r
1712                           }\r
1713                         | seh_block\r
1714                         | instr\r
1715                         | sec_decl\r
1716                         | extsource_spec\r
1717                         | language_decl\r
1718                         | customattr_decl\r
1719                           {\r
1720                                 codegen.CurrentMethodDef.AddCustomAttr ((CustomAttr) $1);\r
1721                           }\r
1722                         | data_decl\r
1723                         ;\r
1724 \r
1725 local_list              : /* EMPTY */\r
1726                         | local\r
1727                           {\r
1728                                 ArrayList local_list = new ArrayList ();\r
1729                                 local_list.Add ($1);\r
1730                                 $$ = local_list;\r
1731                           }\r
1732                         | local_list COMMA local\r
1733                           {\r
1734                                 ArrayList local_list = (ArrayList) $1;\r
1735                                 local_list.Add ($3);\r
1736                           }\r
1737                         ;\r
1738 \r
1739 local                   : type\r
1740                           {\r
1741                                 $$ = new Local (-1, (ITypeRef) $1);\r
1742                           }\r
1743                         | type id\r
1744                           {\r
1745                                 $$ = new Local (-1, (string) $2, (ITypeRef) $1);\r
1746                           }\r
1747                         | slot_num type\r
1748                           {\r
1749                                 $$ = new Local ((int) $1, (ITypeRef) $2);\r
1750                           }\r
1751                         | slot_num type id\r
1752                           {\r
1753                                 $$ = new Local ((int) $1, (string) $3, (ITypeRef) $2);\r
1754                           }\r
1755                         ;\r
1756 \r
1757 slot_num                : OPEN_BRACKET int32 CLOSE_BRACKET\r
1758                           {\r
1759                                 $$ = $2;\r
1760                           }\r
1761                         ;\r
1762 \r
1763 type_spec               : class_ref\r
1764                         | OPEN_BRACKET slashed_name CLOSE_BRACKET\r
1765                           {\r
1766                                 // This is a reference to a global method in another\r
1767                                 // assembly. This is not supported in the MS version of ilasm\r
1768                           }\r
1769                         | OPEN_BRACKET D_MODULE slashed_name CLOSE_BRACKET\r
1770                           {\r
1771 \r
1772                           }\r
1773                         | type\r
1774                         ;\r
1775 \r
1776 scope_block             : scope_block_begin method_decls CLOSE_BRACE\r
1777                           {\r
1778                                 $$ = new HandlerBlock ((LabelInfo) $1,\r
1779                                         codegen.CurrentMethodDef.AddLabel ());\r
1780                           }\r
1781                         ;\r
1782 \r
1783 scope_block_begin       : OPEN_BRACE\r
1784                           {\r
1785                                 $$ = codegen.CurrentMethodDef.AddLabel ();\r
1786                           }\r
1787                         ;\r
1788                         \r
1789                         \r
1790 seh_block               : try_block seh_clauses\r
1791                           {\r
1792                                 TryBlock try_block = (TryBlock) $1;\r
1793 \r
1794                                 ArrayList clause_list = (ArrayList) $2;\r
1795                                 foreach (object clause in clause_list)\r
1796                                         try_block.AddSehClause ((ISehClause) clause);\r
1797 \r
1798                                 codegen.CurrentMethodDef.AddInstr (try_block);\r
1799                           }\r
1800                         ;\r
1801 \r
1802 try_block               : D_TRY scope_block\r
1803                           {\r
1804                                 $$ = new TryBlock ((HandlerBlock) $2);\r
1805                           }\r
1806                         | D_TRY id K_TO id\r
1807                           {\r
1808                                 LabelInfo from = codegen.CurrentMethodDef.AddLabelRef ((string) $2);\r
1809                                 LabelInfo to = codegen.CurrentMethodDef.AddLabelRef ((string) $4);\r
1810                                 \r
1811                                 $$ = new TryBlock (new HandlerBlock (from, to));\r
1812                           }\r
1813                         | D_TRY int32 K_TO int32\r
1814                           {\r
1815                                 LabelInfo from = codegen.CurrentMethodDef.AddLabel ((int) $2);\r
1816                                 LabelInfo to = codegen.CurrentMethodDef.AddLabel ((int) $4);\r
1817                                 \r
1818                                 $$ = new TryBlock (new HandlerBlock (from, to));\r
1819                           }\r
1820                         ;\r
1821 \r
1822 seh_clauses             : seh_clause\r
1823                           {\r
1824                                 ArrayList clause_list = new ArrayList ();\r
1825                                 clause_list.Add ($1);\r
1826                                 $$ = clause_list;\r
1827                           }\r
1828                         | seh_clauses seh_clause\r
1829                           {\r
1830                                 ArrayList clause_list = (ArrayList) $1;\r
1831                                 clause_list.Add ($2);\r
1832                           }\r
1833                         ;\r
1834 \r
1835 seh_clause              : K_CATCH class_ref handler_block\r
1836                           {\r
1837                                 IClassRef type = (IClassRef) $2;\r
1838                                 CatchBlock cb = new CatchBlock (type);\r
1839                                 cb.SetHandlerBlock ((HandlerBlock) $3);\r
1840                                 $$ = cb;\r
1841                           }\r
1842                         | K_FINALLY handler_block\r
1843                           {\r
1844                                 FinallyBlock fb = new FinallyBlock ();\r
1845                                 fb.SetHandlerBlock ((HandlerBlock) $2);\r
1846                                 $$ = fb;\r
1847                           }\r
1848                         | K_FAULT handler_block\r
1849                           {\r
1850                                 FaultBlock fb = new FaultBlock ();\r
1851                                 fb.SetHandlerBlock ((HandlerBlock) $2);\r
1852                                 $$ = fb;\r
1853                           }\r
1854                         | filter_clause handler_block\r
1855                           {\r
1856                                 FilterBlock fb = (FilterBlock) $1;\r
1857                                 fb.SetHandlerBlock ((HandlerBlock) $2);\r
1858                           }\r
1859                         ;\r
1860 \r
1861 filter_clause           : K_FILTER scope_block\r
1862                           {\r
1863                                 HandlerBlock block = (HandlerBlock) $2;\r
1864                                 FilterBlock fb = new FilterBlock (block);\r
1865                                 $$ = fb;\r
1866                           }\r
1867                         | K_FILTER id\r
1868                           {\r
1869                                 LabelInfo from = codegen.CurrentMethodDef.AddLabelRef ((string) $2);\r
1870                                 FilterBlock fb = new FilterBlock (new HandlerBlock (from, null));\r
1871                                 $$ = fb;\r
1872                           }\r
1873                         | K_FILTER int32\r
1874                           {\r
1875                                 LabelInfo from = codegen.CurrentMethodDef.AddLabel ((int) $2);\r
1876                                 FilterBlock fb = new FilterBlock (new HandlerBlock (from, null));\r
1877                                 $$ = fb;\r
1878                           }\r
1879                         ;\r
1880 \r
1881 handler_block           : scope_block\r
1882                           {\r
1883                                 \r
1884                           }\r
1885                         | K_HANDLER id K_TO id\r
1886                           {     \r
1887                                 LabelInfo from = codegen.CurrentMethodDef.AddLabelRef ((string) $2);\r
1888                                 LabelInfo to = codegen.CurrentMethodDef.AddLabelRef ((string) $4);\r
1889 \r
1890                                 $$ = new HandlerBlock (from, to);\r
1891                           }\r
1892                         | K_HANDLER int32 K_TO int32\r
1893                           {\r
1894                                 LabelInfo from = codegen.CurrentMethodDef.AddLabelRef ((string) $2);\r
1895                                 LabelInfo to = codegen.CurrentMethodDef.AddLabelRef ((string) $4);\r
1896 \r
1897                                 $$ = new HandlerBlock (from, to);\r
1898                           }\r
1899                         ;\r
1900 \r
1901 instr                   : INSTR_NONE\r
1902                           {\r
1903                                 codegen.CurrentMethodDef.AddInstr (\r
1904                                         new SimpInstr ((Op) $1));\r
1905                           }\r
1906                         | INSTR_LOCAL int32\r
1907                           {\r
1908                                 codegen.CurrentMethodDef.AddInstr (\r
1909                                         new IntInstr ((IntOp) $1, (int) $2));        \r
1910                           }\r
1911                         | INSTR_LOCAL id\r
1912                           {\r
1913                                 int slot = codegen.CurrentMethodDef.GetNamedLocalSlot ((string) $2);\r
1914                                 codegen.CurrentMethodDef.AddInstr (\r
1915                                         new IntInstr ((IntOp) $1, slot));\r
1916                           }\r
1917                         | INSTR_PARAM int32\r
1918                           {\r
1919                                 codegen.CurrentMethodDef.AddInstr (\r
1920                                         new IntInstr ((IntOp) $1, (int) $2));\r
1921                           }\r
1922                         | INSTR_PARAM id\r
1923                           {\r
1924                                 int pos = codegen.CurrentMethodDef.GetNamedParamPos ((string) $2);\r
1925                                 codegen.CurrentMethodDef.AddInstr (\r
1926                                         new IntInstr ((IntOp) $1, pos));\r
1927                           }\r
1928                         | INSTR_I int32\r
1929                           {\r
1930                                 codegen.CurrentMethodDef.AddInstr (new\r
1931                                         IntInstr ((IntOp) $1, (int) $2));\r
1932                           }\r
1933                         | INSTR_I id\r
1934                           {\r
1935                                 int slot = codegen.CurrentMethodDef.GetNamedLocalSlot ((string) $2);\r
1936                                 codegen.CurrentMethodDef.AddInstr (new\r
1937                                         IntInstr ((IntOp) $1, slot));\r
1938                           }\r
1939                         | INSTR_I8 int64\r
1940                           {\r
1941                                 if ($1 is MiscInstr) {\r
1942                                         switch ((MiscInstr) $1) {\r
1943                                         case MiscInstr.ldc_i8:\r
1944                                         codegen.CurrentMethodDef.AddInstr (new LdcInstr ((MiscInstr) $1,\r
1945                                                 (long) $2));\r
1946                                         break;\r
1947                                         }\r
1948                                 }\r
1949                           }\r
1950                         | INSTR_R float64\r
1951                           {\r
1952                                 switch ((MiscInstr) $1) {\r
1953                                 case MiscInstr.ldc_r4:\r
1954                                 case MiscInstr.ldc_r8:\r
1955                                          codegen.CurrentMethodDef.AddInstr (new LdcInstr ((MiscInstr) $1, (double) $2));\r
1956                                          break;\r
1957                                 }\r
1958                           }\r
1959                         | INSTR_R int64\r
1960                           {\r
1961                                 long l = (long) $2;\r
1962                                 \r
1963                                 switch ((MiscInstr) $1) {\r
1964                                         case MiscInstr.ldc_r4:\r
1965                                         case MiscInstr.ldc_r8:\r
1966                                         codegen.CurrentMethodDef.AddInstr (new LdcInstr ((MiscInstr) $1, (double) l));\r
1967                                         break;\r
1968                                 }\r
1969                           }\r
1970                         | INSTR_R bytes_list\r
1971                         | INSTR_BRTARGET int32\r
1972                           {\r
1973                                 LabelInfo target = codegen.CurrentMethodDef.AddLabel ((int) $2);\r
1974                                 codegen.CurrentMethodDef.AddInstr (new BranchInstr ((BranchOp) $1,\r
1975                                                                    target));  \r
1976                           }\r
1977                         | INSTR_BRTARGET id\r
1978                           {\r
1979                                 LabelInfo target = codegen.CurrentMethodDef.AddLabelRef ((string) $2);\r
1980                                 codegen.CurrentMethodDef.AddInstr (new BranchInstr ((BranchOp) $1,\r
1981                                                                    target));\r
1982                           }\r
1983                         | INSTR_METHOD method_ref\r
1984                           {\r
1985                                 codegen.CurrentMethodDef.AddInstr (new MethodInstr ((MethodOp) $1,\r
1986                                         (IMethodRef) $2));\r
1987                           }\r
1988                         | INSTR_FIELD type type_spec DOUBLE_COLON id\r
1989                           {\r
1990                                 \r
1991                                 ITypeRef owner = (ITypeRef) $3;\r
1992                                 IFieldRef fieldref = owner.GetFieldRef (\r
1993                                         (ITypeRef) $2, (string) $5);\r
1994 \r
1995                                 codegen.CurrentMethodDef.AddInstr (new FieldInstr ((FieldOp) $1, fieldref));\r
1996                           }\r
1997                         | INSTR_FIELD type id\r
1998                           {\r
1999                                 GlobalFieldRef fieldref = new GlobalFieldRef ((ITypeRef) $2, (string) $3);\r
2000 \r
2001                                 codegen.CurrentMethodDef.AddInstr (new FieldInstr ((FieldOp) $1, fieldref));\r
2002                           }\r
2003                         | INSTR_TYPE type_spec\r
2004                           {\r
2005                                 codegen.CurrentMethodDef.AddInstr (new TypeInstr ((TypeOp) $1,\r
2006                                         (ITypeRef) $2));\r
2007                           }\r
2008                         | INSTR_STRING comp_qstring\r
2009                           {\r
2010                                 if ((MiscInstr) $1 == MiscInstr.ldstr)\r
2011                                         codegen.CurrentMethodDef.AddInstr (new LdstrInstr ((string) $2));\r
2012                           }\r
2013                         | INSTR_STRING K_BYTEARRAY ASSIGN bytes_list\r
2014                           {\r
2015                                 byte[] bs = (byte[]) $4;\r
2016                                 if ((MiscInstr) $1 == MiscInstr.ldstr)\r
2017                                         codegen.CurrentMethodDef.AddInstr (new LdstrInstr (bs));\r
2018                           }\r
2019                         | INSTR_STRING K_BYTEARRAY bytes_list\r
2020                           {\r
2021                                 byte[] bs = (byte[]) $3;\r
2022                                 if ((MiscInstr) $1 == MiscInstr.ldstr)\r
2023                                         codegen.CurrentMethodDef.AddInstr (new LdstrInstr (bs));\r
2024                           }\r
2025                         | INSTR_SIG call_conv type OPEN_PARENS type_list CLOSE_PARENS\r
2026                           {\r
2027                                 ArrayList arg_list = (ArrayList) $5;\r
2028                                 ITypeRef[] arg_array = null;\r
2029 \r
2030                                 if (arg_list != null)\r
2031                                         arg_array = (ITypeRef[]) arg_list.ToArray (typeof (ITypeRef));\r
2032 \r
2033                                 codegen.CurrentMethodDef.AddInstr (new CalliInstr ((CallConv) $2,\r
2034                                         (ITypeRef) $3, arg_array));\r
2035                           }     \r
2036                         | INSTR_TOK owner_type\r
2037                           {\r
2038                                 if ((MiscInstr) $1 == MiscInstr.ldtoken) {\r
2039                                         if ($2 is IMethodRef)\r
2040                                                 codegen.CurrentMethodDef.AddInstr (new LdtokenInstr ((IMethodRef) $2));\r
2041                                         else if ($2 is IFieldRef)\r
2042                                                 codegen.CurrentMethodDef.AddInstr (new LdtokenInstr ((IFieldRef) $2));\r
2043                                         else\r
2044                                                 codegen.CurrentMethodDef.AddInstr (new LdtokenInstr ((ITypeRef) $2));\r
2045                                                 \r
2046                                 }\r
2047                           }\r
2048                         | INSTR_SWITCH OPEN_PARENS labels CLOSE_PARENS\r
2049                           {\r
2050                                 codegen.CurrentMethodDef.AddInstr (new SwitchInstr ((ArrayList) $3));\r
2051                           }\r
2052                         ;\r
2053 \r
2054 method_ref              : call_conv type type_spec DOUBLE_COLON method_name\r
2055                           OPEN_PARENS type_list CLOSE_PARENS \r
2056                           {\r
2057                                 ITypeRef owner = (ITypeRef) $3;\r
2058                                 ArrayList arg_list = (ArrayList) $7;\r
2059                                 ITypeRef[] param_list;\r
2060                                 IMethodRef methref;\r
2061 \r
2062                                 if (arg_list != null)\r
2063                                         param_list = (ITypeRef[]) arg_list.ToArray (typeof (ITypeRef));\r
2064                                 else\r
2065                                         param_list = new ITypeRef[0];\r
2066 \r
2067                                 if (owner.UseTypeSpec) {\r
2068                                         methref = new TypeSpecMethodRef (owner, (ITypeRef) $2,\r
2069                                                 (CallConv) $1, (string) $5, param_list);\r
2070                                 } else {\r
2071                                         methref = owner.GetMethodRef ((ITypeRef) $2,\r
2072                                                 (CallConv) $1, (string) $5, param_list);\r
2073                                 }\r
2074 \r
2075                                 $$ = methref;\r
2076                           }\r
2077                         | call_conv type method_name \r
2078                           OPEN_PARENS type_list CLOSE_PARENS\r
2079                           {\r
2080                                 ArrayList arg_list = (ArrayList) $5;\r
2081                                 ITypeRef[] param_list;\r
2082   \r
2083                                 if (arg_list != null)\r
2084                                         param_list = (ITypeRef[]) arg_list.ToArray (typeof (ITypeRef));\r
2085                                 else\r
2086                                         param_list = new ITypeRef[0];\r
2087 \r
2088                                 $$ = new GlobalMethodRef ((ITypeRef) $2, (CallConv) $1,\r
2089                                         (string) $3, param_list);\r
2090                           }\r
2091                         | call_conv type type_spec DOUBLE_COLON method_name\r
2092                           typars_clause OPEN_PARENS type_list CLOSE_PARENS \r
2093                           {\r
2094                                 ITypeRef owner = (ITypeRef) $3;\r
2095                                 ArrayList arg_list = (ArrayList) $8;\r
2096                                 ITypeRef[] param_list;\r
2097                                 IMethodRef methref;\r
2098 \r
2099                                 if (arg_list != null)\r
2100                                         param_list = (ITypeRef[]) arg_list.ToArray (typeof (ITypeRef));\r
2101                                 else\r
2102                                         param_list = new ITypeRef[0];\r
2103 \r
2104                                 if (owner.UseTypeSpec) {\r
2105                                         methref = new TypeSpecMethodRef (owner, (ITypeRef) $2,\r
2106                                                 (CallConv) $1, (string) $5, param_list);\r
2107                                 } else {\r
2108                                         methref = owner.GetMethodRef ((ITypeRef) $2,\r
2109                                                 (CallConv) $1, (string) $5, param_list);\r
2110                                 }\r
2111 \r
2112                                 if ($6 != null) {\r
2113                                         ArrayList tp = (ArrayList) $6;\r
2114                                         ITypeRef[] ta = (ITypeRef[]) tp.ToArray (typeof (ITypeRef));\r
2115                                         \r
2116                                         methref = new GenericMethodRef (methref, new GenericMethodSig (ta));\r
2117                                 }\r
2118                                 \r
2119                                 $$ = methref;\r
2120                           }\r
2121                         ;\r
2122 \r
2123 labels                  : /* EMPTY */\r
2124                         | id\r
2125                           {\r
2126                                 ArrayList label_list = new ArrayList ();\r
2127                                 label_list.Add ($1);\r
2128                                 $$ = label_list;\r
2129                           }\r
2130                         | int32\r
2131                           {\r
2132                                 ArrayList label_list = new ArrayList ();\r
2133                                 label_list.Add ($1);\r
2134                                 $$ = label_list;\r
2135                           }\r
2136                         | labels COMMA id\r
2137                           {\r
2138                                 ArrayList label_list = (ArrayList) $1;\r
2139                                 label_list.Add ($3);\r
2140                           }\r
2141                         | labels COMMA int32\r
2142                           {\r
2143                                 ArrayList label_list = (ArrayList) $1;\r
2144                                 label_list.Add ($3);\r
2145                           }\r
2146                         ;\r
2147 \r
2148 owner_type              : type_spec\r
2149                         | member_ref\r
2150                         ;\r
2151 \r
2152 member_ref              : K_METHOD method_ref\r
2153                           {\r
2154                                 $$ = $2;\r
2155                           }\r
2156                         | K_FIELD type type_spec DOUBLE_COLON id\r
2157                           {\r
2158                                 ITypeRef owner = (ITypeRef) $3;\r
2159 \r
2160                                 $$ = owner.GetFieldRef (\r
2161                                         (ITypeRef) $2, (string) $5);\r
2162                           }\r
2163                         | K_FIELD type id\r
2164                           {\r
2165                                 $$ = new GlobalFieldRef ((ITypeRef) $2, (string) $3);\r
2166                           }\r
2167                         ;\r
2168 \r
2169 event_all               : event_head OPEN_BRACE event_decls CLOSE_BRACE\r
2170                           {\r
2171                                 codegen.CurrentTypeDef.EndEventDef ();\r
2172                           }\r
2173                         ;\r
2174 \r
2175 event_head              : D_EVENT event_attr type_spec id\r
2176                           {\r
2177                                 EventDef event_def = new EventDef ((FeatureAttr) $2,\r
2178                                         (ITypeRef) $3, (string) $4);\r
2179                                 codegen.CurrentTypeDef.BeginEventDef (event_def);\r
2180                           }\r
2181                         | D_EVENT event_attr id\r
2182                         ;\r
2183 \r
2184 event_attr              : /* EMPTY */\r
2185                           {\r
2186                                 $$ = new FeatureAttr ();\r
2187                           }\r
2188                         | event_attr K_RTSPECIALNAME\r
2189                           {\r
2190                                 $$ = (FeatureAttr) $1 & FeatureAttr.Rtspecialname;\r
2191                           }\r
2192                         | event_attr K_SPECIALNAME\r
2193                           {\r
2194                                 $$ = (FeatureAttr) $1 & FeatureAttr.Specialname;\r
2195                           }\r
2196                         ;\r
2197 \r
2198 event_decls             : /* EMPTY */\r
2199                         | event_decls event_decl\r
2200                         ;\r
2201 \r
2202 event_decl              : D_ADDON method_ref\r
2203                           {\r
2204                                 codegen.CurrentTypeDef.CurrentEvent.AddAddon (\r
2205                                         (MethodRef) $2);                                \r
2206                           }\r
2207                         | D_REMOVEON method_ref\r
2208                           {\r
2209                                 codegen.CurrentTypeDef.CurrentEvent.AddRemoveon (\r
2210                                         (MethodRef) $2);\r
2211                           }\r
2212                         | D_FIRE method_ref\r
2213                           {\r
2214                                 codegen.CurrentTypeDef.CurrentEvent.AddFire (\r
2215                                         (MethodRef) $2);\r
2216                           }\r
2217                         | D_OTHER method_ref\r
2218                           {\r
2219                                 codegen.CurrentTypeDef.CurrentEvent.AddOther (\r
2220                                         (MethodRef) $2);\r
2221                           }\r
2222                         | customattr_decl\r
2223                         | extsource_spec\r
2224                         | language_decl\r
2225                         ;\r
2226 \r
2227 prop_all                : prop_head OPEN_BRACE prop_decls CLOSE_BRACE\r
2228                           {\r
2229                                 codegen.CurrentTypeDef.EndPropertyDef ();\r
2230                           }\r
2231                         ;\r
2232 \r
2233 prop_head               : D_PROPERTY prop_attr type id OPEN_PARENS type_list CLOSE_PARENS init_opt\r
2234                           {\r
2235                                 PropertyDef prop_def = new PropertyDef ((FeatureAttr) $2, (ITypeRef) $3,\r
2236                                         (string) $4, (ArrayList) $6);\r
2237                                 codegen.CurrentTypeDef.BeginPropertyDef (prop_def);\r
2238 \r
2239                                 if ($8 != null) {\r
2240                                         prop_def.AddInitValue ((Constant) $8);\r
2241                                 }\r
2242                           }\r
2243                         ;\r
2244 \r
2245 prop_attr               : /* EMPTY */\r
2246                           {\r
2247                                 $$ = new FeatureAttr ();\r
2248                           }\r
2249                         | prop_attr K_RTSPECIALNAME\r
2250                           {\r
2251                                 $$ = (FeatureAttr) $1 | FeatureAttr.Rtspecialname;\r
2252                           }\r
2253                         | prop_attr K_SPECIALNAME\r
2254                           {\r
2255                                 $$ = (FeatureAttr) $1 | FeatureAttr.Specialname;\r
2256                           }\r
2257                         | prop_attr K_INSTANCE\r
2258                           {\r
2259                           }\r
2260                         ;\r
2261 \r
2262 prop_decls              : /* EMPTY */\r
2263                         | prop_decls prop_decl\r
2264                         ;\r
2265 \r
2266 prop_decl               : D_SET method_ref\r
2267                           {\r
2268                                 codegen.CurrentTypeDef.CurrentProperty.AddSet ((MethodRef) $2);\r
2269                           }\r
2270                         | D_GET method_ref\r
2271                           {\r
2272                                 codegen.CurrentTypeDef.CurrentProperty.AddGet ((MethodRef) $2);\r
2273                           }\r
2274                         | D_OTHER method_ref\r
2275                           {\r
2276                                 codegen.CurrentTypeDef.CurrentProperty.AddOther ((MethodRef) $2);\r
2277                           }\r
2278                         | customattr_decl\r
2279                         | extsource_spec\r
2280                         | language_decl\r
2281                         ;\r
2282 \r
2283 customattr_decl         : D_CUSTOM custom_type\r
2284                           {\r
2285                                 $$ = new CustomAttr ((IMethodRef) $2, null);\r
2286                           }\r
2287                         | D_CUSTOM custom_type ASSIGN comp_qstring\r
2288                         | D_CUSTOM custom_type ASSIGN bytes_list\r
2289                           {\r
2290                                 $$ = new CustomAttr ((IMethodRef) $2,\r
2291                                         (byte[]) $4);\r
2292                           }\r
2293                         | D_CUSTOM OPEN_PARENS owner_type CLOSE_PARENS custom_type\r
2294                         | D_CUSTOM OPEN_PARENS owner_type CLOSE_PARENS custom_type ASSIGN comp_qstring\r
2295                         | D_CUSTOM OPEN_PARENS owner_type CLOSE_PARENS custom_type ASSIGN\r
2296                           bytes_list\r
2297                         ;\r
2298                         \r
2299 custom_type             : call_conv type type_spec DOUBLE_COLON D_CTOR OPEN_PARENS type_list CLOSE_PARENS\r
2300                           {\r
2301                                 ITypeRef owner = (ITypeRef) $3;\r
2302                                 ArrayList arg_list = (ArrayList) $7;\r
2303                                 ITypeRef[] param_list;\r
2304   \r
2305                                 if (arg_list != null)\r
2306                                         param_list = (ITypeRef[]) arg_list.ToArray (typeof (ITypeRef));\r
2307                                 else\r
2308                                         param_list = new ITypeRef[0];\r
2309 \r
2310                                 $$ = owner.GetMethodRef ((ITypeRef) $2,\r
2311                                         (CallConv) $1, (string) $5, param_list);\r
2312                           }\r
2313                         | call_conv type D_CTOR OPEN_PARENS type_list CLOSE_PARENS\r
2314                           {\r
2315                                 ArrayList arg_list = (ArrayList) $5;\r
2316                                 ITypeRef[] param_list;\r
2317   \r
2318                                 if (arg_list != null)\r
2319                                         param_list = (ITypeRef[]) arg_list.ToArray (typeof (ITypeRef));\r
2320                                 else\r
2321                                         param_list = new ITypeRef[0];\r
2322 \r
2323                                 $$ = new GlobalMethodRef ((ITypeRef) $2, (CallConv) $1,\r
2324                                         (string) $3, param_list);\r
2325                           }\r
2326                         ;\r
2327 \r
2328 sec_decl                : D_PERMISSION sec_action type_spec OPEN_PARENS nameval_pairs CLOSE_PARENS\r
2329                         | D_PERMISSION sec_action type_spec\r
2330                         | D_PERMISSIONSET sec_action ASSIGN bytes_list\r
2331                         ;\r
2332 \r
2333 nameval_pairs           : nameval_pair \r
2334                         | nameval_pairs COMMA nameval_pair\r
2335                         ;\r
2336 \r
2337 nameval_pair            : comp_qstring ASSIGN cavalue\r
2338                         ;\r
2339 \r
2340 cavalue                 : truefalse\r
2341                         | int32\r
2342                         | int32 OPEN_PARENS int32 CLOSE_PARENS\r
2343                         | comp_qstring \r
2344                         | class_ref OPEN_PARENS K_INT8 COLON int32 CLOSE_PARENS\r
2345                         | class_ref OPEN_PARENS K_INT16 COLON int32 CLOSE_PARENS\r
2346                         | class_ref OPEN_PARENS K_INT32 COLON int32 CLOSE_PARENS\r
2347                         | class_ref OPEN_PARENS int32 CLOSE_PARENS\r
2348                         ;\r
2349 \r
2350 sec_action              : K_REQUEST\r
2351                         | K_DEMAND\r
2352                         | K_ASSERT\r
2353                         | K_DENY\r
2354                         | K_PERMITONLY\r
2355                         | K_LINKCHECK\r
2356                         | K_INHERITCHECK\r
2357                         | K_REQMIN\r
2358                         | K_REQOPT\r
2359                         | K_REQREFUSE\r
2360                         | K_PREJITGRANT\r
2361                         | K_PREJITDENY\r
2362                         | K_NONCASDEMAND\r
2363                         | K_NONCASLINKDEMAND\r
2364                         | K_NONCASINHERITANCE\r
2365                         ;\r
2366 \r
2367 module_head             : D_MODULE\r
2368                           {\r
2369                           }\r
2370                         | D_MODULE comp_name\r
2371                           {\r
2372                                 codegen.SetModuleName ((string) $2);\r
2373                           }\r
2374                         | D_MODULE K_EXTERN comp_name\r
2375                           {\r
2376                                 codegen.ExternTable.AddModule ((string) $3);                         \r
2377                           }\r
2378                         ;\r
2379 \r
2380 file_decl               : D_FILE file_attr comp_name file_entry D_HASH ASSIGN\r
2381                           bytes_list file_entry\r
2382                         | D_FILE file_attr comp_name file_entry\r
2383                         ;\r
2384 \r
2385 file_attr               : /* EMPTY */\r
2386                         | file_attr K_NOMETADATA\r
2387                         ;\r
2388 \r
2389 file_entry              : /* EMPTY */\r
2390                         | D_ENTRYPOINT\r
2391                         ;\r
2392 \r
2393 assembly_all            : assembly_head OPEN_BRACE assembly_decls CLOSE_BRACE\r
2394                         ;\r
2395 \r
2396 assembly_head           : D_ASSEMBLY asm_attr slashed_name\r
2397                           {\r
2398                                 codegen.SetAssemblyName ((string) $3);\r
2399                           }\r
2400                         ;\r
2401 \r
2402 asm_attr                : /* EMPTY */\r
2403                         | asm_attr K_NOAPPDOMAIN\r
2404                         | asm_attr K_NOPROCESS\r
2405                         | asm_attr K_NOMACHINE\r
2406                         ;\r
2407 \r
2408 assembly_decls          : /* EMPTY */\r
2409                         | assembly_decls assembly_decl\r
2410                         ;\r
2411 \r
2412 assembly_decl           : D_PUBLICKEY ASSIGN bytes_list\r
2413                           {\r
2414                                 codegen.SetAssemblyPublicKey ((byte []) $3);\r
2415                           }\r
2416                         | D_VER int32 COLON int32 COLON int32 COLON int32\r
2417                           {\r
2418                                 codegen.SetAssemblyVersion ((int) $2, (int) $4, (int) $6, (int) $8);\r
2419                           }\r
2420                         | D_LOCALE comp_qstring\r
2421                           {\r
2422                                 codegen.SetAssemblyLocale ((string) $2);\r
2423                           }\r
2424                         | D_LOCALE ASSIGN bytes_list\r
2425                         | D_HASH K_ALGORITHM int32\r
2426                           {\r
2427                                 codegen.SetAssemblyHashAlgorithm ((int) $3);\r
2428                           }\r
2429                         | customattr_decl\r
2430                           {\r
2431                                 codegen.AddAssemblyCustomAttribute ((CustomAttr) $1);\r
2432                           }\r
2433                         | sec_decl\r
2434                         ;\r
2435 \r
2436 asm_or_ref_decl         : D_PUBLICKEY ASSIGN bytes_list\r
2437                         | D_VER int32 COLON int32 COLON int32 COLON int32 \r
2438                         | D_LOCALE comp_qstring\r
2439                         | D_LOCALE ASSIGN bytes_list\r
2440                         | customattr_decl\r
2441                         ;\r
2442 \r
2443 assemblyref_all         : assemblyref_head OPEN_BRACE assemblyref_decls CLOSE_BRACE\r
2444                         ;\r
2445 \r
2446 assemblyref_head        : D_ASSEMBLY K_EXTERN slashed_name\r
2447                           {\r
2448                                 System.Reflection.AssemblyName asmb_name = \r
2449                                         new System.Reflection.AssemblyName ();\r
2450                                 asmb_name.Name = (string) $3;\r
2451                                 codegen.BeginAssemblyRef ((string) $3, asmb_name);\r
2452                           }\r
2453                         | D_ASSEMBLY K_EXTERN slashed_name K_AS slashed_name\r
2454                           {\r
2455                                 System.Reflection.AssemblyName asmb_name = \r
2456                                         new System.Reflection.AssemblyName ();\r
2457                                 asmb_name.Name = (string) $3;\r
2458                                 codegen.BeginAssemblyRef ((string) $5, asmb_name);\r
2459                           }\r
2460                         ;\r
2461 \r
2462 assemblyref_decls       : /* EMPTY */\r
2463                         | assemblyref_decls assemblyref_decl\r
2464                         ;\r
2465 \r
2466 assemblyref_decl        : D_VER int32 COLON int32 COLON int32 COLON int32\r
2467                           {\r
2468                                 codegen.CurrentAssemblyRef.SetVersion ((int) $2, (int) $4, (int) $6, (int) $8);\r
2469                           }\r
2470                         | D_PUBLICKEY ASSIGN bytes_list\r
2471                           {\r
2472                                 codegen.CurrentAssemblyRef.SetPublicKey ((byte []) $3);\r
2473                           }\r
2474                         | D_PUBLICKEYTOKEN ASSIGN bytes_list\r
2475                           {\r
2476                                 codegen.CurrentAssemblyRef.SetPublicKeyToken ((byte []) $3);\r
2477                           }\r
2478                         | D_LOCALE comp_qstring\r
2479                           {\r
2480                                 codegen.CurrentAssemblyRef.SetLocale ((string) $2);\r
2481                           }\r
2482                         | D_LOCALE ASSIGN bytes_list\r
2483                         \r
2484                         | D_HASH ASSIGN bytes_list\r
2485                           {\r
2486                                 codegen.CurrentAssemblyRef.SetHash ((byte []) $3);\r
2487                           }\r
2488                         | customattr_decl\r
2489                         ;\r
2490 \r
2491 exptype_all             : exptype_head OPEN_BRACE exptype_decls CLOSE_BRACE\r
2492                         ;\r
2493 \r
2494 exptype_head            : D_CLASS K_EXTERN expt_attr comp_name\r
2495                         ;\r
2496 \r
2497 expt_attr               : /* EMPTY */\r
2498                         | expt_attr K_PRIVATE\r
2499                         | expt_attr K_PUBLIC \r
2500                         | expt_attr K_NESTED K_PUBLIC\r
2501                         | expt_attr K_NESTED K_PRIVATE\r
2502                         | expt_attr K_NESTED K_FAMILY\r
2503                         | expt_attr K_NESTED K_ASSEMBLY\r
2504                         | expt_attr K_NESTED K_FAMANDASSEM\r
2505                         | expt_attr K_NESTED K_FAMORASSEM\r
2506                         ;\r
2507 \r
2508 exptype_decls           : /* EMPTY */\r
2509                         | exptype_decls exptype_decl\r
2510                         ;\r
2511 \r
2512 exptype_decl            : D_FILE comp_name\r
2513                         | D_CLASS K_EXTERN comp_name\r
2514                         | D_CLASS int32\r
2515                         | customattr_decl\r
2516                         ;\r
2517 \r
2518 manifestres_all         : manifestres_head OPEN_BRACE manifestres_decls CLOSE_BRACE\r
2519                         ;\r
2520 \r
2521 manifestres_head        : D_MRESOURCE manres_attr comp_name     \r
2522                         ;\r
2523 \r
2524 manres_attr             : /* EMPTY */\r
2525                         | manres_attr K_PUBLIC\r
2526                         | manres_attr K_PRIVATE\r
2527                         ;\r
2528 \r
2529 manifestres_decls       : /* EMPTY */\r
2530                         | manifestres_decls manifestres_decl\r
2531                         ;\r
2532 \r
2533 manifestres_decl        : D_FILE comp_name K_AT int32\r
2534                         | D_ASSEMBLY K_EXTERN slashed_name\r
2535                         | customattr_decl\r
2536                         ;\r
2537 \r
2538 comp_qstring            : QSTRING\r
2539                         | comp_qstring PLUS QSTRING     { $$ = String.Format ("{0}{1}", $1, $3); }\r
2540                         ;\r
2541 \r
2542 int32                   : INT64\r
2543                           {\r
2544                                 long l = (long) $1;\r
2545                                 byte[] intb = BitConverter.GetBytes (l);\r
2546                                 $$ = BitConverter.ToInt32 (intb, BitConverter.IsLittleEndian ? 0 : 4);\r
2547                           }\r
2548                         ;\r
2549 \r
2550 int64                   : INT64\r
2551                         ;\r
2552 \r
2553 float64                 : FLOAT64\r
2554                         | K_FLOAT32 OPEN_PARENS INT32 CLOSE_PARENS\r
2555                           {\r
2556                                 int i = (int) $3;\r
2557                                 byte[] intb = BitConverter.GetBytes (i);\r
2558                                 $$ = (double) BitConverter.ToSingle (intb, BitConverter.IsLittleEndian ? 0 : 4);\r
2559                           }\r
2560                         | K_FLOAT32 OPEN_PARENS INT64 CLOSE_PARENS\r
2561                           {\r
2562                                 long l = (long) $3;\r
2563                                 byte[] intb = BitConverter.GetBytes (l);\r
2564                                 $$ = (double) BitConverter.ToSingle (intb, BitConverter.IsLittleEndian ? 0 : 4);\r
2565                           }\r
2566                         | K_FLOAT64 OPEN_PARENS INT64 CLOSE_PARENS\r
2567                           {\r
2568                                 byte[] intb = BitConverter.GetBytes ((long) $3);\r
2569                                 $$ = BitConverter.ToDouble (intb, BitConverter.IsLittleEndian ? 0 : 4);\r
2570                           }\r
2571                         | K_FLOAT64 OPEN_PARENS INT32 CLOSE_PARENS\r
2572                           {\r
2573                                 byte[] intb = BitConverter.GetBytes ((int) $3);\r
2574                                 $$ = (double) BitConverter.ToSingle (intb, BitConverter.IsLittleEndian ? 0 : 4);\r
2575                           }\r
2576                         ;\r
2577 \r
2578 hexbyte                 : HEXBYTE       { }\r
2579                         ;\r
2580 \r
2581 bytes_list              : OPEN_PARENS\r
2582                           {\r
2583                                 tokenizer.InByteArray = true;\r
2584                           }\r
2585                           bytes CLOSE_PARENS\r
2586                           {\r
2587                                 $$ = $3;\r
2588                                 tokenizer.InByteArray = false;\r
2589                           }\r
2590                         ;\r
2591 \r
2592 bytes                   : /* EMPTY */   { $$ = new byte[0]; }\r
2593                         | hexbytes\r
2594                           {\r
2595                                 ArrayList byte_list = (ArrayList) $1;\r
2596                                 $$ = byte_list.ToArray (typeof (byte));\r
2597                           }\r
2598                         ;\r
2599 \r
2600 hexbytes                : hexbyte\r
2601                           {\r
2602                                 ArrayList byte_list = new ArrayList ();\r
2603                                 byte_list.Add (Convert.ToByte ($1));\r
2604                                 $$ = byte_list;\r
2605                           }\r
2606                         | hexbytes hexbyte\r
2607                           {\r
2608                                 ArrayList byte_list = (ArrayList) $1;\r
2609                                 byte_list.Add (Convert.ToByte ($2));\r
2610                           }\r
2611                         ;\r
2612 \r
2613 truefalse               : K_TRUE\r
2614                           {\r
2615                                 $$ = true;\r
2616                           }\r
2617                         | K_FALSE\r
2618                           {\r
2619                                 $$ = false;\r
2620                           }\r
2621                         ;\r
2622 \r
2623 id                      : ID\r
2624                         | SQSTRING\r
2625                         ;\r
2626 \r
2627 comp_name               : id\r
2628                         | comp_name DOT id\r
2629                           {\r
2630                                 $$ = (string) $1 + '.' + (string) $3;\r
2631                           }\r
2632                         | COMP_NAME\r
2633                         ;\r
2634 \r
2635 %%\r
2636 \r
2637 }\r
2638 \r