3 // Mono::ILASM::ILParser
\r
5 // (C) Sergey Chaban (serge@wildwestsoftware.com)
\r
6 // (C) 2003 Jackson Harper, All rights reserved
\r
12 using System.Collections;
\r
13 using System.Globalization;
\r
15 namespace Mono.ILASM {
\r
17 public class ILParser {
\r
19 private CodeGen codegen;
\r
21 private bool is_value_class;
\r
22 private bool is_enum_class;
\r
23 private bool pinvoke_info;
\r
24 private string pinvoke_mod;
\r
25 private string pinvoke_meth;
\r
26 private PEAPI.PInvokeAttr pinvoke_attr;
\r
27 private ILTokenizer tokenizer;
\r
29 public ILParser (CodeGen codegen, ILTokenizer tokenizer)
\r
31 this.codegen = codegen;
\r
32 this.tokenizer = tokenizer;
\r
35 public CodeGen CodeGen {
\r
36 get { return codegen; }
\r
43 /* ID - alpha-numeric identifier */
\r
46 /* QSTRING - quoted string */
\r
49 /* SQSTRING - single quoted string */
\r
52 /* COMP_NAME - A name with dots */
\r
55 /* INT32 - 32 bit integer */
\r
58 /* INT64 - 64 bit integer */
\r
61 /* FLOAT64 - floating point number */
\r
64 /* HEXBYTE - two digit hex number */
\r
70 %token OPEN_BRACE "{"
\r
71 %token CLOSE_BRACE "}"
\r
72 %token OPEN_BRACKET "["
\r
73 %token CLOSE_BRACKET "]"
\r
74 %token OPEN_PARENS "("
\r
75 %token CLOSE_PARENS ")"
\r
78 %token DOUBLE_COLON "::"
\r
79 %token SEMICOLON ";"
\r
82 %token AMPERSAND "&"
\r
86 %token ELLIPSIS "..."
\r
88 %token OPEN_ANGLE_BRACKET "<"
\r
89 %token CLOSE_ANGLE_BRACKET ">"
\r
96 /* INSTR_* instruction types */
\r
102 %token INSTR_BRTARGET
\r
103 %token INSTR_METHOD
\r
104 %token INSTR_NEWOBJ
\r
107 %token INSTR_STRING
\r
111 %token INSTR_SWITCH
\r
120 /* Mechanically generated - DO NOT EDIT! */
\r
129 %token D_CAPABILITY
\r
134 %token D_CONSTRAINT
\r
141 %token D_ENTRYPOINT
\r
150 %token D_IMPLICITCOM
\r
156 %token D_MANIFESTRES
\r
163 %token D_ORIGINATOR
\r
169 %token D_PERMISSION
\r
170 %token D_PERMISSIONSET
\r
174 %token D_PUBLICKEYTOKEN
\r
191 %token K_IMPLICITCOM
\r
192 %token K_IMPLICITRES
\r
193 %token K_NOAPPDOMAIN
\r
217 %token K_RTSPECIALNAME
\r
218 %token K_SPECIALNAME
\r
220 %token K_FAMANDASSEM
\r
221 %token K_FAMORASSEM
\r
222 %token K_PRIVATESCOPE
\r
224 %token K_NOTSERIALIZED
\r
226 %token K_NOT_IN_GC_HEAP
\r
231 %token K_SEQUENTIAL
\r
236 %token K_SERIALIZABLE
\r
240 %token K_IMPLEMENTS
\r
245 %token K_UNMANAGEDEXP
\r
246 %token K_PINVOKEIMPL
\r
256 %token K_FORWARDREF
\r
258 %token K_INTERNALCALL
\r
259 %token K_SYNCHRONIZED
\r
260 %token K_NOINLINING
\r
301 %token K_USERDEFINED
\r
307 %token K_STREAMED_OBJECT
\r
308 %token K_STORED_OBJECT
\r
309 %token K_BLOB_OBJECT
\r
320 %token K_FROMUNMANAGED
\r
321 %token K_CALLMOSTDERIVED
\r
337 %token K_PERMITONLY
\r
339 %token K_INHERITCHECK
\r
343 %token K_PREJITGRANT
\r
344 %token K_PREJITDENY
\r
345 %token K_NONCASDEMAND
\r
346 %token K_NONCASLINKDEMAND
\r
347 %token K_NONCASINHERITANCE
\r
349 %token K_NOMETADATA
\r
351 %token K_FULLORIGIN
\r
355 %token K_ENABLEJITTRACKING
\r
356 %token K_DISABLEJITOPTIMIZER
\r
357 %token K_PRESERVESIG
\r
358 %token K_BEFOREFIELDINIT
\r
362 %token K_COMPILERCONTROLLED
\r
371 /* end generated */
\r
384 decls : /* EMPTY */
\r
402 | D_SUBSYSTEM int32
\r
404 codegen.SetSubSystem ((int) $2);
\r
408 codegen.SetCorFlags ((int) $2);
\r
410 | D_FILE K_ALIGNMENT int32
\r
411 | D_IMAGEBASE int64
\r
413 codegen.SetImageBase ((long) $2);
\r
419 extsource_spec : D_LINE int32 SQSTRING
\r
421 | D_LINE int32 COLON int32 SQSTRING
\r
422 | D_LINE int32 COLON int32
\r
425 language_decl : D_LANGUAGE SQSTRING
\r
426 | D_LANGUAGE SQSTRING COMMA SQSTRING
\r
427 | D_LANGUAGE SQSTRING COMMA SQSTRING COMMA SQSTRING
\r
430 constraint_decl : D_CONSTRAINT BANG int32 K_IS type
\r
432 codegen.CurrentTypeDef.AddGenericConstraint ((int) $3, (ITypeRef) $5);
\r
436 vtfixup_decl : D_VTFIXUP OPEN_BRACKET int32 CLOSE_BRACKET
\r
437 vtfixup_attr K_AT id
\r
440 vtfixup_attr : /* EMPTY */
\r
441 | vtfixup_attr int32
\r
442 | vtfixup_attr int64
\r
443 | vtfixup_attr K_FROMUNMANAGED
\r
444 | vtfixup_attr K_CALLMOSTDERIVED
\r
447 namespace_all : namespace_head OPEN_BRACE decls CLOSE_BRACE
\r
449 codegen.CurrentNameSpace = null;
\r
453 namespace_head : D_NAMESPACE comp_name
\r
455 codegen.CurrentNameSpace = (string) $2;
\r
459 class_all : class_head OPEN_BRACE class_decls CLOSE_BRACE
\r
461 codegen.EndTypeDef ();
\r
465 class_head : D_CLASS class_attr id formal_typars_clause extends_clause
\r
468 codegen.BeginTypeDef ((TypeAttr) $2, (string) $3,
\r
469 $5 as IClassRef, $6 as ArrayList, null);
\r
471 if (is_value_class)
\r
472 codegen.CurrentTypeDef.MakeValueClass ();
\r
474 codegen.CurrentTypeDef.MakeEnumClass ();
\r
477 ArrayList typars_list = (ArrayList) $4;
\r
478 foreach (string id in typars_list)
\r
479 codegen.CurrentTypeDef.AddGenericParam (id);
\r
484 class_attrs : class_attrs class_attr
\r
487 class_attr : /* EMPTY */
\r
489 // Reset some flags
\r
490 is_value_class = false;
\r
491 is_enum_class = false;
\r
492 $$ = new TypeAttr ();
\r
494 | class_attr K_PUBLIC { $$ = (TypeAttr)$1 | TypeAttr.Public; }
\r
495 | class_attr K_PRIVATE { $$ = (TypeAttr)$1 | TypeAttr.Private; }
\r
496 | class_attr K_NESTED K_PRIVATE { $$ = (TypeAttr)$1 | TypeAttr.NestedPrivate; }
\r
497 | class_attr K_NESTED K_PUBLIC { $$ = (TypeAttr)$1 | TypeAttr.NestedPublic; }
\r
498 | class_attr K_NESTED K_FAMILY { $$ = (TypeAttr)$1 | TypeAttr.NestedFamily; }
\r
499 | class_attr K_NESTED K_ASSEMBLY { $$ = (TypeAttr)$1 | TypeAttr.NestedAssembly;}
\r
500 | class_attr K_NESTED K_FAMANDASSEM { $$ = (TypeAttr)$1 | TypeAttr.NestedFamAndAssem; }
\r
501 | class_attr K_NESTED K_FAMORASSEM { $$ = (TypeAttr)$1 | TypeAttr.NestedFamOrAssem; }
\r
502 | class_attr K_VALUE { is_value_class = true; }
\r
503 | class_attr K_ENUM { is_enum_class = true; is_value_class = true;
\r
505 | class_attr K_INTERFACE { $$ = (TypeAttr)$1 | TypeAttr.Interface; }
\r
506 | class_attr K_SEALED { $$ = (TypeAttr)$1 | TypeAttr.Sealed; }
\r
507 | class_attr K_ABSTRACT { $$ = (TypeAttr)$1 | TypeAttr.Abstract; }
\r
508 | class_attr K_AUTO { }
\r
509 | class_attr K_SEQUENTIAL { $$ = (TypeAttr)$1 | TypeAttr.SequentialLayout; }
\r
510 | class_attr K_EXPLICIT { $$ = (TypeAttr)$1 | TypeAttr.ExplicitLayout; }
\r
511 | class_attr K_ANSI { }
\r
512 | class_attr K_UNICODE { $$ = (TypeAttr)$1 | TypeAttr.UnicodeClass; }
\r
513 | class_attr K_AUTOCHAR { $$ = (TypeAttr)$1 | TypeAttr.AutoClass; }
\r
514 | class_attr K_IMPORT { $$ = (TypeAttr)$1 | TypeAttr.Import; }
\r
515 | class_attr K_SERIALIZABLE { $$ = (TypeAttr)$1 | TypeAttr.Serializable; }
\r
516 | class_attr K_BEFOREFIELDINIT { $$ = (TypeAttr)$1 | TypeAttr.BeforeFieldInit; }
\r
517 | class_attr K_SPECIALNAME { $$ = (TypeAttr)$1 | TypeAttr.SpecialName; }
\r
518 | class_attr K_RTSPECIALNAME { $$ = (TypeAttr)$1 | TypeAttr.RTSpecialName; }
\r
521 extends_clause : /* EMPTY */
\r
522 | K_EXTENDS class_ref
\r
528 impl_clause : /* EMPTY */
\r
529 | K_IMPLEMENTS class_refs
\r
535 formal_typars_clause : /* EMPTY */
\r
536 | OPEN_ANGLE_BRACKET formal_typars CLOSE_ANGLE_BRACKET
\r
542 typars_clause : /* EMPTY */
\r
543 | OPEN_ANGLE_BRACKET typars CLOSE_ANGLE_BRACKET
\r
551 ArrayList typars_list = new ArrayList ();
\r
552 typars_list.Add ($1);
\r
555 | typars COMMA type
\r
557 ArrayList typars_list = (ArrayList) $1;
\r
558 typars_list.Add ($3);
\r
563 formal_typars : formal_typar
\r
565 ArrayList formal_list = new ArrayList ();
\r
566 formal_list.Add ($1);
\r
569 | formal_typars COMMA formal_typar
\r
571 ArrayList formal_list = (ArrayList) $1;
\r
572 formal_list.Add ($3);
\r
584 class_refs : class_ref
\r
586 ArrayList class_list = new ArrayList ();
\r
587 class_list.Add ($1);
\r
590 | class_refs COMMA class_ref
\r
592 ArrayList class_list = (ArrayList) $1;
\r
593 class_list.Add ($3);
\r
597 slashed_name : comp_name
\r
598 | slashed_name SLASH comp_name
\r
600 $$ = String.Format ("{0}/{1}", $1, $3);
\r
604 class_ref : OPEN_BRACKET slashed_name CLOSE_BRACKET slashed_name
\r
606 if (codegen.IsThisAssembly ((string) $2)) {
\r
607 $$ = new TypeRef ((string) $4, false, null);
\r
609 $$ = codegen.ExternTable.GetTypeRef ((string) $2, (string) $4, false);
\r
612 | OPEN_BRACKET D_MODULE slashed_name CLOSE_BRACKET slashed_name
\r
614 if (codegen.IsThisModule ((string) $3)) {
\r
615 $$ = new TypeRef ((string) $5, false, null);
\r
617 $$ = codegen.ExternTable.GetModuleTypeRef ((string) $3, (string) $5, false);
\r
622 PrimitiveTypeRef prim = PrimitiveTypeRef.GetPrimitiveType ((string) $1);
\r
627 $$ = new TypeRef ((string) $1, false, null);
\r
632 class_decls : /* EMPTY */
\r
633 | class_decls class_decl
\r
636 class_decl : method_all
\r
646 codegen.CurrentTypeDef.AddCustomAttribute ((CustomAttr) $1);
\r
650 codegen.CurrentTypeDef.SetSize ((int) $2);
\r
654 codegen.CurrentTypeDef.SetPack ((int) $2);
\r
656 | D_OVERRIDE type_spec DOUBLE_COLON method_name K_WITH call_conv type
\r
657 type_spec DOUBLE_COLON method_name type_list
\r
660 // My copy of the spec didn't have a type_list but
\r
661 // it seems pretty crucial
\r
663 ITypeRef owner = (ITypeRef) $2;
\r
664 ArrayList arg_list = (ArrayList) $11;
\r
665 ITypeRef[] param_list;
\r
668 if (arg_list != null)
\r
669 param_list = (ITypeRef[]) arg_list.ToArray (typeof (ITypeRef));
\r
671 param_list = new ITypeRef[0];
\r
673 decl = owner.GetMethodRef ((ITypeRef) $7,
\r
674 (CallConv) $6, (string) $4, param_list);
\r
676 string sig = MethodDef.CreateSignature ((string) $10,
\r
678 codegen.CurrentTypeDef.AddOverride (sig, decl);
\r
680 OPEN_PARENS sig_args CLOSE_PARENS
\r
685 type : K_CLASS class_ref
\r
691 $$ = new PrimitiveTypeRef (PrimitiveType.Object, "System.Object");
\r
695 $$ = new PrimitiveTypeRef (PrimitiveType.String, "System.String");
\r
697 | K_VALUE K_CLASS class_ref
\r
699 IClassRef class_ref = (IClassRef) $3;
\r
700 class_ref.MakeValueClass ();
\r
703 | K_VALUETYPE OPEN_BRACKET slashed_name CLOSE_BRACKET slashed_name
\r
705 ExternTypeRef ext_ref = codegen.ExternTable.GetTypeRef ((string) $3, (string) $5, false);
\r
706 ExternTypeRefInst inst = new ExternTypeRefInst (ext_ref, true);
\r
709 | K_VALUETYPE slashed_name
\r
711 TypeRef t_ref = new TypeRef ((string) $2, true, null);
\r
712 t_ref.MakeValueClass ();
\r
715 | type OPEN_BRACKET CLOSE_BRACKET
\r
717 ITypeRef base_type = (ITypeRef) $1;
\r
718 if (base_type is ExternTypeRef)
\r
719 base_type = ((ExternTypeRef) base_type).Clone ();
\r
720 base_type.MakeArray ();
\r
723 | type OPEN_BRACKET bounds CLOSE_BRACKET
\r
725 ITypeRef base_type = (ITypeRef) $1;
\r
726 if (base_type is ExternTypeRef)
\r
727 base_type = ((ExternTypeRef) base_type).Clone ();
\r
728 ArrayList bound_list = (ArrayList) $3;
\r
729 base_type.MakeBoundArray (bound_list);
\r
734 ITypeRef base_type = (ITypeRef) $1;
\r
735 if (base_type is ExternTypeRef)
\r
736 base_type = ((ExternTypeRef) base_type).Clone ();
\r
737 base_type.MakeManagedPointer ();
\r
742 ITypeRef base_type = (ITypeRef) $1;
\r
743 if (base_type is ExternTypeRef)
\r
744 base_type = ((ExternTypeRef) base_type).Clone ();
\r
745 base_type.MakeUnmanagedPointer ();
\r
750 ITypeRef base_type = (ITypeRef) $1;
\r
751 if (base_type is ExternTypeRef)
\r
752 base_type = ((ExternTypeRef) base_type).Clone ();
\r
753 base_type.MakePinned ();
\r
756 | type K_MODREQ OPEN_PARENS class_ref CLOSE_PARENS
\r
758 ITypeRef base_type = (ITypeRef) $1;
\r
759 if (base_type is ExternTypeRef)
\r
760 base_type = ((ExternTypeRef) base_type).Clone ();
\r
761 IClassRef class_ref = (IClassRef) $4;
\r
762 base_type.MakeCustomModified (codegen,
\r
763 CustomModifier.modopt, class_ref);
\r
766 | type K_MODOPT OPEN_PARENS class_ref CLOSE_PARENS
\r
768 ITypeRef base_type = (ITypeRef) $1;
\r
769 if (base_type is ExternTypeRef)
\r
770 base_type = ((ExternTypeRef) base_type).Clone ();
\r
771 IClassRef class_ref = (IClassRef) $4;
\r
772 base_type.MakeCustomModified (codegen,
\r
773 CustomModifier.modopt, class_ref);
\r
776 | K_METHOD call_conv type STAR OPEN_PARENS sig_args CLOSE_PARENS
\r
779 $$ = new PrimitiveTypeRef (PrimitiveType.TypedRef,
\r
780 "System.TypedReference");
\r
784 $$ = new PrimitiveTypeRef (PrimitiveType.Char, "System.Char");
\r
788 $$ = new PrimitiveTypeRef (PrimitiveType.Char, "System.Char");
\r
792 $$ = new PrimitiveTypeRef (PrimitiveType.Void, "System.Void");
\r
796 $$ = new PrimitiveTypeRef (PrimitiveType.Boolean, "System.Bool");
\r
800 $$ = new PrimitiveTypeRef (PrimitiveType.Int8, "System.Int8");
\r
804 $$ = new PrimitiveTypeRef (PrimitiveType.Int16, "System.Int16");
\r
808 $$ = new PrimitiveTypeRef (PrimitiveType.Int32, "System.Int32");
\r
812 $$ = new PrimitiveTypeRef (PrimitiveType.Int64, "System.Int64");
\r
816 $$ = new PrimitiveTypeRef (PrimitiveType.Float32, "System.Float32");
\r
820 $$ = new PrimitiveTypeRef (PrimitiveType.Float64, "System.Float64");
\r
822 | K_UNSIGNED K_INT8
\r
824 $$ = new PrimitiveTypeRef (PrimitiveType.UInt8, "System.UInt8");
\r
826 | K_UNSIGNED K_INT16
\r
828 $$ = new PrimitiveTypeRef (PrimitiveType.UInt16, "System.UInt16");
\r
830 | K_UNSIGNED K_INT32
\r
832 $$ = new PrimitiveTypeRef (PrimitiveType.UInt32, "System.UInt32");
\r
834 | K_UNSIGNED K_INT64
\r
836 $$ = new PrimitiveTypeRef (PrimitiveType.UInt64, "System.UInt64");
\r
840 // TODO: Is this the proper full name
\r
841 $$ = new PrimitiveTypeRef (PrimitiveType.NativeInt, "System.IntPtr");
\r
844 | K_NATIVE K_UNSIGNED K_INT
\r
846 $$ = new PrimitiveTypeRef (PrimitiveType.NativeUInt, "System.UIntPtr");
\r
850 GenericTypeSpec spec = new GenericTypeSpec ((int) $2);
\r
851 $$ = new GenericTypeRef (spec, $2.ToString ());
\r
855 MVar mvar = new MVar ((int) $3);
\r
856 $$ = new GenericTypeRef (mvar, $3.ToString ());
\r
858 | K_CLASS slashed_name OPEN_ANGLE_BRACKET BANG int32 CLOSE_ANGLE_BRACKET
\r
860 $$ = new TypeRef ((string) $2, false, null);
\r
862 | K_CLASS slashed_name OPEN_ANGLE_BRACKET typars CLOSE_ANGLE_BRACKET
\r
864 ArrayList typar_list = (ArrayList) $4;
\r
865 ITypeRef[] typar_array = (ITypeRef[]) typar_list.ToArray (typeof (ITypeRef));
\r
867 $$ = new GenericTypeInst ((string)$2, typar_array);
\r
873 ArrayList bound_list = new ArrayList ();
\r
874 bound_list.Add ($1);
\r
877 | bounds COMMA bound
\r
879 ArrayList bound_list = (ArrayList) $1;
\r
880 bound_list.Add ($3);
\r
884 bound : /* EMPTY */
\r
886 // This is shortref for no lowerbound or size
\r
887 $$ = new DictionaryEntry (TypeRef.Ellipsis, TypeRef.Ellipsis);
\r
891 // No lower bound or size
\r
892 $$ = new DictionaryEntry (TypeRef.Ellipsis, TypeRef.Ellipsis);
\r
896 // ******** Not sure what this is?
\r
897 // For now I will say it is size because there
\r
898 // is allready a way to set lower
\r
899 $$ = new DictionaryEntry (TypeRef.Ellipsis, $1);
\r
901 | int32 ELLIPSIS int32
\r
903 // lower bound and size
\r
904 $$ = new DictionaryEntry ($1, $3);
\r
908 // Just lower bound
\r
909 $$ = new DictionaryEntry ($1, TypeRef.Ellipsis);
\r
913 call_conv : K_INSTANCE call_conv
\r
915 $$ = (CallConv) $2 | CallConv.Instance;
\r
917 | K_EXPLICIT call_conv
\r
919 $$ = (CallConv) $2 | CallConv.InstanceExplicit;
\r
924 call_kind : /* EMPTY */
\r
926 $$ = new CallConv ();
\r
930 $$ = CallConv.Default;
\r
934 $$ = CallConv.Vararg;
\r
936 | K_UNMANAGED K_CDECL
\r
938 $$ = CallConv.Cdecl;
\r
940 | K_UNMANAGED K_STDCALL
\r
942 $$ = CallConv.Stdcall;
\r
944 | K_UNMANAGED K_THISCALL
\r
946 $$ = CallConv.Thiscall;
\r
948 | K_UNMANAGED K_FASTCALL
\r
950 $$ = CallConv.Fastcall;
\r
954 native_type : /* EMPTY */
\r
955 | K_CUSTOM OPEN_PARENS comp_qstring COMMA comp_qstring CLOSE_PARENS
\r
956 | K_FIXED K_SYSSTRING OPEN_BRACKET int32 CLOSE_BRACKET
\r
958 $$ = NativeType.FixedSysString;
\r
960 | K_FIXED K_ARRAY OPEN_BRACKET int32 CLOSE_BRACKET
\r
964 $$ = NativeType.Currency;
\r
969 $$ = NativeType.Void;
\r
973 $$ = NativeType.Boolean;
\r
977 $$ = NativeType.Int8;
\r
981 $$ = NativeType.Int16;
\r
985 $$ = NativeType.Int32;
\r
989 $$ = NativeType.Int64;
\r
993 $$ = NativeType.Float32;
\r
997 $$ = NativeType.Float64;
\r
1000 | K_UNSIGNED K_INT8
\r
1002 $$ = NativeType.UInt8;
\r
1004 | K_UNSIGNED K_INT16
\r
1006 $$ = NativeType.UInt16;
\r
1008 | K_UNSIGNED K_INT32
\r
1010 $$ = NativeType.UInt32;
\r
1012 | K_UNSIGNED K_INT64
\r
1014 $$ = NativeType.UInt64;
\r
1016 | native_type STAR
\r
1017 | native_type OPEN_BRACKET CLOSE_BRACKET
\r
1018 | native_type OPEN_BRACKET int32 CLOSE_BRACKET
\r
1019 | native_type OPEN_BRACKET int32 PLUS int32 CLOSE_BRACKET
\r
1020 | native_type OPEN_BRACKET PLUS int32 CLOSE_BRACKET
\r
1025 $$ = NativeType.BStr;
\r
1029 $$ = NativeType.LPStr;
\r
1033 $$ = NativeType.LPWStr;
\r
1037 $$ = NativeType.LPTStr;
\r
1042 $$ = NativeType.IUnknown;
\r
1046 $$ = NativeType.IDispatch;
\r
1050 $$ = NativeType.Struct;
\r
1054 $$ = NativeType.Interface;
\r
1056 | K_SAFEARRAY variant_type
\r
1057 | K_SAFEARRAY variant_type COMMA comp_qstring
\r
1060 $$ = NativeType.Int;
\r
1062 | K_UNSIGNED K_INT
\r
1064 $$ = NativeType.UInt;
\r
1066 | K_NESTED K_STRUCT
\r
1069 $$ = NativeType.ByValStr;
\r
1073 $$ = NativeType.AnsiBStr;
\r
1077 $$ = NativeType.TBstr;
\r
1079 | K_VARIANT K_BOOL
\r
1081 $$ = NativeType.VariantBool;
\r
1086 $$ = NativeType.AsAny;
\r
1091 variant_type : /* EMPTY */
\r
1103 | K_UNSIGNED K_INT8
\r
1104 | K_UNSIGNED K_INT16
\r
1105 | K_UNSIGNED K_INT32
\r
1106 | K_UNSIGNED K_INT64
\r
1108 | variant_type OPEN_BRACKET CLOSE_BRACKET
\r
1109 | variant_type K_VECTOR
\r
1110 | variant_type AMPERSAND
\r
1120 | K_UNSIGNED K_INT
\r
1130 | K_STREAMED_OBJECT
\r
1137 field_decl : D_FIELD repeat_opt field_attr type id at_opt init_opt
\r
1139 FieldDef field_def = new FieldDef((FieldAttr) $3,
\r
1140 (string) $5, (ITypeRef) $4);
\r
1141 codegen.AddFieldDef (field_def);
\r
1144 field_def.SetOffset ((uint) $2);
\r
1148 field_def.AddDataValue ((string) $6);
\r
1152 field_def.SetValue ((Constant) $7);
\r
1157 repeat_opt : /* EMPTY */
\r
1158 | OPEN_BRACKET int32 CLOSE_BRACKET
\r
1164 field_attr : /* EMPTY */
\r
1166 $$ = new FieldAttr ();
\r
1168 | field_attr K_PUBLIC
\r
1170 $$ = (FieldAttr) $1 | FieldAttr.Public;
\r
1172 | field_attr K_PRIVATE
\r
1174 $$ = (FieldAttr) $1 | FieldAttr.Private;
\r
1176 | field_attr K_FAMILY
\r
1178 $$ = (FieldAttr) $1 | FieldAttr.Family;
\r
1180 | field_attr K_ASSEMBLY
\r
1182 $$ = (FieldAttr) $1 | FieldAttr.Assembly;
\r
1184 | field_attr K_FAMANDASSEM
\r
1186 $$ = (FieldAttr) $1 | FieldAttr.FamAndAssem;
\r
1188 | field_attr K_FAMORASSEM
\r
1190 $$ = (FieldAttr) $1 | FieldAttr.FamOrAssem;
\r
1192 | field_attr K_PRIVATESCOPE
\r
1194 // This is just 0x0000
\r
1196 | field_attr K_STATIC
\r
1198 $$ = (FieldAttr) $1 | FieldAttr.Static;
\r
1200 | field_attr K_INITONLY
\r
1202 $$ = (FieldAttr) $1 | FieldAttr.Initonly;
\r
1204 | field_attr K_RTSPECIALNAME
\r
1206 $$ = (FieldAttr) $1 | FieldAttr.RTSpecialName;
\r
1208 | field_attr K_SPECIALNAME
\r
1210 $$ = (FieldAttr) $1 | FieldAttr.SpecialName;
\r
1212 | field_attr K_MARSHAL OPEN_PARENS native_type CLOSE_PARENS
\r
1216 | field_attr K_LITERAL
\r
1218 $$ = (FieldAttr) $1 | FieldAttr.Literal;
\r
1220 | field_attr K_NOTSERIALIZED
\r
1222 $$ = (FieldAttr) $1 | FieldAttr.Notserialized;
\r
1226 at_opt : /* EMPTY */
\r
1233 init_opt : /* EMPTY */
\r
1234 | ASSIGN field_init
\r
1240 field_init : K_FLOAT32 OPEN_PARENS float64 CLOSE_PARENS
\r
1242 $$ = new FloatConst (Convert.ToSingle ($3));
\r
1244 | K_FLOAT64 OPEN_PARENS float64 CLOSE_PARENS
\r
1246 $$ = new DoubleConst (Convert.ToDouble ($3));
\r
1248 | K_FLOAT32 OPEN_PARENS int64 CLOSE_PARENS
\r
1250 $$ = new FloatConst (Convert.ToSingle ($3));
\r
1252 | K_FLOAT64 OPEN_PARENS int64 CLOSE_PARENS
\r
1254 $$ = new DoubleConst (Convert.ToDouble ($3));
\r
1256 | K_INT64 OPEN_PARENS int64 CLOSE_PARENS
\r
1258 $$ = new IntConst (Convert.ToInt64 ($3));
\r
1260 | K_INT32 OPEN_PARENS int64 CLOSE_PARENS
\r
1262 $$ = new IntConst (Convert.ToInt32 ($3));
\r
1264 | K_INT16 OPEN_PARENS int64 CLOSE_PARENS
\r
1266 $$ = new IntConst (Convert.ToInt16 ($3));
\r
1268 | K_CHAR OPEN_PARENS int64 CLOSE_PARENS
\r
1270 $$ = new CharConst (Convert.ToChar ($3));
\r
1272 | K_WCHAR OPEN_PARENS int64 CLOSE_PARENS
\r
1274 $$ = new CharConst (Convert.ToChar ($3));
\r
1276 | K_INT8 OPEN_PARENS int64 CLOSE_PARENS
\r
1278 $$ = new IntConst (Convert.ToByte ($3));
\r
1280 | K_BOOL OPEN_PARENS truefalse CLOSE_PARENS
\r
1282 $$ = new BoolConst ((bool) $3);
\r
1284 | K_BYTEARRAY bytes_list
\r
1286 $$ = new ByteArrConst ((byte[]) $2);
\r
1290 // ******** THIS IS NOT IN THE DOCUMENTATION ******** //
\r
1291 $$ = new StringConst ((string) $1);
\r
1295 $$ = new NullConst ();
\r
1299 data_decl : data_head data_body
\r
1301 DataDef datadef = (DataDef) $1;
\r
1303 if ($2 is ArrayList) {
\r
1304 ArrayList const_list = (ArrayList) $2;
\r
1305 DataConstant[] const_arr = new DataConstant[const_list.Count];
\r
1307 for (int i=0; i<const_arr.Length; i++)
\r
1308 const_arr[i] = (DataConstant) const_list[i];
\r
1310 datadef.PeapiConstant = new ArrayConstant (const_arr);
\r
1312 datadef.PeapiConstant = (PEAPI.Constant) $2;
\r
1314 codegen.AddDataDef (datadef);
\r
1318 data_head : D_DATA tls id ASSIGN
\r
1320 $$ = new DataDef ((string) $3, (bool) $2);
\r
1324 $$ = new DataDef (String.Empty, (bool) $2);
\r
1328 tls : /* EMPTY */ { $$ = false; }
\r
1329 | K_TLS { $$ = true; }
\r
1332 data_body : OPEN_BRACE dataitem_list CLOSE_BRACE
\r
1336 dataitem_list : dataitem
\r
1338 ArrayList dataitem_list = new ArrayList ();
\r
1339 dataitem_list.Add ($1);
\r
1340 $$ = dataitem_list;
\r
1342 | dataitem_list COMMA dataitem
\r
1344 ArrayList list = (ArrayList) $1;
\r
1349 dataitem : K_CHAR STAR OPEN_PARENS comp_qstring CLOSE_PARENS
\r
1351 $$ = new StringConst ((string) $4);
\r
1353 | K_WCHAR STAR OPEN_PARENS comp_qstring CLOSE_PARENS
\r
1355 $$ = new StringConst ((string) $4);
\r
1357 | AMPERSAND OPEN_PARENS id CLOSE_PARENS
\r
1359 // DataDef def = codegen.CurrentTypeDef.GetDataDef ((string) $3);
\r
1360 // $$ = new AddressConstant ((DataConstant) def.PeapiConstant);
\r
1362 | K_BYTEARRAY ASSIGN bytes_list
\r
1364 $$ = new ByteArrConst ((byte[]) $3);
\r
1366 | K_BYTEARRAY bytes_list
\r
1368 // ******** THIS IS NOT IN THE SPECIFICATION ******** //
\r
1369 $$ = new ByteArrConst ((byte[]) $2);
\r
1371 | K_FLOAT32 OPEN_PARENS float64 CLOSE_PARENS repeat_opt
\r
1373 double d = (double) $3;
\r
1374 FloatConst float_const = new FloatConst ((float) d);
\r
1377 $$ = new RepeatedConstant (float_const, (int) $5);
\r
1381 | K_FLOAT64 OPEN_PARENS float64 CLOSE_PARENS repeat_opt
\r
1383 DoubleConst double_const = new DoubleConst ((double) $3);
\r
1386 $$ = new RepeatedConstant (double_const, (int) $5);
\r
1388 $$ = double_const;
\r
1390 | K_INT64 OPEN_PARENS int64 CLOSE_PARENS repeat_opt
\r
1392 IntConst int_const = new IntConst ((long) $3);
\r
1395 $$ = new RepeatedConstant (int_const, (int) $5);
\r
1399 | K_INT32 OPEN_PARENS int32 CLOSE_PARENS repeat_opt
\r
1401 IntConst int_const = new IntConst ((int) $3);
\r
1404 $$ = new RepeatedConstant (int_const, (int) $5);
\r
1408 | K_INT16 OPEN_PARENS int32 CLOSE_PARENS repeat_opt
\r
1411 IntConst int_const = new IntConst ((short) i);
\r
1414 $$ = new RepeatedConstant (int_const, (int) $5);
\r
1418 | K_INT8 OPEN_PARENS int32 CLOSE_PARENS repeat_opt
\r
1421 IntConst int_const = new IntConst ((sbyte) i);
\r
1424 $$ = new RepeatedConstant (int_const, (int) $5);
\r
1428 | K_FLOAT32 repeat_opt
\r
1430 FloatConst float_const = new FloatConst (0F);
\r
1433 $$ = new RepeatedConstant (float_const, (int) $2);
\r
1437 | K_FLOAT64 repeat_opt
\r
1439 DoubleConst double_const = new DoubleConst (0);
\r
1442 $$ = new RepeatedConstant (double_const, (int) $2);
\r
1444 $$ = double_const;
\r
1446 | K_INT64 repeat_opt
\r
1448 IntConst int_const = new IntConst ((long) 0);
\r
1451 $$ = new RepeatedConstant (int_const, (int) $2);
\r
1455 | K_INT32 repeat_opt
\r
1457 IntConst int_const = new IntConst ((int) 0);
\r
1460 $$ = new RepeatedConstant (int_const, (int) $2);
\r
1464 | K_INT16 repeat_opt
\r
1466 IntConst int_const = new IntConst ((short) 0);
\r
1469 $$ = new RepeatedConstant (int_const, (int) $2);
\r
1473 | K_INT8 repeat_opt
\r
1475 IntConst int_const = new IntConst ((sbyte) 0);
\r
1478 $$ = new RepeatedConstant (int_const, (int) $2);
\r
1484 method_all : method_head OPEN_BRACE method_decls CLOSE_BRACE
\r
1486 codegen.EndMethodDef ();
\r
1490 method_head : D_METHOD meth_attr call_conv param_attr type method_name
\r
1491 formal_typars_clause OPEN_PARENS sig_args CLOSE_PARENS impl_attr
\r
1493 MethodDef methdef = new MethodDef ((MethAttr) $2, (CallConv) $3,
\r
1494 (ImplAttr) $11, (string) $6, (ITypeRef) $5,
\r
1496 codegen.BeginMethodDef (methdef);
\r
1498 if (pinvoke_info) {
\r
1499 methdef.AddPInvokeInfo (pinvoke_attr, pinvoke_mod, pinvoke_meth);
\r
1500 pinvoke_info = false;
\r
1504 ArrayList typars_list = (ArrayList) $7;
\r
1505 foreach (string id in typars_list)
\r
1506 methdef.AddGenericParam (id);
\r
1509 | D_METHOD meth_attr call_conv param_attr type
\r
1510 K_MARSHAL OPEN_PARENS native_type CLOSE_PARENS method_name
\r
1511 OPEN_PARENS sig_args CLOSE_PARENS impl_attr
\r
1514 meth_attr : /* EMPTY */ { $$ = new MethAttr (); }
\r
1515 | meth_attr K_STATIC { $$ = (MethAttr) $1 | MethAttr.Static; }
\r
1516 | meth_attr K_PUBLIC { $$ = (MethAttr) $1 | MethAttr.Public; }
\r
1517 | meth_attr K_PRIVATE { $$ = (MethAttr) $1 | MethAttr.Private; }
\r
1518 | meth_attr K_FAMILY { $$ = (MethAttr) $1 | MethAttr.Family; }
\r
1519 | meth_attr K_ASSEMBLY { $$ = (MethAttr) $1 | MethAttr.Assembly; }
\r
1520 | meth_attr K_FAMANDASSEM { $$ = (MethAttr) $1 | MethAttr.FamAndAssem; }
\r
1521 | meth_attr K_FAMORASSEM { $$ = (MethAttr) $1 | MethAttr.FamOrAssem; }
\r
1522 | meth_attr K_PRIVATESCOPE { /* CHECK HEADERS */ }
\r
1523 | meth_attr K_FINAL { $$ = (MethAttr) $1 | MethAttr.Final; }
\r
1524 | meth_attr K_VIRTUAL { $$ = (MethAttr) $1 | MethAttr.Virtual; }
\r
1525 | meth_attr K_ABSTRACT { $$ = (MethAttr) $1 | MethAttr.Abstract; }
\r
1526 | meth_attr K_HIDEBYSIG { $$ = (MethAttr) $1 | MethAttr.HideBySig; }
\r
1527 | meth_attr K_NEWSLOT { $$ = (MethAttr) $1 | MethAttr.NewSlot; }
\r
1528 | meth_attr K_REQSECOBJ { $$ = (MethAttr) $1 | MethAttr.RequireSecObject; }
\r
1529 | meth_attr K_SPECIALNAME { $$ = (MethAttr) $1 | MethAttr.SpecialName; }
\r
1530 | meth_attr K_RTSPECIALNAME { $$ = (MethAttr) $1 | MethAttr.RTSpecialName; }
\r
1531 | meth_attr K_COMPILERCONTROLLED { /* Do nothing */ }
\r
1532 | meth_attr K_UNMANAGEDEXP
\r
1533 | meth_attr K_PINVOKEIMPL OPEN_PARENS comp_qstring K_AS
\r
1534 comp_qstring pinv_attr CLOSE_PARENS
\r
1536 pinvoke_info = true;
\r
1537 pinvoke_mod = (string) $4;
\r
1538 pinvoke_meth = (string) $6;
\r
1539 pinvoke_attr = (PInvokeAttr) $7;
\r
1541 | meth_attr K_PINVOKEIMPL OPEN_PARENS comp_qstring pinv_attr CLOSE_PARENS
\r
1543 pinvoke_info = true;
\r
1544 pinvoke_mod = (string) $4;
\r
1545 pinvoke_meth = null;
\r
1546 pinvoke_attr = (PInvokeAttr) $5;
\r
1548 | meth_attr K_PINVOKEIMPL OPEN_PARENS pinv_attr CLOSE_PARENS
\r
1550 pinvoke_info = true;
\r
1551 pinvoke_mod = null;
\r
1552 pinvoke_meth = null;
\r
1553 pinvoke_attr = (PInvokeAttr) $4;
\r
1557 pinv_attr : /* EMPTY */ { $$ = new PInvokeAttr (); }
\r
1558 | pinv_attr K_NOMANGLE { $$ = (PInvokeAttr) $1 | PInvokeAttr.nomangle; }
\r
1559 | pinv_attr K_ANSI { $$ = (PInvokeAttr) $1 | PInvokeAttr.ansi; }
\r
1560 | pinv_attr K_UNICODE { $$ = (PInvokeAttr) $1 | PInvokeAttr.unicode; }
\r
1561 | pinv_attr K_AUTOCHAR { $$ = (PInvokeAttr) $1 | PInvokeAttr.autochar; }
\r
1562 | pinv_attr K_LASTERR { $$ = (PInvokeAttr) $1 | PInvokeAttr.lasterr; }
\r
1563 | pinv_attr K_WINAPI { $$ = (PInvokeAttr) $1 | PInvokeAttr.winapi; }
\r
1564 | pinv_attr K_CDECL { $$ = (PInvokeAttr) $1 | PInvokeAttr.cdecl; }
\r
1565 | pinv_attr K_STDCALL { $$ = (PInvokeAttr) $1 | PInvokeAttr.stdcall; }
\r
1566 | pinv_attr K_THISCALL { $$ = (PInvokeAttr) $1 | PInvokeAttr.thiscall; }
\r
1567 | pinv_attr K_FASTCALL { $$ = (PInvokeAttr) $1 | PInvokeAttr.fastcall; }
\r
1570 method_name : D_CTOR
\r
1575 param_attr : /* EMPTY */ { $$ = new ParamAttr (); }
\r
1576 | param_attr OPEN_BRACKET K_IN CLOSE_BRACKET { $$ = (ParamAttr) $1 | ParamAttr.In; }
\r
1577 | param_attr OPEN_BRACKET K_OUT CLOSE_BRACKET { $$ = (ParamAttr) $1 | ParamAttr.Out; }
\r
1578 | param_attr OPEN_BRACKET K_OPT CLOSE_BRACKET { $$ = (ParamAttr) $1 | ParamAttr.Opt; }
\r
1581 impl_attr : /* EMPTY */ { $$ = new ImplAttr (); }
\r
1582 | impl_attr K_NATIVE { $$ = (ImplAttr) $1 | ImplAttr.Native; }
\r
1583 | impl_attr K_CIL { $$ = (ImplAttr) $1 | ImplAttr.IL; }
\r
1584 | impl_attr K_IL { $$ = (ImplAttr) $1 | ImplAttr.IL; }
\r
1585 | impl_attr K_OPTIL { $$ = (ImplAttr) $1 | ImplAttr.Optil; }
\r
1586 | impl_attr K_MANAGED { /* should this reset? */ }
\r
1587 | impl_attr K_UNMANAGED { $$ = (ImplAttr) $1 | ImplAttr.Unmanaged; }
\r
1588 | impl_attr K_FORWARDREF { $$ = (ImplAttr) $1 | ImplAttr.ForwardRef; }
\r
1589 | impl_attr K_PRESERVESIG { $$ = (ImplAttr) $1 | ImplAttr.PreserveSig; }
\r
1590 | impl_attr K_RUNTIME { $$ = (ImplAttr) $1 | ImplAttr.Runtime; }
\r
1591 | impl_attr K_INTERNALCALL { $$ = (ImplAttr) $1 | ImplAttr.InternalCall; }
\r
1592 | impl_attr K_SYNCHRONIZED { $$ = (ImplAttr) $1 | ImplAttr.Synchronised; }
\r
1593 | impl_attr K_NOINLINING { $$ = (ImplAttr) $1 | ImplAttr.NoInLining; }
\r
1596 sig_args : /* EMPTY */
\r
1600 sig_arg_list : sig_arg
\r
1602 ArrayList sig_list = new ArrayList ();
\r
1603 sig_list.Add ($1);
\r
1606 | sig_arg_list COMMA sig_arg
\r
1608 ArrayList sig_list = (ArrayList) $1;
\r
1609 sig_list.Add ($3);
\r
1614 sig_arg : param_attr type
\r
1616 $$ = new ParamDef ((ParamAttr) $1, null, (ITypeRef) $2);
\r
1618 | param_attr type id
\r
1620 $$ = new ParamDef ((ParamAttr) $1, (string) $3, (ITypeRef) $2);
\r
1624 $$ = new ParamDef ((ParamAttr) 0, "...", new SentinelTypeRef ());
\r
1625 // $$ = ParamDef.Ellipsis;
\r
1627 | param_attr type K_MARSHAL OPEN_PARENS native_type CLOSE_PARENS
\r
1628 | param_attr type K_MARSHAL OPEN_PARENS native_type CLOSE_PARENS id
\r
1631 type_list : /* EMPTY */
\r
1633 $$ = new ArrayList (0);
\r
1637 ArrayList type_list = new ArrayList ();
\r
1638 // type_list.Add (TypeRef.Ellipsis);
\r
1639 type_list.Add (new SentinelTypeRef ());
\r
1642 | type_list COMMA ELLIPSIS
\r
1644 ArrayList type_list = (ArrayList) $1;
\r
1645 // type_list.Add (TypeRef.Ellipsis);
\r
1646 type_list.Add (new SentinelTypeRef ());
\r
1649 | param_attr type opt_id
\r
1651 ArrayList type_list = new ArrayList ();
\r
1652 type_list.Add ($2);
\r
1655 | type_list COMMA param_attr type opt_id
\r
1657 ArrayList type_list = (ArrayList) $1;
\r
1658 type_list.Add ($4);
\r
1662 opt_id : /* EMPTY */
\r
1666 method_decls : /* EMPTY */
\r
1667 | method_decls method_decl
\r
1670 method_decl : D_EMITBYTE int32
\r
1671 | D_MAXSTACK int32
\r
1673 codegen.CurrentMethodDef.SetMaxStack ((int) $2);
\r
1675 | D_LOCALS OPEN_PARENS local_list CLOSE_PARENS
\r
1678 codegen.CurrentMethodDef.AddLocals (
\r
1682 | D_LOCALS K_INIT OPEN_PARENS local_list CLOSE_PARENS
\r
1685 codegen.CurrentMethodDef.AddLocals (
\r
1687 codegen.CurrentMethodDef.InitLocals ();
\r
1692 codegen.CurrentMethodDef.EntryPoint ();
\r
1696 codegen.CurrentMethodDef.ZeroInit ();
\r
1698 | D_EXPORT OPEN_BRACKET int32 CLOSE_BRACKET
\r
1699 | D_EXPORT OPEN_BRACKET int32 CLOSE_BRACKET K_AS id
\r
1700 | D_VTENTRY int32 COLON int32
\r
1701 | D_OVERRIDE type_spec DOUBLE_COLON method_name
\r
1703 codegen.CurrentTypeDef.AddOverride (codegen.CurrentMethodDef,
\r
1704 (ITypeRef) $2, (string) $4);
\r
1708 | D_PARAM OPEN_BRACKET int32 CLOSE_BRACKET init_opt
\r
1711 codegen.CurrentMethodDef.AddLabel ((string) $1);
\r
1720 codegen.CurrentMethodDef.AddCustomAttr ((CustomAttr) $1);
\r
1725 local_list : /* EMPTY */
\r
1728 ArrayList local_list = new ArrayList ();
\r
1729 local_list.Add ($1);
\r
1732 | local_list COMMA local
\r
1734 ArrayList local_list = (ArrayList) $1;
\r
1735 local_list.Add ($3);
\r
1741 $$ = new Local (-1, (ITypeRef) $1);
\r
1745 $$ = new Local (-1, (string) $2, (ITypeRef) $1);
\r
1749 $$ = new Local ((int) $1, (ITypeRef) $2);
\r
1751 | slot_num type id
\r
1753 $$ = new Local ((int) $1, (string) $3, (ITypeRef) $2);
\r
1757 slot_num : OPEN_BRACKET int32 CLOSE_BRACKET
\r
1763 type_spec : class_ref
\r
1764 | OPEN_BRACKET slashed_name CLOSE_BRACKET
\r
1766 // This is a reference to a global method in another
\r
1767 // assembly. This is not supported in the MS version of ilasm
\r
1769 | OPEN_BRACKET D_MODULE slashed_name CLOSE_BRACKET
\r
1771 string module = (string) $3;
\r
1773 if (codegen.IsThisModule (module)) {
\r
1774 // This is not handled yet.
\r
1776 $$ = codegen.ExternTable.GetModuleTypeRef ((string) $3, "<Module>", false);
\r
1783 scope_block : scope_block_begin method_decls CLOSE_BRACE
\r
1785 $$ = new HandlerBlock ((LabelInfo) $1,
\r
1786 codegen.CurrentMethodDef.AddLabel ());
\r
1790 scope_block_begin : OPEN_BRACE
\r
1792 $$ = codegen.CurrentMethodDef.AddLabel ();
\r
1797 seh_block : try_block seh_clauses
\r
1799 TryBlock try_block = (TryBlock) $1;
\r
1801 ArrayList clause_list = (ArrayList) $2;
\r
1802 foreach (object clause in clause_list)
\r
1803 try_block.AddSehClause ((ISehClause) clause);
\r
1805 codegen.CurrentMethodDef.AddInstr (try_block);
\r
1809 try_block : D_TRY scope_block
\r
1811 $$ = new TryBlock ((HandlerBlock) $2);
\r
1813 | D_TRY id K_TO id
\r
1815 LabelInfo from = codegen.CurrentMethodDef.AddLabelRef ((string) $2);
\r
1816 LabelInfo to = codegen.CurrentMethodDef.AddLabelRef ((string) $4);
\r
1818 $$ = new TryBlock (new HandlerBlock (from, to));
\r
1820 | D_TRY int32 K_TO int32
\r
1822 LabelInfo from = codegen.CurrentMethodDef.AddLabel ((int) $2);
\r
1823 LabelInfo to = codegen.CurrentMethodDef.AddLabel ((int) $4);
\r
1825 $$ = new TryBlock (new HandlerBlock (from, to));
\r
1829 seh_clauses : seh_clause
\r
1831 ArrayList clause_list = new ArrayList ();
\r
1832 clause_list.Add ($1);
\r
1835 | seh_clauses seh_clause
\r
1837 ArrayList clause_list = (ArrayList) $1;
\r
1838 clause_list.Add ($2);
\r
1842 seh_clause : K_CATCH class_ref handler_block
\r
1844 IClassRef type = (IClassRef) $2;
\r
1845 CatchBlock cb = new CatchBlock (type);
\r
1846 cb.SetHandlerBlock ((HandlerBlock) $3);
\r
1849 | K_FINALLY handler_block
\r
1851 FinallyBlock fb = new FinallyBlock ();
\r
1852 fb.SetHandlerBlock ((HandlerBlock) $2);
\r
1855 | K_FAULT handler_block
\r
1857 FaultBlock fb = new FaultBlock ();
\r
1858 fb.SetHandlerBlock ((HandlerBlock) $2);
\r
1861 | filter_clause handler_block
\r
1863 FilterBlock fb = (FilterBlock) $1;
\r
1864 fb.SetHandlerBlock ((HandlerBlock) $2);
\r
1868 filter_clause : K_FILTER scope_block
\r
1870 HandlerBlock block = (HandlerBlock) $2;
\r
1871 FilterBlock fb = new FilterBlock (block);
\r
1876 LabelInfo from = codegen.CurrentMethodDef.AddLabelRef ((string) $2);
\r
1877 FilterBlock fb = new FilterBlock (new HandlerBlock (from, null));
\r
1882 LabelInfo from = codegen.CurrentMethodDef.AddLabel ((int) $2);
\r
1883 FilterBlock fb = new FilterBlock (new HandlerBlock (from, null));
\r
1888 handler_block : scope_block
\r
1892 | K_HANDLER id K_TO id
\r
1894 LabelInfo from = codegen.CurrentMethodDef.AddLabelRef ((string) $2);
\r
1895 LabelInfo to = codegen.CurrentMethodDef.AddLabelRef ((string) $4);
\r
1897 $$ = new HandlerBlock (from, to);
\r
1899 | K_HANDLER int32 K_TO int32
\r
1901 LabelInfo from = codegen.CurrentMethodDef.AddLabelRef ((string) $2);
\r
1902 LabelInfo to = codegen.CurrentMethodDef.AddLabelRef ((string) $4);
\r
1904 $$ = new HandlerBlock (from, to);
\r
1908 instr : INSTR_NONE
\r
1910 codegen.CurrentMethodDef.AddInstr (
\r
1911 new SimpInstr ((Op) $1));
\r
1913 | INSTR_LOCAL int32
\r
1915 codegen.CurrentMethodDef.AddInstr (
\r
1916 new IntInstr ((IntOp) $1, (int) $2));
\r
1920 int slot = codegen.CurrentMethodDef.GetNamedLocalSlot ((string) $2);
\r
1921 codegen.CurrentMethodDef.AddInstr (
\r
1922 new IntInstr ((IntOp) $1, slot));
\r
1924 | INSTR_PARAM int32
\r
1926 codegen.CurrentMethodDef.AddInstr (
\r
1927 new IntInstr ((IntOp) $1, (int) $2));
\r
1931 int pos = codegen.CurrentMethodDef.GetNamedParamPos ((string) $2);
\r
1932 codegen.CurrentMethodDef.AddInstr (
\r
1933 new IntInstr ((IntOp) $1, pos));
\r
1937 codegen.CurrentMethodDef.AddInstr (new
\r
1938 IntInstr ((IntOp) $1, (int) $2));
\r
1942 int slot = codegen.CurrentMethodDef.GetNamedLocalSlot ((string) $2);
\r
1943 codegen.CurrentMethodDef.AddInstr (new
\r
1944 IntInstr ((IntOp) $1, slot));
\r
1948 if ($1 is MiscInstr) {
\r
1949 switch ((MiscInstr) $1) {
\r
1950 case MiscInstr.ldc_i8:
\r
1951 codegen.CurrentMethodDef.AddInstr (new LdcInstr ((MiscInstr) $1,
\r
1959 switch ((MiscInstr) $1) {
\r
1960 case MiscInstr.ldc_r4:
\r
1961 case MiscInstr.ldc_r8:
\r
1962 codegen.CurrentMethodDef.AddInstr (new LdcInstr ((MiscInstr) $1, (double) $2));
\r
1968 long l = (long) $2;
\r
1970 switch ((MiscInstr) $1) {
\r
1971 case MiscInstr.ldc_r4:
\r
1972 case MiscInstr.ldc_r8:
\r
1973 codegen.CurrentMethodDef.AddInstr (new LdcInstr ((MiscInstr) $1, (double) l));
\r
1977 | INSTR_R bytes_list
\r
1978 | INSTR_BRTARGET int32
\r
1980 LabelInfo target = codegen.CurrentMethodDef.AddLabel ((int) $2);
\r
1981 codegen.CurrentMethodDef.AddInstr (new BranchInstr ((BranchOp) $1,
\r
1984 | INSTR_BRTARGET id
\r
1986 LabelInfo target = codegen.CurrentMethodDef.AddLabelRef ((string) $2);
\r
1987 codegen.CurrentMethodDef.AddInstr (new BranchInstr ((BranchOp) $1,
\r
1990 | INSTR_METHOD method_ref
\r
1992 codegen.CurrentMethodDef.AddInstr (new MethodInstr ((MethodOp) $1,
\r
1993 (IMethodRef) $2));
\r
1995 | INSTR_FIELD type type_spec DOUBLE_COLON id
\r
1998 ITypeRef owner = (ITypeRef) $3;
\r
1999 IFieldRef fieldref = owner.GetFieldRef (
\r
2000 (ITypeRef) $2, (string) $5);
\r
2002 codegen.CurrentMethodDef.AddInstr (new FieldInstr ((FieldOp) $1, fieldref));
\r
2004 | INSTR_FIELD type id
\r
2006 GlobalFieldRef fieldref = new GlobalFieldRef ((ITypeRef) $2, (string) $3);
\r
2008 codegen.CurrentMethodDef.AddInstr (new FieldInstr ((FieldOp) $1, fieldref));
\r
2010 | INSTR_TYPE type_spec
\r
2012 codegen.CurrentMethodDef.AddInstr (new TypeInstr ((TypeOp) $1,
\r
2015 | INSTR_STRING comp_qstring
\r
2017 if ((MiscInstr) $1 == MiscInstr.ldstr)
\r
2018 codegen.CurrentMethodDef.AddInstr (new LdstrInstr ((string) $2));
\r
2020 | INSTR_STRING K_BYTEARRAY ASSIGN bytes_list
\r
2022 byte[] bs = (byte[]) $4;
\r
2023 if ((MiscInstr) $1 == MiscInstr.ldstr)
\r
2024 codegen.CurrentMethodDef.AddInstr (new LdstrInstr (bs));
\r
2026 | INSTR_STRING K_BYTEARRAY bytes_list
\r
2028 byte[] bs = (byte[]) $3;
\r
2029 if ((MiscInstr) $1 == MiscInstr.ldstr)
\r
2030 codegen.CurrentMethodDef.AddInstr (new LdstrInstr (bs));
\r
2032 | INSTR_SIG call_conv type OPEN_PARENS type_list CLOSE_PARENS
\r
2034 ArrayList arg_list = (ArrayList) $5;
\r
2035 ITypeRef[] arg_array = null;
\r
2037 if (arg_list != null)
\r
2038 arg_array = (ITypeRef[]) arg_list.ToArray (typeof (ITypeRef));
\r
2040 codegen.CurrentMethodDef.AddInstr (new CalliInstr ((CallConv) $2,
\r
2041 (ITypeRef) $3, arg_array));
\r
2043 | INSTR_TOK owner_type
\r
2045 if ((MiscInstr) $1 == MiscInstr.ldtoken) {
\r
2046 if ($2 is IMethodRef)
\r
2047 codegen.CurrentMethodDef.AddInstr (new LdtokenInstr ((IMethodRef) $2));
\r
2048 else if ($2 is IFieldRef)
\r
2049 codegen.CurrentMethodDef.AddInstr (new LdtokenInstr ((IFieldRef) $2));
\r
2051 codegen.CurrentMethodDef.AddInstr (new LdtokenInstr ((ITypeRef) $2));
\r
2055 | INSTR_SWITCH OPEN_PARENS labels CLOSE_PARENS
\r
2057 codegen.CurrentMethodDef.AddInstr (new SwitchInstr ((ArrayList) $3));
\r
2061 method_ref : call_conv type type_spec DOUBLE_COLON method_name
\r
2062 OPEN_PARENS type_list CLOSE_PARENS
\r
2064 ITypeRef owner = (ITypeRef) $3;
\r
2065 ArrayList arg_list = (ArrayList) $7;
\r
2066 ITypeRef[] param_list;
\r
2067 IMethodRef methref;
\r
2069 if (arg_list != null)
\r
2070 param_list = (ITypeRef[]) arg_list.ToArray (typeof (ITypeRef));
\r
2072 param_list = new ITypeRef[0];
\r
2074 if (owner.UseTypeSpec) {
\r
2075 methref = new TypeSpecMethodRef (owner, (ITypeRef) $2,
\r
2076 (CallConv) $1, (string) $5, param_list);
\r
2078 methref = owner.GetMethodRef ((ITypeRef) $2,
\r
2079 (CallConv) $1, (string) $5, param_list);
\r
2084 | call_conv type method_name
\r
2085 OPEN_PARENS type_list CLOSE_PARENS
\r
2087 ArrayList arg_list = (ArrayList) $5;
\r
2088 ITypeRef[] param_list;
\r
2090 if (arg_list != null)
\r
2091 param_list = (ITypeRef[]) arg_list.ToArray (typeof (ITypeRef));
\r
2093 param_list = new ITypeRef[0];
\r
2095 $$ = new GlobalMethodRef ((ITypeRef) $2, (CallConv) $1,
\r
2096 (string) $3, param_list);
\r
2098 | call_conv type type_spec DOUBLE_COLON method_name
\r
2099 typars_clause OPEN_PARENS type_list CLOSE_PARENS
\r
2101 ITypeRef owner = (ITypeRef) $3;
\r
2102 ArrayList arg_list = (ArrayList) $8;
\r
2103 ITypeRef[] param_list;
\r
2104 IMethodRef methref;
\r
2106 if (arg_list != null)
\r
2107 param_list = (ITypeRef[]) arg_list.ToArray (typeof (ITypeRef));
\r
2109 param_list = new ITypeRef[0];
\r
2111 if (owner.UseTypeSpec) {
\r
2112 methref = new TypeSpecMethodRef (owner, (ITypeRef) $2,
\r
2113 (CallConv) $1, (string) $5, param_list);
\r
2115 methref = owner.GetMethodRef ((ITypeRef) $2,
\r
2116 (CallConv) $1, (string) $5, param_list);
\r
2120 ArrayList tp = (ArrayList) $6;
\r
2121 ITypeRef[] ta = (ITypeRef[]) tp.ToArray (typeof (ITypeRef));
\r
2123 methref = new GenericMethodRef (methref, new GenericMethodSig (ta));
\r
2130 labels : /* EMPTY */
\r
2133 ArrayList label_list = new ArrayList ();
\r
2134 label_list.Add ($1);
\r
2139 ArrayList label_list = new ArrayList ();
\r
2140 label_list.Add ($1);
\r
2145 ArrayList label_list = (ArrayList) $1;
\r
2146 label_list.Add ($3);
\r
2148 | labels COMMA int32
\r
2150 ArrayList label_list = (ArrayList) $1;
\r
2151 label_list.Add ($3);
\r
2155 owner_type : type_spec
\r
2159 member_ref : K_METHOD method_ref
\r
2163 | K_FIELD type type_spec DOUBLE_COLON id
\r
2165 ITypeRef owner = (ITypeRef) $3;
\r
2167 $$ = owner.GetFieldRef (
\r
2168 (ITypeRef) $2, (string) $5);
\r
2172 $$ = new GlobalFieldRef ((ITypeRef) $2, (string) $3);
\r
2176 event_all : event_head OPEN_BRACE event_decls CLOSE_BRACE
\r
2178 codegen.CurrentTypeDef.EndEventDef ();
\r
2182 event_head : D_EVENT event_attr type_spec id
\r
2184 EventDef event_def = new EventDef ((FeatureAttr) $2,
\r
2185 (ITypeRef) $3, (string) $4);
\r
2186 codegen.CurrentTypeDef.BeginEventDef (event_def);
\r
2188 | D_EVENT event_attr id
\r
2191 event_attr : /* EMPTY */
\r
2193 $$ = new FeatureAttr ();
\r
2195 | event_attr K_RTSPECIALNAME
\r
2197 $$ = (FeatureAttr) $1 & FeatureAttr.Rtspecialname;
\r
2199 | event_attr K_SPECIALNAME
\r
2201 $$ = (FeatureAttr) $1 & FeatureAttr.Specialname;
\r
2205 event_decls : /* EMPTY */
\r
2206 | event_decls event_decl
\r
2209 event_decl : D_ADDON method_ref
\r
2211 codegen.CurrentTypeDef.CurrentEvent.AddAddon (
\r
2214 | D_REMOVEON method_ref
\r
2216 codegen.CurrentTypeDef.CurrentEvent.AddRemoveon (
\r
2219 | D_FIRE method_ref
\r
2221 codegen.CurrentTypeDef.CurrentEvent.AddFire (
\r
2224 | D_OTHER method_ref
\r
2226 codegen.CurrentTypeDef.CurrentEvent.AddOther (
\r
2234 prop_all : prop_head OPEN_BRACE prop_decls CLOSE_BRACE
\r
2236 codegen.CurrentTypeDef.EndPropertyDef ();
\r
2240 prop_head : D_PROPERTY prop_attr type id OPEN_PARENS type_list CLOSE_PARENS init_opt
\r
2242 PropertyDef prop_def = new PropertyDef ((FeatureAttr) $2, (ITypeRef) $3,
\r
2243 (string) $4, (ArrayList) $6);
\r
2244 codegen.CurrentTypeDef.BeginPropertyDef (prop_def);
\r
2247 prop_def.AddInitValue ((Constant) $8);
\r
2252 prop_attr : /* EMPTY */
\r
2254 $$ = new FeatureAttr ();
\r
2256 | prop_attr K_RTSPECIALNAME
\r
2258 $$ = (FeatureAttr) $1 | FeatureAttr.Rtspecialname;
\r
2260 | prop_attr K_SPECIALNAME
\r
2262 $$ = (FeatureAttr) $1 | FeatureAttr.Specialname;
\r
2264 | prop_attr K_INSTANCE
\r
2269 prop_decls : /* EMPTY */
\r
2270 | prop_decls prop_decl
\r
2273 prop_decl : D_SET method_ref
\r
2275 codegen.CurrentTypeDef.CurrentProperty.AddSet ((MethodRef) $2);
\r
2277 | D_GET method_ref
\r
2279 codegen.CurrentTypeDef.CurrentProperty.AddGet ((MethodRef) $2);
\r
2281 | D_OTHER method_ref
\r
2283 codegen.CurrentTypeDef.CurrentProperty.AddOther ((MethodRef) $2);
\r
2290 customattr_decl : D_CUSTOM custom_type
\r
2292 $$ = new CustomAttr ((IMethodRef) $2, null);
\r
2294 | D_CUSTOM custom_type ASSIGN comp_qstring
\r
2295 | D_CUSTOM custom_type ASSIGN bytes_list
\r
2297 $$ = new CustomAttr ((IMethodRef) $2,
\r
2300 | D_CUSTOM OPEN_PARENS owner_type CLOSE_PARENS custom_type
\r
2301 | D_CUSTOM OPEN_PARENS owner_type CLOSE_PARENS custom_type ASSIGN comp_qstring
\r
2302 | D_CUSTOM OPEN_PARENS owner_type CLOSE_PARENS custom_type ASSIGN
\r
2306 custom_type : call_conv type type_spec DOUBLE_COLON D_CTOR OPEN_PARENS type_list CLOSE_PARENS
\r
2308 ITypeRef owner = (ITypeRef) $3;
\r
2309 ArrayList arg_list = (ArrayList) $7;
\r
2310 ITypeRef[] param_list;
\r
2312 if (arg_list != null)
\r
2313 param_list = (ITypeRef[]) arg_list.ToArray (typeof (ITypeRef));
\r
2315 param_list = new ITypeRef[0];
\r
2317 $$ = owner.GetMethodRef ((ITypeRef) $2,
\r
2318 (CallConv) $1, (string) $5, param_list);
\r
2320 | call_conv type D_CTOR OPEN_PARENS type_list CLOSE_PARENS
\r
2322 ArrayList arg_list = (ArrayList) $5;
\r
2323 ITypeRef[] param_list;
\r
2325 if (arg_list != null)
\r
2326 param_list = (ITypeRef[]) arg_list.ToArray (typeof (ITypeRef));
\r
2328 param_list = new ITypeRef[0];
\r
2330 $$ = new GlobalMethodRef ((ITypeRef) $2, (CallConv) $1,
\r
2331 (string) $3, param_list);
\r
2335 sec_decl : D_PERMISSION sec_action type_spec OPEN_PARENS nameval_pairs CLOSE_PARENS
\r
2336 | D_PERMISSION sec_action type_spec
\r
2337 | D_PERMISSIONSET sec_action ASSIGN bytes_list
\r
2340 nameval_pairs : nameval_pair
\r
2341 | nameval_pairs COMMA nameval_pair
\r
2344 nameval_pair : comp_qstring ASSIGN cavalue
\r
2347 cavalue : truefalse
\r
2349 | int32 OPEN_PARENS int32 CLOSE_PARENS
\r
2351 | class_ref OPEN_PARENS K_INT8 COLON int32 CLOSE_PARENS
\r
2352 | class_ref OPEN_PARENS K_INT16 COLON int32 CLOSE_PARENS
\r
2353 | class_ref OPEN_PARENS K_INT32 COLON int32 CLOSE_PARENS
\r
2354 | class_ref OPEN_PARENS int32 CLOSE_PARENS
\r
2357 sec_action : K_REQUEST
\r
2370 | K_NONCASLINKDEMAND
\r
2371 | K_NONCASINHERITANCE
\r
2374 module_head : D_MODULE
\r
2377 | D_MODULE comp_name
\r
2379 codegen.SetModuleName ((string) $2);
\r
2381 | D_MODULE K_EXTERN comp_name
\r
2383 codegen.ExternTable.AddModule ((string) $3);
\r
2387 file_decl : D_FILE file_attr comp_name file_entry D_HASH ASSIGN
\r
2388 bytes_list file_entry
\r
2390 codegen.SetFileRef (new FileRef ((string) $3, (byte []) $7, (bool) $2, (bool) $8));
\r
2392 | D_FILE file_attr comp_name file_entry
\r
2394 // We need to compute the hash ourselves. :-(
\r
2395 // AssemblyName an = AssemblyName.GetName ((string) $3);
\r
2399 file_attr : /* EMPTY */
\r
2403 | file_attr K_NOMETADATA
\r
2409 file_entry : /* EMPTY */
\r
2419 assembly_all : assembly_head OPEN_BRACE assembly_decls CLOSE_BRACE
\r
2422 assembly_head : D_ASSEMBLY asm_attr slashed_name
\r
2424 codegen.SetAssemblyName ((string) $3);
\r
2428 asm_attr : /* EMPTY */
\r
2429 | asm_attr K_NOAPPDOMAIN
\r
2430 | asm_attr K_NOPROCESS
\r
2431 | asm_attr K_NOMACHINE
\r
2434 assembly_decls : /* EMPTY */
\r
2435 | assembly_decls assembly_decl
\r
2438 assembly_decl : D_PUBLICKEY ASSIGN bytes_list
\r
2440 codegen.SetAssemblyPublicKey ((byte []) $3);
\r
2442 | D_VER int32 COLON int32 COLON int32 COLON int32
\r
2444 codegen.SetAssemblyVersion ((int) $2, (int) $4, (int) $6, (int) $8);
\r
2446 | D_LOCALE comp_qstring
\r
2448 codegen.SetAssemblyLocale ((string) $2);
\r
2450 | D_LOCALE ASSIGN bytes_list
\r
2451 | D_HASH K_ALGORITHM int32
\r
2453 codegen.SetAssemblyHashAlgorithm ((int) $3);
\r
2457 codegen.AddAssemblyCustomAttribute ((CustomAttr) $1);
\r
2462 asm_or_ref_decl : D_PUBLICKEY ASSIGN bytes_list
\r
2463 | D_VER int32 COLON int32 COLON int32 COLON int32
\r
2464 | D_LOCALE comp_qstring
\r
2465 | D_LOCALE ASSIGN bytes_list
\r
2469 assemblyref_all : assemblyref_head OPEN_BRACE assemblyref_decls CLOSE_BRACE
\r
2472 assemblyref_head : D_ASSEMBLY K_EXTERN slashed_name
\r
2474 System.Reflection.AssemblyName asmb_name =
\r
2475 new System.Reflection.AssemblyName ();
\r
2476 asmb_name.Name = (string) $3;
\r
2477 codegen.BeginAssemblyRef ((string) $3, asmb_name);
\r
2479 | D_ASSEMBLY K_EXTERN slashed_name K_AS slashed_name
\r
2481 System.Reflection.AssemblyName asmb_name =
\r
2482 new System.Reflection.AssemblyName ();
\r
2483 asmb_name.Name = (string) $3;
\r
2484 codegen.BeginAssemblyRef ((string) $5, asmb_name);
\r
2488 assemblyref_decls : /* EMPTY */
\r
2489 | assemblyref_decls assemblyref_decl
\r
2492 assemblyref_decl : D_VER int32 COLON int32 COLON int32 COLON int32
\r
2494 codegen.CurrentAssemblyRef.SetVersion ((int) $2, (int) $4, (int) $6, (int) $8);
\r
2496 | D_PUBLICKEY ASSIGN bytes_list
\r
2498 codegen.CurrentAssemblyRef.SetPublicKey ((byte []) $3);
\r
2500 | D_PUBLICKEYTOKEN ASSIGN bytes_list
\r
2502 codegen.CurrentAssemblyRef.SetPublicKeyToken ((byte []) $3);
\r
2504 | D_LOCALE comp_qstring
\r
2506 codegen.CurrentAssemblyRef.SetLocale ((string) $2);
\r
2508 | D_LOCALE ASSIGN bytes_list
\r
2510 | D_HASH ASSIGN bytes_list
\r
2512 codegen.CurrentAssemblyRef.SetHash ((byte []) $3);
\r
2517 exptype_all : exptype_head OPEN_BRACE exptype_decls CLOSE_BRACE
\r
2520 exptype_head : D_CLASS K_EXTERN expt_attr comp_name
\r
2523 expt_attr : /* EMPTY */
\r
2524 | expt_attr K_PRIVATE
\r
2525 | expt_attr K_PUBLIC
\r
2526 | expt_attr K_NESTED K_PUBLIC
\r
2527 | expt_attr K_NESTED K_PRIVATE
\r
2528 | expt_attr K_NESTED K_FAMILY
\r
2529 | expt_attr K_NESTED K_ASSEMBLY
\r
2530 | expt_attr K_NESTED K_FAMANDASSEM
\r
2531 | expt_attr K_NESTED K_FAMORASSEM
\r
2534 exptype_decls : /* EMPTY */
\r
2535 | exptype_decls exptype_decl
\r
2538 exptype_decl : D_FILE comp_name
\r
2539 | D_CLASS K_EXTERN comp_name
\r
2544 manifestres_all : manifestres_head OPEN_BRACE manifestres_decls CLOSE_BRACE
\r
2547 manifestres_head : D_MRESOURCE manres_attr comp_name
\r
2550 manres_attr : /* EMPTY */
\r
2551 | manres_attr K_PUBLIC
\r
2552 | manres_attr K_PRIVATE
\r
2555 manifestres_decls : /* EMPTY */
\r
2556 | manifestres_decls manifestres_decl
\r
2559 manifestres_decl : D_FILE comp_name K_AT int32
\r
2560 | D_ASSEMBLY K_EXTERN slashed_name
\r
2564 comp_qstring : QSTRING
\r
2565 | comp_qstring PLUS QSTRING { $$ = String.Format ("{0}{1}", $1, $3); }
\r
2570 long l = (long) $1;
\r
2571 byte[] intb = BitConverter.GetBytes (l);
\r
2572 $$ = BitConverter.ToInt32 (intb, BitConverter.IsLittleEndian ? 0 : 4);
\r
2580 | K_FLOAT32 OPEN_PARENS INT32 CLOSE_PARENS
\r
2583 byte[] intb = BitConverter.GetBytes (i);
\r
2584 $$ = (double) BitConverter.ToSingle (intb, BitConverter.IsLittleEndian ? 0 : 4);
\r
2586 | K_FLOAT32 OPEN_PARENS INT64 CLOSE_PARENS
\r
2588 long l = (long) $3;
\r
2589 byte[] intb = BitConverter.GetBytes (l);
\r
2590 $$ = (double) BitConverter.ToSingle (intb, BitConverter.IsLittleEndian ? 0 : 4);
\r
2592 | K_FLOAT64 OPEN_PARENS INT64 CLOSE_PARENS
\r
2594 byte[] intb = BitConverter.GetBytes ((long) $3);
\r
2595 $$ = BitConverter.ToDouble (intb, BitConverter.IsLittleEndian ? 0 : 4);
\r
2597 | K_FLOAT64 OPEN_PARENS INT32 CLOSE_PARENS
\r
2599 byte[] intb = BitConverter.GetBytes ((int) $3);
\r
2600 $$ = (double) BitConverter.ToSingle (intb, BitConverter.IsLittleEndian ? 0 : 4);
\r
2604 hexbyte : HEXBYTE { }
\r
2607 bytes_list : OPEN_PARENS
\r
2609 tokenizer.InByteArray = true;
\r
2611 bytes CLOSE_PARENS
\r
2614 tokenizer.InByteArray = false;
\r
2618 bytes : /* EMPTY */ { $$ = new byte[0]; }
\r
2621 ArrayList byte_list = (ArrayList) $1;
\r
2622 $$ = byte_list.ToArray (typeof (byte));
\r
2626 hexbytes : hexbyte
\r
2628 ArrayList byte_list = new ArrayList ();
\r
2629 byte_list.Add (Convert.ToByte ($1));
\r
2632 | hexbytes hexbyte
\r
2634 ArrayList byte_list = (ArrayList) $1;
\r
2635 byte_list.Add (Convert.ToByte ($2));
\r
2639 truefalse : K_TRUE
\r
2654 | comp_name DOT id
\r
2656 $$ = (string) $1 + '.' + (string) $3;
\r