New test.
[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 using System.Reflection;\r
15 using System.Security;\r
16 using System.Security.Permissions;\r
17 \r
18 using MIPermission = Mono.ILASM.Permission;\r
19 using MIPermissionSet = Mono.ILASM.PermissionSet;\r
20 \r
21 namespace Mono.ILASM {\r
22 \r
23         public class ILParser {\r
24 \r
25                 private CodeGen codegen;\r
26 \r
27                 private bool is_value_class;\r
28                 private bool is_enum_class;\r
29                 private bool pinvoke_info;\r
30                 private string pinvoke_mod;\r
31                 private string pinvoke_meth;\r
32                 private PEAPI.PInvokeAttr pinvoke_attr;\r
33                 private ILTokenizer tokenizer;\r
34                 static int yacc_verbose_flag;\r
35 \r
36                 class NameValuePair {\r
37                         public string Name;\r
38                         public object Value;\r
39 \r
40                         public NameValuePair (string name, object value)\r
41                         {\r
42                                 this.Name = name;\r
43                                 this.Value = value;\r
44                         }\r
45                 }\r
46 \r
47                 class PermPair {\r
48                         public PEAPI.SecurityAction sec_action;\r
49                         public object perm;\r
50 \r
51                         public PermPair (PEAPI.SecurityAction sec_action, object perm)\r
52                         {\r
53                                 this.sec_action = sec_action;\r
54                                 this.perm = perm;\r
55                         }\r
56                 }\r
57 \r
58                 public bool CheckSecurityActionValidity (System.Security.Permissions.SecurityAction action, bool for_assembly)\r
59                 {\r
60                         if ((action == System.Security.Permissions.SecurityAction.RequestMinimum || \r
61                                 action == System.Security.Permissions.SecurityAction.RequestOptional || \r
62                                 action == System.Security.Permissions.SecurityAction.RequestRefuse) && !for_assembly) {\r
63                                 Report.Warning (String.Format ("System.Security.Permissions.SecurityAction '{0}' is not valid for this declaration", action));\r
64                                 return false;\r
65                         }\r
66 \r
67                         return true;\r
68                 }\r
69 \r
70                 public void AddSecDecl (object perm, bool for_assembly)\r
71                 {\r
72                         PermPair pp = perm as PermPair;\r
73 \r
74                         if (pp == null) {\r
75                                 MIPermissionSet ps_20 = (MIPermissionSet) perm;\r
76                                 codegen.AddPermission (ps_20.SecurityAction, ps_20);\r
77                                 return;\r
78                         }\r
79 \r
80                         if (!CheckSecurityActionValidity ((System.Security.Permissions.SecurityAction) pp.sec_action, for_assembly))\r
81                                 Report.Error (String.Format ("Invalid security action : {0}", pp.sec_action));\r
82 \r
83                         codegen.AddPermission (pp.sec_action, pp.perm);\r
84                 }\r
85 \r
86                 public object ClassRefToObject (object class_ref, object val)\r
87                 {\r
88                         ExternTypeRef etr = class_ref as ExternTypeRef;\r
89                         if (etr == null)\r
90                                 /* FIXME: report error? can be PrimitiveTypeRef or TypeRef */\r
91                                 return null;\r
92                                 \r
93                         System.Type t = etr.GetReflectedType ();\r
94                         return (t.IsEnum ? Enum.Parse (t, String.Format ("{0}", val)) : val);\r
95                 }\r
96 \r
97                 /* Converts a type_spec to a corresponding PermPair */\r
98                 PermPair TypeSpecToPermPair (object action, object type_spec, ArrayList pairs)\r
99                 {\r
100                         ExternTypeRef etr = type_spec as ExternTypeRef;\r
101                         if (etr == null)\r
102                                 /* FIXME: could be PrimitiveTypeRef or TypeRef \r
103                                           Report what error? */\r
104                                 return null;\r
105 \r
106                         System.Type t = etr.GetReflectedType ();\r
107                         object obj = Activator.CreateInstance (t, \r
108                                                 new object [] {(System.Security.Permissions.SecurityAction) (short) action});\r
109 \r
110                         if (pairs != null)\r
111                                 foreach (NameValuePair pair in pairs) {\r
112                                         PropertyInfo pi = t.GetProperty (pair.Name);\r
113                                         pi.SetValue (obj, pair.Value, null);\r
114                                 }\r
115 \r
116                         IPermission iper = (IPermission) t.GetMethod ("CreatePermission").Invoke (obj, null);\r
117                         return new PermPair ((PEAPI.SecurityAction) action, iper);\r
118                 }\r
119 \r
120                 public ILParser (CodeGen codegen, ILTokenizer tokenizer)\r
121                 {\r
122                         this.codegen = codegen;\r
123                         this.tokenizer = tokenizer;\r
124                 }\r
125 \r
126                 public CodeGen CodeGen {\r
127                         get { return codegen; }\r
128                 }\r
129 \r
130                 private BaseTypeRef GetTypeRef (BaseTypeRef b)\r
131                 {\r
132                         if (b is BaseClassRef)\r
133                                 return ((BaseClassRef) b).Clone ();\r
134                         return b;\r
135                 }\r
136 \r
137 %}\r
138 \r
139 %token EOF\r
140 \r
141 /* ID - alpha-numeric identifier */\r
142 %token ID\r
143 \r
144 /* QSTRING - quoted string */\r
145 %token QSTRING\r
146 \r
147 /* SQSTRING - single quoted string */\r
148 %token SQSTRING\r
149 \r
150 /* COMP_NAME - A name with dots */\r
151 %token COMP_NAME\r
152 \r
153 /* INT32 - 32 bit integer */\r
154 %token INT32\r
155 \r
156 /* INT64 - 64 bit integer */\r
157 %token INT64\r
158 \r
159 /* FLOAT64 - floating point number */\r
160 %token FLOAT64\r
161 \r
162 /* HEXBYTE - two digit hex number */\r
163 %token HEXBYTE\r
164 \r
165 \r
166 /* Punctuation */\r
167 %token DOT           "."\r
168 %token OPEN_BRACE    "{"\r
169 %token CLOSE_BRACE   "}"\r
170 %token OPEN_BRACKET  "["\r
171 %token CLOSE_BRACKET "]"\r
172 %token OPEN_PARENS   "("\r
173 %token CLOSE_PARENS  ")"\r
174 %token COMMA         ","\r
175 %token COLON         ":"\r
176 %token DOUBLE_COLON  "::"\r
177 %token SEMICOLON     ";"\r
178 %token ASSIGN        "="\r
179 %token STAR          "*"\r
180 %token AMPERSAND     "&"\r
181 %token PLUS          "+"\r
182 %token SLASH         "/"\r
183 %token BANG          "!"\r
184 %token ELLIPSIS      "..."\r
185 %token DASH          "-"\r
186 %token OPEN_ANGLE_BRACKET   "<"\r
187 %token CLOSE_ANGLE_BRACKET  ">"\r
188 \r
189 \r
190 \r
191 %token UNKNOWN\r
192 \r
193 \r
194 /* INSTR_* instruction types */\r
195 %token INSTR_NONE\r
196 %token INSTR_VAR\r
197 %token INSTR_I\r
198 %token INSTR_I8\r
199 %token INSTR_R\r
200 %token INSTR_BRTARGET\r
201 %token INSTR_METHOD\r
202 %token INSTR_NEWOBJ\r
203 %token INSTR_FIELD\r
204 %token INSTR_TYPE\r
205 %token INSTR_STRING\r
206 %token INSTR_SIG\r
207 %token INSTR_RVA\r
208 %token INSTR_TOK\r
209 %token INSTR_SWITCH\r
210 %token INSTR_PHI\r
211 %token INSTR_LOCAL\r
212 %token INSTR_PARAM\r
213 \r
214 \r
215 \r
216 \r
217 \r
218 /* Mechanically generated  - DO NOT EDIT! */\r
219 \r
220 \r
221 /* Directives */\r
222 %token D_ADDON\r
223 %token D_ALGORITHM\r
224 %token D_ASSEMBLY\r
225 %token D_BACKING\r
226 %token D_BLOB\r
227 %token D_CAPABILITY\r
228 %token D_CCTOR\r
229 %token D_CLASS\r
230 %token D_COMTYPE\r
231 %token D_CONFIG\r
232 %token D_IMAGEBASE\r
233 %token D_CORFLAGS\r
234 %token D_CTOR\r
235 %token D_CUSTOM\r
236 %token D_DATA\r
237 %token D_EMITBYTE\r
238 %token D_ENTRYPOINT\r
239 %token D_EVENT\r
240 %token D_EXELOC\r
241 %token D_EXPORT\r
242 %token D_FIELD\r
243 %token D_FILE\r
244 %token D_FIRE\r
245 %token D_GET\r
246 %token D_HASH\r
247 %token D_IMPLICITCOM\r
248 %token D_LANGUAGE\r
249 %token D_LINE\r
250 %token D_XLINE\r
251 %token D_LOCALE\r
252 %token D_LOCALS\r
253 %token D_MANIFESTRES\r
254 %token D_MAXSTACK\r
255 %token D_METHOD\r
256 %token D_MIME\r
257 %token D_MODULE\r
258 %token D_MRESOURCE\r
259 %token D_NAMESPACE\r
260 %token D_ORIGINATOR\r
261 %token D_OS\r
262 %token D_OTHER\r
263 %token D_OVERRIDE\r
264 %token D_PACK\r
265 %token D_PARAM\r
266 %token D_PERMISSION\r
267 %token D_PERMISSIONSET\r
268 %token D_PROCESSOR\r
269 %token D_PROPERTY\r
270 %token D_PUBLICKEY\r
271 %token D_PUBLICKEYTOKEN\r
272 %token D_REMOVEON\r
273 %token D_SET\r
274 %token D_SIZE\r
275 %token D_STACKRESERVE\r
276 %token D_SUBSYSTEM\r
277 %token D_TITLE\r
278 %token D_TRY\r
279 %token D_VER\r
280 %token D_VTABLE\r
281 %token D_VTENTRY\r
282 %token D_VTFIXUP\r
283 %token D_ZEROINIT\r
284 \r
285 \r
286 /* Keywords */\r
287 %token K_AT\r
288 %token K_AS\r
289 %token K_IMPLICITCOM\r
290 %token K_IMPLICITRES\r
291 %token K_NOAPPDOMAIN\r
292 %token K_NOPROCESS\r
293 %token K_NOMACHINE\r
294 %token K_EXTERN\r
295 %token K_INSTANCE\r
296 %token K_EXPLICIT\r
297 %token K_DEFAULT\r
298 %token K_VARARG\r
299 %token K_UNMANAGED\r
300 %token K_CDECL\r
301 %token K_STDCALL\r
302 %token K_THISCALL\r
303 %token K_FASTCALL\r
304 %token K_MARSHAL\r
305 %token K_IN\r
306 %token K_OUT\r
307 %token K_OPT\r
308 // %token K_LCID\r
309 %token K_RETVAL\r
310 %token K_STATIC\r
311 %token K_PUBLIC\r
312 %token K_PRIVATE\r
313 %token K_FAMILY\r
314 %token K_INITONLY\r
315 %token K_RTSPECIALNAME\r
316 %token K_SPECIALNAME\r
317 %token K_ASSEMBLY\r
318 %token K_FAMANDASSEM\r
319 %token K_FAMORASSEM\r
320 %token K_PRIVATESCOPE\r
321 %token K_LITERAL\r
322 %token K_NOTSERIALIZED\r
323 %token K_VALUE\r
324 %token K_NOT_IN_GC_HEAP\r
325 %token K_INTERFACE\r
326 %token K_SEALED\r
327 %token K_ABSTRACT\r
328 %token K_AUTO\r
329 %token K_SEQUENTIAL\r
330 %token K_ANSI\r
331 %token K_UNICODE\r
332 %token K_AUTOCHAR\r
333 %token K_BESTFIT\r
334 %token K_IMPORT\r
335 %token K_SERIALIZABLE\r
336 %token K_NESTED\r
337 %token K_LATEINIT\r
338 %token K_EXTENDS\r
339 %token K_IMPLEMENTS\r
340 %token K_FINAL\r
341 %token K_VIRTUAL\r
342 %token K_HIDEBYSIG\r
343 %token K_NEWSLOT\r
344 %token K_UNMANAGEDEXP\r
345 %token K_PINVOKEIMPL\r
346 %token K_NOMANGLE\r
347 %token K_OLE\r
348 %token K_LASTERR\r
349 %token K_WINAPI\r
350 %token K_NATIVE\r
351 %token K_IL\r
352 %token K_CIL\r
353 %token K_OPTIL\r
354 %token K_MANAGED\r
355 %token K_FORWARDREF\r
356 %token K_RUNTIME\r
357 %token K_INTERNALCALL\r
358 %token K_SYNCHRONIZED\r
359 %token K_NOINLINING\r
360 %token K_CUSTOM\r
361 %token K_FIXED\r
362 %token K_SYSSTRING\r
363 %token K_ARRAY\r
364 %token K_VARIANT\r
365 %token K_CURRENCY\r
366 %token K_SYSCHAR\r
367 %token K_VOID\r
368 %token K_BOOL\r
369 %token K_INT8\r
370 %token K_INT16\r
371 %token K_INT32\r
372 %token K_INT64\r
373 %token K_FLOAT32\r
374 %token K_FLOAT64\r
375 %token K_ERROR\r
376 %token K_UNSIGNED\r
377 %token K_UINT\r
378 %token K_UINT8\r
379 %token K_UINT16\r
380 %token K_UINT32\r
381 %token K_UINT64\r
382 %token K_DECIMAL\r
383 %token K_DATE\r
384 %token K_BSTR\r
385 %token K_LPSTR\r
386 %token K_LPWSTR\r
387 %token K_LPTSTR\r
388 %token K_OBJECTREF\r
389 %token K_IUNKNOWN\r
390 %token K_IDISPATCH\r
391 %token K_STRUCT\r
392 %token K_SAFEARRAY\r
393 %token K_INT\r
394 %token K_BYVALSTR\r
395 %token K_TBSTR\r
396 %token K_LPVOID\r
397 %token K_ANY\r
398 %token K_FLOAT\r
399 %token K_LPSTRUCT\r
400 %token K_NULL\r
401 %token K_PTR\r
402 %token K_VECTOR\r
403 %token K_HRESULT\r
404 %token K_CARRAY\r
405 %token K_USERDEFINED\r
406 %token K_RECORD\r
407 %token K_FILETIME\r
408 %token K_BLOB\r
409 %token K_STREAM\r
410 %token K_STORAGE\r
411 %token K_STREAMED_OBJECT\r
412 %token K_STORED_OBJECT\r
413 %token K_BLOB_OBJECT\r
414 %token K_CF\r
415 %token K_CLSID\r
416 %token K_METHOD\r
417 %token K_CLASS\r
418 %token K_PINNED\r
419 %token K_MODREQ\r
420 %token K_MODOPT\r
421 %token K_TYPEDREF\r
422 %token K_TYPE\r
423 %token K_WCHAR\r
424 %token K_CHAR\r
425 %token K_FROMUNMANAGED\r
426 %token K_CALLMOSTDERIVED\r
427 %token K_BYTEARRAY\r
428 %token K_WITH\r
429 %token K_INIT\r
430 %token K_TO\r
431 %token K_CATCH\r
432 %token K_FILTER\r
433 %token K_FINALLY\r
434 %token K_FAULT\r
435 %token K_HANDLER\r
436 %token K_TLS\r
437 %token K_FIELD\r
438 %token K_PROPERTY\r
439 %token K_REQUEST\r
440 %token K_DEMAND\r
441 %token K_ASSERT\r
442 %token K_DENY\r
443 %token K_PERMITONLY\r
444 %token K_LINKCHECK\r
445 %token K_INHERITCHECK\r
446 %token K_REQMIN\r
447 %token K_REQOPT\r
448 %token K_REQREFUSE\r
449 %token K_PREJITGRANT\r
450 %token K_PREJITDENY\r
451 %token K_NONCASDEMAND\r
452 %token K_NONCASLINKDEMAND\r
453 %token K_NONCASINHERITANCE\r
454 %token K_READONLY\r
455 %token K_NOMETADATA\r
456 %token K_ALGORITHM\r
457 %token K_FULLORIGIN\r
458 // %token K_NAN\r
459 // %token K_INF\r
460 // %token K_PUBLICKEY\r
461 %token K_ENABLEJITTRACKING\r
462 %token K_DISABLEJITOPTIMIZER\r
463 %token K_PRESERVESIG\r
464 %token K_BEFOREFIELDINIT\r
465 %token K_ALIGNMENT\r
466 %token K_NULLREF\r
467 %token K_VALUETYPE\r
468 %token K_COMPILERCONTROLLED\r
469 %token K_REQSECOBJ\r
470 %token K_ENUM\r
471 %token K_OBJECT\r
472 %token K_STRING\r
473 %token K_TRUE\r
474 %token K_FALSE\r
475 %token K_IS\r
476 %token K_ON\r
477 %token K_OFF\r
478 %token K_CHARMAPERROR\r
479 \r
480 /* end generated */\r
481 \r
482 \r
483 \r
484 \r
485 \r
486 %start il_file\r
487 \r
488 %%\r
489 \r
490 il_file                 : decls\r
491                         ;\r
492 \r
493 decls                   : /* EMPTY */\r
494                         | decls decl\r
495                         ;\r
496 \r
497 decl                    : class_all\r
498                         | namespace_all\r
499                         | method_all\r
500                         | field_decl\r
501                         | data_decl\r
502                         | vtfixup_decl\r
503                         | file_decl\r
504                         | assembly_all\r
505                         | assemblyref_all\r
506                         | exptype_all\r
507                         | manifestres_all\r
508                         | module_head\r
509                         | sec_decl\r
510                         | customattr_decl\r
511                           {\r
512                                 if (codegen.CurrentCustomAttrTarget != null)\r
513                                         codegen.CurrentCustomAttrTarget.AddCustomAttribute ((CustomAttr) $1);\r
514                           }\r
515                         | D_SUBSYSTEM int32\r
516                           {\r
517                                 codegen.SetSubSystem ((int) $2);\r
518                           }\r
519                         | D_CORFLAGS int32\r
520                           {\r
521                                 codegen.SetCorFlags ((int) $2);\r
522                           }\r
523                         | D_FILE K_ALIGNMENT int32\r
524                         | D_IMAGEBASE int64\r
525                           {\r
526                                 codegen.SetImageBase ((long) $2);\r
527                           }\r
528                         | D_STACKRESERVE int64\r
529                           {\r
530                                 codegen.SetStackReserve ((long) $2);\r
531                           }\r
532                         | extsource_spec\r
533                         | language_decl\r
534                         ;\r
535 \r
536 extsource_spec          : D_LINE int32 SQSTRING\r
537                         | D_LINE int32\r
538                         | D_LINE int32 COLON int32 SQSTRING\r
539                         | D_LINE int32 COLON int32\r
540                         ;\r
541 \r
542 language_decl           : D_LANGUAGE SQSTRING\r
543                         | D_LANGUAGE SQSTRING COMMA SQSTRING\r
544                         | D_LANGUAGE SQSTRING COMMA SQSTRING COMMA SQSTRING\r
545                         ;\r
546 \r
547                         \r
548 vtfixup_decl            : D_VTFIXUP OPEN_BRACKET int32 CLOSE_BRACKET \r
549                           vtfixup_attr K_AT id\r
550                         ;\r
551 \r
552 vtfixup_attr            : /* EMPTY */\r
553                         | vtfixup_attr K_INT32\r
554                         | vtfixup_attr K_INT64\r
555                         | vtfixup_attr K_FROMUNMANAGED\r
556                         | vtfixup_attr K_CALLMOSTDERIVED\r
557                         ;\r
558 \r
559 namespace_all           : namespace_head OPEN_BRACE decls CLOSE_BRACE\r
560                           {\r
561                                 codegen.CurrentNameSpace = null;\r
562                           }\r
563                         ;\r
564 \r
565 namespace_head          : D_NAMESPACE comp_name\r
566                           {\r
567                                 codegen.CurrentNameSpace = (string) $2;\r
568                           }\r
569                         ;\r
570 \r
571 class_all               : class_head OPEN_BRACE class_decls CLOSE_BRACE\r
572                           {\r
573                                 codegen.EndTypeDef ();\r
574                           }\r
575                         ;\r
576 \r
577 class_head              : D_CLASS class_attr comp_name formal_typars_clause extends_clause\r
578                           impl_clause\r
579                           {\r
580                                 codegen.BeginTypeDef ((TypeAttr) $2, (string) $3, \r
581                                                 $5 as BaseClassRef, $6 as ArrayList, null, (GenericParameters) $4);\r
582                                 \r
583                                 if (is_value_class)\r
584                                         codegen.CurrentTypeDef.MakeValueClass ();\r
585                                 if (is_enum_class)\r
586                                         codegen.CurrentTypeDef.MakeEnumClass ();\r
587                           }\r
588                         ;\r
589 \r
590 class_attrs             : class_attrs class_attr\r
591                         ;\r
592 \r
593 class_attr              : /* EMPTY */                           \r
594                           { \r
595                                 // Reset some flags\r
596                                 is_value_class = false;\r
597                                 is_enum_class = false;\r
598                                 $$ = new TypeAttr ();\r
599                           }\r
600                         | class_attr K_PUBLIC                   { $$ = (TypeAttr)$1 | TypeAttr.Public; }        \r
601                         | class_attr K_PRIVATE                  { $$ = (TypeAttr)$1 | TypeAttr.Private; }\r
602                         | class_attr K_NESTED K_PRIVATE         { $$ = (TypeAttr)$1 | TypeAttr.NestedPrivate; }\r
603                         | class_attr K_NESTED K_PUBLIC          { $$ = (TypeAttr)$1 | TypeAttr.NestedPublic; }\r
604                         | class_attr K_NESTED K_FAMILY          { $$ = (TypeAttr)$1 | TypeAttr.NestedFamily; }\r
605                         | class_attr K_NESTED K_ASSEMBLY        { $$ = (TypeAttr)$1 | TypeAttr.NestedAssembly;}\r
606                         | class_attr K_NESTED K_FAMANDASSEM     { $$ = (TypeAttr)$1 | TypeAttr.NestedFamAndAssem; }\r
607                         | class_attr K_NESTED K_FAMORASSEM      { $$ = (TypeAttr)$1 | TypeAttr.NestedFamOrAssem; }\r
608                         | class_attr K_VALUE                    { is_value_class = true; }\r
609                         | class_attr K_ENUM                     { is_enum_class = true; is_value_class = true;\r
610                           }\r
611                         | class_attr K_INTERFACE                { $$ = (TypeAttr)$1 | TypeAttr.Interface; }\r
612                         | class_attr K_SEALED                   { $$ = (TypeAttr)$1 | TypeAttr.Sealed; }\r
613                         | class_attr K_ABSTRACT                 { $$ = (TypeAttr)$1 | TypeAttr.Abstract; }\r
614                         | class_attr K_AUTO                     {  }\r
615                         | class_attr K_SEQUENTIAL               { $$ = (TypeAttr)$1 | TypeAttr.SequentialLayout; }\r
616                         | class_attr K_EXPLICIT                 { $$ = (TypeAttr)$1 | TypeAttr.ExplicitLayout; }\r
617                         | class_attr K_ANSI                     {  }\r
618                         | class_attr K_UNICODE                  { $$ = (TypeAttr)$1 | TypeAttr.UnicodeClass; }\r
619                         | class_attr K_AUTOCHAR                 { $$ = (TypeAttr)$1 | TypeAttr.AutoClass; }\r
620                         | class_attr K_IMPORT                   { $$ = (TypeAttr)$1 | TypeAttr.Import; }\r
621                         | class_attr K_SERIALIZABLE             { $$ = (TypeAttr)$1 | TypeAttr.Serializable; }\r
622                         | class_attr K_BEFOREFIELDINIT          { $$ = (TypeAttr)$1 | TypeAttr.BeforeFieldInit; }\r
623                         | class_attr K_SPECIALNAME              { $$ = (TypeAttr)$1 | TypeAttr.SpecialName; }\r
624                         | class_attr K_RTSPECIALNAME            { $$ = (TypeAttr)$1 | TypeAttr.RTSpecialName; }\r
625                         ;\r
626 \r
627 extends_clause          : /* EMPTY */\r
628                         | K_EXTENDS generic_class_ref\r
629                           {\r
630                                 $$ = $2;\r
631                           }\r
632                         ;\r
633 \r
634 impl_clause             : /* EMPTY */\r
635                         | impl_class_refs\r
636                         ;\r
637 \r
638 impl_class_refs         : K_IMPLEMENTS generic_class_ref\r
639                           {\r
640                                 ArrayList al = new ArrayList ();\r
641                                 al.Add ($2);\r
642                                 $$ = al;\r
643                           }\r
644                         | impl_class_refs COMMA generic_class_ref\r
645                           {\r
646                                 ArrayList al = (ArrayList) $1;\r
647 \r
648                                 al.Insert (0, $3);\r
649                                 $$ = al;\r
650                           }\r
651                         ;\r
652 \r
653 formal_typars_clause           : /* EMPTY */\r
654                         | OPEN_ANGLE_BRACKET formal_typars CLOSE_ANGLE_BRACKET\r
655                           {\r
656 #if NET_2_0 || BOOTSTRAP_NET_2_0\r
657                                 $$ = $2;\r
658 #else\r
659                                 Report.Error ("Use ilasm2 for generics support.");\r
660 #endif\r
661                           }\r
662                         ;\r
663 \r
664 typars_clause           : /* EMPTY */\r
665                         | OPEN_ANGLE_BRACKET typars CLOSE_ANGLE_BRACKET\r
666                           {\r
667 #if NET_2_0 || BOOTSTRAP_NET_2_0\r
668                                 $$ = $2;\r
669 #else\r
670                                 Report.Error ("Use ilasm2 for generics support.");\r
671 #endif\r
672                           }\r
673                         ;\r
674 \r
675 typars                  : type\r
676                           {\r
677                                 GenericArguments ga = new GenericArguments ();\r
678                                 ga.Add ((BaseTypeRef) $1);\r
679                                 $$ = ga;\r
680                           }\r
681                         | typars COMMA type\r
682                           {\r
683                                 ((GenericArguments) $1).Add ((BaseTypeRef) $3);\r
684                                 $$ = $1;\r
685                           }\r
686                         ;\r
687 \r
688 constraints_clause      : /* EMTPY */\r
689                         | OPEN_PARENS constraints CLOSE_PARENS\r
690                           {\r
691                                 $$ = $2;\r
692                           }\r
693                        ;\r
694 \r
695 \r
696 constraints             : generic_class_ref\r
697                           {\r
698                                 ArrayList al = new ArrayList ();\r
699                                 al.Add ($1);\r
700                                 $$ = al;\r
701                            }\r
702                         | constraints COMMA generic_class_ref\r
703                           {\r
704                                 ArrayList al = (ArrayList) $1;\r
705                                 al.Add ($3);\r
706                                 $$ = al;\r
707                           }\r
708                         ;\r
709 \r
710 generic_class_ref       : class_ref\r
711                           {\r
712                                 $$ = $1;\r
713                           }\r
714                         | K_CLASS class_ref typars_clause\r
715                           {\r
716                                 if ($3 != null)\r
717                                         $$ = ((BaseClassRef) $2).GetGenericTypeInst ((GenericArguments) $3);\r
718                                 else\r
719                                         $$ = $2;\r
720                           }\r
721                         | BANG int32\r
722                           {\r
723                                 GenParam gpar = new GenParam ((int) $2, "", GenParamType.Var);\r
724                                 $$ = new GenericParamRef (gpar, $2.ToString ());\r
725                           }\r
726                         | BANG BANG int32\r
727                           {\r
728                                 GenParam gpar = new GenParam ((int) $3, "", GenParamType.MVar);\r
729                                 $$ = new GenericParamRef (gpar, $3.ToString ());\r
730                           }\r
731                         | BANG id\r
732                           {\r
733                                 int num = -1;\r
734                                 string name = (string) $2;\r
735                                 if (codegen.CurrentTypeDef != null)\r
736                                         num = codegen.CurrentTypeDef.GetGenericParamNum (name);\r
737                                 GenParam gpar = new GenParam (num, name, GenParamType.Var);\r
738                                 $$ = new GenericParamRef (gpar, name);\r
739                           }\r
740                         | BANG BANG id\r
741                           {\r
742                                 int num = -1;\r
743                                 string name = (string) $3;\r
744                                 if (codegen.CurrentMethodDef != null)\r
745                                         num = codegen.CurrentMethodDef.GetGenericParamNum (name);\r
746                                 GenParam gpar = new GenParam (num, name, GenParamType.MVar);\r
747                                 $$ = new GenericParamRef (gpar, name);\r
748                           }\r
749                         ; \r
750 \r
751 formal_typars           : formal_typar_attr constraints_clause formal_typar\r
752                           {\r
753                                 GenericParameter gp = new GenericParameter ((string) $3, (PEAPI.GenericParamAttributes) $1, (ArrayList) $2);\r
754 \r
755                                 GenericParameters colln = new GenericParameters ();\r
756                                 colln.Add (gp);\r
757                                 $$ = colln;\r
758                           }\r
759                         | formal_typars COMMA formal_typar_attr constraints_clause formal_typar\r
760                           {\r
761                                 GenericParameters colln = (GenericParameters) $1;\r
762                                 colln.Add (new GenericParameter ((string) $5, (PEAPI.GenericParamAttributes) $3, (ArrayList) $4));\r
763                                 $$ = colln;\r
764                           }\r
765                          ;\r
766  \r
767 formal_typar_attr       : /* EMPTY */\r
768                           {\r
769                                 $$ = new PEAPI.GenericParamAttributes ();\r
770                           }\r
771                         | formal_typar_attr D_CTOR\r
772                           {\r
773                                $$ = (PEAPI.GenericParamAttributes) $1 | PEAPI.GenericParamAttributes.DefaultConstructorConstrait; \r
774                           }\r
775                         | formal_typar_attr K_VALUETYPE\r
776                           {\r
777                                $$ = (PEAPI.GenericParamAttributes) $1 | PEAPI.GenericParamAttributes.NotNullableValueTypeConstraint; \r
778                           }\r
779                         | formal_typar_attr K_CLASS\r
780                           {\r
781                                $$ = (PEAPI.GenericParamAttributes) $1 | PEAPI.GenericParamAttributes.ReferenceTypeConstraint; \r
782                           }\r
783                         ;\r
784 \r
785 formal_typar            : id\r
786                           {\r
787                                 $$ = $1;\r
788                           }\r
789                         ;\r
790 \r
791 param_type_decl         : D_PARAM K_TYPE id\r
792                           {\r
793                                   if (codegen.CurrentMethodDef != null)\r
794                                           codegen.CurrentCustomAttrTarget = codegen.CurrentMethodDef.GetGenericParam ((string) $3);\r
795                                   else\r
796                                           codegen.CurrentCustomAttrTarget = codegen.CurrentTypeDef.GetGenericParam ((string) $3);\r
797                                   if (codegen.CurrentCustomAttrTarget == null)\r
798                                           Report.Error (String.Format ("Type parameter '{0}' undefined.", (string) $3));\r
799                           }\r
800                         | D_PARAM K_TYPE OPEN_BRACKET int32 CLOSE_BRACKET\r
801                           {\r
802                                   int index = ((int) $4);\r
803                                   if (codegen.CurrentMethodDef != null)\r
804                                           codegen.CurrentCustomAttrTarget = codegen.CurrentMethodDef.GetGenericParam (index - 1);\r
805                                   else\r
806                                           codegen.CurrentCustomAttrTarget = codegen.CurrentTypeDef.GetGenericParam (index - 1);\r
807                                   if (codegen.CurrentCustomAttrTarget == null)\r
808                                           Report.Error (String.Format ("Type parameter '{0}' index out of range.", index));\r
809                           }\r
810                         ;\r
811                         \r
812 class_refs              : class_ref\r
813                           {\r
814                                 ArrayList class_list = new ArrayList ();\r
815                                 class_list.Add ($1);\r
816                                 $$ = class_list; \r
817                           }\r
818                         | class_refs COMMA class_ref\r
819                           {\r
820                                 ArrayList class_list = (ArrayList) $1;\r
821                                 class_list.Add ($3);\r
822                           }\r
823                         ;\r
824 \r
825 slashed_name            : comp_name\r
826                         | slashed_name SLASH comp_name\r
827                           {\r
828                                 $$ = String.Format ("{0}/{1}", $1, $3);\r
829                           }\r
830                         ;\r
831 \r
832 class_ref               : OPEN_BRACKET slashed_name CLOSE_BRACKET slashed_name\r
833                           {\r
834                                 if (codegen.IsThisAssembly ((string) $2)) {\r
835                                         $$ = codegen.GetTypeRef ((string) $4);\r
836                                 } else {\r
837                                         $$ = codegen.ExternTable.GetTypeRef ((string) $2, (string) $4, false);\r
838                                 }\r
839                           }\r
840                         | OPEN_BRACKET D_MODULE slashed_name CLOSE_BRACKET slashed_name\r
841                           {\r
842                                 if (codegen.IsThisModule ((string) $3)) {\r
843                                         $$ = codegen.GetTypeRef ((string) $5);\r
844                                 } else {\r
845                                         $$ = codegen.ExternTable.GetModuleTypeRef ((string) $3, (string) $5, false);\r
846                                 }\r
847                           }\r
848                         | slashed_name\r
849                           {\r
850                                 PrimitiveTypeRef prim = PrimitiveTypeRef.GetPrimitiveType ((string) $1);\r
851 \r
852                                 if (prim != null && !codegen.IsThisAssembly ("mscorlib"))\r
853                                         $$ = prim;\r
854                                 else\r
855                                         $$ = codegen.GetTypeRef ((string) $1);\r
856                           }\r
857                       \r
858                         ;\r
859 \r
860 class_decls             : /* EMPTY */\r
861                         | class_decls class_decl\r
862                         ;\r
863 \r
864 class_decl              : method_all\r
865                         | class_all\r
866                         | event_all\r
867                         | prop_all\r
868                         | field_decl\r
869                         | data_decl\r
870                         | sec_decl\r
871                           {\r
872                                 AddSecDecl ($1, false);\r
873                           }\r
874                         | extsource_spec\r
875                         | customattr_decl\r
876                           {\r
877                                 if (codegen.CurrentCustomAttrTarget != null)\r
878                                         codegen.CurrentCustomAttrTarget.AddCustomAttribute ((CustomAttr) $1);\r
879                           }\r
880                         | param_type_decl\r
881                         | D_SIZE int32\r
882                           {\r
883                                 codegen.CurrentTypeDef.SetSize ((int) $2);\r
884                           }\r
885                         | D_PACK int32\r
886                           {\r
887                                 codegen.CurrentTypeDef.SetPack ((int) $2);\r
888                           }\r
889                         | D_OVERRIDE type_spec DOUBLE_COLON method_name K_WITH call_conv type\r
890                           type_spec DOUBLE_COLON method_name type_list\r
891                           {\r
892                                 //\r
893                                 // My copy of the spec didn't have a type_list but\r
894                                 // it seems pretty crucial\r
895                                 //\r
896                                 BaseTypeRef owner = (BaseTypeRef) $2;\r
897                                 ArrayList arg_list = (ArrayList) $11;\r
898                                 BaseTypeRef[] param_list;\r
899                                 BaseMethodRef decl;\r
900 \r
901                                 if (arg_list != null)\r
902                                         param_list = (BaseTypeRef[]) arg_list.ToArray (typeof (BaseTypeRef));\r
903                                 else\r
904                                         param_list = new BaseTypeRef[0];\r
905 \r
906                                 decl = owner.GetMethodRef ((BaseTypeRef) $7,\r
907                                         (CallConv) $6, (string) $4, param_list, 0);\r
908 \r
909                                 // NOTICE: `owner' here might be wrong\r
910                                 string sig = MethodDef.CreateSignature (owner, (string) $10,\r
911                                                                         param_list, 0);\r
912                                 codegen.CurrentTypeDef.AddOverride (sig, decl);                                        \r
913                           }\r
914                           OPEN_PARENS sig_args CLOSE_PARENS\r
915                         | language_decl\r
916                         ;\r
917 \r
918 type                    : generic_class_ref\r
919                           {\r
920                                 $$ = $1;\r
921                           }\r
922                         | K_OBJECT\r
923                           {\r
924                                 $$ = new PrimitiveTypeRef (PrimitiveType.Object, "System.Object");\r
925                           }\r
926                         | K_VALUE K_CLASS class_ref\r
927                           {\r
928                                 BaseClassRef class_ref = (BaseClassRef) $3;\r
929                                 class_ref.MakeValueClass ();\r
930                                 $$ = class_ref;\r
931                           }\r
932                         | K_VALUETYPE OPEN_BRACKET slashed_name CLOSE_BRACKET slashed_name typars_clause\r
933                           {\r
934                                 ExternTypeRef ext_ref = codegen.ExternTable.GetTypeRef ((string) $3, (string) $5, true);\r
935                                 if ($6 != null)\r
936                                         $$ = ext_ref.GetGenericTypeInst ((GenericArguments) $6);\r
937                                 else\r
938                                         $$ = ext_ref;\r
939                           }\r
940                         | K_VALUETYPE slashed_name typars_clause\r
941                           {\r
942                                 TypeRef t_ref = codegen.GetTypeRef ((string) $2);\r
943                                 t_ref.MakeValueClass ();\r
944                                 if ($3 != null)\r
945                                         $$ = t_ref.GetGenericTypeInst ((GenericArguments) $3);\r
946                                 else\r
947                                         $$ = t_ref;\r
948                           }\r
949                         | type OPEN_BRACKET CLOSE_BRACKET\r
950                           {\r
951                                 BaseTypeRef base_type = GetTypeRef ((BaseTypeRef) $1);\r
952                                 base_type.MakeArray ();\r
953                                 $$ = base_type;\r
954                           }\r
955                         | type OPEN_BRACKET bounds CLOSE_BRACKET\r
956                           {\r
957                                 BaseTypeRef base_type = GetTypeRef ((BaseTypeRef) $1);\r
958                                 ArrayList bound_list = (ArrayList) $3;\r
959                                 base_type.MakeBoundArray (bound_list);\r
960                                 $$ = base_type;\r
961                           }\r
962                         | type AMPERSAND\r
963                           {\r
964                                 BaseTypeRef base_type = GetTypeRef ((BaseTypeRef) $1);\r
965                                 base_type.MakeManagedPointer ();\r
966                                 $$ = base_type;\r
967                           }\r
968                         | type STAR\r
969                           {\r
970                                 BaseTypeRef base_type = GetTypeRef ((BaseTypeRef) $1);\r
971                                 base_type.MakeUnmanagedPointer ();\r
972                                 $$ = base_type;\r
973                           }\r
974                         | type K_PINNED\r
975                           {\r
976                                 BaseTypeRef base_type = GetTypeRef ((BaseTypeRef) $1);\r
977                                 base_type.MakePinned ();\r
978                                 $$ = base_type;\r
979                           }\r
980                         | type K_MODREQ OPEN_PARENS class_ref CLOSE_PARENS\r
981                           {\r
982                                 BaseTypeRef base_type = GetTypeRef ((BaseTypeRef) $1);\r
983                                 BaseClassRef class_ref = (BaseClassRef) $4;\r
984                                 base_type.MakeCustomModified (codegen,\r
985                                         CustomModifier.modreq, class_ref);\r
986                                 $$ = base_type;\r
987                           }\r
988                         | type K_MODOPT OPEN_PARENS class_ref CLOSE_PARENS\r
989                           {\r
990                                 BaseTypeRef base_type = GetTypeRef ((BaseTypeRef) $1);\r
991                                 BaseClassRef class_ref = (BaseClassRef) $4;\r
992                                 base_type.MakeCustomModified (codegen,\r
993                                         CustomModifier.modopt, class_ref);\r
994                                 $$ = base_type;\r
995                           }\r
996                         | K_METHOD call_conv type STAR OPEN_PARENS sig_args CLOSE_PARENS\r
997                           {\r
998                                 $$ = new MethodPointerTypeRef ((CallConv) $2, (BaseTypeRef) $3, (ArrayList) $6);\r
999                           }\r
1000                         | primitive_type\r
1001                         ;\r
1002 \r
1003                         ;\r
1004 \r
1005 primitive_type          : K_INT8\r
1006                           {\r
1007                                 $$ = new PrimitiveTypeRef (PrimitiveType.Int8, "System.SByte");\r
1008                           }\r
1009                         | K_INT16\r
1010                           {\r
1011                                 $$ = new PrimitiveTypeRef (PrimitiveType.Int16, "System.Int16");\r
1012                           }\r
1013                         | K_INT32\r
1014                           {\r
1015                                 $$ = new PrimitiveTypeRef (PrimitiveType.Int32, "System.Int32");\r
1016                           }\r
1017                         | K_INT64\r
1018                           {\r
1019                                 $$ = new PrimitiveTypeRef (PrimitiveType.Int64, "System.Int64");\r
1020                           }\r
1021                         | K_FLOAT32\r
1022                           {\r
1023                                 $$ = new PrimitiveTypeRef (PrimitiveType.Float32, "System.Single");\r
1024                           }\r
1025                         | K_FLOAT64\r
1026                           {\r
1027                                 $$ = new PrimitiveTypeRef (PrimitiveType.Float64, "System.Double");\r
1028                           }\r
1029                         | K_UNSIGNED K_INT8\r
1030                           {\r
1031                                 $$ = new PrimitiveTypeRef (PrimitiveType.UInt8, "System.Byte");\r
1032                           }\r
1033                         | K_UINT8\r
1034                           {\r
1035                                 $$ = new PrimitiveTypeRef (PrimitiveType.UInt8, "System.Byte");\r
1036                           }\r
1037                         | K_UNSIGNED K_INT16\r
1038                           {\r
1039                                 $$ = new PrimitiveTypeRef (PrimitiveType.UInt16, "System.UInt16");     \r
1040                           }\r
1041                         | K_UINT16\r
1042                           {\r
1043                                 $$ = new PrimitiveTypeRef (PrimitiveType.UInt16, "System.UInt16");     \r
1044                           }\r
1045                         | K_UNSIGNED K_INT32\r
1046                           {\r
1047                                 $$ = new PrimitiveTypeRef (PrimitiveType.UInt32, "System.UInt32");\r
1048                           }\r
1049                         | K_UINT32\r
1050                           {\r
1051                                 $$ = new PrimitiveTypeRef (PrimitiveType.UInt32, "System.UInt32");\r
1052                           }\r
1053                         | K_UNSIGNED K_INT64\r
1054                           {\r
1055                                 $$ = new PrimitiveTypeRef (PrimitiveType.UInt64, "System.UInt64");\r
1056                           }\r
1057                         | K_UINT64\r
1058                           {\r
1059                                 $$ = new PrimitiveTypeRef (PrimitiveType.UInt64, "System.UInt64");\r
1060                           }\r
1061                         | K_NATIVE K_INT\r
1062                           {\r
1063                                 // TODO: Is this the proper full name\r
1064                                 $$ = new PrimitiveTypeRef (PrimitiveType.NativeInt, "System.IntPtr");\r
1065                           }\r
1066                         | K_NATIVE K_UNSIGNED K_INT\r
1067                           {\r
1068                                 $$ = new PrimitiveTypeRef (PrimitiveType.NativeUInt, "System.UIntPtr");\r
1069                           }\r
1070                         | K_NATIVE K_UINT\r
1071                           {\r
1072                                 $$ = new PrimitiveTypeRef (PrimitiveType.NativeUInt, "System.UIntPtr");\r
1073                           }\r
1074                         | K_TYPEDREF\r
1075                           {\r
1076                                 $$ = new PrimitiveTypeRef (PrimitiveType.TypedRef,\r
1077                                         "System.TypedReference");\r
1078                           }\r
1079                         | K_CHAR\r
1080                           {\r
1081                                 $$ = new PrimitiveTypeRef (PrimitiveType.Char, "System.Char");\r
1082                           }\r
1083                         | K_WCHAR\r
1084                           {\r
1085                                 $$ = new PrimitiveTypeRef (PrimitiveType.Char, "System.Char");\r
1086                           }\r
1087                         | K_VOID\r
1088                           {\r
1089                                 $$ = new PrimitiveTypeRef (PrimitiveType.Void, "System.Void");\r
1090                           }\r
1091                         | K_BOOL\r
1092                           {\r
1093                                 $$ = new PrimitiveTypeRef (PrimitiveType.Boolean, "System.Boolean");\r
1094                           }\r
1095                         | K_STRING\r
1096                           {\r
1097                                 $$ = new PrimitiveTypeRef (PrimitiveType.String, "System.String");\r
1098                           }\r
1099                         ;\r
1100 \r
1101 bounds                  : bound\r
1102                           {\r
1103                                 ArrayList bound_list = new ArrayList ();\r
1104                                 bound_list.Add ($1);\r
1105                                 $$ = bound_list;\r
1106                           }\r
1107                         | bounds COMMA bound\r
1108                           {\r
1109                                 ArrayList bound_list = (ArrayList) $1;\r
1110                                 bound_list.Add ($3);\r
1111                           }\r
1112                         ;\r
1113 \r
1114 bound                   : /* EMPTY */\r
1115                           {\r
1116                                 // This is shortref for no lowerbound or size\r
1117                                 $$ = new DictionaryEntry (TypeRef.Ellipsis, TypeRef.Ellipsis);\r
1118                           }\r
1119                         | ELLIPSIS\r
1120                           {\r
1121                                 // No lower bound or size\r
1122                                 $$ = new DictionaryEntry (TypeRef.Ellipsis, TypeRef.Ellipsis);\r
1123                           }\r
1124                         | int32\r
1125                           {\r
1126                                 /* Only size specified */ \r
1127                                 int size = (int) $1;\r
1128                                 if (size < 0)\r
1129                                         /* size cannot be < 0, so emit as (0, ...)\r
1130                                            ilasm.net emits it like this */\r
1131                                         $$ = new DictionaryEntry (0, TypeRef.Ellipsis);\r
1132                                 else\r
1133                                         $$ = new DictionaryEntry (TypeRef.Ellipsis, size);\r
1134                           }\r
1135                         | int32 ELLIPSIS int32\r
1136                           {\r
1137                                 // lower and upper bound\r
1138                                 int lower = (int) $1;\r
1139                                 int upper = (int) $3;\r
1140                                 if (lower > upper) \r
1141                                         Report.Error ("Lower bound " + lower + " must be <= upper bound " + upper);\r
1142 \r
1143                                 $$ = new DictionaryEntry ($1, $3);\r
1144                           }\r
1145                         | int32 ELLIPSIS\r
1146                           {\r
1147                                 // Just lower bound\r
1148                                 $$ = new DictionaryEntry ($1, TypeRef.Ellipsis);\r
1149                           }\r
1150                         ;\r
1151 \r
1152 call_conv               : K_INSTANCE call_conv\r
1153                           {\r
1154                                 $$ = (CallConv) $2 | CallConv.Instance;\r
1155                           }\r
1156                         | K_EXPLICIT call_conv\r
1157                           {\r
1158                                 $$ = (CallConv) $2 | CallConv.InstanceExplicit;\r
1159                           }\r
1160                         | call_kind\r
1161                         ;\r
1162 \r
1163 call_kind               : /* EMPTY */\r
1164                           {\r
1165                                 $$ = new CallConv ();\r
1166                           }\r
1167                         | K_DEFAULT\r
1168                           {\r
1169                                 $$ = CallConv.Default;\r
1170                           }\r
1171                         | K_VARARG\r
1172                           {\r
1173                                 $$ = CallConv.Vararg;\r
1174                           }\r
1175                         | K_UNMANAGED K_CDECL\r
1176                           {\r
1177                                 $$ = CallConv.Cdecl;\r
1178                           }\r
1179                         | K_UNMANAGED K_STDCALL\r
1180                           {\r
1181                                 $$ = CallConv.Stdcall;\r
1182                           }\r
1183                         | K_UNMANAGED K_THISCALL\r
1184                           {\r
1185                                 $$ = CallConv.Thiscall;\r
1186                           }\r
1187                         | K_UNMANAGED K_FASTCALL\r
1188                           {\r
1189                                 $$ = CallConv.Fastcall;\r
1190                           }\r
1191                         ;\r
1192 \r
1193 native_type             : /* EMPTY */\r
1194                         | K_CUSTOM OPEN_PARENS comp_qstring COMMA comp_qstring CLOSE_PARENS\r
1195                           {\r
1196                                 $$ = new CustomMarshaller ((string) $3, (string) $5);\r
1197                           }\r
1198                         | K_FIXED K_SYSSTRING OPEN_BRACKET int32 CLOSE_BRACKET\r
1199                           {\r
1200                                 $$ = new FixedSysString ((uint) (int)$4);\r
1201                           }\r
1202                         | K_FIXED K_ARRAY OPEN_BRACKET int32 CLOSE_BRACKET\r
1203                           {\r
1204                                 $$ = new FixedArray ((int) $4);        \r
1205                           }\r
1206                         | K_VARIANT\r
1207                         | K_CURRENCY\r
1208                           {\r
1209                                 $$ = NativeType.Currency;\r
1210                           }\r
1211                         | K_SYSCHAR\r
1212                         | K_VOID\r
1213                           {\r
1214                                 $$ = NativeType.Void;\r
1215                           }\r
1216                         | K_BOOL\r
1217                           {\r
1218                                 $$ = NativeType.Boolean;\r
1219                           }\r
1220                         | K_INT8\r
1221                           {\r
1222                                 $$ = NativeType.Int8;\r
1223                           }\r
1224                         | K_INT16\r
1225                           {\r
1226                                 $$ = NativeType.Int16;\r
1227                           }\r
1228                         | K_INT32\r
1229                           {\r
1230                                 $$ = NativeType.Int32;\r
1231                           }\r
1232                         | K_INT64\r
1233                           {\r
1234                                 $$ = NativeType.Int64;\r
1235                           }\r
1236                         | K_FLOAT32\r
1237                           {\r
1238                                 $$ = NativeType.Float32;\r
1239                           }\r
1240                         | K_FLOAT64\r
1241                           {\r
1242                                 $$ = NativeType.Float64;\r
1243                           }\r
1244                         | K_ERROR\r
1245                           {\r
1246                                 $$ = NativeType.Error;\r
1247                           }\r
1248                         | K_UNSIGNED K_INT8\r
1249                           {\r
1250                                 $$ = NativeType.UInt8;\r
1251                           }\r
1252                         | K_UINT8\r
1253                           {\r
1254                                 $$ = NativeType.UInt8;\r
1255                           }\r
1256                         | K_UNSIGNED K_INT16\r
1257                           {\r
1258                                 $$ = NativeType.UInt16;\r
1259                           }\r
1260                         | K_UINT16\r
1261                           {\r
1262                                 $$ = NativeType.UInt16;\r
1263                           }\r
1264                         | K_UNSIGNED K_INT32\r
1265                           {\r
1266                                 $$ = NativeType.UInt32;\r
1267                           }\r
1268                         | K_UINT32\r
1269                           {\r
1270                                 $$ = NativeType.UInt32;\r
1271                           }\r
1272                         | K_UNSIGNED K_INT64\r
1273                           {\r
1274                                 $$ = NativeType.UInt64;\r
1275                           }\r
1276                         | K_UINT64\r
1277                           {\r
1278                                 $$ = NativeType.UInt64;\r
1279                           }\r
1280                         | native_type STAR\r
1281                         | native_type OPEN_BRACKET CLOSE_BRACKET\r
1282                           {\r
1283                                 $$ = new NativeArray ((NativeType) $1);\r
1284                           }\r
1285                         | native_type OPEN_BRACKET int32 CLOSE_BRACKET\r
1286                           {\r
1287                                 $$ = new NativeArray ((NativeType) $1, (int) $3, 0, 0);\r
1288                           }\r
1289                         | native_type OPEN_BRACKET int32 PLUS int32 CLOSE_BRACKET\r
1290                           {\r
1291                                 //FIXME: Allowed only for methods, !fields\r
1292                                 $$ = new NativeArray ((NativeType) $1, (int) $3, (int) $5);\r
1293                           }\r
1294                         | native_type OPEN_BRACKET PLUS int32 CLOSE_BRACKET\r
1295                           {\r
1296                                 //FIXME: Allowed only for methods, !fields\r
1297                                 $$ = new NativeArray ((NativeType) $1, -1, (int) $4);\r
1298                           }\r
1299                         | K_DECIMAL\r
1300                         | K_DATE\r
1301                         | K_BSTR\r
1302                           {\r
1303                                 $$ = NativeType.BStr;\r
1304                           }\r
1305                         | K_LPSTR\r
1306                           {\r
1307                                 $$ = NativeType.LPStr;\r
1308                           }\r
1309                         | K_LPWSTR\r
1310                           {\r
1311                                 $$ = NativeType.LPWStr;\r
1312                           }\r
1313                         | K_LPTSTR\r
1314                           {\r
1315                                 $$ = NativeType.LPTStr;\r
1316                           }\r
1317                         | K_OBJECTREF\r
1318                         | K_IUNKNOWN\r
1319                           {\r
1320                                 $$ = NativeType.IUnknown;\r
1321                           }\r
1322                         | K_IDISPATCH\r
1323                           {\r
1324                                 $$ = NativeType.IDispatch;\r
1325                           }\r
1326                         | K_STRUCT\r
1327                           {\r
1328                                 $$ = NativeType.Struct;\r
1329                           }\r
1330                         | K_INTERFACE\r
1331                           {\r
1332                                 $$ = NativeType.Interface;\r
1333                           }\r
1334                         | K_SAFEARRAY variant_type\r
1335                           {\r
1336                                 if ($2 == null)\r
1337                                         $$ = new SafeArray ();\r
1338                                 else        \r
1339                                         $$ = new SafeArray ((SafeArrayType) $2);\r
1340                           }\r
1341                         | K_SAFEARRAY variant_type COMMA comp_qstring\r
1342                         | K_INT\r
1343                           {\r
1344                                 $$ = NativeType.Int;\r
1345                           }\r
1346                         | K_UNSIGNED K_INT\r
1347                           {\r
1348                                 $$ = NativeType.UInt;\r
1349                           }\r
1350                         | K_NESTED K_STRUCT\r
1351                         | K_BYVALSTR\r
1352                           {\r
1353                                 $$ = NativeType.ByValStr;\r
1354                           }\r
1355                         | K_ANSI K_BSTR\r
1356                           {\r
1357                                 $$ = NativeType.AnsiBStr;\r
1358                           }\r
1359                         | K_TBSTR\r
1360                           {\r
1361                                 $$ = NativeType.TBstr;\r
1362                           }\r
1363                         | K_VARIANT K_BOOL\r
1364                           {\r
1365                                 $$ = NativeType.VariantBool;\r
1366                           }\r
1367                         | K_METHOD\r
1368                           {\r
1369                                 $$ = NativeType.FuncPtr;\r
1370                           }     \r
1371                         | K_AS K_ANY\r
1372                           {\r
1373                                 $$ = NativeType.AsAny;\r
1374                           }\r
1375                         | K_LPSTRUCT\r
1376                           {\r
1377                                 $$ = NativeType.LPStruct;\r
1378                           }\r
1379                         ;\r
1380 \r
1381 variant_type            : /* EMPTY */\r
1382                         | K_NULL\r
1383                         | K_VARIANT\r
1384                           {\r
1385                                 $$ = SafeArrayType.variant;\r
1386                           }\r
1387                         | K_CURRENCY\r
1388                           {\r
1389                                 $$ = SafeArrayType.currency;\r
1390                           }\r
1391                         | K_VOID\r
1392                         | K_BOOL\r
1393                           {\r
1394                                 $$ = SafeArrayType.boolean;\r
1395                           }\r
1396                         | K_INT8\r
1397                           {\r
1398                                 $$ = SafeArrayType.int8;\r
1399                           }\r
1400                         | K_INT16\r
1401                           {\r
1402                                 $$ = SafeArrayType.int16;\r
1403                           }\r
1404                         | K_INT32\r
1405                           {\r
1406                                 $$ = SafeArrayType.int32;\r
1407                           }\r
1408                         | K_INT64\r
1409                         | K_FLOAT32\r
1410                           {\r
1411                                 $$ = SafeArrayType.float32;\r
1412                           }\r
1413                         | K_FLOAT64\r
1414                           {\r
1415                                 $$ = SafeArrayType.float64;\r
1416                           }\r
1417                         | K_UNSIGNED K_INT8\r
1418                           {\r
1419                                 $$ = SafeArrayType.uint8;\r
1420                           }\r
1421                         | K_UNSIGNED K_INT16\r
1422                           {\r
1423                                 $$ = SafeArrayType.uint16;\r
1424                           }\r
1425                         | K_UNSIGNED K_INT32\r
1426                           {\r
1427                                 $$ = SafeArrayType.uint32;\r
1428                           }\r
1429                         | K_UNSIGNED K_INT64\r
1430                         | STAR\r
1431                         | variant_type OPEN_BRACKET CLOSE_BRACKET\r
1432                         | variant_type K_VECTOR\r
1433                         | variant_type AMPERSAND\r
1434                         | K_DECIMAL\r
1435                           {\r
1436                                 $$ = SafeArrayType.Decimal;\r
1437                           }\r
1438                         | K_DATE\r
1439                           {\r
1440                                 $$ = SafeArrayType.date;\r
1441                           }\r
1442                         | K_BSTR\r
1443                           {\r
1444                                 $$ = SafeArrayType.bstr;\r
1445                           }\r
1446                         | K_LPSTR\r
1447                         | K_LPWSTR\r
1448                         | K_IUNKNOWN\r
1449                           {\r
1450                                 $$ = SafeArrayType.unknown;\r
1451                           }\r
1452                         | K_IDISPATCH\r
1453                           {\r
1454                                 $$ = SafeArrayType.unknown;\r
1455                           }\r
1456                         | K_SAFEARRAY\r
1457                         | K_INT\r
1458                           {\r
1459                                 $$ = SafeArrayType.Int;\r
1460                           }\r
1461                         | K_UNSIGNED K_INT\r
1462                           {\r
1463                                 $$ = SafeArrayType.UInt;\r
1464                           }\r
1465                         | K_ERROR\r
1466                           {\r
1467                                 $$ = SafeArrayType.error;\r
1468                           }\r
1469                         | K_HRESULT\r
1470                         | K_CARRAY\r
1471                         | K_USERDEFINED\r
1472                         | K_RECORD\r
1473                         | K_FILETIME\r
1474                         | K_BLOB\r
1475                         | K_STREAM\r
1476                         | K_STORAGE\r
1477                         | K_STREAMED_OBJECT\r
1478                         | K_STORED_OBJECT\r
1479                         | K_BLOB_OBJECT\r
1480                         | K_CF\r
1481                         | K_CLSID\r
1482                         ;\r
1483 \r
1484 field_decl              : D_FIELD repeat_opt field_attr type id at_opt init_opt\r
1485                           {\r
1486                                 FieldDef field_def = new FieldDef((FieldAttr) $3, \r
1487                                         (string) $5, (BaseTypeRef) $4);\r
1488                                 codegen.AddFieldDef (field_def);\r
1489                                 codegen.CurrentCustomAttrTarget = field_def;\r
1490                                 \r
1491                                 if ($2 != null) {\r
1492                                         field_def.SetOffset ((uint) (int)$2);\r
1493                                 }\r
1494 \r
1495                                 if ($6 != null) {\r
1496                                         field_def.AddDataValue ((string) $6);\r
1497                                 }\r
1498 \r
1499                                 if ($7 != null) {\r
1500                                         field_def.SetValue ((Constant) $7);\r
1501                                 }\r
1502                           }\r
1503                         ;\r
1504 \r
1505 repeat_opt              : /* EMPTY */\r
1506                         | OPEN_BRACKET int32 CLOSE_BRACKET\r
1507                           {\r
1508                                 $$ = $2;\r
1509                           }\r
1510                         ;\r
1511 \r
1512 field_attr              : /* EMPTY */\r
1513                           {\r
1514                                 $$ = new FieldAttr ();\r
1515                           }\r
1516                         | field_attr K_PUBLIC\r
1517                           {\r
1518                                 $$ = (FieldAttr) $1 | FieldAttr.Public;\r
1519                           }\r
1520                         | field_attr K_PRIVATE\r
1521                           {\r
1522                                 $$ = (FieldAttr) $1 | FieldAttr.Private;\r
1523                           }\r
1524                         | field_attr K_FAMILY\r
1525                           {\r
1526                                 $$ = (FieldAttr) $1 | FieldAttr.Family;\r
1527                           }\r
1528                         | field_attr K_ASSEMBLY\r
1529                           {\r
1530                                 $$ = (FieldAttr) $1 | FieldAttr.Assembly;\r
1531                           }\r
1532                         | field_attr K_FAMANDASSEM\r
1533                           {\r
1534                                 $$ = (FieldAttr) $1 | FieldAttr.FamAndAssem;\r
1535                           }\r
1536                         | field_attr K_FAMORASSEM\r
1537                           {\r
1538                                 $$ = (FieldAttr) $1 | FieldAttr.FamOrAssem;\r
1539                           }\r
1540                         | field_attr K_PRIVATESCOPE\r
1541                           {\r
1542                                 // This is just 0x0000\r
1543                           }\r
1544                         | field_attr K_STATIC\r
1545                           {\r
1546                                 $$ = (FieldAttr) $1 | FieldAttr.Static;\r
1547                           }\r
1548                         | field_attr K_INITONLY\r
1549                           {\r
1550                                 $$ = (FieldAttr) $1 | FieldAttr.Initonly;\r
1551                           }\r
1552                         | field_attr K_RTSPECIALNAME\r
1553                           {\r
1554                                 $$ = (FieldAttr) $1 | FieldAttr.RTSpecialName;\r
1555                           }\r
1556                         | field_attr K_SPECIALNAME\r
1557                           {\r
1558                                 $$ = (FieldAttr) $1 | FieldAttr.SpecialName;\r
1559                           }\r
1560                         | field_attr K_MARSHAL OPEN_PARENS native_type CLOSE_PARENS\r
1561                           {\r
1562                                codegen.AddFieldMarshalInfo ((NativeType) $4);\r
1563                                $$ = (FieldAttr) $1 | FieldAttr.HasFieldMarshal;\r
1564                           }\r
1565                         | field_attr K_LITERAL\r
1566                           {\r
1567                                 $$ = (FieldAttr) $1 | FieldAttr.Literal;\r
1568                           }\r
1569                         | field_attr K_NOTSERIALIZED\r
1570                           {\r
1571                                 $$ = (FieldAttr) $1 | FieldAttr.Notserialized;\r
1572                           }\r
1573                         ;\r
1574 \r
1575 at_opt                  : /* EMPTY */\r
1576                         | K_AT id\r
1577                           {\r
1578                                 $$ = $2;\r
1579                           }\r
1580                         ;\r
1581 \r
1582 init_opt                : /* EMPTY */\r
1583                         | ASSIGN field_init\r
1584                           {\r
1585                                 $$ = $2;\r
1586                           }\r
1587                         ;\r
1588 \r
1589 field_init_primitive    : K_FLOAT32 OPEN_PARENS float64 CLOSE_PARENS\r
1590                           {\r
1591                                 $$ = new FloatConst (Convert.ToSingle ($3));\r
1592                           }\r
1593                         | K_FLOAT64 OPEN_PARENS float64 CLOSE_PARENS\r
1594                           {\r
1595                                 $$ = new DoubleConst (Convert.ToDouble ($3));\r
1596                           }\r
1597                         | K_FLOAT32 OPEN_PARENS int64 CLOSE_PARENS\r
1598                           {\r
1599                                 $$ = new FloatConst (BitConverter.ToSingle (BitConverter.GetBytes ((long)$3), BitConverter.IsLittleEndian ? 0 : 4));\r
1600                           }\r
1601                         | K_FLOAT64 OPEN_PARENS int64 CLOSE_PARENS\r
1602                           {\r
1603                                 $$ = new DoubleConst (BitConverter.Int64BitsToDouble ((long)$3));\r
1604                           }\r
1605                         | K_INT64 OPEN_PARENS int64 CLOSE_PARENS\r
1606                           {\r
1607                                 $$ = new IntConst (Convert.ToInt64 ($3));\r
1608                           }\r
1609                         | K_UINT64 OPEN_PARENS int64 CLOSE_PARENS\r
1610                           {\r
1611                                 $$ = new UIntConst (Convert.ToUInt64 ((ulong)(long) $3));\r
1612                           }\r
1613                         | K_INT32 OPEN_PARENS int64 CLOSE_PARENS\r
1614                           {\r
1615                                 $$ = new IntConst ((int)((long)$3));\r
1616                           }\r
1617                         | K_UINT32 OPEN_PARENS int64 CLOSE_PARENS\r
1618                           {\r
1619                                 $$ = new UIntConst ((uint)((long)$3));\r
1620                           }\r
1621                         | K_INT16 OPEN_PARENS int64 CLOSE_PARENS\r
1622                           {\r
1623                                 $$ = new IntConst ((short)((long) $3));\r
1624                           }\r
1625                         | K_UINT16 OPEN_PARENS int64 CLOSE_PARENS\r
1626                           {\r
1627                                 $$ = new UIntConst ((ushort)((long) $3));\r
1628                           }\r
1629                         | K_CHAR OPEN_PARENS int64 CLOSE_PARENS\r
1630                           {\r
1631                                 $$ = new CharConst (Convert.ToChar ($3));\r
1632                           }\r
1633                         | K_WCHAR OPEN_PARENS int64 CLOSE_PARENS\r
1634                           {\r
1635                                 $$ = new CharConst (Convert.ToChar ($3));\r
1636                           }\r
1637                         | K_INT8 OPEN_PARENS int64 CLOSE_PARENS\r
1638                           {\r
1639                                 $$ = new IntConst ((sbyte)((long) ($3)));\r
1640                           }\r
1641                         | K_UINT8 OPEN_PARENS int64 CLOSE_PARENS\r
1642                           {\r
1643                                 $$ = new UIntConst ((byte)((long) ($3)));\r
1644                           }\r
1645                         | K_BOOL OPEN_PARENS truefalse CLOSE_PARENS\r
1646                           {\r
1647                                 $$ = new BoolConst ((bool) $3);\r
1648                           }\r
1649                         ;\r
1650 \r
1651 field_init              : field_init_primitive\r
1652                         | K_BYTEARRAY bytes_list\r
1653                           {\r
1654                                 $$ = new ByteArrConst ((byte[]) $2);\r
1655                           }\r
1656                         | comp_qstring\r
1657                           {\r
1658                                 // ******** THIS IS NOT IN THE DOCUMENTATION ******** //\r
1659                                 $$ = new StringConst ((string) $1);\r
1660                           }\r
1661                         | K_NULLREF\r
1662                           {\r
1663                                 $$ = new NullConst ();\r
1664                           }\r
1665                         ;\r
1666 \r
1667 data_decl               : data_head data_body\r
1668                           {\r
1669                                 DataDef datadef = (DataDef) $1;\r
1670                                 \r
1671                                 if ($2 is ArrayList) {\r
1672                                         ArrayList const_list = (ArrayList) $2;\r
1673                                         DataConstant[] const_arr = new DataConstant[const_list.Count];\r
1674                                         \r
1675                                         for (int i=0; i<const_arr.Length; i++)\r
1676                                                 const_arr[i] = (DataConstant) const_list[i];\r
1677 \r
1678                                         datadef.PeapiConstant = new ArrayConstant (const_arr);\r
1679                                 } else {\r
1680                                         datadef.PeapiConstant = (PEAPI.Constant) $2;\r
1681                                 }\r
1682                                 codegen.AddDataDef (datadef);\r
1683                           }\r
1684                         ;\r
1685 \r
1686 data_head               : D_DATA tls id ASSIGN\r
1687                           {\r
1688                                 $$ = new DataDef ((string) $3, (bool) $2);    \r
1689                           } \r
1690                         | D_DATA tls\r
1691                           {\r
1692                                 $$ = new DataDef (String.Empty, (bool) $2);\r
1693                           }\r
1694                         ;\r
1695 \r
1696 tls                     : /* EMPTY */   { $$ = false; }\r
1697                         | K_TLS         { $$ = true; }\r
1698                         ;\r
1699 \r
1700 data_body               : OPEN_BRACE dataitem_list CLOSE_BRACE\r
1701                           {\r
1702                                 $$ = $2;\r
1703                           }\r
1704                         | dataitem\r
1705                         ;\r
1706 \r
1707 dataitem_list           : dataitem\r
1708                           {\r
1709                                 ArrayList dataitem_list = new ArrayList ();\r
1710                                 dataitem_list.Add ($1);\r
1711                                 $$ = dataitem_list;\r
1712                           }\r
1713                         | dataitem_list COMMA dataitem\r
1714                           {\r
1715                                 ArrayList list = (ArrayList) $1;\r
1716                                 list.Add ($3);\r
1717                           }\r
1718                         ;\r
1719 \r
1720 dataitem                : K_CHAR STAR OPEN_PARENS comp_qstring CLOSE_PARENS\r
1721                           {\r
1722                                 $$ = new StringConst ((string) $4);\r
1723                           }\r
1724                         | K_WCHAR STAR OPEN_PARENS comp_qstring CLOSE_PARENS\r
1725                           {\r
1726                                 $$ = new StringConst ((string) $4);\r
1727                           }\r
1728                         | AMPERSAND OPEN_PARENS id CLOSE_PARENS\r
1729                           {\r
1730                            //     DataDef def = codegen.CurrentTypeDef.GetDataDef ((string) $3);\r
1731                            //     $$ = new AddressConstant ((DataConstant) def.PeapiConstant);\r
1732                           }\r
1733                         | K_BYTEARRAY ASSIGN bytes_list\r
1734                           {\r
1735                                 $$ = new ByteArrConst ((byte[]) $3);\r
1736                           }\r
1737                         | K_BYTEARRAY bytes_list\r
1738                           {\r
1739                                 // ******** THIS IS NOT IN THE SPECIFICATION ******** //\r
1740                                 $$ = new ByteArrConst ((byte[]) $2);\r
1741                           }\r
1742                         | K_FLOAT32 OPEN_PARENS float64 CLOSE_PARENS repeat_opt\r
1743                           {\r
1744                                 double d = (double) $3;\r
1745                                 FloatConst float_const = new FloatConst ((float) d);\r
1746 \r
1747                                 if ($5 != null)\r
1748                                         $$ = new RepeatedConstant (float_const, (int) $5);\r
1749                                 else\r
1750                                         $$ = float_const;\r
1751                           }\r
1752                         | K_FLOAT64 OPEN_PARENS float64 CLOSE_PARENS repeat_opt\r
1753                           {\r
1754                                 DoubleConst double_const = new DoubleConst ((double) $3);\r
1755 \r
1756                                 if ($5 != null)\r
1757                                         $$ = new RepeatedConstant (double_const, (int) $5);\r
1758                                 else\r
1759                                         $$ = double_const;\r
1760                           }\r
1761                         | K_INT64 OPEN_PARENS int64 CLOSE_PARENS repeat_opt\r
1762                           {\r
1763                                 IntConst int_const = new IntConst ((long) $3);\r
1764 \r
1765                                 if ($5 != null)\r
1766                                         $$ = new RepeatedConstant (int_const, (int) $5);\r
1767                                 else\r
1768                                         $$ = int_const;\r
1769                           }\r
1770                         | K_INT32 OPEN_PARENS int32 CLOSE_PARENS repeat_opt\r
1771                           {\r
1772                                 IntConst int_const = new IntConst ((int) $3);\r
1773 \r
1774                                 if ($5 != null)\r
1775                                         $$ = new RepeatedConstant (int_const, (int) $5);\r
1776                                 else\r
1777                                         $$ = int_const;\r
1778                           }\r
1779                         | K_INT16 OPEN_PARENS int32 CLOSE_PARENS repeat_opt\r
1780                           {\r
1781                                 int i = (int) $3;\r
1782                                 IntConst int_const = new IntConst ((short) i);\r
1783 \r
1784                                 if ($5 != null)\r
1785                                         $$ = new RepeatedConstant (int_const, (int) $5);\r
1786                                 else\r
1787                                         $$ = int_const;\r
1788                           }\r
1789                         | K_INT8 OPEN_PARENS int32 CLOSE_PARENS repeat_opt\r
1790                           {\r
1791                                 int i = (int) $3;\r
1792                                 IntConst int_const = new IntConst ((sbyte) i);\r
1793 \r
1794                                 if ($5 != null)\r
1795                                         $$ = new RepeatedConstant (int_const, (int) $5);\r
1796                                 else\r
1797                                         $$ = int_const;\r
1798                           }\r
1799                         | K_FLOAT32 repeat_opt\r
1800                           {\r
1801                                 FloatConst float_const = new FloatConst (0F);\r
1802 \r
1803                                 if ($2 != null)\r
1804                                         $$ = new RepeatedConstant (float_const, (int) $2);\r
1805                                 else\r
1806                                         $$ = float_const;\r
1807                           }\r
1808                         | K_FLOAT64 repeat_opt\r
1809                           {\r
1810                                 DoubleConst double_const = new DoubleConst (0);\r
1811 \r
1812                                 if ($2 != null)\r
1813                                         $$ = new RepeatedConstant (double_const, (int) $2);\r
1814                                 else\r
1815                                         $$ = double_const;\r
1816                           }\r
1817                         | K_INT64 repeat_opt\r
1818                           {\r
1819                                 IntConst int_const = new IntConst ((long) 0);\r
1820 \r
1821                                 if ($2 != null)\r
1822                                         $$ = new RepeatedConstant (int_const, (int) $2);\r
1823                                 else\r
1824                                         $$ = int_const;\r
1825                           }\r
1826                         | K_INT32 repeat_opt\r
1827                           {\r
1828                                 IntConst int_const = new IntConst ((int) 0);\r
1829 \r
1830                                 if ($2 != null)\r
1831                                         $$ = new RepeatedConstant (int_const, (int) $2);\r
1832                                 else\r
1833                                         $$ = int_const;\r
1834                           }\r
1835                         | K_INT16 repeat_opt\r
1836                           {\r
1837                                 IntConst int_const = new IntConst ((short) 0);\r
1838 \r
1839                                 if ($2 != null)\r
1840                                         $$ = new RepeatedConstant (int_const, (int) $2);\r
1841                                 else\r
1842                                         $$ = int_const;\r
1843                           }\r
1844                         | K_INT8 repeat_opt\r
1845                           {\r
1846                                 IntConst int_const = new IntConst ((sbyte) 0);\r
1847 \r
1848                                 if ($2 != null)\r
1849                                         $$ = new RepeatedConstant (int_const, (int) $2);\r
1850                                 else\r
1851                                         $$ = int_const;\r
1852                           }\r
1853                         ;\r
1854 \r
1855 method_all              : method_head OPEN_BRACE method_decls CLOSE_BRACE\r
1856                           {\r
1857                                 codegen.EndMethodDef (tokenizer.Location);\r
1858                           }\r
1859                         ;\r
1860 \r
1861 method_head             : D_METHOD meth_attr call_conv param_attr type method_name\r
1862                           formal_typars_clause OPEN_PARENS sig_args CLOSE_PARENS impl_attr\r
1863                           {\r
1864                                 CallConv cc = (CallConv) $3;\r
1865                                 if ($7 != null)\r
1866                                         cc |= CallConv.Generic;\r
1867 \r
1868                                 MethodDef methdef = new MethodDef (\r
1869                                         codegen, (MethAttr) $2, cc,\r
1870                                         (ImplAttr) $11, (string) $6, (BaseTypeRef) $5,\r
1871                                         (ArrayList) $9, tokenizer.Reader.Location, (GenericParameters) $7, codegen.CurrentTypeDef);\r
1872                                 if (pinvoke_info) {\r
1873                                         ExternModule mod = codegen.ExternTable.AddModule (pinvoke_mod);\r
1874                                         methdef.AddPInvokeInfo (pinvoke_attr, mod, pinvoke_meth);\r
1875                                         pinvoke_info = false;\r
1876                                 }\r
1877                           }\r
1878                         | D_METHOD meth_attr call_conv param_attr type \r
1879                           K_MARSHAL OPEN_PARENS native_type CLOSE_PARENS method_name\r
1880                           OPEN_PARENS sig_args CLOSE_PARENS impl_attr\r
1881                           {\r
1882                                 MethodDef methdef = new MethodDef (\r
1883                                         codegen, (MethAttr) $2, (CallConv) $3,\r
1884                                         (ImplAttr) $14, (string) $10, (BaseTypeRef) $5,\r
1885                                         (ArrayList) $12, tokenizer.Reader.Location, null, codegen.CurrentTypeDef);\r
1886 \r
1887                                 if (pinvoke_info) {\r
1888                                         ExternModule mod = codegen.ExternTable.AddModule (pinvoke_mod);\r
1889                                         methdef.AddPInvokeInfo (pinvoke_attr, mod, pinvoke_meth);\r
1890                                         pinvoke_info = false;\r
1891                                 }\r
1892                                 \r
1893                                 methdef.AddRetTypeMarshalInfo ((NativeType) $8);\r
1894                           }\r
1895                         ;\r
1896 \r
1897 meth_attr               : /* EMPTY */                   { $$ = new MethAttr (); }\r
1898                         | meth_attr K_STATIC            { $$ = (MethAttr) $1 | MethAttr.Static; }\r
1899                         | meth_attr K_PUBLIC            { $$ = (MethAttr) $1 | MethAttr.Public; }\r
1900                         | meth_attr K_PRIVATE           { $$ = (MethAttr) $1 | MethAttr.Private; }\r
1901                         | meth_attr K_FAMILY            { $$ = (MethAttr) $1 | MethAttr.Family; }\r
1902                         | meth_attr K_ASSEMBLY          { $$ = (MethAttr) $1 | MethAttr.Assembly; }\r
1903                         | meth_attr K_FAMANDASSEM       { $$ = (MethAttr) $1 | MethAttr.FamAndAssem; } \r
1904                         | meth_attr K_FAMORASSEM        { $$ = (MethAttr) $1 | MethAttr.FamOrAssem; } \r
1905                         | meth_attr K_PRIVATESCOPE      { /* CHECK HEADERS */ }\r
1906                         | meth_attr K_FINAL             { $$ = (MethAttr) $1 | MethAttr.Final; } \r
1907                         | meth_attr K_VIRTUAL           { $$ = (MethAttr) $1 | MethAttr.Virtual; }\r
1908                         | meth_attr K_ABSTRACT          { $$ = (MethAttr) $1 | MethAttr.Abstract; }\r
1909                         | meth_attr K_HIDEBYSIG         { $$ = (MethAttr) $1 | MethAttr.HideBySig; }\r
1910                         | meth_attr K_NEWSLOT           { $$ = (MethAttr) $1 | MethAttr.NewSlot; }\r
1911                         | meth_attr K_REQSECOBJ         { $$ = (MethAttr) $1 | MethAttr.RequireSecObject; }\r
1912                         | meth_attr K_SPECIALNAME       { $$ = (MethAttr) $1 | MethAttr.SpecialName; }\r
1913                         | meth_attr K_RTSPECIALNAME     { $$ = (MethAttr) $1 | MethAttr.RTSpecialName; }\r
1914                         | meth_attr K_COMPILERCONTROLLED { /* Do nothing */ }\r
1915                         | meth_attr K_UNMANAGEDEXP      \r
1916                         | meth_attr K_PINVOKEIMPL OPEN_PARENS comp_qstring K_AS\r
1917                                 comp_qstring pinv_attr CLOSE_PARENS\r
1918                           {\r
1919                                 pinvoke_info = true;\r
1920                                 pinvoke_mod = (string) $4;\r
1921                                 pinvoke_meth = (string) $6;\r
1922                                 pinvoke_attr = (PInvokeAttr) $7;\r
1923                           }\r
1924                         | meth_attr K_PINVOKEIMPL OPEN_PARENS comp_qstring pinv_attr CLOSE_PARENS\r
1925                           {\r
1926                                 pinvoke_info = true;\r
1927                                 pinvoke_mod = (string) $4;\r
1928                                 pinvoke_meth = null;\r
1929                                 pinvoke_attr = (PInvokeAttr) $5;\r
1930                           }\r
1931                         | meth_attr K_PINVOKEIMPL OPEN_PARENS pinv_attr CLOSE_PARENS\r
1932                           {\r
1933                                 pinvoke_info = true;\r
1934                                 pinvoke_mod = null;\r
1935                                 pinvoke_meth = null;\r
1936                                 pinvoke_attr = (PInvokeAttr) $4;\r
1937                           }\r
1938                         ;\r
1939 \r
1940 pinv_attr               : /* EMPTY */ { $$ = new PInvokeAttr (); }\r
1941                         | pinv_attr K_NOMANGLE { $$ = (PInvokeAttr) $1 | PInvokeAttr.nomangle; }\r
1942                         | pinv_attr K_ANSI { $$ = (PInvokeAttr) $1 | PInvokeAttr.ansi; }\r
1943                         | pinv_attr K_UNICODE { $$ = (PInvokeAttr) $1 | PInvokeAttr.unicode; }\r
1944                         | pinv_attr K_AUTOCHAR { $$ = (PInvokeAttr) $1 | PInvokeAttr.autochar; }\r
1945                         | pinv_attr K_LASTERR { $$ = (PInvokeAttr) $1 | PInvokeAttr.lasterr; }\r
1946                         | pinv_attr K_WINAPI { $$ = (PInvokeAttr) $1 | PInvokeAttr.winapi; }\r
1947                         | pinv_attr K_CDECL { $$ = (PInvokeAttr) $1 | PInvokeAttr.cdecl; }\r
1948                         | pinv_attr K_STDCALL { $$ = (PInvokeAttr) $1 | PInvokeAttr.stdcall; }\r
1949                         | pinv_attr K_THISCALL { $$ = (PInvokeAttr) $1 | PInvokeAttr.thiscall; }\r
1950                         | pinv_attr K_FASTCALL { $$ = (PInvokeAttr) $1 | PInvokeAttr.fastcall; }\r
1951                         | pinv_attr K_BESTFIT COLON K_ON { $$ = (PInvokeAttr) $1 | PInvokeAttr.bestfit_on; }\r
1952                         | pinv_attr K_BESTFIT COLON K_OFF { $$ = (PInvokeAttr) $1 | PInvokeAttr.bestfit_off; }\r
1953                         | pinv_attr K_CHARMAPERROR COLON K_ON { $$ = (PInvokeAttr) $1 | PInvokeAttr.charmaperror_on; }\r
1954                         | pinv_attr K_CHARMAPERROR COLON K_OFF { $$ = (PInvokeAttr) $1 | PInvokeAttr.charmaperror_off; }\r
1955                         ;\r
1956 \r
1957 method_name             : D_CTOR\r
1958                         | D_CCTOR\r
1959                         | comp_name\r
1960                         ;\r
1961 \r
1962 param_attr              : /* EMPTY */                                   { $$ = new ParamAttr (); }\r
1963                         | param_attr OPEN_BRACKET K_IN CLOSE_BRACKET    { $$ = (ParamAttr) $1 | ParamAttr.In; }\r
1964                         | param_attr OPEN_BRACKET K_OUT CLOSE_BRACKET   { $$ = (ParamAttr) $1 | ParamAttr.Out; }\r
1965                         | param_attr OPEN_BRACKET K_OPT CLOSE_BRACKET   { $$ = (ParamAttr) $1 | ParamAttr.Opt; }\r
1966                         ;\r
1967 \r
1968 impl_attr               : /* EMPTY */                   { $$ = new ImplAttr (); }\r
1969                         | impl_attr K_NATIVE            { $$ = (ImplAttr) $1 | ImplAttr.Native; }\r
1970                         | impl_attr K_CIL               { $$ = (ImplAttr) $1 | ImplAttr.IL; }\r
1971                         | impl_attr K_IL                { $$ = (ImplAttr) $1 | ImplAttr.IL; }\r
1972                         | impl_attr K_OPTIL             { $$ = (ImplAttr) $1 | ImplAttr.Optil; }\r
1973                         | impl_attr K_MANAGED           { /* should this reset? */ }\r
1974                         | impl_attr K_UNMANAGED         { $$ = (ImplAttr) $1 | ImplAttr.Unmanaged; }\r
1975                         | impl_attr K_FORWARDREF        { $$ = (ImplAttr) $1 | ImplAttr.ForwardRef; }\r
1976                         | impl_attr K_PRESERVESIG       { $$ = (ImplAttr) $1 | ImplAttr.PreserveSig; }\r
1977                         | impl_attr K_RUNTIME           { $$ = (ImplAttr) $1 | ImplAttr.Runtime; }\r
1978                         | impl_attr K_INTERNALCALL      { $$ = (ImplAttr) $1 | ImplAttr.InternalCall; }\r
1979                         | impl_attr K_SYNCHRONIZED      { $$ = (ImplAttr) $1 | ImplAttr.Synchronised; }\r
1980                         | impl_attr K_NOINLINING        { $$ = (ImplAttr) $1 | ImplAttr.NoInLining; }\r
1981                         ;\r
1982 \r
1983 sig_args                : /* EMPTY */\r
1984                         | sig_arg_list\r
1985                         ;\r
1986 \r
1987 sig_arg_list            : sig_arg\r
1988                           {\r
1989                                 ArrayList sig_list = new ArrayList ();\r
1990                                 sig_list.Add ($1);\r
1991                                 $$ = sig_list;\r
1992                           }\r
1993                         | sig_arg_list COMMA sig_arg\r
1994                           {\r
1995                                 ArrayList sig_list = (ArrayList) $1;\r
1996                                 sig_list.Add ($3);\r
1997                                 $$ = sig_list;\r
1998                           }\r
1999                         ;\r
2000 \r
2001 sig_arg                 : param_attr type\r
2002                           {\r
2003                                 $$ = new ParamDef ((ParamAttr) $1, null, (BaseTypeRef) $2);\r
2004                           }\r
2005                         | param_attr type id\r
2006                           {\r
2007                                 $$ = new ParamDef ((ParamAttr) $1, (string) $3, (BaseTypeRef) $2);\r
2008                           }\r
2009                         | ELLIPSIS\r
2010                           {\r
2011                                 $$ = new ParamDef ((ParamAttr) 0, "...", new SentinelTypeRef ());\r
2012                                 // $$ = ParamDef.Ellipsis;\r
2013                           }\r
2014                         | param_attr type K_MARSHAL OPEN_PARENS native_type CLOSE_PARENS\r
2015                           {\r
2016                                 ParamDef param_def = new ParamDef ((ParamAttr) $1, null, (BaseTypeRef) $2);\r
2017                                 param_def.AddMarshalInfo ((PEAPI.NativeType) $5);\r
2018 \r
2019                                 $$ = param_def;\r
2020                           }\r
2021                         | param_attr type K_MARSHAL OPEN_PARENS native_type CLOSE_PARENS id\r
2022                           {\r
2023                                 ParamDef param_def = new ParamDef ((ParamAttr) $1, (string) $7, (BaseTypeRef) $2);\r
2024                                 param_def.AddMarshalInfo ((PEAPI.NativeType) $5);\r
2025 \r
2026                                 $$ = param_def;\r
2027                           }\r
2028                         ;\r
2029 \r
2030 type_list               : /* EMPTY */\r
2031                           {\r
2032                                 $$ = new ArrayList (0);\r
2033                           }\r
2034                         | ELLIPSIS\r
2035                           {\r
2036                                 ArrayList type_list = new ArrayList ();\r
2037                                 // type_list.Add (TypeRef.Ellipsis);\r
2038                                 type_list.Add (new SentinelTypeRef ());\r
2039                                 $$ = type_list;\r
2040                           }\r
2041                         | type_list COMMA ELLIPSIS\r
2042                           {\r
2043                                 ArrayList type_list = (ArrayList) $1;\r
2044                                 // type_list.Add (TypeRef.Ellipsis);\r
2045                                 type_list.Add (new SentinelTypeRef ());\r
2046                                 $$ = type_list;\r
2047                           }\r
2048                         | param_attr type opt_id\r
2049                           {\r
2050                                 ArrayList type_list = new ArrayList ();\r
2051                                 type_list.Add ($2);\r
2052                                 $$ = type_list;\r
2053                           }\r
2054                         | type_list COMMA param_attr type opt_id\r
2055                           {\r
2056                                 ArrayList type_list = (ArrayList) $1;\r
2057                                 type_list.Add ($4);\r
2058                           }\r
2059                         ;\r
2060 \r
2061 opt_id                  : /* EMPTY */\r
2062                         | id\r
2063                         ;\r
2064 \r
2065 method_decls            : /* EMPTY */\r
2066                         | method_decls method_decl\r
2067                         ;\r
2068 \r
2069 method_decl             : D_EMITBYTE int32\r
2070                         | D_MAXSTACK int32\r
2071                           {\r
2072                                 codegen.CurrentMethodDef.SetMaxStack ((int) $2);\r
2073                           }\r
2074                         | D_LOCALS OPEN_PARENS local_list CLOSE_PARENS\r
2075                           {\r
2076                                 if ($3 != null) {\r
2077                                         codegen.CurrentMethodDef.AddLocals (\r
2078                                                 (ArrayList) $3);\r
2079                                 }\r
2080                           }\r
2081                         | D_LOCALS K_INIT OPEN_PARENS local_list CLOSE_PARENS\r
2082                           {\r
2083                                 if ($4 != null) {\r
2084                                         codegen.CurrentMethodDef.AddLocals (\r
2085                                                 (ArrayList) $4);\r
2086                                         codegen.CurrentMethodDef.InitLocals ();\r
2087                                 }\r
2088                           }\r
2089                         | D_ENTRYPOINT\r
2090                           {\r
2091                                 codegen.CurrentMethodDef.EntryPoint ();\r
2092                                 codegen.HasEntryPoint = true;\r
2093                           }\r
2094                         | D_ZEROINIT\r
2095                           {\r
2096                                 codegen.CurrentMethodDef.ZeroInit ();\r
2097                           }\r
2098                         | D_EXPORT OPEN_BRACKET int32 CLOSE_BRACKET\r
2099                         | D_EXPORT OPEN_BRACKET int32 CLOSE_BRACKET K_AS id\r
2100                         | D_VTENTRY int32 COLON int32 \r
2101                         | D_OVERRIDE type_spec DOUBLE_COLON method_name\r
2102                           {\r
2103                                 codegen.CurrentTypeDef.AddOverride (codegen.CurrentMethodDef,\r
2104                                         (BaseTypeRef) $2, (string) $4);\r
2105                                 \r
2106                           }\r
2107                         | D_OVERRIDE K_METHOD method_ref\r
2108                           {\r
2109                                 codegen.CurrentTypeDef.AddOverride (codegen.CurrentMethodDef.Signature,\r
2110                                         (BaseMethodRef) $3);\r
2111                           }\r
2112                         | D_OVERRIDE K_METHOD call_conv type type_spec DOUBLE_COLON method_name\r
2113                           OPEN_ANGLE_BRACKET OPEN_BRACKET int32 CLOSE_BRACKET CLOSE_ANGLE_BRACKET\r
2114                           OPEN_PARENS type_list CLOSE_PARENS \r
2115                           {\r
2116                                 BaseTypeRef owner = (BaseTypeRef) $5;\r
2117                                 ArrayList arg_list = (ArrayList) $14;\r
2118                                 BaseTypeRef[] param_list;\r
2119                                 BaseMethodRef methref;\r
2120 \r
2121                                 if (arg_list != null)\r
2122                                         param_list = (BaseTypeRef[]) arg_list.ToArray (typeof (BaseTypeRef));\r
2123                                 else\r
2124                                         param_list = new BaseTypeRef[0];\r
2125 \r
2126                                 if (owner.UseTypeSpec) {\r
2127                                         methref = new TypeSpecMethodRef (owner, (CallConv) $3, (BaseTypeRef) $4,\r
2128                                                 (string) $7, param_list, (int) $10);\r
2129                                 } else {\r
2130                                         methref = owner.GetMethodRef ((BaseTypeRef) $4,\r
2131                                                 (CallConv) $3, (string) $7, param_list, (int) $10);\r
2132                                 }\r
2133 \r
2134                                 codegen.CurrentTypeDef.AddOverride (codegen.CurrentMethodDef.Signature,\r
2135                                         methref);\r
2136                           }\r
2137                         | scope_block\r
2138                         | D_PARAM OPEN_BRACKET int32 CLOSE_BRACKET init_opt\r
2139                           {\r
2140                                 int index = (int) $3;\r
2141                                 ParamDef param = codegen.CurrentMethodDef.GetParam (index);\r
2142                                 codegen.CurrentCustomAttrTarget = param;\r
2143 \r
2144                                 if (param == null) {\r
2145                                         Report.Warning (tokenizer.Location, String.Format ("invalid param index ({0}) with .param", index));\r
2146                                         break;\r
2147                                 }\r
2148                                 if ($5 != null)\r
2149                                         param.AddDefaultValue ((Constant) $5);\r
2150                           }\r
2151                         | param_type_decl\r
2152                         | id COLON\r
2153                           {\r
2154                                 codegen.CurrentMethodDef.AddLabel ((string) $1);\r
2155                           }\r
2156                         | seh_block\r
2157                         | instr\r
2158                         | sec_decl\r
2159                           {\r
2160                                 AddSecDecl ($1, false);\r
2161                           }\r
2162                         | extsource_spec\r
2163                         | language_decl\r
2164                         | customattr_decl\r
2165                           {\r
2166                                 if (codegen.CurrentCustomAttrTarget != null)\r
2167                                         codegen.CurrentCustomAttrTarget.AddCustomAttribute ((CustomAttr) $1);\r
2168                           }\r
2169                         | data_decl\r
2170                         ;\r
2171 \r
2172 local_list              : /* EMPTY */\r
2173                         | local\r
2174                           {\r
2175                                 ArrayList local_list = new ArrayList ();\r
2176                                 local_list.Add ($1);\r
2177                                 $$ = local_list;\r
2178                           }\r
2179                         | local_list COMMA local\r
2180                           {\r
2181                                 ArrayList local_list = (ArrayList) $1;\r
2182                                 local_list.Add ($3);\r
2183                           }\r
2184                         ;\r
2185 \r
2186 local                   : type\r
2187                           {\r
2188                                 $$ = new Local (-1, (BaseTypeRef) $1);\r
2189                           }\r
2190                         | type id\r
2191                           {\r
2192                                 $$ = new Local (-1, (string) $2, (BaseTypeRef) $1);\r
2193                           }\r
2194                         | slot_num type\r
2195                           {\r
2196                                 $$ = new Local ((int) $1, (BaseTypeRef) $2);\r
2197                           }\r
2198                         | slot_num type id\r
2199                           {\r
2200                                 $$ = new Local ((int) $1, (string) $3, (BaseTypeRef) $2);\r
2201                           }\r
2202                         ;\r
2203 \r
2204 slot_num                : OPEN_BRACKET int32 CLOSE_BRACKET\r
2205                           {\r
2206                                 $$ = $2;\r
2207                           }\r
2208                         ;\r
2209 \r
2210 type_spec               : OPEN_BRACKET slashed_name CLOSE_BRACKET\r
2211                           {\r
2212                                 // This is a reference to a global method in another\r
2213                                 // assembly. This is not supported in the MS version of ilasm\r
2214                           }\r
2215                         | OPEN_BRACKET D_MODULE slashed_name CLOSE_BRACKET\r
2216                           {\r
2217                                 string module = (string) $3;\r
2218 \r
2219                                 if (codegen.IsThisModule (module)) {\r
2220                                     // This is not handled yet.\r
2221                                 } else {\r
2222                                     $$ = codegen.ExternTable.GetModuleTypeRef ((string) $3, "<Module>", false);\r
2223                                 }\r
2224 \r
2225                           }\r
2226                         | type\r
2227                         ;\r
2228 \r
2229 scope_block             : scope_block_begin method_decls CLOSE_BRACE\r
2230                           {\r
2231                                 $$ = new HandlerBlock ((LabelInfo) $1,\r
2232                                         codegen.CurrentMethodDef.AddLabel ());\r
2233                           }\r
2234                         ;\r
2235 \r
2236 scope_block_begin       : OPEN_BRACE\r
2237                           {\r
2238                                 $$ = codegen.CurrentMethodDef.AddLabel ();\r
2239                           }\r
2240                         ;\r
2241                         \r
2242                         \r
2243 seh_block               : try_block seh_clauses\r
2244                           {\r
2245                                 TryBlock try_block = (TryBlock) $1;\r
2246 \r
2247                                 ArrayList clause_list = (ArrayList) $2;\r
2248                                 foreach (object clause in clause_list)\r
2249                                         try_block.AddSehClause ((ISehClause) clause);\r
2250 \r
2251                                 codegen.CurrentMethodDef.AddInstr (try_block);\r
2252                           }\r
2253                         ;\r
2254 \r
2255 try_block               : D_TRY scope_block\r
2256                           {\r
2257                                 $$ = new TryBlock ((HandlerBlock) $2, tokenizer.Location);\r
2258                           }\r
2259                         | D_TRY id K_TO id\r
2260                           {\r
2261                                 LabelInfo from = codegen.CurrentMethodDef.AddLabelRef ((string) $2);\r
2262                                 LabelInfo to = codegen.CurrentMethodDef.AddLabelRef ((string) $4);\r
2263                                 \r
2264                                 $$ = new TryBlock (new HandlerBlock (from, to), tokenizer.Location);\r
2265                           }\r
2266                         | D_TRY int32 K_TO int32\r
2267                           {\r
2268                                 LabelInfo from = codegen.CurrentMethodDef.AddLabel ((int) $2);\r
2269                                 LabelInfo to = codegen.CurrentMethodDef.AddLabel ((int) $4);\r
2270                                 \r
2271                                 $$ = new TryBlock (new HandlerBlock (from, to), tokenizer.Location);\r
2272                           }\r
2273                         ;\r
2274 \r
2275 seh_clauses             : seh_clause\r
2276                           {\r
2277                                 ArrayList clause_list = new ArrayList ();\r
2278                                 clause_list.Add ($1);\r
2279                                 $$ = clause_list;\r
2280                           }\r
2281                         | seh_clauses seh_clause\r
2282                           {\r
2283                                 ArrayList clause_list = (ArrayList) $1;\r
2284                                 clause_list.Add ($2);\r
2285                           }\r
2286                         ;\r
2287 \r
2288 seh_clause              : K_CATCH class_ref handler_block\r
2289                           {\r
2290                                 if ($2.GetType () == typeof (PrimitiveTypeRef))\r
2291                                         Report.Error ("Exception not be of a primitive type.");\r
2292                                         \r
2293                                 BaseClassRef type = (BaseClassRef) $2;\r
2294                                 CatchBlock cb = new CatchBlock (type);\r
2295                                 cb.SetHandlerBlock ((HandlerBlock) $3);\r
2296                                 $$ = cb;\r
2297                           }\r
2298                         | K_FINALLY handler_block\r
2299                           {\r
2300                                 FinallyBlock fb = new FinallyBlock ();\r
2301                                 fb.SetHandlerBlock ((HandlerBlock) $2);\r
2302                                 $$ = fb;\r
2303                           }\r
2304                         | K_FAULT handler_block\r
2305                           {\r
2306                                 FaultBlock fb = new FaultBlock ();\r
2307                                 fb.SetHandlerBlock ((HandlerBlock) $2);\r
2308                                 $$ = fb;\r
2309                           }\r
2310                         | filter_clause handler_block\r
2311                           {\r
2312                                 FilterBlock fb = (FilterBlock) $1;\r
2313                                 fb.SetHandlerBlock ((HandlerBlock) $2);\r
2314                           }\r
2315                         ;\r
2316 \r
2317 filter_clause           : K_FILTER scope_block\r
2318                           {\r
2319                                 HandlerBlock block = (HandlerBlock) $2;\r
2320                                 FilterBlock fb = new FilterBlock (block);\r
2321                                 $$ = fb;\r
2322                           }\r
2323                         | K_FILTER id\r
2324                           {\r
2325                                 LabelInfo from = codegen.CurrentMethodDef.AddLabelRef ((string) $2);\r
2326                                 FilterBlock fb = new FilterBlock (new HandlerBlock (from, null));\r
2327                                 $$ = fb;\r
2328                           }\r
2329                         | K_FILTER int32\r
2330                           {\r
2331                                 LabelInfo from = codegen.CurrentMethodDef.AddLabel ((int) $2);\r
2332                                 FilterBlock fb = new FilterBlock (new HandlerBlock (from, null));\r
2333                                 $$ = fb;\r
2334                           }\r
2335                         ;\r
2336 \r
2337 handler_block           : scope_block\r
2338                           {\r
2339                                 \r
2340                           }\r
2341                         | K_HANDLER id K_TO id\r
2342                           {     \r
2343                                 LabelInfo from = codegen.CurrentMethodDef.AddLabelRef ((string) $2);\r
2344                                 LabelInfo to = codegen.CurrentMethodDef.AddLabelRef ((string) $4);\r
2345 \r
2346                                 $$ = new HandlerBlock (from, to);\r
2347                           }\r
2348                         | K_HANDLER int32 K_TO int32\r
2349                           {\r
2350                                 LabelInfo from = codegen.CurrentMethodDef.AddLabelRef ((string) $2);\r
2351                                 LabelInfo to = codegen.CurrentMethodDef.AddLabelRef ((string) $4);\r
2352 \r
2353                                 $$ = new HandlerBlock (from, to);\r
2354                           }\r
2355                         ;\r
2356 \r
2357 instr                   : INSTR_NONE\r
2358                           {\r
2359                                 codegen.CurrentMethodDef.AddInstr (\r
2360                                         new SimpInstr ((Op) $1, tokenizer.Location));\r
2361                           }\r
2362                         | INSTR_LOCAL int32\r
2363                           {\r
2364                                 codegen.CurrentMethodDef.AddInstr (\r
2365                                         new IntInstr ((IntOp) $1, (int) $2, tokenizer.Location));        \r
2366                           }\r
2367                         | INSTR_LOCAL id\r
2368                           {\r
2369                                 int slot = codegen.CurrentMethodDef.GetNamedLocalSlot ((string) $2);\r
2370                                 codegen.CurrentMethodDef.AddInstr (\r
2371                                         new IntInstr ((IntOp) $1, slot, tokenizer.Location));\r
2372                           }\r
2373                         | INSTR_PARAM int32\r
2374                           {\r
2375                                 codegen.CurrentMethodDef.AddInstr (\r
2376                                         new IntInstr ((IntOp) $1, (int) $2, tokenizer.Location));\r
2377                           }\r
2378                         | INSTR_PARAM id\r
2379                           {\r
2380                                 int pos = codegen.CurrentMethodDef.GetNamedParamPos ((string) $2);\r
2381                                 if (pos < 0)\r
2382                                         Report.Error (String.Format ("Undeclared identifier '{0}'", (string) $2));\r
2383 \r
2384                                 codegen.CurrentMethodDef.AddInstr (\r
2385                                         new IntInstr ((IntOp) $1, pos, tokenizer.Location));\r
2386                           }\r
2387                         | INSTR_I int32\r
2388                           {\r
2389                                 codegen.CurrentMethodDef.AddInstr (new\r
2390                                         IntInstr ((IntOp) $1, (int) $2, tokenizer.Location));\r
2391                           }\r
2392                         | INSTR_I id\r
2393                           {\r
2394                                 int slot = codegen.CurrentMethodDef.GetNamedLocalSlot ((string) $2);\r
2395                                 codegen.CurrentMethodDef.AddInstr (new\r
2396                                         IntInstr ((IntOp) $1, slot, tokenizer.Location));\r
2397                           }\r
2398                         | INSTR_I8 int64\r
2399                           {\r
2400                                 if ($1 is MiscInstr) {\r
2401                                         switch ((MiscInstr) $1) {\r
2402                                         case MiscInstr.ldc_i8:\r
2403                                         codegen.CurrentMethodDef.AddInstr (new LdcInstr ((MiscInstr) $1,\r
2404                                                 (long) $2, tokenizer.Location));\r
2405                                         break;\r
2406                                         }\r
2407                                 }\r
2408                           }\r
2409                         | INSTR_R float64\r
2410                           {\r
2411                                 switch ((MiscInstr) $1) {\r
2412                                 case MiscInstr.ldc_r4:\r
2413                                 case MiscInstr.ldc_r8:\r
2414                                          codegen.CurrentMethodDef.AddInstr (new LdcInstr ((MiscInstr) $1, (double) $2, tokenizer.Location));\r
2415                                          break;\r
2416                                 }\r
2417                           }\r
2418                         | INSTR_R int64\r
2419                           {\r
2420                                 long l = (long) $2;\r
2421                                 \r
2422                                 switch ((MiscInstr) $1) {\r
2423                                         case MiscInstr.ldc_r4:\r
2424                                         case MiscInstr.ldc_r8:\r
2425                                         codegen.CurrentMethodDef.AddInstr (new LdcInstr ((MiscInstr) $1, (double) l, tokenizer.Location));\r
2426                                         break;\r
2427                                 }\r
2428                           }\r
2429                         | INSTR_R bytes_list\r
2430                           {\r
2431                                 switch ((MiscInstr) $1) {\r
2432                                         case MiscInstr.ldc_r4:\r
2433                                                 float s = BitConverter.ToSingle ((byte []) $2, 0);\r
2434                                                 codegen.CurrentMethodDef.AddInstr (new LdcInstr ((MiscInstr) $1, s, tokenizer.Location));\r
2435                                                 break;\r
2436                                         case MiscInstr.ldc_r8:\r
2437                                                 double d = BitConverter.ToDouble ((byte []) $2, 0);\r
2438                                                 codegen.CurrentMethodDef.AddInstr (new LdcInstr ((MiscInstr) $1, d, tokenizer.Location));\r
2439                                                 break;\r
2440                                 }\r
2441                           }\r
2442                         | INSTR_BRTARGET int32\r
2443                           {\r
2444                                 LabelInfo target = codegen.CurrentMethodDef.AddLabel ((int) $2);\r
2445                                 codegen.CurrentMethodDef.AddInstr (new BranchInstr ((BranchOp) $1,\r
2446                                                                    target, tokenizer.Location));  \r
2447                           }\r
2448                         | INSTR_BRTARGET id\r
2449                           {\r
2450                                 LabelInfo target = codegen.CurrentMethodDef.AddLabelRef ((string) $2);\r
2451                                 codegen.CurrentMethodDef.AddInstr (new BranchInstr ((BranchOp) $1,\r
2452                                                                    target, tokenizer.Location));\r
2453                           }\r
2454                         | INSTR_METHOD method_ref\r
2455                           {\r
2456                                 codegen.CurrentMethodDef.AddInstr (new MethodInstr ((MethodOp) $1,\r
2457                                         (BaseMethodRef) $2, tokenizer.Location));\r
2458                           }\r
2459                         | INSTR_FIELD type type_spec DOUBLE_COLON id\r
2460                           {\r
2461                                 \r
2462                                 BaseTypeRef owner = (BaseTypeRef) $3;\r
2463                                 GenericParamRef gpr = $2 as GenericParamRef;\r
2464                                 if (gpr != null && codegen.CurrentMethodDef != null)\r
2465                                         codegen.CurrentMethodDef.ResolveGenParam ((PEAPI.GenParam) gpr.PeapiType);\r
2466                                 IFieldRef fieldref = owner.GetFieldRef (\r
2467                                         (BaseTypeRef) $2, (string) $5);\r
2468 \r
2469                                 codegen.CurrentMethodDef.AddInstr (new FieldInstr ((FieldOp) $1, fieldref, tokenizer.Location));\r
2470                           }\r
2471                         | INSTR_FIELD type id\r
2472                           {\r
2473                                 GlobalFieldRef fieldref = codegen.GetGlobalFieldRef ((BaseTypeRef) $2, (string) $3);\r
2474 \r
2475                                 codegen.CurrentMethodDef.AddInstr (new FieldInstr ((FieldOp) $1, fieldref, tokenizer.Location));\r
2476                           }\r
2477                         | INSTR_TYPE type_spec\r
2478                           {\r
2479                                 codegen.CurrentMethodDef.AddInstr (new TypeInstr ((TypeOp) $1,\r
2480                                         (BaseTypeRef) $2, tokenizer.Location));\r
2481                           }\r
2482                         | INSTR_STRING comp_qstring\r
2483                           {\r
2484                                 if ((MiscInstr) $1 == MiscInstr.ldstr)\r
2485                                         codegen.CurrentMethodDef.AddInstr (new LdstrInstr ((string) $2, tokenizer.Location));\r
2486                           }\r
2487                         | INSTR_STRING K_BYTEARRAY ASSIGN bytes_list\r
2488                           {\r
2489                                 byte[] bs = (byte[]) $4;\r
2490                                 if ((MiscInstr) $1 == MiscInstr.ldstr)\r
2491                                         codegen.CurrentMethodDef.AddInstr (new LdstrInstr (bs, tokenizer.Location));\r
2492                           }\r
2493                         | INSTR_STRING K_BYTEARRAY bytes_list\r
2494                           {\r
2495                                 byte[] bs = (byte[]) $3;\r
2496                                 if ((MiscInstr) $1 == MiscInstr.ldstr)\r
2497                                         codegen.CurrentMethodDef.AddInstr (new LdstrInstr (bs, tokenizer.Location));\r
2498                           }\r
2499                         | INSTR_SIG call_conv type OPEN_PARENS type_list CLOSE_PARENS\r
2500                           {\r
2501                                 ArrayList arg_list = (ArrayList) $5;\r
2502                                 BaseTypeRef[] arg_array = null;\r
2503 \r
2504                                 if (arg_list != null)\r
2505                                         arg_array = (BaseTypeRef[]) arg_list.ToArray (typeof (BaseTypeRef));\r
2506 \r
2507                                 codegen.CurrentMethodDef.AddInstr (new CalliInstr ((CallConv) $2,\r
2508                                         (BaseTypeRef) $3, arg_array, tokenizer.Location));\r
2509                           }     \r
2510                         | INSTR_TOK owner_type\r
2511                           {\r
2512                                 if ((MiscInstr) $1 == MiscInstr.ldtoken) {\r
2513                                         if ($2 is BaseMethodRef)\r
2514                                                 codegen.CurrentMethodDef.AddInstr (new LdtokenInstr ((BaseMethodRef) $2, tokenizer.Location));\r
2515                                         else if ($2 is IFieldRef)\r
2516                                                 codegen.CurrentMethodDef.AddInstr (new LdtokenInstr ((IFieldRef) $2, tokenizer.Location));\r
2517                                         else\r
2518                                                 codegen.CurrentMethodDef.AddInstr (new LdtokenInstr ((BaseTypeRef) $2, tokenizer.Location));\r
2519                                                 \r
2520                                 }\r
2521                           }\r
2522                         | INSTR_SWITCH OPEN_PARENS labels CLOSE_PARENS\r
2523                           {\r
2524                                 codegen.CurrentMethodDef.AddInstr (new SwitchInstr ((ArrayList) $3, tokenizer.Location));\r
2525                           }\r
2526                         ;\r
2527 \r
2528 method_ref              : call_conv type method_name typars_clause\r
2529                           OPEN_PARENS type_list CLOSE_PARENS\r
2530                           {\r
2531                                 ArrayList arg_list = (ArrayList) $6;\r
2532                                 GenericArguments ga = (GenericArguments) $4;\r
2533                                 BaseTypeRef[] param_list;\r
2534   \r
2535                                 if (arg_list != null)\r
2536                                         param_list = (BaseTypeRef[]) arg_list.ToArray (typeof (BaseTypeRef));\r
2537                                 else\r
2538                                         param_list = new BaseTypeRef[0];\r
2539 \r
2540                                 BaseMethodRef methref = codegen.GetGlobalMethodRef ((BaseTypeRef) $2, (CallConv) $1,\r
2541                                         (string) $3, param_list, (ga != null ? ga.Count : 0));\r
2542 \r
2543                                 if (ga != null)\r
2544                                         methref = methref.GetGenericMethodRef (ga);\r
2545 \r
2546                                 $$ = methref;\r
2547                           }\r
2548                         | call_conv type type_spec DOUBLE_COLON method_name\r
2549                           typars_clause OPEN_PARENS type_list CLOSE_PARENS \r
2550                           {\r
2551                                 BaseTypeRef owner = (BaseTypeRef) $3;\r
2552                                 ArrayList arg_list = (ArrayList) $8;\r
2553                                 GenericArguments ga = (GenericArguments) $6;\r
2554                                 BaseTypeRef[] param_list;\r
2555                                 BaseMethodRef methref;\r
2556 \r
2557                                 if (arg_list != null)\r
2558                                         param_list = (BaseTypeRef[]) arg_list.ToArray (typeof (BaseTypeRef));\r
2559                                 else\r
2560                                         param_list = new BaseTypeRef[0];\r
2561 \r
2562                                 if (codegen.IsThisAssembly ("mscorlib")) {\r
2563                                         PrimitiveTypeRef prim = owner as PrimitiveTypeRef;\r
2564                                         if (prim != null && prim.SigMod == "")\r
2565                                                 owner = codegen.GetTypeRef (prim.Name);\r
2566                                 }\r
2567 \r
2568                                 if (owner.UseTypeSpec) {\r
2569                                         methref = new TypeSpecMethodRef (owner, (CallConv) $1, (BaseTypeRef) $2,\r
2570                                                 (string) $5, param_list, (ga != null ? ga.Count : 0));\r
2571                                 } else {\r
2572                                         methref = owner.GetMethodRef ((BaseTypeRef) $2,\r
2573                                                 (CallConv) $1, (string) $5, param_list, (ga != null ? ga.Count : 0));\r
2574                                 }\r
2575 \r
2576                                 if (ga != null)\r
2577                                         methref = methref.GetGenericMethodRef (ga);\r
2578                                 \r
2579                                 $$ = methref;\r
2580                           }\r
2581                         ;\r
2582 \r
2583 labels                  : /* EMPTY */\r
2584                         | id\r
2585                           {\r
2586                                 ArrayList label_list = new ArrayList ();\r
2587                                 label_list.Add ($1);\r
2588                                 $$ = label_list;\r
2589                           }\r
2590                         | int32\r
2591                           {\r
2592                                 ArrayList label_list = new ArrayList ();\r
2593                                 label_list.Add ($1);\r
2594                                 $$ = label_list;\r
2595                           }\r
2596                         | labels COMMA id\r
2597                           {\r
2598                                 ArrayList label_list = (ArrayList) $1;\r
2599                                 label_list.Add ($3);\r
2600                           }\r
2601                         | labels COMMA int32\r
2602                           {\r
2603                                 ArrayList label_list = (ArrayList) $1;\r
2604                                 label_list.Add ($3);\r
2605                           }\r
2606                         ;\r
2607 \r
2608 owner_type              : type_spec\r
2609                         | member_ref\r
2610                         ;\r
2611 \r
2612 member_ref              : K_METHOD method_ref\r
2613                           {\r
2614                                 $$ = $2;\r
2615                           }\r
2616                         | K_FIELD type type_spec DOUBLE_COLON id\r
2617                           {\r
2618                                 BaseTypeRef owner = (BaseTypeRef) $3;\r
2619 \r
2620                                 $$ = owner.GetFieldRef (\r
2621                                         (BaseTypeRef) $2, (string) $5);\r
2622                           }\r
2623                         | K_FIELD type id\r
2624                           {\r
2625                                 $$ = codegen.GetGlobalFieldRef ((BaseTypeRef) $2, (string) $3);\r
2626                           }\r
2627                         ;\r
2628 \r
2629 event_all               : event_head OPEN_BRACE event_decls CLOSE_BRACE\r
2630                           {\r
2631                                 codegen.CurrentTypeDef.EndEventDef ();\r
2632                           }\r
2633                         ;\r
2634 \r
2635 event_head              : D_EVENT event_attr type_spec comp_name\r
2636                           {\r
2637                                 EventDef event_def = new EventDef ((FeatureAttr) $2,\r
2638                                         (BaseTypeRef) $3, (string) $4);\r
2639                                 codegen.CurrentTypeDef.BeginEventDef (event_def);\r
2640                                 codegen.CurrentCustomAttrTarget = event_def;\r
2641                           }\r
2642                         | D_EVENT event_attr id\r
2643                         ;\r
2644 \r
2645 event_attr              : /* EMPTY */\r
2646                           {\r
2647                                 $$ = new FeatureAttr ();\r
2648                           }\r
2649                         | event_attr K_RTSPECIALNAME\r
2650                           {\r
2651                                 $$ = (FeatureAttr) $1 & FeatureAttr.Rtspecialname;\r
2652                           }\r
2653                         | event_attr K_SPECIALNAME\r
2654                           {\r
2655                                 $$ = (FeatureAttr) $1 & FeatureAttr.Specialname;\r
2656                           }\r
2657                         ;\r
2658 \r
2659 event_decls             : /* EMPTY */\r
2660                         | event_decls event_decl\r
2661                         ;\r
2662 \r
2663 event_decl              : D_ADDON method_ref\r
2664                           {\r
2665                                 codegen.CurrentTypeDef.CurrentEvent.AddAddon (\r
2666                                         (MethodRef) $2);                                \r
2667                           }\r
2668                         | D_REMOVEON method_ref\r
2669                           {\r
2670                                 codegen.CurrentTypeDef.CurrentEvent.AddRemoveon (\r
2671                                         (MethodRef) $2);\r
2672                           }\r
2673                         | D_FIRE method_ref\r
2674                           {\r
2675                                 codegen.CurrentTypeDef.CurrentEvent.AddFire (\r
2676                                         (MethodRef) $2);\r
2677                           }\r
2678                         | D_OTHER method_ref\r
2679                           {\r
2680                                 codegen.CurrentTypeDef.CurrentEvent.AddOther (\r
2681                                         (MethodRef) $2);\r
2682                           }\r
2683                         | customattr_decl\r
2684                           {\r
2685                                 if (codegen.CurrentCustomAttrTarget != null)\r
2686                                         codegen.CurrentCustomAttrTarget.AddCustomAttribute ((CustomAttr) $1);\r
2687                           }\r
2688                         | extsource_spec\r
2689                         | language_decl\r
2690                         ;\r
2691 \r
2692 prop_all                : prop_head OPEN_BRACE prop_decls CLOSE_BRACE\r
2693                           {\r
2694                                 codegen.CurrentTypeDef.EndPropertyDef ();\r
2695                           }\r
2696                         ;\r
2697 \r
2698 prop_head               : D_PROPERTY prop_attr type comp_name OPEN_PARENS type_list CLOSE_PARENS init_opt\r
2699                           {\r
2700                                 PropertyDef prop_def = new PropertyDef ((FeatureAttr) $2, (BaseTypeRef) $3,\r
2701                                         (string) $4, (ArrayList) $6);\r
2702                                 codegen.CurrentTypeDef.BeginPropertyDef (prop_def);\r
2703                                 codegen.CurrentCustomAttrTarget = prop_def;\r
2704 \r
2705                                 if ($8 != null) {\r
2706                                         prop_def.AddInitValue ((Constant) $8);\r
2707                                 }\r
2708                           }\r
2709                         ;\r
2710 \r
2711 prop_attr               : /* EMPTY */\r
2712                           {\r
2713                                 $$ = new FeatureAttr ();\r
2714                           }\r
2715                         | prop_attr K_RTSPECIALNAME\r
2716                           {\r
2717                                 $$ = (FeatureAttr) $1 | FeatureAttr.Rtspecialname;\r
2718                           }\r
2719                         | prop_attr K_SPECIALNAME\r
2720                           {\r
2721                                 $$ = (FeatureAttr) $1 | FeatureAttr.Specialname;\r
2722                           }\r
2723                         | prop_attr K_INSTANCE\r
2724                           {\r
2725                                 $$ = (FeatureAttr) $1 | FeatureAttr.Instance;\r
2726                           }\r
2727                         ;\r
2728 \r
2729 prop_decls              : /* EMPTY */\r
2730                         | prop_decls prop_decl\r
2731                         ;\r
2732 \r
2733 prop_decl               : D_SET method_ref\r
2734                           {\r
2735                                 codegen.CurrentTypeDef.CurrentProperty.AddSet ((MethodRef) $2);\r
2736                           }\r
2737                         | D_GET method_ref\r
2738                           {\r
2739                                 codegen.CurrentTypeDef.CurrentProperty.AddGet ((MethodRef) $2);\r
2740                           }\r
2741                         | D_OTHER method_ref\r
2742                           {\r
2743                                 codegen.CurrentTypeDef.CurrentProperty.AddOther ((MethodRef) $2);\r
2744                           }\r
2745                         | customattr_decl\r
2746                          {\r
2747                                 if (codegen.CurrentCustomAttrTarget != null)\r
2748                                         codegen.CurrentCustomAttrTarget.AddCustomAttribute ((CustomAttr) $1);\r
2749                          }\r
2750                         | extsource_spec\r
2751                         | language_decl\r
2752                         ;\r
2753 \r
2754 customattr_decl         : D_CUSTOM custom_type\r
2755                           {\r
2756                                 $$ = new CustomAttr ((BaseMethodRef) $2, null);\r
2757                           }\r
2758                         | D_CUSTOM custom_type ASSIGN comp_qstring\r
2759                         | D_CUSTOM custom_type ASSIGN bytes_list\r
2760                           {\r
2761                                 $$ = new CustomAttr ((BaseMethodRef) $2,\r
2762                                         (byte[]) $4);\r
2763                           }\r
2764                         | D_CUSTOM OPEN_PARENS owner_type CLOSE_PARENS custom_type\r
2765                         | D_CUSTOM OPEN_PARENS owner_type CLOSE_PARENS custom_type ASSIGN comp_qstring\r
2766                         | D_CUSTOM OPEN_PARENS owner_type CLOSE_PARENS custom_type ASSIGN\r
2767                           bytes_list\r
2768                         ;\r
2769                         \r
2770 custom_type             : call_conv type type_spec DOUBLE_COLON D_CTOR OPEN_PARENS type_list CLOSE_PARENS\r
2771                           {\r
2772                                 BaseTypeRef owner = (BaseTypeRef) $3;\r
2773                                 ArrayList arg_list = (ArrayList) $7;\r
2774                                 BaseTypeRef[] param_list;\r
2775   \r
2776                                 if (arg_list != null)\r
2777                                         param_list = (BaseTypeRef[]) arg_list.ToArray (typeof (BaseTypeRef));\r
2778                                 else\r
2779                                         param_list = new BaseTypeRef[0];\r
2780 \r
2781                                 $$ = owner.GetMethodRef ((BaseTypeRef) $2,\r
2782                                         (CallConv) $1, (string) $5, param_list, 0);\r
2783                           }\r
2784                         | call_conv type D_CTOR OPEN_PARENS type_list CLOSE_PARENS\r
2785                           {\r
2786                                 ArrayList arg_list = (ArrayList) $5;\r
2787                                 BaseTypeRef[] param_list;\r
2788   \r
2789                                 if (arg_list != null)\r
2790                                         param_list = (BaseTypeRef[]) arg_list.ToArray (typeof (BaseTypeRef));\r
2791                                 else\r
2792                                         param_list = new BaseTypeRef[0];\r
2793 \r
2794                                 $$ = codegen.GetGlobalMethodRef ((BaseTypeRef) $2, (CallConv) $1,\r
2795                                         (string) $3, param_list, 0);\r
2796                           }\r
2797                         ;\r
2798 \r
2799 sec_decl                : D_PERMISSION sec_action type_spec OPEN_PARENS nameval_pairs CLOSE_PARENS\r
2800                           {\r
2801                                 $$ = TypeSpecToPermPair ($2, $3, (ArrayList) $5);\r
2802                           }\r
2803                         | D_PERMISSION sec_action type_spec\r
2804                           {\r
2805                                 $$ = TypeSpecToPermPair ($2, $3, null);\r
2806                           }\r
2807                         | D_PERMISSIONSET sec_action ASSIGN bytes_list\r
2808                           {\r
2809                                 System.Text.UnicodeEncoding ue = new System.Text.UnicodeEncoding ();\r
2810                                 PermissionSetAttribute psa = new PermissionSetAttribute ((System.Security.Permissions.SecurityAction) (short) $2);\r
2811                                 psa.XML = ue.GetString ((byte []) $4);\r
2812                                 $$ = new PermPair ((PEAPI.SecurityAction) $2, psa.CreatePermissionSet ());\r
2813                           }\r
2814                         | D_PERMISSIONSET sec_action comp_qstring\r
2815                           {\r
2816                                 PermissionSetAttribute psa = new PermissionSetAttribute ((System.Security.Permissions.SecurityAction) (short) $2);\r
2817                                 psa.XML = (string) $3;\r
2818                                 $$ = new PermPair ((PEAPI.SecurityAction) $2, psa.CreatePermissionSet ());\r
2819                           }\r
2820                         | D_PERMISSIONSET sec_action ASSIGN OPEN_BRACE permissions CLOSE_BRACE\r
2821                           {\r
2822 #if NET_2_0\r
2823                                 $$ = new MIPermissionSet ((PEAPI.SecurityAction) $2, (ArrayList) $5);\r
2824 #else\r
2825                                 Report.Error ("Use ilasm2 for 2.0 style declarative security attributes.");\r
2826 #endif\r
2827                           }\r
2828                         ;\r
2829 \r
2830 permissions             : permission\r
2831                           {\r
2832                                 ArrayList list = new ArrayList ();\r
2833                                 list.Add ($1);\r
2834                                 $$ = list;\r
2835                           }\r
2836                         | permissions COMMA permission\r
2837                           {\r
2838                                 ArrayList list = (ArrayList) $1;\r
2839                                 list.Add ($3);\r
2840                                 $$ = list;\r
2841                           }\r
2842                         ;\r
2843                         \r
2844 permission              : class_ref ASSIGN OPEN_BRACE permission_members CLOSE_BRACE\r
2845                           {\r
2846                                 $$ = new MIPermission ((BaseTypeRef) $1, (ArrayList) $4);\r
2847                           }\r
2848                         ;\r
2849 \r
2850 permission_members      : permission_member\r
2851                           {\r
2852                                   ArrayList list = new ArrayList ();\r
2853                                   list.Add ($1);\r
2854                                   $$ = list;\r
2855                           }\r
2856                         | permission_members permission_member\r
2857                           {\r
2858                                   ArrayList list = (ArrayList) $1;\r
2859                                   list.Add ($2);\r
2860                                   $$ = list;\r
2861                           }\r
2862                         ;\r
2863 \r
2864 permission_member       : prop_or_field primitive_type perm_mbr_nameval_pair\r
2865                           {\r
2866                                 NameValuePair pair = (NameValuePair) $3;\r
2867                                 $$ = new PermissionMember ((MemberTypes) $1, (BaseTypeRef) $2, pair.Name, pair.Value);\r
2868                           }\r
2869                         | prop_or_field K_ENUM class_ref perm_mbr_nameval_pair\r
2870                           {\r
2871                                 NameValuePair pair = (NameValuePair) $4;\r
2872                                 $$ = new PermissionMember ((MemberTypes) $1, (BaseTypeRef) $3, pair.Name, pair.Value);\r
2873                           }\r
2874                         ;\r
2875 \r
2876 perm_mbr_nameval_pair   : SQSTRING ASSIGN field_init_primitive\r
2877                           {\r
2878                                 $$ = new NameValuePair ((string) $1, (PEAPI.Constant) $3);\r
2879                           }\r
2880                         | SQSTRING ASSIGN K_BYTEARRAY bytes_list\r
2881                           {\r
2882                                 $$ = new NameValuePair ((string) $1, new ByteArrConst ((byte[]) $4));\r
2883                           }\r
2884                         | SQSTRING ASSIGN K_STRING OPEN_PARENS SQSTRING CLOSE_PARENS\r
2885                           {\r
2886                                 $$ = new NameValuePair ((string) $1, new StringConst ((string) $5));\r
2887                           }\r
2888                         ;\r
2889 \r
2890 prop_or_field           : K_PROPERTY\r
2891                           {\r
2892                                 $$ = MemberTypes.Property;\r
2893                           }\r
2894                         | K_FIELD\r
2895                           {\r
2896                                 $$ = MemberTypes.Field;\r
2897                           }\r
2898                         ;\r
2899 \r
2900 nameval_pairs           : nameval_pair \r
2901                           {\r
2902                                 ArrayList pairs = new ArrayList ();\r
2903                                 pairs.Add ($1);\r
2904                                 $$ = pairs;\r
2905                           }\r
2906                         | nameval_pairs COMMA nameval_pair\r
2907                           {\r
2908                                 ArrayList pairs = (ArrayList) $1;\r
2909                                 pairs.Add ($3);\r
2910                                 $$ = pairs;\r
2911                           }\r
2912                         ;\r
2913 \r
2914 nameval_pair            : comp_qstring ASSIGN cavalue\r
2915                           {\r
2916                                 $$ = new NameValuePair ((string) $1, $3);\r
2917                           }\r
2918                         ;\r
2919 \r
2920 cavalue                 : truefalse\r
2921                         | int32\r
2922                         | int32 OPEN_PARENS int32 CLOSE_PARENS\r
2923                           {\r
2924                                 $$ = $3;\r
2925                           }\r
2926                         | comp_qstring \r
2927                         | class_ref OPEN_PARENS K_INT8 COLON int32 CLOSE_PARENS\r
2928                           {\r
2929                                 $$ = ClassRefToObject ($1, (byte) (int) $5);\r
2930                           }\r
2931                         | class_ref OPEN_PARENS K_INT16 COLON int32 CLOSE_PARENS\r
2932                           {\r
2933                                 $$ = ClassRefToObject ($1, (short) (int) $5);\r
2934                           }\r
2935                         | class_ref OPEN_PARENS K_INT32 COLON int32 CLOSE_PARENS\r
2936                           {\r
2937                                 $$ = ClassRefToObject ($1, (int) $5);\r
2938                           }\r
2939                         | class_ref OPEN_PARENS int32 CLOSE_PARENS\r
2940                           {\r
2941                                 $$ = ClassRefToObject ($1, (int) $3);\r
2942                           }\r
2943                         ;\r
2944 \r
2945 sec_action              : K_REQUEST\r
2946                           {\r
2947                                 $$ = PEAPI.SecurityAction.Request;\r
2948                           }\r
2949                         | K_DEMAND\r
2950                           {\r
2951                                 $$ = PEAPI.SecurityAction.Demand;\r
2952                           }\r
2953                         | K_ASSERT\r
2954                           {\r
2955                                 $$ = PEAPI.SecurityAction.Assert;\r
2956                           }\r
2957                         | K_DENY\r
2958                           {\r
2959                                 $$ = PEAPI.SecurityAction.Deny;\r
2960                           }\r
2961                         | K_PERMITONLY\r
2962                           {\r
2963                                 $$ = PEAPI.SecurityAction.PermitOnly;\r
2964                           }\r
2965                         | K_LINKCHECK\r
2966                           {\r
2967                                 $$ = PEAPI.SecurityAction.LinkDemand;\r
2968                           }\r
2969                         | K_INHERITCHECK\r
2970                           {\r
2971                                 $$ = PEAPI.SecurityAction.InheritDemand;\r
2972                           }\r
2973                         | K_REQMIN\r
2974                           {\r
2975                                 $$ = PEAPI.SecurityAction.RequestMinimum;\r
2976                           }\r
2977                         | K_REQOPT\r
2978                           {\r
2979                                 $$ = PEAPI.SecurityAction.RequestOptional;\r
2980                           }\r
2981                         | K_REQREFUSE\r
2982                           {\r
2983                                 $$ = PEAPI.SecurityAction.RequestRefuse;\r
2984                           }\r
2985                         | K_PREJITGRANT\r
2986                           {\r
2987                                 $$ = PEAPI.SecurityAction.PreJitGrant;\r
2988                           }\r
2989                         | K_PREJITDENY\r
2990                           {\r
2991                                 $$ = PEAPI.SecurityAction.PreJitDeny;\r
2992                           }\r
2993                         | K_NONCASDEMAND\r
2994                           {\r
2995                                 $$ = PEAPI.SecurityAction.NonCasDemand;\r
2996                           }\r
2997                         | K_NONCASLINKDEMAND\r
2998                           {\r
2999                                 $$ = PEAPI.SecurityAction.NonCasLinkDemand;\r
3000                           }\r
3001                         | K_NONCASINHERITANCE\r
3002                           {\r
3003                                 $$ = PEAPI.SecurityAction.NonCasInheritance;\r
3004                           }\r
3005                         /* FIXME: Should we have LinkDemandChoice, InheritDemandChoice and DemandChoice ? */  \r
3006                         ;\r
3007 \r
3008 module_head             : D_MODULE\r
3009                           {\r
3010                           }\r
3011                         | D_MODULE comp_name\r
3012                           {\r
3013                                 codegen.SetModuleName ((string) $2);\r
3014                           }\r
3015                         | D_MODULE K_EXTERN comp_name\r
3016                           {\r
3017                                 codegen.ExternTable.AddModule ((string) $3);                         \r
3018                           }\r
3019                         ;\r
3020 \r
3021 file_decl               : D_FILE file_attr comp_name file_entry D_HASH ASSIGN\r
3022                           bytes_list file_entry\r
3023                           {\r
3024                                 codegen.SetFileRef (new FileRef ((string) $3, (byte []) $7, (bool) $2, (bool) $8)); \r
3025                           }\r
3026                         | D_FILE file_attr comp_name file_entry\r
3027                           {\r
3028                                 // We need to compute the hash ourselves. :-(\r
3029                                 // AssemblyName an = AssemblyName.GetName ((string) $3);\r
3030                           }\r
3031                         ;\r
3032 \r
3033 file_attr               : /* EMPTY */\r
3034                           {\r
3035                                 $$ = true;\r
3036                           }\r
3037                         | file_attr K_NOMETADATA\r
3038                           {\r
3039                                 $$ = false;\r
3040                           }\r
3041                         ;\r
3042 \r
3043 file_entry              : /* EMPTY */\r
3044                           {\r
3045                                 $$ = false;\r
3046                           }\r
3047                         | D_ENTRYPOINT\r
3048                           {\r
3049                                 $$ = true;\r
3050                           }\r
3051                         ;\r
3052 \r
3053 assembly_all            : assembly_head OPEN_BRACE assembly_decls CLOSE_BRACE\r
3054                           {\r
3055                                 codegen.CurrentCustomAttrTarget = null;\r
3056                                 codegen.CurrentDeclSecurityTarget = null;\r
3057                           }\r
3058                         ;\r
3059 \r
3060 assembly_head           : D_ASSEMBLY asm_attr slashed_name\r
3061                           {\r
3062                                 codegen.SetAssemblyName ((string) $3);\r
3063                                 codegen.CurrentCustomAttrTarget = codegen.ThisAssembly;\r
3064                                 codegen.CurrentDeclSecurityTarget = codegen.ThisAssembly;\r
3065                           }\r
3066                         ;\r
3067 \r
3068 asm_attr                : /* EMPTY */\r
3069                         | asm_attr K_NOAPPDOMAIN\r
3070                         | asm_attr K_NOPROCESS\r
3071                         | asm_attr K_NOMACHINE\r
3072                         ;\r
3073 \r
3074 assembly_decls          : /* EMPTY */\r
3075                         | assembly_decls assembly_decl\r
3076                         ;\r
3077 \r
3078 assembly_decl           : D_PUBLICKEY ASSIGN bytes_list\r
3079                           {\r
3080                                 codegen.ThisAssembly.SetPublicKey ((byte []) $3);\r
3081                           }\r
3082                         | D_VER int32 COLON int32 COLON int32 COLON int32\r
3083                           {\r
3084                                 codegen.ThisAssembly.SetVersion ((int) $2, (int) $4, (int) $6, (int) $8);\r
3085                           }\r
3086                         | D_LOCALE comp_qstring\r
3087                           {\r
3088                                 codegen.ThisAssembly.SetLocale ((string) $2);\r
3089                           }\r
3090                         | D_LOCALE ASSIGN bytes_list\r
3091                         | D_HASH K_ALGORITHM int32\r
3092                           {\r
3093                                 codegen.ThisAssembly.SetHashAlgorithm ((int) $3);\r
3094                           }\r
3095                         | customattr_decl\r
3096                           {\r
3097                                 codegen.ThisAssembly.AddCustomAttribute ((CustomAttr) $1);\r
3098                           }\r
3099                         | sec_decl\r
3100                           {\r
3101                                 AddSecDecl ($1, true);\r
3102                           }\r
3103                         ;\r
3104 \r
3105 asm_or_ref_decl         : D_PUBLICKEY ASSIGN bytes_list\r
3106                         | D_VER int32 COLON int32 COLON int32 COLON int32 \r
3107                         | D_LOCALE comp_qstring\r
3108                         | D_LOCALE ASSIGN bytes_list\r
3109                         | customattr_decl\r
3110                         ;\r
3111 \r
3112 assemblyref_all         : assemblyref_head OPEN_BRACE assemblyref_decls CLOSE_BRACE\r
3113                         ;\r
3114 \r
3115 assemblyref_head        : D_ASSEMBLY K_EXTERN slashed_name\r
3116                           {\r
3117                                 System.Reflection.AssemblyName asmb_name = \r
3118                                         new System.Reflection.AssemblyName ();\r
3119                                 asmb_name.Name = (string) $3;\r
3120                                 codegen.BeginAssemblyRef ((string) $3, asmb_name);\r
3121                           }\r
3122                         | D_ASSEMBLY K_EXTERN slashed_name K_AS slashed_name\r
3123                           {\r
3124                                 System.Reflection.AssemblyName asmb_name = \r
3125                                         new System.Reflection.AssemblyName ();\r
3126                                 asmb_name.Name = (string) $3;\r
3127                                 codegen.BeginAssemblyRef ((string) $5, asmb_name);\r
3128                           }\r
3129                         ;\r
3130 \r
3131 assemblyref_decls       : /* EMPTY */\r
3132                         | assemblyref_decls assemblyref_decl\r
3133                         ;\r
3134 \r
3135 assemblyref_decl        : D_VER int32 COLON int32 COLON int32 COLON int32\r
3136                           {\r
3137                                 codegen.CurrentAssemblyRef.SetVersion ((int) $2, (int) $4, (int) $6, (int) $8);\r
3138                           }\r
3139                         | D_PUBLICKEY ASSIGN bytes_list\r
3140                           {\r
3141                                 codegen.CurrentAssemblyRef.SetPublicKey ((byte []) $3);\r
3142                           }\r
3143                         | D_PUBLICKEYTOKEN ASSIGN bytes_list\r
3144                           {\r
3145                                 codegen.CurrentAssemblyRef.SetPublicKeyToken ((byte []) $3);\r
3146                           }\r
3147                         | D_LOCALE comp_qstring\r
3148                           {\r
3149                                 codegen.CurrentAssemblyRef.SetLocale ((string) $2);\r
3150                           }\r
3151                         | D_LOCALE ASSIGN bytes_list\r
3152                         \r
3153                         | D_HASH ASSIGN bytes_list\r
3154                           {\r
3155                                 codegen.CurrentAssemblyRef.SetHash ((byte []) $3);\r
3156                           }\r
3157                         | customattr_decl\r
3158                           {\r
3159                                 if (codegen.CurrentCustomAttrTarget != null)\r
3160                                         codegen.CurrentCustomAttrTarget.AddCustomAttribute ((CustomAttr) $1);\r
3161                           }\r
3162                         ;\r
3163 \r
3164 exptype_all             : exptype_head OPEN_BRACE exptype_decls CLOSE_BRACE\r
3165                         ;\r
3166 \r
3167 exptype_head            : D_CLASS K_EXTERN expt_attr comp_name\r
3168                         ;\r
3169 \r
3170 expt_attr               : /* EMPTY */\r
3171                         | expt_attr K_PRIVATE\r
3172                         | expt_attr K_PUBLIC \r
3173                         | expt_attr K_NESTED K_PUBLIC\r
3174                         | expt_attr K_NESTED K_PRIVATE\r
3175                         | expt_attr K_NESTED K_FAMILY\r
3176                         | expt_attr K_NESTED K_ASSEMBLY\r
3177                         | expt_attr K_NESTED K_FAMANDASSEM\r
3178                         | expt_attr K_NESTED K_FAMORASSEM\r
3179                         ;\r
3180 \r
3181 exptype_decls           : /* EMPTY */\r
3182                         | exptype_decls exptype_decl\r
3183                         ;\r
3184 \r
3185 exptype_decl            : D_FILE comp_name\r
3186                         | D_CLASS K_EXTERN comp_name\r
3187                         | D_CLASS int32\r
3188                         | customattr_decl\r
3189                         ;\r
3190 \r
3191 manifestres_all         : manifestres_head OPEN_BRACE manifestres_decls CLOSE_BRACE\r
3192                         ;\r
3193 \r
3194 manifestres_head        : D_MRESOURCE manres_attr comp_name\r
3195                           {\r
3196                                 FileStream s = new FileStream ((string) $3, FileMode.Open, FileAccess.Read);\r
3197                                 byte [] buff = new byte [s.Length];\r
3198                                 s.Read (buff, 0, (int) s.Length);\r
3199                                 s.Close ();\r
3200 \r
3201                                 codegen.AddManifestResource (new ManifestResource ((string) $3, buff, ($2 == null) ? 0 : (uint) $2));\r
3202                           }\r
3203                         ;\r
3204 \r
3205 manres_attr             : /* EMPTY */\r
3206                         | manres_attr K_PUBLIC { $$ = ManifestResource.PublicResource; }\r
3207                         | manres_attr K_PRIVATE { $$ = ManifestResource.PrivateResource; } \r
3208                         ;\r
3209 \r
3210 manifestres_decls       : /* EMPTY */\r
3211                         | manifestres_decls manifestres_decl\r
3212                         ;\r
3213 \r
3214 manifestres_decl        : D_FILE comp_name K_AT int32\r
3215                         | D_ASSEMBLY K_EXTERN slashed_name\r
3216                         | customattr_decl\r
3217                         ;\r
3218 \r
3219 comp_qstring            : QSTRING\r
3220                         | comp_qstring PLUS QSTRING     { $$ = String.Format ("{0}{1}", $1, $3); }\r
3221                         ;\r
3222 \r
3223 int32                   : INT64\r
3224                           {\r
3225                                 long l = (long) $1;\r
3226                                 byte[] intb = BitConverter.GetBytes (l);\r
3227                                 $$ = BitConverter.ToInt32 (intb, BitConverter.IsLittleEndian ? 0 : 4);\r
3228                           }\r
3229                         ;\r
3230 \r
3231 int64                   : INT64\r
3232                         ;\r
3233 \r
3234 float64                 : FLOAT64\r
3235                         | K_FLOAT32 OPEN_PARENS INT32 CLOSE_PARENS\r
3236                           {\r
3237                                 int i = (int) $3;\r
3238                                 byte[] intb = BitConverter.GetBytes (i);\r
3239                                 $$ = (double) BitConverter.ToSingle (intb, BitConverter.IsLittleEndian ? 0 : 4);\r
3240                           }\r
3241                         | K_FLOAT32 OPEN_PARENS INT64 CLOSE_PARENS\r
3242                           {\r
3243                                 long l = (long) $3;\r
3244                                 byte[] intb = BitConverter.GetBytes (l);\r
3245                                 $$ = (double) BitConverter.ToSingle (intb, BitConverter.IsLittleEndian ? 0 : 4);\r
3246                           }\r
3247                         | K_FLOAT64 OPEN_PARENS INT64 CLOSE_PARENS\r
3248                           {\r
3249                                 byte[] intb = BitConverter.GetBytes ((long) $3);\r
3250                                 $$ = BitConverter.ToDouble (intb, BitConverter.IsLittleEndian ? 0 : 4);\r
3251                           }\r
3252                         | K_FLOAT64 OPEN_PARENS INT32 CLOSE_PARENS\r
3253                           {\r
3254                                 byte[] intb = BitConverter.GetBytes ((int) $3);\r
3255                                 $$ = (double) BitConverter.ToSingle (intb, BitConverter.IsLittleEndian ? 0 : 4);\r
3256                           }\r
3257                         ;\r
3258 \r
3259 hexbyte                 : HEXBYTE       { }\r
3260                         ;\r
3261 \r
3262 bytes_list              : OPEN_PARENS\r
3263                           {\r
3264                                 tokenizer.InByteArray = true;\r
3265                           }\r
3266                           bytes CLOSE_PARENS\r
3267                           {\r
3268                                 $$ = $3;\r
3269                                 tokenizer.InByteArray = false;\r
3270                           }\r
3271                         ;\r
3272 \r
3273 bytes                   : /* EMPTY */   { $$ = new byte[0]; }\r
3274                         | hexbytes\r
3275                           {\r
3276                                 ArrayList byte_list = (ArrayList) $1;\r
3277                                 $$ = byte_list.ToArray (typeof (byte));\r
3278                           }\r
3279                         ;\r
3280 \r
3281 hexbytes                : hexbyte\r
3282                           {\r
3283                                 ArrayList byte_list = new ArrayList ();\r
3284                                 byte_list.Add (Convert.ToByte ($1));\r
3285                                 $$ = byte_list;\r
3286                           }\r
3287                         | hexbytes hexbyte\r
3288                           {\r
3289                                 ArrayList byte_list = (ArrayList) $1;\r
3290                                 byte_list.Add (Convert.ToByte ($2));\r
3291                           }\r
3292                         ;\r
3293 \r
3294 truefalse               : K_TRUE\r
3295                           {\r
3296                                 $$ = true;\r
3297                           }\r
3298                         | K_FALSE\r
3299                           {\r
3300                                 $$ = false;\r
3301                           }\r
3302                         ;\r
3303 \r
3304 id                      : ID\r
3305                         | SQSTRING\r
3306                         ;\r
3307 \r
3308 comp_name               : id\r
3309                         | comp_name DOT comp_name\r
3310                           {\r
3311                                 $$ = (string) $1 + '.' + (string) $3;\r
3312                           }\r
3313                         | COMP_NAME\r
3314                         ;\r
3315 \r
3316 %%\r
3317 \r
3318 }\r
3319 \r