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