2 // Mono::ILASM::ILParser
\r
4 // (C) Sergey Chaban (serge@wildwestsoftware.com)
\r
9 using System.Collections;
\r
10 using System.Globalization;
\r
12 namespace Mono.ILASM {
\r
14 public class ILParser {
\r
16 private CodeGen codegen;
\r
18 public ILParser (CodeGen codegen) {
\r
19 this.codegen = codegen;
\r
22 public CodeGen CodeGen {
\r
23 get { return codegen; }
\r
30 /* ID - alpha-numeric identifier */
\r
33 /* QSTRING - quoted string */
\r
36 /* SQSTRING - single quoted string */
\r
39 /* INT32 - 32 bit integer */
\r
42 /* INT64 - 64 bit integer */
\r
45 /* FLOAT64 - floating point number */
\r
48 /* HEXBYTE - two digit hex number */
\r
54 %token OPEN_BRACE "{"
\r
55 %token CLOSE_BRACE "}"
\r
56 %token OPEN_BRACKET "["
\r
57 %token CLOSE_BRACKET "]"
\r
58 %token OPEN_PARENS "("
\r
59 %token CLOSE_PARENS ")"
\r
62 %token DOUBLE_COLON "::"
\r
63 %token SEMICOLON ";"
\r
66 %token AMPERSAND "&"
\r
70 %token ELLIPSIS "..."
\r
72 %token OPEN_ANGLE_BRACKET "<"
\r
73 %token CLOSE_ANGLE_BRACKET ">"
\r
80 /* INSTR_* instruction types */
\r
86 %token INSTR_BRTARGET
\r
104 /* Mechanically generated - DO NOT EDIT! */
\r
113 %token D_CAPABILITY
\r
123 %token D_ENTRYPOINT
\r
132 %token D_IMPLICITCOM
\r
138 %token D_MANIFESTRES
\r
145 %token D_ORIGINATOR
\r
151 %token D_PERMISSION
\r
152 %token D_PERMISSIONSET
\r
156 %token D_PUBLICKEYTOKEN
\r
173 %token K_IMPLICITCOM
\r
174 %token K_IMPLICITRES
\r
175 %token K_NOAPPDOMAIN
\r
199 %token K_RTSPECIALNAME
\r
200 %token K_SPECIALNAME
\r
202 %token K_FAMANDASSEM
\r
203 %token K_FAMORASSEM
\r
204 %token K_PRIVATESCOPE
\r
206 %token K_NOTSERIALIZED
\r
208 %token K_NOT_IN_GC_HEAP
\r
213 %token K_SEQUENTIAL
\r
218 %token K_SERIALIZABLE
\r
222 %token K_IMPLEMENTS
\r
227 %token K_UNMANAGEDEXP
\r
228 %token K_PINVOKEIMPL
\r
238 %token K_FORWARDREF
\r
240 %token K_INTERNALCALL
\r
241 %token K_SYNCHRONIZED
\r
242 %token K_NOINLINING
\r
283 %token K_USERDEFINED
\r
289 %token K_STREAMED_OBJECT
\r
290 %token K_STORED_OBJECT
\r
291 %token K_BLOB_OBJECT
\r
302 %token K_FROMUNMANAGED
\r
303 %token K_CALLMOSTDERIVED
\r
319 %token K_PERMITONLY
\r
321 %token K_INHERITCHECK
\r
325 %token K_PREJITGRANT
\r
326 %token K_PREJITDENY
\r
327 %token K_NONCASDEMAND
\r
328 %token K_NONCASLINKDEMAND
\r
329 %token K_NONCASINHERITANCE
\r
331 %token K_NOMETADATA
\r
333 %token K_FULLORIGIN
\r
337 %token K_ENABLEJITTRACKING
\r
338 %token K_DISABLEJITOPTIMIZER
\r
339 %token K_PRESERVESIG
\r
340 %token K_BEFOREFIELDINIT
\r
344 %token K_COMPILERCONTROLLED
\r
352 /* end generated */
\r
365 decls : /* EMPTY */
\r
383 | D_SUBSYSTEM int32
\r
385 | D_FILE K_ALIGNMENT int32
\r
386 /* | D_IMAGEBASE int64 */
\r
391 extsource_spec : D_LINE int32 SQSTRING
\r
393 | D_LINE int32 COLON int32 SQSTRING
\r
394 | D_LINE int32 COLON int32
\r
397 language_decl : D_LANGUAGE SQSTRING
\r
398 | D_LANGUAGE SQSTRING COMMA SQSTRING
\r
399 | D_LANGUAGE SQSTRING COMMA SQSTRING COMMA SQSTRING
\r
402 vtfixup_decl : D_VTFIXUP OPEN_BRACKET int32 CLOSE_BRACKET
\r
403 vtfixup_attr K_AT id
\r
406 vtfixup_attr : /* EMPTY */
\r
407 | vtfixup_attr int64
\r
408 | vtfixup_attr K_FROMUNMANAGED
\r
409 | vtfixup_attr K_CALLMOSTDERIVED
\r
412 namespace_all : namespace_head OPEN_BRACE decls CLOSE_BRACE
\r
414 codegen.CurrentNameSpace = null;
\r
418 namespace_head : D_NAMESPACE comp_name
\r
420 codegen.CurrentNameSpace = (string) $2;
\r
424 class_all : class_head OPEN_BRACE class_decls CLOSE_BRACE
\r
426 codegen.EndTypeDef ();
\r
430 class_head : D_CLASS class_attr id typars_clause extends_clause
\r
433 codegen.BeginTypeDef ((TypeAttr) $2, (string) $3,
\r
434 $5 as IClassRef, $6 as ArrayList, null);
\r
436 // Lets not worry about generics for now :p
\r
438 ArrayList typars_list = (ArrayList) $4;
\r
439 foreach (DictionaryEntry entry in typars_list) {
\r
440 string name = (string) entry.Key;
\r
441 string id = (string) entry.Value;
\r
442 codegen.CurrentTypeDef.AddGenericParam (name, id);
\r
449 class_attrs : class_attrs class_attr
\r
452 class_attr : /* EMPTY */ { $$ = new TypeAttr (); }
\r
453 | class_attr K_PUBLIC { $$ = (TypeAttr)$1 | TypeAttr.Public; }
\r
454 | class_attr K_PRIVATE { $$ = (TypeAttr)$1 | TypeAttr.Private; }
\r
455 | class_attr K_NESTED K_PRIVATE { $$ = (TypeAttr)$1 | TypeAttr.NestedPrivate; }
\r
456 | class_attr K_NESTED K_PUBLIC { $$ = (TypeAttr)$1 | TypeAttr.NestedPublic; }
\r
457 | class_attr K_NESTED K_FAMILY { $$ = (TypeAttr)$1 | TypeAttr.NestedFamily; }
\r
458 | class_attr K_NESTED K_ASSEMBLY { $$ = (TypeAttr)$1 | TypeAttr.NestedAssembly;}
\r
459 | class_attr K_NESTED K_FAMANDASSEM { $$ = (TypeAttr)$1 | TypeAttr.NestedFamAndAssem; }
\r
460 | class_attr K_NESTED K_FAMORASSEM { $$ = (TypeAttr)$1 | TypeAttr.NestedFamOrAssem; }
\r
461 | class_attr K_VALUE { }
\r
462 | class_attr K_ENUM { }
\r
463 | class_attr K_INTERFACE { $$ = (TypeAttr)$1 | TypeAttr.Interface; }
\r
464 | class_attr K_SEALED { $$ = (TypeAttr)$1 | TypeAttr.Sealed; }
\r
465 | class_attr K_ABSTRACT { $$ = (TypeAttr)$1 | TypeAttr.Abstract; }
\r
466 | class_attr K_AUTO { }
\r
467 | class_attr K_SEQUENTIAL { $$ = (TypeAttr)$1 | TypeAttr.SequentialLayout; }
\r
468 | class_attr K_EXPLICIT { $$ = (TypeAttr)$1 | TypeAttr.ExplicitLayout; }
\r
469 | class_attr K_ANSI { }
\r
470 | class_attr K_UNICODE { $$ = (TypeAttr)$1 | TypeAttr.UnicodeClass; }
\r
471 | class_attr K_AUTOCHAR { $$ = (TypeAttr)$1 | TypeAttr.AutoClass; }
\r
472 | class_attr K_IMPORT { $$ = (TypeAttr)$1 | TypeAttr.Import; }
\r
473 | class_attr K_SERIALIZABLE { $$ = (TypeAttr)$1 | TypeAttr.Serializable; }
\r
474 | class_attr K_BEFOREFIELDINIT { $$ = (TypeAttr)$1 | TypeAttr.BeforeFieldInit; }
\r
475 | class_attr K_SPECIALNAME { $$ = (TypeAttr)$1 | TypeAttr.SpecialName; }
\r
476 | class_attr K_RTSPECIALNAME { $$ = (TypeAttr)$1 | TypeAttr.RTSpecialName; }
\r
479 extends_clause : /* EMPTY */
\r
480 | K_EXTENDS class_ref
\r
486 impl_clause : /* EMPTY */
\r
487 | K_IMPLEMENTS class_refs
\r
493 typars_clause : /* EMPTY */
\r
494 | OPEN_ANGLE_BRACKET formal_typars CLOSE_ANGLE_BRACKET
\r
502 ArrayList typars_list = new ArrayList ();
\r
503 typars_list.Add ($1);
\r
506 | typars COMMA type
\r
508 ArrayList typars_list = (ArrayList) $1;
\r
509 typars_list.Add ($3);
\r
514 formal_typars : formal_typar
\r
516 ArrayList formal_list = new ArrayList ();
\r
517 formal_list.Add ($1);
\r
520 | formal_typars COMMA formal_typar
\r
522 ArrayList formal_list = (ArrayList) $1;
\r
523 formal_list.Add ($3);
\r
531 $$ = new DictionaryEntry ($1, null);
\r
535 $$ = new DictionaryEntry ($1, $2);
\r
539 class_refs : class_ref
\r
541 ArrayList class_list = new ArrayList ();
\r
542 class_list.Add ($1);
\r
545 | class_refs COMMA class_ref
\r
547 ArrayList class_list = (ArrayList) $1;
\r
548 class_list.Add ($3);
\r
552 slashed_name : comp_name
\r
553 | slashed_name SLASH comp_name
\r
555 $$ = String.Format ("{0}/{1}", $1, $3);
\r
559 class_ref : OPEN_BRACKET file_name CLOSE_BRACKET slashed_name
\r
561 if (codegen.IsThisAssembly ((string) $2)) {
\r
562 $$ = new TypeRef ((string) $4, null);
\r
564 ClassRef klass = codegen.ExternTable.GetClass (
\r
565 (string) $2, (string)$4);
\r
566 $$ = new ExternTypeRef (klass, (string) $4);
\r
569 | OPEN_BRACKET D_MODULE file_name CLOSE_BRACKET slashed_name
\r
572 PrimitiveTypeRef prim = PrimitiveTypeRef.GetPrimitiveType ((string) $1);
\r
577 $$ = new TypeRef ((string) $1, null);
\r
581 class_decls : /* EMPTY */
\r
582 | class_decls class_decl
\r
585 class_decl : method_all
\r
595 codegen.CurrentTypeDef.AddCustomAttribute ((CustomAttr) $1);
\r
599 codegen.CurrentTypeDef.SetSize ((int) $2);
\r
603 codegen.CurrentTypeDef.SetPack ((int) $2);
\r
605 | D_OVERRIDE type_spec DOUBLE_COLON method_name
\r
606 K_WITH call_conv type type_spec DOUBLE_COLON method_name
\r
607 OPEN_PARENS sig_args CLOSE_PARENS
\r
611 type : K_CLASS class_ref
\r
617 $$ = new PrimitiveTypeRef (PrimitiveType.Object, "System.Object");
\r
621 $$ = new PrimitiveTypeRef (PrimitiveType.String, "System.String");
\r
623 | K_VALUE K_CLASS class_ref
\r
627 | K_VALUETYPE OPEN_BRACKET file_name CLOSE_BRACKET slashed_name
\r
629 ClassRef klass = codegen.ExternTable.GetValueClass ((string) $3, (string)$5);
\r
630 $$ = new ExternTypeRef (klass, (string) $5);
\r
632 | K_VALUETYPE slashed_name
\r
634 $$ = new TypeRef ((string) $2, null);
\r
636 | type OPEN_BRACKET CLOSE_BRACKET
\r
638 ITypeRef base_type = (ITypeRef) $1;
\r
639 base_type.MakeArray ();
\r
641 | type OPEN_BRACKET bounds CLOSE_BRACKET
\r
643 ITypeRef base_type = (ITypeRef) $1;
\r
644 ArrayList bound_list = (ArrayList) $3;
\r
645 base_type.MakeBoundArray (bound_list);
\r
649 ITypeRef base_type = (ITypeRef) $1;
\r
650 base_type.MakeManagedPointer ();
\r
654 ITypeRef base_type = (ITypeRef) $1;
\r
655 base_type.MakeUnmanagedPointer ();
\r
659 ITypeRef base_type = (ITypeRef) $1;
\r
660 base_type.MakePinned ();
\r
662 | type K_MODREQ OPEN_PARENS class_ref CLOSE_PARENS
\r
665 ITypeRef base_type = (ITypeRef) $1;
\r
666 ITypeRef class_ref = (ITypeRef) $4;
\r
668 $$ = new CustomModifiedType (base_type.Type,
\r
669 CustomModifier.modreq, (Class) class_ref.Type);
\r
672 | type K_MODOPT OPEN_PARENS class_ref CLOSE_PARENS
\r
675 TypeRef base_type = (TypeRef) $1;
\r
676 TypeRef class_ref = (TypeRef) $4;
\r
678 $$ = new CustomModifiedType (base_type.Type,
\r
679 CustomModifier.modopt, (Class) class_ref.Type);
\r
682 | K_METHOD call_conv type STAR OPEN_PARENS sig_args CLOSE_PARENS
\r
685 $$ = new PrimitiveTypeRef (PrimitiveType.TypedRef,
\r
686 "System.TypedReference");
\r
690 $$ = new PrimitiveTypeRef (PrimitiveType.Char, "System.Char");
\r
694 $$ = new PrimitiveTypeRef (PrimitiveType.Void, "System.Void");
\r
698 $$ = new PrimitiveTypeRef (PrimitiveType.Boolean, "System.Bool");
\r
702 $$ = new PrimitiveTypeRef (PrimitiveType.Int8, "System.Int8");
\r
706 $$ = new PrimitiveTypeRef (PrimitiveType.Int16, "System.Int16");
\r
710 $$ = new PrimitiveTypeRef (PrimitiveType.Int32, "System.Int32");
\r
714 $$ = new PrimitiveTypeRef (PrimitiveType.Int64, "System.Int64");
\r
718 $$ = new PrimitiveTypeRef (PrimitiveType.Float32, "System.Float32");
\r
722 $$ = new PrimitiveTypeRef (PrimitiveType.Float64, "System.Float64");
\r
724 | K_UNSIGNED K_INT8
\r
726 $$ = new PrimitiveTypeRef (PrimitiveType.UInt8, "System.UInt8");
\r
728 | K_UNSIGNED K_INT16
\r
730 $$ = new PrimitiveTypeRef (PrimitiveType.UInt16, "System.UInt16");
\r
732 | K_UNSIGNED K_INT32
\r
734 $$ = new PrimitiveTypeRef (PrimitiveType.UInt32, "System.UInt32");
\r
736 | K_UNSIGNED K_INT64
\r
738 $$ = new PrimitiveTypeRef (PrimitiveType.UInt64, "System.UInt64");
\r
742 // TODO: Is this the proper full name
\r
743 $$ = new PrimitiveTypeRef (PrimitiveType.NativeInt, "System.IntPtr");
\r
746 | K_NATIVE K_UNSIGNED K_INT
\r
748 $$ = new PrimitiveTypeRef (PrimitiveType.NativeUInt, "System.UIntPtr");
\r
752 // access class type parameter by number
\r
756 // access method type parameter by number
\r
762 ArrayList bound_list = new ArrayList ();
\r
763 bound_list.Add ($1);
\r
766 | bounds COMMA bound
\r
768 ArrayList bound_list = (ArrayList) $1;
\r
769 bound_list.Add ($3);
\r
773 bound : /* EMPTY */
\r
776 // No lower bound or size
\r
777 $$ = new DictionaryEntry (null,null);
\r
781 // ******** Not sure what this is?
\r
782 // For now I will say it is size because there
\r
783 // is allready a way to set lower
\r
784 $$ = new DictionaryEntry (null, $1);
\r
786 | int32 ELLIPSIS int32
\r
788 // lower bound and size
\r
789 $$ = new DictionaryEntry ($1, $3);
\r
793 // Just lower bound
\r
794 $$ = new DictionaryEntry ($1, null);
\r
798 call_conv : K_INSTANCE call_conv
\r
800 $$ = (CallConv) $2 | CallConv.Instance;
\r
802 | K_EXPLICIT call_conv
\r
804 $$ = (CallConv) $2 | CallConv.InstanceExplicit;
\r
809 call_kind : /* EMPTY */
\r
811 $$ = new CallConv ();
\r
815 $$ = CallConv.Default;
\r
819 $$ = CallConv.Vararg;
\r
821 | K_UNMANAGED K_CDECL
\r
823 $$ = CallConv.Cdecl;
\r
825 | K_UNMANAGED K_STDCALL
\r
827 $$ = CallConv.Stdcall;
\r
829 | K_UNMANAGED K_THISCALL
\r
831 $$ = CallConv.Thiscall;
\r
833 | K_UNMANAGED K_FASTCALL
\r
835 $$ = CallConv.Fastcall;
\r
839 native_type : /* EMPTY */
\r
840 | K_CUSTOM OPEN_PARENS comp_qstring COMMA comp_qstring CLOSE_PARENS
\r
841 | K_FIXED K_SYSSTRING OPEN_BRACKET int32 CLOSE_BRACKET
\r
843 $$ = NativeType.FixedSysString;
\r
845 | K_FIXED K_ARRAY OPEN_BRACKET int32 CLOSE_BRACKET
\r
849 $$ = NativeType.Currency;
\r
854 $$ = NativeType.Void;
\r
858 $$ = NativeType.Boolean;
\r
862 $$ = NativeType.Int8;
\r
866 $$ = NativeType.Int16;
\r
870 $$ = NativeType.Int32;
\r
874 $$ = NativeType.Int64;
\r
878 $$ = NativeType.Float32;
\r
882 $$ = NativeType.Float64;
\r
885 | K_UNSIGNED K_INT8
\r
887 $$ = NativeType.UInt8;
\r
889 | K_UNSIGNED K_INT16
\r
891 $$ = NativeType.UInt16;
\r
893 | K_UNSIGNED K_INT32
\r
895 $$ = NativeType.UInt32;
\r
897 | K_UNSIGNED K_INT64
\r
899 $$ = NativeType.UInt64;
\r
902 | native_type OPEN_BRACKET CLOSE_BRACKET
\r
903 | native_type OPEN_BRACKET int32 CLOSE_BRACKET
\r
904 | native_type OPEN_BRACKET int32 PLUS int32 CLOSE_BRACKET
\r
905 | native_type OPEN_BRACKET PLUS int32 CLOSE_BRACKET
\r
910 $$ = NativeType.BStr;
\r
914 $$ = NativeType.LPStr;
\r
918 $$ = NativeType.LPWStr;
\r
922 $$ = NativeType.LPTStr;
\r
927 $$ = NativeType.IUnknown;
\r
931 $$ = NativeType.IDispatch;
\r
935 $$ = NativeType.Struct;
\r
939 $$ = NativeType.Interface;
\r
941 | K_SAFEARRAY variant_type
\r
942 | K_SAFEARRAY variant_type COMMA comp_qstring
\r
945 $$ = NativeType.Int;
\r
949 $$ = NativeType.UInt;
\r
951 | K_NESTED K_STRUCT
\r
954 $$ = NativeType.ByValStr;
\r
958 $$ = NativeType.AnsiBStr;
\r
962 $$ = NativeType.TBstr;
\r
966 $$ = NativeType.VariantBool;
\r
971 $$ = NativeType.AsAny;
\r
976 variant_type : /* EMPTY */
\r
988 | K_UNSIGNED K_INT8
\r
989 | K_UNSIGNED K_INT16
\r
990 | K_UNSIGNED K_INT32
\r
991 | K_UNSIGNED K_INT64
\r
993 | variant_type OPEN_BRACKET CLOSE_BRACKET
\r
994 | variant_type K_VECTOR
\r
995 | variant_type AMPERSAND
\r
1005 | K_UNSIGNED K_INT
\r
1015 | K_STREAMED_OBJECT
\r
1022 field_decl : D_FIELD repeat_opt field_attr type id at_opt init_opt
\r
1024 FieldDef field_def = new FieldDef((FieldAttr) $3,
\r
1025 (string) $5, (ITypeRef) $4);
\r
1026 codegen.AddFieldDef (field_def);
\r
1029 field_def.SetOffset ((uint) $2);
\r
1033 field_def.AddDataValue ((DataConstant) $6);
\r
1037 field_def.SetValue ((Constant) $7);
\r
1042 repeat_opt : /* EMPTY */
\r
1043 | OPEN_BRACKET int32 CLOSE_BRACKET
\r
1049 field_attr : /* EMPTY */
\r
1051 $$ = new FieldAttr ();
\r
1053 | field_attr K_PUBLIC
\r
1055 $$ = (FieldAttr) $1 | FieldAttr.Public;
\r
1057 | field_attr K_PRIVATE
\r
1059 $$ = (FieldAttr) $1 | FieldAttr.Private;
\r
1061 | field_attr K_FAMILY
\r
1063 $$ = (FieldAttr) $1 | FieldAttr.Family;
\r
1065 | field_attr K_ASSEMBLY
\r
1067 $$ = (FieldAttr) $1 | FieldAttr.Assembly;
\r
1069 | field_attr K_FAMANDASSEM
\r
1071 $$ = (FieldAttr) $1 | FieldAttr.FamAndAssem;
\r
1073 | field_attr K_FAMORASSEM
\r
1075 $$ = (FieldAttr) $1 | FieldAttr.FamOrAssem;
\r
1077 | field_attr K_PRIVATESCOPE
\r
1079 // This is just 0x0000
\r
1081 | field_attr K_STATIC
\r
1083 $$ = (FieldAttr) $1 | FieldAttr.Static;
\r
1085 | field_attr K_INITONLY
\r
1087 $$ = (FieldAttr) $1 | FieldAttr.Initonly;
\r
1089 | field_attr K_RTSPECIALNAME
\r
1091 $$ = (FieldAttr) $1 | FieldAttr.RTSpecialName;
\r
1093 | field_attr K_SPECIALNAME
\r
1095 $$ = (FieldAttr) $1 | FieldAttr.SpecialName;
\r
1097 | field_attr K_MARSHAL OPEN_PARENS native_type CLOSE_PARENS
\r
1101 | field_attr K_LITERAL
\r
1103 $$ = (FieldAttr) $1 | FieldAttr.Literal;
\r
1105 | field_attr K_NOTSERIALIZED
\r
1107 $$ = (FieldAttr) $1 | FieldAttr.Notserialized;
\r
1111 at_opt : /* EMPTY */
\r
1114 // TODO: Implement DataTable
\r
1115 // $$ = new DataConstant (DataTable.GetOffset ((string) $2));
\r
1119 init_opt : /* EMPTY */
\r
1120 | ASSIGN field_init
\r
1126 field_init : K_FLOAT32 OPEN_PARENS float64 CLOSE_PARENS
\r
1128 $$ = new FloatConst (Convert.ToSingle ($3));
\r
1130 | K_FLOAT64 OPEN_PARENS float64 CLOSE_PARENS
\r
1132 $$ = new DoubleConst (Convert.ToDouble ($3));
\r
1134 | K_FLOAT32 OPEN_PARENS int64 CLOSE_PARENS
\r
1136 $$ = new FloatConst (Convert.ToSingle ($3));
\r
1138 | K_FLOAT64 OPEN_PARENS int64 CLOSE_PARENS
\r
1140 $$ = new DoubleConst (Convert.ToDouble (3));
\r
1142 | K_INT64 OPEN_PARENS int64 CLOSE_PARENS
\r
1144 $$ = new IntConst (Convert.ToInt64 ($3));
\r
1146 | K_INT32 OPEN_PARENS int64 CLOSE_PARENS
\r
1148 $$ = new IntConst (Convert.ToUInt32 ($3));
\r
1150 | K_INT16 OPEN_PARENS int64 CLOSE_PARENS
\r
1152 $$ = new IntConst (Convert.ToUInt16 ($3));
\r
1154 | K_CHAR OPEN_PARENS int64 CLOSE_PARENS
\r
1156 $$ = new CharConst (Convert.ToChar ($3));
\r
1158 | K_INT8 OPEN_PARENS int64 CLOSE_PARENS
\r
1160 $$ = new IntConst (Convert.ToByte ($3));
\r
1162 | K_BOOL OPEN_PARENS truefalse CLOSE_PARENS
\r
1164 $$ = new BoolConst ((bool) $3);
\r
1166 | K_BYTEARRAY OPEN_PARENS bytes CLOSE_PARENS
\r
1168 $$ = new ByteArrConst ((byte[]) $3);
\r
1172 // ******** THIS IS NOT IN THE DOCUMENTATION ******** //
\r
1173 $$ = new StringConst ((string) $1);
\r
1177 $$ = new NullConst ();
\r
1181 data_decl : data_head data_body
\r
1184 Console.WriteLine ("Creating data decl: '{0}' '{1}'", $1, $2);
\r
1186 DataDef datadef = (DataDef) $1;
\r
1188 if ($2 is ArrayList) {
\r
1189 ArrayList const_list = (ArrayList) $2;
\r
1190 DataConstant[] const_arr = new DataConstant[const_list.Count];
\r
1192 for (int i=0; i<const_arr.Length; i++)
\r
1193 const_arr[i] = (DataConstant) const_list[i];
\r
1195 datadef.PeapiConstant = new ArrayConstant (const_arr);
\r
1197 datadef.PeapiConstant = (PEAPI.Constant) $2;
\r
1203 data_head : D_DATA tls id ASSIGN
\r
1205 $$ = new DataDef ((string) $3, (bool) $2);
\r
1209 $$ = new DataDef (String.Empty, (bool) $2);
\r
1213 tls : /* EMPTY */ { $$ = false; }
\r
1214 | K_TLS { $$ = true; }
\r
1217 data_body : OPEN_BRACE dataitem_list CLOSE_BRACE
\r
1221 dataitem_list : dataitem
\r
1222 | dataitem_list COMMA dataitem
\r
1225 dataitem : K_CHAR STAR OPEN_PARENS comp_qstring CLOSE_PARENS
\r
1226 | AMPERSAND OPEN_PARENS id CLOSE_PARENS
\r
1227 | K_BYTEARRAY ASSIGN OPEN_PARENS bytes CLOSE_PARENS
\r
1229 $$ = new ByteArrConst ((byte[]) $4);
\r
1231 | K_BYTEARRAY OPEN_PARENS bytes CLOSE_PARENS
\r
1233 // ******** THIS IS NOT IN THE SPECIFICATION ******** //
\r
1234 $$ = new ByteArrConst ((byte[]) $3);
\r
1236 | K_FLOAT32 OPEN_PARENS float64 CLOSE_PARENS repeat_opt
\r
1238 FloatConst float_const = new FloatConst ((float) $3);
\r
1241 $$ = new RepeatedConstant (float_const, (int) $5);
\r
1245 | K_FLOAT64 OPEN_PARENS float64 CLOSE_PARENS repeat_opt
\r
1247 DoubleConst double_const = new DoubleConst ((double) $3);
\r
1250 $$ = new RepeatedConstant (double_const, (int) $5);
\r
1252 $$ = double_const;
\r
1254 | K_INT64 OPEN_PARENS int64 CLOSE_PARENS repeat_opt
\r
1256 IntConst int_const = new IntConst ((long) $3);
\r
1259 $$ = new RepeatedConstant (int_const, (int) $5);
\r
1263 | K_INT32 OPEN_PARENS int32 CLOSE_PARENS repeat_opt
\r
1265 IntConst int_const = new IntConst ((int) $3);
\r
1268 $$ = new RepeatedConstant (int_const, (int) $5);
\r
1272 | K_INT16 OPEN_PARENS int32 CLOSE_PARENS repeat_opt
\r
1274 IntConst int_const = new IntConst ((short) $3);
\r
1277 $$ = new RepeatedConstant (int_const, (int) $5);
\r
1281 | K_INT8 OPEN_PARENS int32 CLOSE_PARENS repeat_opt
\r
1283 IntConst int_const = new IntConst ((sbyte) $3);
\r
1286 $$ = new RepeatedConstant (int_const, (int) $5);
\r
1290 | K_FLOAT32 repeat_opt
\r
1292 FloatConst float_const = new FloatConst (0F);
\r
1295 $$ = new RepeatedConstant (float_const, (int) $2);
\r
1299 | K_FLOAT64 repeat_opt
\r
1301 DoubleConst double_const = new DoubleConst (0);
\r
1304 $$ = new RepeatedConstant (double_const, (int) $2);
\r
1306 $$ = double_const;
\r
1308 | K_INT64 repeat_opt
\r
1310 IntConst int_const = new IntConst ((long) 0);
\r
1313 $$ = new RepeatedConstant (int_const, (int) $2);
\r
1317 | K_INT32 repeat_opt
\r
1319 IntConst int_const = new IntConst ((int) 0);
\r
1322 $$ = new RepeatedConstant (int_const, (int) $2);
\r
1326 | K_INT16 repeat_opt
\r
1328 IntConst int_const = new IntConst ((short) 0);
\r
1331 $$ = new RepeatedConstant (int_const, (int) $2);
\r
1335 | K_INT8 repeat_opt
\r
1337 IntConst int_const = new IntConst ((sbyte) 0);
\r
1340 $$ = new RepeatedConstant (int_const, (int) $2);
\r
1346 method_all : method_head OPEN_BRACE method_decls CLOSE_BRACE
\r
1348 codegen.EndMethodDef ();
\r
1352 method_head : D_METHOD meth_attr call_conv param_attr type method_name
\r
1353 typars_clause OPEN_PARENS sig_args CLOSE_PARENS impl_attr
\r
1355 MethodDef methdef = new MethodDef ((MethAttr) $2, (CallConv) $3,
\r
1356 (ImplAttr) $11, (string) $6, (ITypeRef) $5,
\r
1358 codegen.BeginMethodDef (methdef);
\r
1360 | D_METHOD meth_attr call_conv param_attr type
\r
1361 K_MARSHAL OPEN_PARENS native_type CLOSE_PARENS method_name
\r
1362 OPEN_PARENS sig_args CLOSE_PARENS impl_attr
\r
1365 meth_attr : /* EMPTY */ { $$ = new MethAttr (); }
\r
1366 | meth_attr K_STATIC { $$ = (MethAttr) $1 | MethAttr.Static; }
\r
1367 | meth_attr K_PUBLIC { $$ = (MethAttr) $1 | MethAttr.Public; }
\r
1368 | meth_attr K_PRIVATE { $$ = (MethAttr) $1 | MethAttr.Private; }
\r
1369 | meth_attr K_FAMILY { $$ = (MethAttr) $1 | MethAttr.Family; }
\r
1370 | meth_attr K_ASSEMBLY { $$ = (MethAttr) $1 | MethAttr.Assembly; }
\r
1371 | meth_attr K_FAMANDASSEM { $$ = (MethAttr) $1 | MethAttr.FamAndAssem; }
\r
1372 | meth_attr K_FAMORASSEM { $$ = (MethAttr) $1 | MethAttr.FamOrAssem; }
\r
1373 | meth_attr K_PRIVATESCOPE { /* CHECK HEADERS */ }
\r
1374 | meth_attr K_FINAL { $$ = (MethAttr) $1 | MethAttr.Final; }
\r
1375 | meth_attr K_VIRTUAL { $$ = (MethAttr) $1 | MethAttr.Virtual; }
\r
1376 | meth_attr K_ABSTRACT { $$ = (MethAttr) $1 | MethAttr.Abstract; }
\r
1377 | meth_attr K_HIDEBYSIG { $$ = (MethAttr) $1 | MethAttr.HideBySig; }
\r
1378 | meth_attr K_NEWSLOT { $$ = (MethAttr) $1 | MethAttr.NewSlot; }
\r
1379 | meth_attr K_REQSECOBJ { $$ = (MethAttr) $1 | MethAttr.RequireSecObject; }
\r
1380 | meth_attr K_SPECIALNAME { $$ = (MethAttr) $1 | MethAttr.SpecialName; }
\r
1381 | meth_attr K_RTSPECIALNAME { $$ = (MethAttr) $1 | MethAttr.RTSpecialName; }
\r
1382 | meth_attr K_UNMANAGEDEXP
\r
1383 | meth_attr K_PINVOKEIMPL OPEN_PARENS comp_qstring K_AS
\r
1384 comp_qstring pinv_attr CLOSE_PARENS
\r
1385 | meth_attr K_PINVOKEIMPL OPEN_PARENS comp_qstring pinv_attr CLOSE_PARENS
\r
1386 | meth_attr K_PINVOKEIMPL OPEN_PARENS pinv_attr CLOSE_PARENS
\r
1389 pinv_attr : /* EMPTY */
\r
1390 | pinv_attr K_NOMANGLE
\r
1391 | pinv_attr K_ANSI
\r
1392 | pinv_attr K_UNICODE
\r
1393 | pinv_attr K_AUTOCHAR
\r
1394 | pinv_attr K_LASTERR
\r
1395 | pinv_attr K_WINAPI
\r
1396 | pinv_attr K_CDECL
\r
1397 | pinv_attr K_STDCALL
\r
1398 | pinv_attr K_THISCALL
\r
1399 | pinv_attr K_FASTCALL
\r
1402 method_name : D_CTOR
\r
1407 param_attr : /* EMPTY */ { $$ = new ParamAttr (); }
\r
1408 | param_attr OPEN_BRACKET K_IN CLOSE_BRACKET { $$ = (ParamAttr) $1 | ParamAttr.In; }
\r
1409 | param_attr OPEN_BRACKET K_OUT CLOSE_BRACKET { $$ = (ParamAttr) $1 | ParamAttr.Out; }
\r
1410 | param_attr OPEN_BRACKET K_OPT CLOSE_BRACKET { $$ = (ParamAttr) $1 | ParamAttr.Opt; }
\r
1413 impl_attr : /* EMPTY */ { $$ = new ImplAttr (); }
\r
1414 | impl_attr K_NATIVE { $$ = (ImplAttr) $1 | ImplAttr.Native; }
\r
1415 | impl_attr K_CIL { $$ = (ImplAttr) $1 | ImplAttr.IL; }
\r
1416 | impl_attr K_IL { $$ = (ImplAttr) $1 | ImplAttr.IL; }
\r
1417 | impl_attr K_OPTIL { $$ = (ImplAttr) $1 | ImplAttr.Optil; }
\r
1418 | impl_attr K_MANAGED { /* should this reset? */ }
\r
1419 | impl_attr K_UNMANAGED { $$ = (ImplAttr) $1 | ImplAttr.Unmanaged; }
\r
1420 | impl_attr K_FORWARDREF { $$ = (ImplAttr) $1 | ImplAttr.ForwardRef; }
\r
1421 | impl_attr K_PRESERVESIG { $$ = (ImplAttr) $1 | ImplAttr.PreserveSig; }
\r
1422 | impl_attr K_RUNTIME { $$ = (ImplAttr) $1 | ImplAttr.Runtime; }
\r
1423 | impl_attr K_INTERNALCALL { $$ = (ImplAttr) $1 | ImplAttr.InternalCall; }
\r
1424 | impl_attr K_SYNCHRONIZED { $$ = (ImplAttr) $1 | ImplAttr.Synchronised; }
\r
1425 | impl_attr K_NOINLINING { $$ = (ImplAttr) $1 | ImplAttr.NoInLining; }
\r
1428 sig_args : /* EMPTY */
\r
1432 sig_arg_list : sig_arg
\r
1434 ArrayList sig_list = new ArrayList ();
\r
1435 sig_list.Add ($1);
\r
1438 | sig_arg_list COMMA sig_arg
\r
1440 ArrayList sig_list = (ArrayList) $1;
\r
1441 sig_list.Add ($3);
\r
1446 sig_arg : param_attr type
\r
1448 $$ = new ParamDef ((ParamAttr) $1, null, (ITypeRef) $2);
\r
1450 | param_attr type id
\r
1452 $$ = new ParamDef ((ParamAttr) $1, (string) $3, (ITypeRef) $2);
\r
1456 $$ = ParamDef.Ellipsis;
\r
1458 | param_attr type K_MARSHAL OPEN_PARENS native_type CLOSE_PARENS
\r
1459 | param_attr type K_MARSHAL OPEN_PARENS native_type CLOSE_PARENS id
\r
1462 type_list : /* EMPTY */
\r
1465 ArrayList type_list = new ArrayList ();
\r
1466 type_list.Add (TypeRef.Ellipsis);
\r
1469 | type_list COMMA ELLIPSIS
\r
1471 ArrayList type_list = (ArrayList) $1;
\r
1472 type_list.Add (TypeRef.Ellipsis);
\r
1476 ArrayList type_list = new ArrayList ();
\r
1477 type_list.Add ($1);
\r
1480 | type_list COMMA type opt_id
\r
1482 ArrayList type_list = (ArrayList) $1;
\r
1483 type_list.Add ($3);
\r
1487 opt_id : /* EMPTY */
\r
1491 method_decls : /* EMPTY */
\r
1492 | method_decls method_decl
\r
1495 method_decl : D_EMITBYTE int32
\r
1496 | D_MAXSTACK int32
\r
1497 | D_LOCALS OPEN_PARENS local_list CLOSE_PARENS
\r
1500 codegen.CurrentMethodDef.AddLocals (
\r
1504 | D_LOCALS K_INIT OPEN_PARENS local_list CLOSE_PARENS
\r
1507 codegen.CurrentMethodDef.AddLocals (
\r
1509 codegen.CurrentMethodDef.InitLocals ();
\r
1514 codegen.CurrentMethodDef.EntryPoint ();
\r
1517 | D_EXPORT OPEN_BRACKET int32 CLOSE_BRACKET
\r
1518 | D_EXPORT OPEN_BRACKET int32 CLOSE_BRACKET K_AS id
\r
1519 | D_VTENTRY int32 COLON int32
\r
1520 | D_OVERRIDE type_spec DOUBLE_COLON method_name
\r
1522 | D_PARAM OPEN_BRACKET int32 CLOSE_BRACKET init_opt
\r
1525 codegen.CurrentMethodDef.AddLabel ((string) $1);
\r
1534 codegen.CurrentMethodDef.AddCustomAttr ((CustomAttr) $1);
\r
1539 local_list : /* EMPTY */
\r
1542 ArrayList local_list = new ArrayList ();
\r
1543 local_list.Add ($1);
\r
1546 | local_list COMMA local
\r
1548 ArrayList local_list = (ArrayList) $1;
\r
1549 local_list.Add ($3);
\r
1555 $$ = new Local (-1, (ITypeRef) $1);
\r
1559 $$ = new Local (-1, (string) $2, (ITypeRef) $1);
\r
1563 $$ = new Local ((int) $1, (ITypeRef) $2);
\r
1565 | slot_num type id
\r
1567 $$ = new Local ((int) $1, (string) $3, (ITypeRef) $2);
\r
1571 slot_num : OPEN_BRACKET int32 CLOSE_BRACKET
\r
1577 type_spec : class_ref
\r
1578 | OPEN_BRACKET file_name CLOSE_BRACKET
\r
1580 // This is a reference to a global method in another
\r
1581 // assembly. This is not supported in the MS version of ilasm
\r
1583 | OPEN_BRACKET D_MODULE file_name CLOSE_BRACKET
\r
1587 scope_block : scope_block_begin method_decls CLOSE_BRACE
\r
1589 $$ = new HandlerBlock ((string) $1,
\r
1590 codegen.CurrentMethodDef.RandomLabel ());
\r
1594 scope_block_begin : OPEN_BRACE
\r
1596 $$ = codegen.CurrentMethodDef.RandomLabel ();
\r
1601 seh_block : try_block seh_clauses
\r
1603 TryBlock try_block = (TryBlock) $1;
\r
1604 try_block.SetMethod (codegen.CurrentMethodDef);
\r
1606 ArrayList clause_list = (ArrayList) $2;
\r
1607 foreach (object clause in clause_list)
\r
1608 try_block.AddSehClause ((ISehClause) clause);
\r
1610 codegen.CurrentMethodDef.AddInstr (try_block);
\r
1614 try_block : D_TRY scope_block
\r
1616 $$ = new TryBlock ((HandlerBlock) $2);
\r
1618 | D_TRY id K_TO id
\r
1620 $$ = new TryBlock ((string) $2, (string) $4);
\r
1622 | D_TRY int32 K_TO int32
\r
1625 seh_clauses : seh_clause
\r
1627 ArrayList clause_list = new ArrayList ();
\r
1628 clause_list.Add ($1);
\r
1631 | seh_clauses seh_clause
\r
1633 ArrayList clause_list = (ArrayList) $1;
\r
1634 clause_list.Add ($2);
\r
1638 seh_clause : K_CATCH class_ref handler_block
\r
1640 ITypeRef type = (ITypeRef) $2;
\r
1641 CatchBlock cb = new CatchBlock (type.AsClassRef (codegen));
\r
1642 cb.SetHandlerBlock ((HandlerBlock) $3);
\r
1645 | K_FINALLY handler_block
\r
1647 FinallyBlock fb = new FinallyBlock ();
\r
1648 fb.SetHandlerBlock ((HandlerBlock) $2);
\r
1651 | K_FAULT handler_block
\r
1653 FaultBlock fb = new FaultBlock ();
\r
1654 fb.SetHandlerBlock ((HandlerBlock) $2);
\r
1657 | filter_clause handler_block
\r
1659 FilterBlock fb = (FilterBlock) $1;
\r
1660 fb.SetHandlerBlock ((HandlerBlock) $2);
\r
1664 filter_clause : K_FILTER scope_block
\r
1666 HandlerBlock block = (HandlerBlock) $2;
\r
1667 FilterBlock fb = new FilterBlock (block.from_label);
\r
1672 FilterBlock fb = new FilterBlock ((string) $2);
\r
1678 handler_block : scope_block
\r
1682 | K_HANDLER id K_TO id
\r
1684 $$ = new HandlerBlock ((string) $2, (string) $4);
\r
1686 | K_HANDLER int32 K_TO int32
\r
1689 instr : INSTR_NONE
\r
1691 codegen.CurrentMethodDef.AddInstr (
\r
1692 new SimpInstr ((Op) $1));
\r
1694 | INSTR_LOCAL int32
\r
1696 codegen.CurrentMethodDef.AddInstr (
\r
1697 new IntInstr ((IntOp) $1, (int) $2));
\r
1701 int slot = codegen.CurrentMethodDef.GetNamedLocalSlot ((string) $2);
\r
1702 codegen.CurrentMethodDef.AddInstr (
\r
1703 new IntInstr ((IntOp) $1, slot));
\r
1705 | INSTR_PARAM int32
\r
1707 codegen.CurrentMethodDef.AddInstr (
\r
1708 new IntInstr ((IntOp) $1, (int) $2));
\r
1712 int pos = codegen.CurrentMethodDef.GetNamedParamPos ((string) $2);
\r
1713 codegen.CurrentMethodDef.AddInstr (
\r
1714 new IntInstr ((IntOp) $1, pos));
\r
1718 codegen.CurrentMethodDef.AddInstr (new
\r
1719 IntInstr ((IntOp) $1, (int) $2));
\r
1723 int slot = codegen.CurrentMethodDef.GetNamedLocalSlot ((string) $2);
\r
1724 codegen.CurrentMethodDef.AddInstr (new
\r
1725 IntInstr ((IntOp) $1, slot));
\r
1729 if ($1 is MiscInstr) {
\r
1730 switch ((MiscInstr) $1) {
\r
1731 case MiscInstr.ldc_i8:
\r
1732 codegen.CurrentMethodDef.AddInstr (new LdcInstr ((MiscInstr) $1,
\r
1740 switch ((MiscInstr) $1) {
\r
1741 case MiscInstr.ldc_r4:
\r
1742 case MiscInstr.ldc_r8:
\r
1743 codegen.CurrentMethodDef.AddInstr (new LdcInstr ((MiscInstr) $1, (double) $2));
\r
1749 long l = (long) $2;
\r
1751 switch ((MiscInstr) $1) {
\r
1752 case MiscInstr.ldc_r4:
\r
1753 case MiscInstr.ldc_r8:
\r
1754 codegen.CurrentMethodDef.AddInstr (new LdcInstr ((MiscInstr) $1, (double) l));
\r
1758 | INSTR_R OPEN_PARENS bytes CLOSE_PARENS
\r
1759 | INSTR_BRTARGET int32
\r
1761 // Need to add this to PEAPI
\r
1763 | INSTR_BRTARGET id
\r
1765 codegen.CurrentMethodDef.AddInstr (new BranchInstr ((BranchOp) $1,
\r
1766 codegen.CurrentMethodDef, (string) $2));
\r
1768 | INSTR_METHOD method_ref
\r
1770 codegen.CurrentMethodDef.AddInstr (new MethodInstr ((MethodOp) $1,
\r
1771 (IMethodRef) $2));
\r
1773 | INSTR_FIELD type type_spec DOUBLE_COLON id
\r
1775 ITypeRef owner = (ITypeRef) $3;
\r
1776 IFieldRef fieldref = owner.AsClassRef (codegen).GetFieldRef (
\r
1777 (ITypeRef) $2, (string) $5);
\r
1779 codegen.CurrentMethodDef.AddInstr (new FieldInstr ((FieldOp) $1, fieldref));
\r
1781 | INSTR_FIELD type id
\r
1783 GlobalFieldRef fieldref = new GlobalFieldRef ((ITypeRef) $2, (string) $3);
\r
1785 codegen.CurrentMethodDef.AddInstr (new FieldInstr ((FieldOp) $1, fieldref));
\r
1787 | INSTR_TYPE type_spec
\r
1789 codegen.CurrentMethodDef.AddInstr (new TypeInstr ((TypeOp) $1,
\r
1792 | INSTR_STRING comp_qstring
\r
1794 if ((MiscInstr) $1 == MiscInstr.ldstr)
\r
1795 codegen.CurrentMethodDef.AddInstr (new LdstrInstr ((string) $2));
\r
1797 | INSTR_STRING K_BYTEARRAY ASSIGN OPEN_PARENS bytes CLOSE_PARENS
\r
1798 | INSTR_STRING K_BYTEARRAY OPEN_PARENS bytes CLOSE_PARENS // ****** ADDED
\r
1799 | INSTR_SIG call_conv type OPEN_PARENS type_list CLOSE_PARENS
\r
1801 ArrayList arg_list = (ArrayList) $5;
\r
1802 ITypeRef[] arg_array = null;
\r
1804 if (arg_list != null)
\r
1805 arg_array = (ITypeRef[]) arg_list.ToArray (typeof (ITypeRef));
\r
1807 codegen.CurrentMethodDef.AddInstr (new CalliInstr ((CallConv) $1,
\r
1808 (ITypeRef) $3, arg_array));
\r
1810 | INSTR_TOK owner_type
\r
1812 if ((MiscInstr) $1 == MiscInstr.ldtoken) {
\r
1813 if ($2 is IMethodRef)
\r
1814 codegen.CurrentMethodDef.AddInstr (new LdtokenInstr ((IMethodRef) $2));
\r
1815 else if ($2 is IFieldRef)
\r
1816 codegen.CurrentMethodDef.AddInstr (new LdtokenInstr ((IFieldRef) $2));
\r
1818 codegen.CurrentMethodDef.AddInstr (new LdtokenInstr ((ITypeRef) $2));
\r
1822 | INSTR_SWITCH OPEN_PARENS labels CLOSE_PARENS
\r
1824 codegen.CurrentMethodDef.AddInstr (new SwitchInstr ((ArrayList) $3,
\r
1825 codegen.CurrentMethodDef));
\r
1829 method_ref : call_conv type type_spec DOUBLE_COLON method_name
\r
1830 OPEN_PARENS type_list CLOSE_PARENS
\r
1832 ITypeRef owner = (ITypeRef) $3;
\r
1833 ArrayList arg_list = (ArrayList) $7;
\r
1834 ITypeRef[] param_list;
\r
1836 if (arg_list != null)
\r
1837 param_list = (ITypeRef[]) arg_list.ToArray (typeof (ITypeRef));
\r
1839 param_list = new ITypeRef[0];
\r
1841 $$ = owner.AsClassRef (codegen).GetMethodRef ((ITypeRef) $2,
\r
1842 (CallConv) $1, (string) $5, param_list);
\r
1844 | call_conv type method_name
\r
1845 OPEN_PARENS type_list CLOSE_PARENS
\r
1847 ArrayList arg_list = (ArrayList) $5;
\r
1848 ITypeRef[] param_list;
\r
1850 if (arg_list != null)
\r
1851 param_list = (ITypeRef[]) arg_list.ToArray (typeof (ITypeRef));
\r
1853 param_list = new ITypeRef[0];
\r
1855 $$ = new GlobalMethodRef ((ITypeRef) $2, (CallConv) $1,
\r
1856 (string) $3, param_list);
\r
1860 labels : /* EMPTY */
\r
1863 ArrayList label_list = new ArrayList ();
\r
1864 label_list.Add ($1);
\r
1869 ArrayList label_list = new ArrayList ();
\r
1870 label_list.Add ($1);
\r
1875 ArrayList label_list = (ArrayList) $1;
\r
1876 label_list.Add ($3);
\r
1878 | labels COMMA int32
\r
1880 ArrayList label_list = (ArrayList) $1;
\r
1881 label_list.Add ($3);
\r
1885 owner_type : type_spec
\r
1889 member_ref : K_METHOD method_ref
\r
1893 | K_FIELD type type_spec DOUBLE_COLON id
\r
1895 ITypeRef owner = (ITypeRef) $3;
\r
1897 $$ = owner.AsClassRef (codegen).GetFieldRef (
\r
1898 (ITypeRef) $2, (string) $5);
\r
1902 $$ = new GlobalFieldRef ((ITypeRef) $2, (string) $3);
\r
1906 event_all : event_head OPEN_BRACE event_decls CLOSE_BRACE
\r
1908 codegen.CurrentTypeDef.EndEventDef ();
\r
1912 event_head : D_EVENT event_attr type_spec id
\r
1914 EventDef event_def = new EventDef ((FeatureAttr) $2,
\r
1915 (ITypeRef) $3, (string) $4);
\r
1916 codegen.CurrentTypeDef.BeginEventDef (event_def);
\r
1918 | D_EVENT event_attr id
\r
1921 event_attr : /* EMPTY */
\r
1923 $$ = new FeatureAttr ();
\r
1925 | event_attr K_RTSPECIALNAME
\r
1927 $$ = (FeatureAttr) $1 & FeatureAttr.Rtspecialname;
\r
1929 | event_attr K_SPECIALNAME
\r
1931 $$ = (FeatureAttr) $1 & FeatureAttr.Specialname;
\r
1935 event_decls : /* EMPTY */
\r
1936 | event_decls event_decl
\r
1939 event_decl : D_ADDON method_ref
\r
1941 codegen.CurrentTypeDef.CurrentEvent.AddAddon (
\r
1944 | D_REMOVEON method_ref
\r
1946 codegen.CurrentTypeDef.CurrentEvent.AddRemoveon (
\r
1949 | D_FIRE method_ref
\r
1951 codegen.CurrentTypeDef.CurrentEvent.AddFire (
\r
1954 | D_OTHER method_ref
\r
1956 codegen.CurrentTypeDef.CurrentEvent.AddOther (
\r
1964 prop_all : prop_head OPEN_BRACE prop_decls CLOSE_BRACE
\r
1966 codegen.CurrentTypeDef.EndPropertyDef ();
\r
1970 prop_head : D_PROPERTY prop_attr type id OPEN_PARENS type_list CLOSE_PARENS init_opt
\r
1972 PropertyDef prop_def = new PropertyDef ((FeatureAttr) $2, (ITypeRef) $3,
\r
1973 (string) $4, (ArrayList) $6);
\r
1974 codegen.CurrentTypeDef.BeginPropertyDef (prop_def);
\r
1977 prop_def.AddInitValue ((Constant) $8);
\r
1982 prop_attr : /* EMPTY */
\r
1984 $$ = new FeatureAttr ();
\r
1986 | prop_attr K_RTSPECIALNAME
\r
1988 $$ = (FeatureAttr) $1 | FeatureAttr.Rtspecialname;
\r
1990 | prop_attr K_SPECIALNAME
\r
1992 $$ = (FeatureAttr) $1 | FeatureAttr.Specialname;
\r
1996 prop_decls : /* EMPTY */
\r
1997 | prop_decls prop_decl
\r
2000 prop_decl : D_SET method_ref
\r
2002 codegen.CurrentTypeDef.CurrentProperty.AddSet ((MethodRef) $2);
\r
2004 | D_GET method_ref
\r
2006 codegen.CurrentTypeDef.CurrentProperty.AddGet ((MethodRef) $2);
\r
2008 | D_OTHER method_ref
\r
2010 codegen.CurrentTypeDef.CurrentProperty.AddOther ((MethodRef) $2);
\r
2017 customattr_decl : D_CUSTOM custom_type
\r
2019 $$ = new CustomAttr ((IMethodRef) $2, null);
\r
2021 | D_CUSTOM custom_type ASSIGN comp_qstring
\r
2022 | D_CUSTOM custom_type ASSIGN OPEN_PARENS bytes CLOSE_PARENS
\r
2024 $$ = new CustomAttr ((IMethodRef) $2,
\r
2027 | D_CUSTOM OPEN_PARENS owner_type CLOSE_PARENS custom_type
\r
2028 | D_CUSTOM OPEN_PARENS owner_type CLOSE_PARENS custom_type ASSIGN comp_qstring
\r
2029 | D_CUSTOM OPEN_PARENS owner_type CLOSE_PARENS custom_type ASSIGN
\r
2030 OPEN_PARENS bytes CLOSE_PARENS
\r
2033 custom_type : call_conv type type_spec DOUBLE_COLON D_CTOR OPEN_PARENS type_list CLOSE_PARENS
\r
2035 ITypeRef owner = (ITypeRef) $3;
\r
2036 ArrayList arg_list = (ArrayList) $7;
\r
2037 ITypeRef[] param_list;
\r
2039 if (arg_list != null)
\r
2040 param_list = (ITypeRef[]) arg_list.ToArray (typeof (ITypeRef));
\r
2042 param_list = new ITypeRef[0];
\r
2044 $$ = owner.AsClassRef (codegen).GetMethodRef ((ITypeRef) $2,
\r
2045 (CallConv) $1, (string) $5, param_list);
\r
2047 | call_conv type D_CTOR OPEN_PARENS type_list CLOSE_PARENS
\r
2049 ArrayList arg_list = (ArrayList) $5;
\r
2050 ITypeRef[] param_list;
\r
2052 if (arg_list != null)
\r
2053 param_list = (ITypeRef[]) arg_list.ToArray (typeof (ITypeRef));
\r
2055 param_list = new ITypeRef[0];
\r
2057 $$ = new GlobalMethodRef ((ITypeRef) $2, (CallConv) $1,
\r
2058 (string) $3, param_list);
\r
2062 sec_decl : D_PERMISSION sec_action type_spec OPEN_PARENS nameval_pairs CLOSE_PARENS
\r
2063 | D_PERMISSION sec_action type_spec
\r
2064 | D_PERMISSIONSET sec_action ASSIGN OPEN_PARENS bytes CLOSE_PARENS
\r
2067 nameval_pairs : nameval_pair
\r
2068 | nameval_pairs COMMA nameval_pair
\r
2071 nameval_pair : comp_qstring ASSIGN cavalue
\r
2074 cavalue : truefalse
\r
2076 | int32 OPEN_PARENS int32 CLOSE_PARENS
\r
2078 | class_ref OPEN_PARENS K_INT8 COLON int32 CLOSE_PARENS
\r
2079 | class_ref OPEN_PARENS K_INT16 COLON int32 CLOSE_PARENS
\r
2080 | class_ref OPEN_PARENS K_INT32 COLON int32 CLOSE_PARENS
\r
2081 | class_ref OPEN_PARENS int32 CLOSE_PARENS
\r
2084 sec_action : K_REQUEST
\r
2097 | K_NONCASLINKDEMAND
\r
2098 | K_NONCASINHERITANCE
\r
2101 module_head : D_MODULE
\r
2102 | D_MODULE comp_name
\r
2103 | D_MODULE K_EXTERN comp_name
\r
2106 file_decl : D_FILE file_attr comp_name file_entry D_HASH ASSIGN
\r
2107 OPEN_PARENS bytes CLOSE_PARENS file_entry
\r
2108 | D_FILE file_attr comp_name file_entry
\r
2111 file_attr : /* EMPTY */
\r
2112 | file_attr K_NOMETADATA
\r
2115 file_entry : /* EMPTY */
\r
2119 assembly_all : assembly_head OPEN_BRACE assembly_decls CLOSE_BRACE
\r
2122 assembly_head : D_ASSEMBLY asm_attr file_name
\r
2124 codegen.SetAssemblyName ((string) $3);
\r
2128 asm_attr : /* EMPTY */
\r
2129 | asm_attr K_NOAPPDOMAIN
\r
2130 | asm_attr K_NOPROCESS
\r
2131 | asm_attr K_NOMACHINE
\r
2134 assembly_decls : /* EMPTY */
\r
2135 | assembly_decls assembly_decl
\r
2138 assembly_decl : D_HASH K_ALGORITHM int32
\r
2143 asm_or_ref_decl : D_PUBLICKEY ASSIGN OPEN_PARENS bytes CLOSE_PARENS
\r
2144 | D_VER int32 COLON int32 COLON int32 COLON int32
\r
2145 | D_LOCALE comp_qstring
\r
2146 | D_LOCALE ASSIGN OPEN_PARENS bytes CLOSE_PARENS
\r
2150 assemblyref_all : assemblyref_head OPEN_BRACE assemblyref_decls CLOSE_BRACE
\r
2153 assemblyref_head : D_ASSEMBLY K_EXTERN file_name
\r
2155 System.Reflection.AssemblyName asmb_name =
\r
2156 new System.Reflection.AssemblyName ();
\r
2157 asmb_name.Name = (string) $3;
\r
2158 codegen.ExternTable.AddAssembly ((string) $3, asmb_name);
\r
2160 | D_ASSEMBLY K_EXTERN file_name K_AS file_name
\r
2162 System.Reflection.AssemblyName asmb_name =
\r
2163 new System.Reflection.AssemblyName ();
\r
2164 asmb_name.Name = (string) $3;
\r
2165 codegen.ExternTable.AddAssembly ((string) $5, asmb_name);
\r
2169 assemblyref_decls : /* EMPTY */
\r
2170 | assemblyref_decls assemblyref_decl
\r
2173 assemblyref_decl : D_HASH ASSIGN OPEN_PARENS bytes CLOSE_PARENS
\r
2175 | D_PUBLICKEYTOKEN ASSIGN OPEN_PARENS bytes CLOSE_PARENS
\r
2178 exptype_all : exptype_head OPEN_BRACE exptype_decls CLOSE_BRACE
\r
2181 exptype_head : D_CLASS K_EXTERN expt_attr comp_name
\r
2184 expt_attr : /* EMPTY */
\r
2185 | expt_attr K_PRIVATE
\r
2186 | expt_attr K_PUBLIC
\r
2187 | expt_attr K_NESTED K_PUBLIC
\r
2188 | expt_attr K_NESTED K_PRIVATE
\r
2189 | expt_attr K_NESTED K_FAMILY
\r
2190 | expt_attr K_NESTED K_ASSEMBLY
\r
2191 | expt_attr K_NESTED K_FAMANDASSEM
\r
2192 | expt_attr K_NESTED K_FAMORASSEM
\r
2195 exptype_decls : /* EMPTY */
\r
2196 | exptype_decls exptype_decl
\r
2199 exptype_decl : D_FILE comp_name
\r
2200 | D_CLASS K_EXTERN comp_name
\r
2205 manifestres_all : manifestres_head OPEN_BRACE manifestres_decls CLOSE_BRACE
\r
2208 manifestres_head : D_MRESOURCE manres_attr comp_name
\r
2211 manres_attr : /* EMPTY */
\r
2212 | manres_attr K_PUBLIC
\r
2213 | manres_attr K_PRIVATE
\r
2216 manifestres_decls : /* EMPTY */
\r
2217 | manifestres_decls manifestres_decl
\r
2220 manifestres_decl : D_FILE comp_name K_AT int32
\r
2221 | D_ASSEMBLY K_EXTERN file_name
\r
2225 comp_qstring : QSTRING
\r
2226 | comp_qstring PLUS QSTRING { $$ = String.Format ("{0}{1}", $1, $3); }
\r
2232 long l = (long) $1;
\r
2233 byte[] intb = BitConverter.GetBytes (l);
\r
2234 $$ = BitConverter.ToInt32 (intb, 0);
\r
2241 $$ = Convert.ToInt64 ($1);
\r
2246 | K_FLOAT32 OPEN_PARENS INT32 CLOSE_PARENS
\r
2249 byte[] intb = BitConverter.GetBytes (i);
\r
2250 $$ = (double) BitConverter.ToSingle (intb, 0);
\r
2252 | K_FLOAT32 OPEN_PARENS INT64 CLOSE_PARENS
\r
2254 long l = (long) $3;
\r
2255 byte[] intb = BitConverter.GetBytes (l);
\r
2256 $$ = (double) BitConverter.ToSingle (intb, 0);
\r
2258 | K_FLOAT64 OPEN_PARENS INT64 CLOSE_PARENS
\r
2260 byte[] intb = BitConverter.GetBytes ((long) $3);
\r
2261 $$ = BitConverter.ToDouble (intb, 0);
\r
2263 | K_FLOAT64 OPEN_PARENS INT32 CLOSE_PARENS
\r
2265 byte[] intb = BitConverter.GetBytes ((int) $3);
\r
2266 $$ = (double) BitConverter.ToSingle (intb, 0);
\r
2271 | INT32 { $$ = Convert.ToByte ($1); }
\r
2274 $$ = Byte.Parse ((string) $1, NumberStyles.HexNumber);
\r
2278 bytes : /* EMPTY */ { $$ = new byte[0]; }
\r
2281 ArrayList byte_list = (ArrayList) $1;
\r
2282 $$ = byte_list.ToArray (typeof (byte));
\r
2286 hexbytes : hexbyte
\r
2288 ArrayList byte_list = new ArrayList ();
\r
2289 byte_list.Add (Convert.ToByte ($1));
\r
2292 | hexbytes hexbyte
\r
2294 ArrayList byte_list = (ArrayList) $1;
\r
2295 byte_list.Add (Convert.ToByte ($2));
\r
2299 truefalse : K_TRUE
\r
2308 | comp_name DOT id
\r
2310 $$ = (string) $1 + '.' + (string) $3;
\r
2314 file_name : comp_name
\r
2315 | file_name DASH comp_name
\r
2317 $$ = (string) $1 + '-' + (string) $3;
\r