* ILParser.jay: Add global method references
[mono.git] / mcs / ilasm / parser / ILParser.jay
index 1b9e9dd8a0d45b116bb046c573d75548461737e6..1c4c9c40deca3fc71985ef52110d8cdcd1a4bd1b 100644 (file)
@@ -6,6 +6,7 @@
 using PEAPI;\r
 using System;\r
 using System.Collections;\r
+using System.Globalization;\r
 \r
 namespace Mono.ILASM {\r
 \r
@@ -67,7 +68,8 @@ namespace Mono.ILASM {
 %token BANG          "!"\r
 %token ELLIPSIS      "..."\r
 %token DASH          "-"\r
-\r
+%token OPEN_ANGLE_BRACKET   "<"\r
+%token CLOSE_ANGLE_BRACKET  ">"\r
 \r
 \r
 \r
@@ -97,7 +99,6 @@ namespace Mono.ILASM {
 \r
 \r
 \r
-\r
 /* Mechanically generated  - DO NOT EDIT! */\r
 \r
 \r
@@ -401,7 +402,6 @@ vtfixup_decl                : D_VTFIXUP OPEN_BRACKET int32 CLOSE_BRACKET
                        ;\r
 \r
 vtfixup_attr           : /* EMPTY */\r
-                       | vtfixup_attr int32\r
                        | vtfixup_attr int64\r
                        | vtfixup_attr K_FROMUNMANAGED\r
                        | vtfixup_attr K_CALLMOSTDERIVED\r
@@ -419,29 +419,30 @@ namespace_head            : D_NAMESPACE comp_name
                           }\r
                        ;\r
 \r
-class_all              : class_head OPEN_BRACE class_decls\r
-                          CLOSE_BRACE\r
+class_all              : class_head OPEN_BRACE class_decls CLOSE_BRACE\r
                           {\r
-                                codegen.CompleteClass ();\r
+                                codegen.EndTypeDef ();\r
                           }\r
-                        \r
                        ;\r
 \r
-class_head             : D_CLASS class_attr id extends_clause\r
+class_head             : D_CLASS class_attr id typars_clause extends_clause\r
                           impl_clause\r
                           {\r
+                                codegen.BeginTypeDef ((TypeAttr) $2, (string) $3, \r
+                                               $5 as IClassRef, $6 as ArrayList, null);\r
+\r
+                                /*\r
+                                // Lets not worry about generics for now :p\r
                                 if ($4 != null) {\r
-                                       codegen.AddClass ((TypeAttr) $2, (string) $3, \r
-                                               ((TypeRef)$4).Type as Class, null);\r
-                               } else {\r
-                                       codegen.AddClass ((TypeAttr)$2, (string) $3, null);\r
-                               }\r
-                                \r
-                               ArrayList impl_list = (ArrayList) $5;\r
-                               if (impl_list != null) {\r
-                                       foreach (TypeRef type_ref in impl_list)\r
-                                               codegen.CurrentClass.AddImplementedInterface (type_ref.Type as Class);\r
-                               }\r
+                                        ArrayList typars_list = (ArrayList) $4;\r
+                                        int index = 0;\r
+                                        foreach (DictionaryEntry entry in typars_list) {\r
+                                                TypeRef type = (TypeRef) entry.Key;\r
+                                                string name = (string) entry.Value;\r
+                                                codegen.CurrentClass.AddGenericParameter ((short) index++, type.Type, name);\r
+                                        }\r
+                                }\r
+                                */\r
                           }\r
                        ;\r
 \r
@@ -489,6 +490,46 @@ impl_clause                : /* EMPTY */
                           }\r
                        ;\r
 \r
+typars_clause           : /* EMPTY */\r
+                        | OPEN_ANGLE_BRACKET formal_typars CLOSE_ANGLE_BRACKET\r
+                          {\r
+                                $$ = $2;\r
+                          }\r
+                        ;\r
+\r
+typars                  : type\r
+                          {\r
+                                ArrayList typars_list = new ArrayList ();\r
+                                typars_list.Add ($1);\r
+                                $$ = typars_list;\r
+                          }\r
+                        | typars COMMA type\r
+                          {\r
+                                ArrayList typars_list = (ArrayList) $1;\r
+                                typars_list.Add ($3);\r
+                                $$ = typars_list;\r
+                          }\r
+                        ;\r
+\r
+formal_typars           : formal_typar\r
+                          {\r
+                                ArrayList formal_list = new ArrayList ();\r
+                                formal_list.Add ($1);\r
+                                $$ = formal_list;\r
+                          }\r
+                        | formal_typars COMMA formal_typar\r
+                          {\r
+                                ArrayList formal_list = (ArrayList) $1;\r
+                                formal_list.Add ($3);\r
+                                $$ = formal_list;\r
+                          }\r
+                        ;\r
+\r
+\r
+formal_typar            : type          { $$ = new DictionaryEntry ($1, null); }\r
+                        | type id       { $$ = new DictionaryEntry ($1, $2); }\r
+                        ;\r
+                        \r
 class_refs             : class_ref\r
                           {\r
                                 ArrayList class_list = new ArrayList ();\r
@@ -511,14 +552,13 @@ slashed_name              : comp_name
 \r
 class_ref              : OPEN_BRACKET comp_name CLOSE_BRACKET slashed_name\r
                           {\r
-                                PEAPI.Type type = codegen.ExternTable.GetClass ((string) $2, (string)$4);\r
-                                $$ = new TypeRef (type, (string) $4);\r
+                                ClassRef klass = codegen.ExternTable.GetClass ((string) $2, (string)$4);\r
+                                $$ = new ExternTypeRef (klass, (string) $4);\r
                           }\r
                        | OPEN_BRACKET D_MODULE comp_name CLOSE_BRACKET slashed_name\r
                        | slashed_name\r
                           {\r
-                                $$ = new TypeRef (codegen.ClassTable.GetReference ((string) $1, null),\r
-                                       (string) $1);\r
+                                $$ = new TypeRef ((string) $1, null);\r
                           }\r
                        ;\r
 \r
@@ -536,6 +576,9 @@ class_decl          : method_all
                        | extsource_spec\r
                        | customattr_decl\r
                        | D_SIZE int32\r
+                          {\r
+                                \r
+                          }\r
                        | D_PACK int32\r
                        | D_OVERRIDE type_spec DOUBLE_COLON method_name\r
                          K_WITH call_conv type type_spec DOUBLE_COLON method_name\r
@@ -549,11 +592,11 @@ type                      : K_CLASS class_ref
                           }\r
                        | K_OBJECT\r
                           {\r
-                                $$ = new TypeRef (PrimitiveType.Object, "System.Object");\r
+                                $$ = new PrimitiveTypeRef (PrimitiveType.Object, "System.Object");\r
                           }\r
                        | K_STRING\r
                           {\r
-                                $$ = new TypeRef (PrimitiveType.String, "System.String");\r
+                                $$ = new PrimitiveTypeRef (PrimitiveType.String, "System.String");\r
                           }\r
                        | K_VALUE K_CLASS class_ref\r
                           {\r
@@ -565,129 +608,125 @@ type                    : K_CLASS class_ref
                           }\r
                        | type OPEN_BRACKET CLOSE_BRACKET\r
                           {\r
-                                TypeRef base_type = (TypeRef) $1;\r
-                                PEAPI.Type arr_type = new ZeroBasedArray (base_type.Type);\r
-                                $$ = new TypeRef (arr_type, base_type.FullName + "[]");\r
+                                ITypeRef base_type = (ITypeRef) $1;\r
+                                base_type.MakeArray ();\r
                           }\r
                        | type OPEN_BRACKET bounds CLOSE_BRACKET\r
                           {\r
-                                TypeRef base_type = (TypeRef) $1;\r
+                                ITypeRef base_type = (ITypeRef) $1;\r
                                 ArrayList bound_list = (ArrayList) $3;\r
-                                int dimen = bound_list.Count;\r
-                                int[] lower_array = new int[dimen];\r
-                                int[] size_array = new int[dimen];\r
-                                bool lower_set = false;\r
-                                bool size_set = false;\r
-                                bool prev_lower_set = true;\r
-                                bool prev_size_set = true;\r
-\r
-                                // TODO: There should probably be an error reported if\r
-                                // something like [3...,3...5] is done\r
-                                for (int i=0; i<dimen; i++) {\r
-                                        DictionaryEntry bound = (DictionaryEntry) bound_list[i];\r
-                                        \r
-                                        if (bound.Key != null && prev_lower_set) {\r
-                                                lower_array[i] = (int) bound.Key;\r
-                                                lower_set = true;\r
-                                        } else {\r
-                                                prev_lower_set = false;\r
-                                        }       \r
-                                        if (bound.Value != null && prev_size_set) {\r
-                                                size_array[i] = (int) bound.Value;\r
-                                                size_set = true;\r
-                                        } else {\r
-                                                prev_size_set = false;\r
-                                        }\r
-                                }\r
-                                if (lower_set && size_set) {\r
-                                        $$ = new BoundArray (base_type.Type,\r
-                                                (uint) dimen, lower_array, size_array);\r
-                                } else if (size_set) {\r
-                                        $$ = new BoundArray (base_type.Type,\r
-                                                (uint) dimen, size_array);\r
-                                } else {\r
-                                        $$ = new BoundArray (base_type.Type, (uint) dimen);\r
-                                }\r
+                                base_type.MakeBoundArray (bound_list);\r
                           }\r
                        | type AMPERSAND\r
                           {\r
-                                TypeRef base_type = $1 as TypeRef;\r
-                                PEAPI.Type ref_type = new ManagedPointer (base_type.Type);\r
-                                $$ = new TypeRef (ref_type, base_type.FullName + '&');\r
+                                ITypeRef base_type = (ITypeRef) $1;\r
+                                base_type.MakeManagedPointer ();\r
                           }\r
                        | type STAR\r
                           {\r
-                                TypeRef base_type = (TypeRef) $1;\r
-                                PEAPI.Type ptr_type = new UnmanagedPointer (base_type.Type);\r
-                                $$ = new TypeRef (ptr_type, base_type.FullName + '&');\r
+                                ITypeRef base_type = (ITypeRef) $1;\r
+                                base_type.MakeUnmanagedPointer ();\r
                           }\r
                        | type K_PINNED\r
+                          {\r
+                                ITypeRef base_type = (ITypeRef) $1;\r
+                                base_type.MakePinned ();\r
+                          }\r
                        | type K_MODREQ OPEN_PARENS class_ref CLOSE_PARENS\r
+                          {\r
+                                /*\r
+                                ITypeRef base_type = (ITypeRef) $1;\r
+                                ITypeRef class_ref = (ITypeRef) $4;\r
+\r
+                                $$ = new CustomModifiedType (base_type.Type,\r
+                                        CustomModifier.modreq, (Class) class_ref.Type);\r
+                                */\r
+                          }\r
                        | type K_MODOPT OPEN_PARENS class_ref CLOSE_PARENS\r
+                          {\r
+                                /*\r
+                                TypeRef base_type = (TypeRef) $1;\r
+                                TypeRef class_ref = (TypeRef) $4;\r
+\r
+                                $$ = new CustomModifiedType (base_type.Type,\r
+                                        CustomModifier.modopt, (Class) class_ref.Type);\r
+                                */\r
+                          }\r
                        | K_METHOD call_conv type STAR OPEN_PARENS sig_args CLOSE_PARENS\r
                        | K_TYPEDREF\r
+                          {\r
+                                $$ = new PrimitiveTypeRef (PrimitiveType.TypedRef,\r
+                                        "System.TypedReference");\r
+                          }\r
                        | K_CHAR\r
                           {\r
-                                $$ = new TypeRef (PrimitiveType.Char, "System.Char");\r
+                                $$ = new PrimitiveTypeRef (PrimitiveType.Char, "System.Char");\r
                           }\r
                        | K_VOID\r
                           {\r
-                                $$ = new TypeRef (PrimitiveType.Void, "System.Void");\r
+                                $$ = new PrimitiveTypeRef (PrimitiveType.Void, "System.Void");\r
                           }\r
                        | K_BOOL\r
                           {\r
-                                $$ = new TypeRef (PrimitiveType.Boolean, "System.Bool");\r
+                                $$ = new PrimitiveTypeRef (PrimitiveType.Boolean, "System.Bool");\r
                           }\r
                        | K_INT8\r
                           {\r
-                                $$ = new TypeRef (PrimitiveType.Int8, "System.Int8");\r
+                                $$ = new PrimitiveTypeRef (PrimitiveType.Int8, "System.Int8");\r
                           }\r
                        | K_INT16\r
                           {\r
-                                $$ = new TypeRef (PrimitiveType.Int16, "System.Int16");\r
+                                $$ = new PrimitiveTypeRef (PrimitiveType.Int16, "System.Int16");\r
                           }\r
                        | K_INT32\r
                           {\r
-                                $$ = new TypeRef (PrimitiveType.Int32, "System.Int32");\r
+                                $$ = new PrimitiveTypeRef (PrimitiveType.Int32, "System.Int32");\r
                           }\r
                        | K_INT64\r
                           {\r
-                                $$ = new TypeRef (PrimitiveType.Int64, "System.Int64");\r
+                                $$ = new PrimitiveTypeRef (PrimitiveType.Int64, "System.Int64");\r
                           }\r
                        | K_FLOAT32\r
                           {\r
-                                $$ = new TypeRef (PrimitiveType.Float32, "System.Float32");\r
+                                $$ = new PrimitiveTypeRef (PrimitiveType.Float32, "System.Float32");\r
                           }\r
                        | K_FLOAT64\r
                           {\r
-                                $$ = new TypeRef (PrimitiveType.Float64, "System.Float64");\r
+                                $$ = new PrimitiveTypeRef (PrimitiveType.Float64, "System.Float64");\r
                           }\r
                        | K_UNSIGNED K_INT8\r
                           {\r
-                                $$ = new TypeRef (PrimitiveType.UInt8, "System.UInt8");\r
+                                $$ = new PrimitiveTypeRef (PrimitiveType.UInt8, "System.UInt8");\r
                           }\r
                        | K_UNSIGNED K_INT16\r
                           {\r
-                                $$ = new TypeRef (PrimitiveType.UInt16, "System.UInt16");     \r
+                                $$ = new PrimitiveTypeRef (PrimitiveType.UInt16, "System.UInt16");     \r
                           }\r
                        | K_UNSIGNED K_INT32\r
                           {\r
-                                $$ = new TypeRef (PrimitiveType.UInt32, "System.UInt32");\r
+                                $$ = new PrimitiveTypeRef (PrimitiveType.UInt32, "System.UInt32");\r
                           }\r
                        | K_UNSIGNED K_INT64\r
                           {\r
-                                $$ = new TypeRef (PrimitiveType.UInt64, "System.UInt64");\r
+                                $$ = new PrimitiveTypeRef (PrimitiveType.UInt64, "System.UInt64");\r
                           }\r
                        | K_NATIVE K_INT\r
                           {\r
                                 // TODO: Is this the proper full name\r
-                                $$ = new TypeRef (PrimitiveType.NativeInt, "native int");\r
+                                $$ = new PrimitiveTypeRef (PrimitiveType.NativeInt, "System.IntPtr");\r
                           }\r
                         \r
                        | K_NATIVE K_UNSIGNED K_INT\r
                           {\r
-                                // TODO: Is this the proper full name\r
-                                $$ = new TypeRef (PrimitiveType.NativeUInt, "native uint");\r
+                                $$ = new PrimitiveTypeRef (PrimitiveType.NativeUInt, "System.UIntPtr");\r
+                          }\r
+                        | BANG int32\r
+                          {\r
+                                // access class type parameter by number\r
+                          }\r
+                        | BANG BANG int32\r
+                          {\r
+                                // access method type parameter by number\r
                           }\r
                        ;\r
 \r
@@ -730,39 +769,108 @@ bound                    : /* EMPTY */
                        ;\r
 \r
 call_conv              : K_INSTANCE call_conv\r
+                          {\r
+                                $$ = (CallConv) $2 | CallConv.Instance;\r
+                          }\r
                        | K_EXPLICIT call_conv\r
+                          {\r
+                                $$ = (CallConv) $2 | CallConv.InstanceExplicit;\r
+                          }\r
                        | call_kind\r
                        ;\r
 \r
 call_kind              : /* EMPTY */\r
+                          {\r
+                                $$ = new CallConv ();\r
+                          }\r
                        | K_DEFAULT\r
+                          {\r
+                                $$ = CallConv.Default;\r
+                          }\r
                        | K_VARARG\r
+                          {\r
+                                $$ = CallConv.Vararg;\r
+                          }\r
                        | K_UNMANAGED K_CDECL\r
+                          {\r
+                                $$ = CallConv.Cdecl;\r
+                          }\r
                        | K_UNMANAGED K_STDCALL\r
+                          {\r
+                                $$ = CallConv.Stdcall;\r
+                          }\r
                        | K_UNMANAGED K_THISCALL\r
+                          {\r
+                                $$ = CallConv.Thiscall;\r
+                          }\r
                        | K_UNMANAGED K_FASTCALL\r
+                          {\r
+                                $$ = CallConv.Fastcall;\r
+                          }\r
                        ;\r
 \r
 native_type            : /* EMPTY */\r
                        | K_CUSTOM OPEN_PARENS comp_qstring COMMA comp_qstring CLOSE_PARENS\r
                        | K_FIXED K_SYSSTRING OPEN_BRACKET int32 CLOSE_BRACKET\r
+                          {\r
+                                $$ = NativeType.FixedSysString;\r
+                          }\r
                        | K_FIXED K_ARRAY OPEN_BRACKET int32 CLOSE_BRACKET\r
                        | K_VARIANT\r
                        | K_CURRENCY\r
+                          {\r
+                                $$ = NativeType.Currency;\r
+                          }\r
                        | K_SYSCHAR\r
                        | K_VOID\r
+                          {\r
+                                $$ = NativeType.Void;\r
+                          }\r
                        | K_BOOL\r
+                          {\r
+                                $$ = NativeType.Boolean;\r
+                          }\r
                        | K_INT8\r
+                          {\r
+                                $$ = NativeType.Int8;\r
+                          }\r
                        | K_INT16\r
+                          {\r
+                                $$ = NativeType.Int16;\r
+                          }\r
                        | K_INT32\r
+                          {\r
+                                $$ = NativeType.Int32;\r
+                          }\r
                        | K_INT64\r
+                          {\r
+                                $$ = NativeType.Int64;\r
+                          }\r
                        | K_FLOAT32\r
+                          {\r
+                                $$ = NativeType.Float32;\r
+                          }\r
                        | K_FLOAT64\r
+                          {\r
+                                $$ = NativeType.Float64;\r
+                          }\r
                        | K_ERROR\r
                        | K_UNSIGNED K_INT8\r
+                          {\r
+                                $$ = NativeType.UInt8;\r
+                          }\r
                        | K_UNSIGNED K_INT16\r
+                          {\r
+                                $$ = NativeType.UInt16;\r
+                          }\r
                        | K_UNSIGNED K_INT32\r
+                          {\r
+                                $$ = NativeType.UInt32;\r
+                          }\r
                        | K_UNSIGNED K_INT64\r
+                          {\r
+                                $$ = NativeType.UInt64;\r
+                          }\r
                        | native_type STAR\r
                        | native_type OPEN_BRACKET CLOSE_BRACKET\r
                        | native_type OPEN_BRACKET int32 CLOSE_BRACKET\r
@@ -771,25 +879,70 @@ native_type               : /* EMPTY */
                        | K_DECIMAL\r
                        | K_DATE\r
                        | K_BSTR\r
+                          {\r
+                                $$ = NativeType.BStr;\r
+                          }\r
                        | K_LPSTR\r
+                          {\r
+                                $$ = NativeType.LPStr;\r
+                          }\r
                        | K_LPWSTR\r
+                          {\r
+                                $$ = NativeType.LPWStr;\r
+                          }\r
                        | K_LPTSTR\r
+                          {\r
+                                $$ = NativeType.LPTStr;\r
+                          }\r
                        | K_OBJECTREF\r
                        | K_IUNKNOWN\r
+                          {\r
+                                $$ = NativeType.IUnknown;\r
+                          }\r
                        | K_IDISPATCH\r
+                          {\r
+                                $$ = NativeType.IDispatch;\r
+                          }\r
                        | K_STRUCT\r
+                          {\r
+                                $$ = NativeType.Struct;\r
+                          }\r
                        | K_INTERFACE\r
+                          {\r
+                                $$ = NativeType.Interface;\r
+                          }\r
                        | K_SAFEARRAY variant_type\r
                        | K_SAFEARRAY variant_type COMMA comp_qstring\r
                        | K_INT\r
+                          {\r
+                                $$ = NativeType.Int;\r
+                          }\r
                        | K_UNSIGNED K_INT\r
+                          {\r
+                                $$ = NativeType.UInt;\r
+                          }\r
                        | K_NESTED K_STRUCT\r
                        | K_BYVALSTR\r
+                          {\r
+                                $$ = NativeType.ByValStr;\r
+                          }\r
                        | K_ANSI K_BSTR\r
+                          {\r
+                                $$ = NativeType.AnsiBStr;\r
+                          }\r
                        | K_TBSTR\r
+                          {\r
+                                $$ = NativeType.TBstr;\r
+                          }\r
                        | K_VARIANT K_BOOL\r
+                          {\r
+                                $$ = NativeType.VariantBool;\r
+                          }\r
                        | K_METHOD\r
                        | K_AS K_ANY\r
+                          {\r
+                                $$ = NativeType.AsAny;\r
+                          }\r
                        | K_LPSTRUCT\r
                        ;\r
 \r
@@ -840,61 +993,198 @@ variant_type             : /* EMPTY */
                        ;\r
 \r
 field_decl             : D_FIELD repeat_opt field_attr type id at_opt init_opt\r
+                          {\r
+                                FieldDef field_def = new FieldDef((FieldAttr) $3, \r
+                                       (string) $5, (ITypeRef) $4);\r
+                                codegen.AddFieldDef (field_def);\r
+                                \r
+                                if ($2 != null) {\r
+                                        field_def.SetOffset ((uint) $2);\r
+                                }\r
+                                /*\r
+                                if ($6 != null) {\r
+                                        field_def.AddDataValue ((DataConstant) $6);\r
+                                }\r
+                                */\r
+                                if ($7 != null) {\r
+                                        field_def.SetValue ((Constant) $7);\r
+                                }\r
+                          }\r
                        ;\r
 \r
 repeat_opt             : /* EMPTY */\r
                        | OPEN_BRACKET int32 CLOSE_BRACKET\r
+                          {\r
+                                $$ = $2;\r
+                          }\r
                        ;\r
 \r
 field_attr             : /* EMPTY */\r
+                          {\r
+                                $$ = new FieldAttr ();\r
+                          }\r
                        | field_attr K_PUBLIC\r
+                          {\r
+                                $$ = (FieldAttr) $1 | FieldAttr.Public;\r
+                          }\r
                        | field_attr K_PRIVATE\r
+                          {\r
+                                $$ = (FieldAttr) $1 | FieldAttr.Private;\r
+                          }\r
                        | field_attr K_FAMILY\r
+                          {\r
+                                $$ = (FieldAttr) $1 | FieldAttr.Family;\r
+                          }\r
                        | field_attr K_ASSEMBLY\r
+                          {\r
+                                $$ = (FieldAttr) $1 | FieldAttr.Assembly;\r
+                          }\r
                        | field_attr K_FAMANDASSEM\r
+                          {\r
+                                $$ = (FieldAttr) $1 | FieldAttr.FamAndAssem;\r
+                          }\r
                        | field_attr K_FAMORASSEM\r
+                          {\r
+                                $$ = (FieldAttr) $1 | FieldAttr.FamOrAssem;\r
+                          }\r
                        | field_attr K_PRIVATESCOPE\r
+                          {\r
+                                // This is just 0x0000\r
+                          }\r
                        | field_attr K_STATIC\r
+                          {\r
+                                $$ = (FieldAttr) $1 | FieldAttr.Static;\r
+                          }\r
                        | field_attr K_INITONLY\r
+                          {\r
+                                $$ = (FieldAttr) $1 | FieldAttr.Initonly;\r
+                          }\r
                        | field_attr K_RTSPECIALNAME\r
+                          {\r
+                                $$ = (FieldAttr) $1 | FieldAttr.RTSpecialName;\r
+                          }\r
                        | field_attr K_SPECIALNAME\r
+                          {\r
+                                $$ = (FieldAttr) $1 | FieldAttr.SpecialName;\r
+                          }\r
                        | field_attr K_MARSHAL OPEN_PARENS native_type CLOSE_PARENS\r
+                          {\r
+                                \r
+                          }\r
                        | field_attr K_LITERAL\r
+                          {\r
+                                $$ = (FieldAttr) $1 | FieldAttr.Literal;\r
+                          }\r
                        | field_attr K_NOTSERIALIZED\r
+                          {\r
+                                $$ = (FieldAttr) $1 | FieldAttr.Notserialized;\r
+                          }\r
                        ;\r
 \r
 at_opt                 : /* EMPTY */\r
                        | K_AT id\r
+                          {\r
+                                // TODO: Implement DataTable\r
+                                // $$ = new DataConstant (DataTable.GetOffset ((string) $2));\r
+                          }\r
                        ;\r
 \r
 init_opt               : /* EMPTY */\r
                        | ASSIGN field_init\r
+                          {\r
+                                $$ = $2;\r
+                          }\r
                        ;\r
 \r
 field_init             : K_FLOAT32 OPEN_PARENS float64 CLOSE_PARENS\r
+                          {\r
+                                $$ = new FloatConst (Convert.ToSingle ($3));\r
+                          }\r
                        | K_FLOAT64 OPEN_PARENS float64 CLOSE_PARENS\r
+                          {\r
+                                $$ = new DoubleConst (Convert.ToDouble ($3));\r
+                          }\r
                        | K_FLOAT32 OPEN_PARENS int64 CLOSE_PARENS\r
+                          {\r
+                                $$ = new FloatConst (Convert.ToSingle ($3));\r
+                          }\r
                        | K_FLOAT64 OPEN_PARENS int64 CLOSE_PARENS\r
+                          {\r
+                                $$ = new DoubleConst (Convert.ToDouble (3));\r
+                          }\r
                        | K_INT64 OPEN_PARENS int64 CLOSE_PARENS\r
+                          {\r
+                                $$ = new IntConst (Convert.ToInt64 ($3));\r
+                          }\r
                        | K_INT32 OPEN_PARENS int64 CLOSE_PARENS\r
+                          {\r
+                                $$ = new IntConst (Convert.ToUInt32 ($3));\r
+                          }\r
                        | K_INT16 OPEN_PARENS int64 CLOSE_PARENS\r
+                          {\r
+                                $$ = new IntConst (Convert.ToUInt16 ($3));\r
+                          }\r
                        | K_CHAR OPEN_PARENS int64 CLOSE_PARENS\r
+                          {\r
+                                $$ = new CharConst (Convert.ToChar ($3));\r
+                          }\r
                        | K_INT8 OPEN_PARENS int64 CLOSE_PARENS\r
+                          {\r
+                                $$ = new IntConst (Convert.ToByte ($3));\r
+                          }\r
                        | K_BOOL OPEN_PARENS truefalse CLOSE_PARENS\r
+                          {\r
+                                $$ = new BoolConst ((bool) $3);\r
+                          }\r
                        | K_BYTEARRAY OPEN_PARENS bytes CLOSE_PARENS\r
-                       | comp_qstring                                          // ******** ADDED\r
+                          {\r
+                                $$ = new ByteArrConst ((byte[]) $3);\r
+                          }\r
+                       | comp_qstring\r
+                          {\r
+                                // ******** THIS IS NOT IN THE DOCUMENTATION ******** //\r
+                                $$ = new StringConst ((string) $1);\r
+                          }\r
                        | K_NULLREF\r
+                          {\r
+                                $$ = new NullConst ();\r
+                          }\r
                        ;\r
 \r
 data_decl              : data_head data_body\r
+                          {\r
+                                /*\r
+                                Console.WriteLine ("Creating data decl: '{0}' '{1}'", $1, $2);\r
+\r
+                                DataDef datadef = (DataDef) $1;\r
+                                \r
+                                if ($2 is ArrayList) {\r
+                                        ArrayList const_list = (ArrayList) $2;\r
+                                        DataConstant[] const_arr = new DataConstant[const_list.Count];\r
+                                        \r
+                                        for (int i=0; i<const_arr.Length; i++)\r
+                                                const_arr[i] = (DataConstant) const_list[i];\r
+\r
+                                        datadef.PeapiConstant = new ArrayConstant (const_arr);\r
+                                } else {\r
+                                        datadef.PeapiConstant = (PEAPI.Constant) $2;\r
+                                }\r
+                                */\r
+                          }\r
                        ;\r
 \r
-data_head              : D_DATA tls id ASSIGN \r
+data_head              : D_DATA tls id ASSIGN\r
+                          {\r
+                                $$ = new DataDef ((string) $3, (bool) $2);    \r
+                          } \r
                        | D_DATA tls\r
+                          {\r
+                                $$ = new DataDef (String.Empty, (bool) $2);\r
+                          }\r
                        ;\r
 \r
-tls                    : /* EMPTY */\r
-                       | K_TLS\r
+tls                    : /* EMPTY */   { $$ = false; }\r
+                       | K_TLS         { $$ = true; }\r
                        ;\r
 \r
 data_body              : OPEN_BRACE dataitem_list CLOSE_BRACE\r
@@ -908,49 +1198,161 @@ dataitem_list           : dataitem
 dataitem               : K_CHAR STAR OPEN_PARENS comp_qstring CLOSE_PARENS\r
                        | AMPERSAND OPEN_PARENS id CLOSE_PARENS\r
                        | K_BYTEARRAY ASSIGN OPEN_PARENS bytes CLOSE_PARENS\r
-                       | K_BYTEARRAY OPEN_PARENS bytes CLOSE_PARENS                    // ******** ADDED\r
+                          {\r
+                                $$ = new ByteArrConst ((byte[]) $4);\r
+                          }\r
+                       | K_BYTEARRAY OPEN_PARENS bytes CLOSE_PARENS\r
+                          {\r
+                                // ******** THIS IS NOT IN THE SPECIFICATION ******** //\r
+                                $$ = new ByteArrConst ((byte[]) $3);\r
+                          }\r
                        | K_FLOAT32 OPEN_PARENS float64 CLOSE_PARENS repeat_opt\r
+                          {\r
+                                FloatConst float_const = new FloatConst ((float) $3);\r
+\r
+                                if ($5 != null)\r
+                                        $$ = new RepeatedConstant (float_const, (int) $5);\r
+                                else\r
+                                        $$ = float_const;\r
+                          }\r
                        | K_FLOAT64 OPEN_PARENS float64 CLOSE_PARENS repeat_opt\r
+                          {\r
+                                DoubleConst double_const = new DoubleConst ((double) $3);\r
+\r
+                                if ($5 != null)\r
+                                        $$ = new RepeatedConstant (double_const, (int) $5);\r
+                                else\r
+                                        $$ = double_const;\r
+                          }\r
                        | K_INT64 OPEN_PARENS int64 CLOSE_PARENS repeat_opt\r
+                          {\r
+                                IntConst int_const = new IntConst ((long) $3);\r
+\r
+                                if ($5 != null)\r
+                                        $$ = new RepeatedConstant (int_const, (int) $5);\r
+                                else\r
+                                        $$ = int_const;\r
+                          }\r
                        | K_INT32 OPEN_PARENS int32 CLOSE_PARENS repeat_opt\r
+                          {\r
+                                IntConst int_const = new IntConst ((int) $3);\r
+\r
+                                if ($5 != null)\r
+                                        $$ = new RepeatedConstant (int_const, (int) $5);\r
+                                else\r
+                                        $$ = int_const;\r
+                          }\r
                        | K_INT16 OPEN_PARENS int32 CLOSE_PARENS repeat_opt\r
+                          {\r
+                                IntConst int_const = new IntConst ((short) $3);\r
+\r
+                                if ($5 != null)\r
+                                        $$ = new RepeatedConstant (int_const, (int) $5);\r
+                                else\r
+                                        $$ = int_const;\r
+                          }\r
                        | K_INT8 OPEN_PARENS int32 CLOSE_PARENS repeat_opt\r
+                          {\r
+                                IntConst int_const = new IntConst ((sbyte) $3);\r
+\r
+                                if ($5 != null)\r
+                                        $$ = new RepeatedConstant (int_const, (int) $5);\r
+                                else\r
+                                        $$ = int_const;\r
+                          }\r
                        | K_FLOAT32 repeat_opt\r
+                          {\r
+                                FloatConst float_const = new FloatConst (0F);\r
+\r
+                                if ($2 != null)\r
+                                        $$ = new RepeatedConstant (float_const, (int) $2);\r
+                                else\r
+                                        $$ = float_const;\r
+                          }\r
                        | K_FLOAT64 repeat_opt\r
+                          {\r
+                                DoubleConst double_const = new DoubleConst (0);\r
+\r
+                                if ($2 != null)\r
+                                        $$ = new RepeatedConstant (double_const, (int) $2);\r
+                                else\r
+                                        $$ = double_const;\r
+                          }\r
                        | K_INT64 repeat_opt\r
+                          {\r
+                                IntConst int_const = new IntConst ((long) 0);\r
+\r
+                                if ($2 != null)\r
+                                        $$ = new RepeatedConstant (int_const, (int) $2);\r
+                                else\r
+                                        $$ = int_const;\r
+                          }\r
                        | K_INT32 repeat_opt\r
+                          {\r
+                                IntConst int_const = new IntConst ((int) 0);\r
+\r
+                                if ($2 != null)\r
+                                        $$ = new RepeatedConstant (int_const, (int) $2);\r
+                                else\r
+                                        $$ = int_const;\r
+                          }\r
                        | K_INT16 repeat_opt\r
+                          {\r
+                                IntConst int_const = new IntConst ((short) 0);\r
+\r
+                                if ($2 != null)\r
+                                        $$ = new RepeatedConstant (int_const, (int) $2);\r
+                                else\r
+                                        $$ = int_const;\r
+                          }\r
                        | K_INT8 repeat_opt\r
+                          {\r
+                                IntConst int_const = new IntConst ((sbyte) 0);\r
+\r
+                                if ($2 != null)\r
+                                        $$ = new RepeatedConstant (int_const, (int) $2);\r
+                                else\r
+                                        $$ = int_const;\r
+                          }\r
                        ;\r
 \r
 method_all             : method_head OPEN_BRACE method_decls CLOSE_BRACE\r
+                          {\r
+                                codegen.EndMethodDef ();\r
+                          }\r
                        ;\r
 \r
 method_head            : D_METHOD meth_attr call_conv param_attr type method_name\r
-                         OPEN_PARENS sig_args CLOSE_PARENS impl_attr\r
+                          typars_clause OPEN_PARENS sig_args CLOSE_PARENS impl_attr\r
+                          {\r
+                                MethodDef methdef = new MethodDef ((MethAttr) $2,\r
+                                        (ImplAttr) $11, (string) $6, (ITypeRef) $5,\r
+                                        (ArrayList) $9);\r
+                                codegen.BeginMethodDef (methdef);\r
+                          }\r
                        | D_METHOD meth_attr call_conv param_attr type \r
                          K_MARSHAL OPEN_PARENS native_type CLOSE_PARENS method_name\r
                          OPEN_PARENS sig_args CLOSE_PARENS impl_attr\r
                        ;\r
 \r
-meth_attr              : /* EMPTY */\r
-                       | meth_attr K_STATIC\r
-                       | meth_attr K_PUBLIC\r
-                       | meth_attr K_PRIVATE\r
-                       | meth_attr K_FAMILY\r
-                       | meth_attr K_ASSEMBLY\r
-                       | meth_attr K_FAMANDASSEM\r
-                       | meth_attr K_FAMORASSEM\r
-                       | meth_attr K_PRIVATESCOPE\r
-                       | meth_attr K_FINAL\r
-                       | meth_attr K_VIRTUAL\r
-                       | meth_attr K_ABSTRACT\r
-                       | meth_attr K_HIDEBYSIG\r
-                       | meth_attr K_NEWSLOT\r
-                       | meth_attr K_REQSECOBJ\r
-                       | meth_attr K_SPECIALNAME\r
-                       | meth_attr K_RTSPECIALNAME\r
-                       | meth_attr K_UNMANAGEDEXP\r
+meth_attr              : /* EMPTY */                   { $$ = new MethAttr (); }\r
+                       | meth_attr K_STATIC            { $$ = (MethAttr) $1 | MethAttr.Static; }\r
+                       | meth_attr K_PUBLIC            { $$ = (MethAttr) $1 | MethAttr.Public; }\r
+                       | meth_attr K_PRIVATE           { $$ = (MethAttr) $1 | MethAttr.Private; }\r
+                       | meth_attr K_FAMILY            { $$ = (MethAttr) $1 | MethAttr.Family; }\r
+                       | meth_attr K_ASSEMBLY          { $$ = (MethAttr) $1 | MethAttr.Assembly; }\r
+                       | meth_attr K_FAMANDASSEM       { $$ = (MethAttr) $1 | MethAttr.FamAndAssem; } \r
+                       | meth_attr K_FAMORASSEM        { $$ = (MethAttr) $1 | MethAttr.FamOrAssem; } \r
+                       | meth_attr K_PRIVATESCOPE      { /* CHECK HEADERS */ }\r
+                       | meth_attr K_FINAL             { $$ = (MethAttr) $1 | MethAttr.Final; } \r
+                       | meth_attr K_VIRTUAL           { $$ = (MethAttr) $1 | MethAttr.Virtual; }\r
+                       | meth_attr K_ABSTRACT          { $$ = (MethAttr) $1 | MethAttr.Abstract; }\r
+                       | meth_attr K_HIDEBYSIG         { $$ = (MethAttr) $1 | MethAttr.HideBySig; }\r
+                       | meth_attr K_NEWSLOT           { $$ = (MethAttr) $1 | MethAttr.NewSlot; }\r
+                       | meth_attr K_REQSECOBJ         { $$ = (MethAttr) $1 | MethAttr.RequireSecObject; }\r
+                       | meth_attr K_SPECIALNAME       { $$ = (MethAttr) $1 | MethAttr.SpecialName; }\r
+                       | meth_attr K_RTSPECIALNAME     { $$ = (MethAttr) $1 | MethAttr.RTSpecialName; }\r
+                       | meth_attr K_UNMANAGEDEXP      \r
                        | meth_attr K_PINVOKEIMPL OPEN_PARENS comp_qstring K_AS\r
                                comp_qstring pinv_attr CLOSE_PARENS\r
                        | meth_attr K_PINVOKEIMPL OPEN_PARENS comp_qstring pinv_attr CLOSE_PARENS\r
@@ -975,49 +1377,91 @@ method_name              : D_CTOR
                        | comp_name\r
                        ;\r
 \r
-param_attr             : /* EMPTY */\r
-                       | param_attr OPEN_BRACKET K_IN CLOSE_BRACKET\r
-                       | param_attr OPEN_BRACKET K_OUT CLOSE_BRACKET\r
-                       | param_attr OPEN_BRACKET K_OPT CLOSE_BRACKET\r
+param_attr             : /* EMPTY */                                   { $$ = new ParamAttr (); }\r
+                       | param_attr OPEN_BRACKET K_IN CLOSE_BRACKET    { $$ = (ParamAttr) $1 | ParamAttr.In; }\r
+                       | param_attr OPEN_BRACKET K_OUT CLOSE_BRACKET   { $$ = (ParamAttr) $1 | ParamAttr.Out; }\r
+                       | param_attr OPEN_BRACKET K_OPT CLOSE_BRACKET   { $$ = (ParamAttr) $1 | ParamAttr.Opt; }\r
                        ;\r
 \r
-impl_attr              : /* EMPTY */\r
-                       | impl_attr K_NATIVE\r
-                       | impl_attr K_CIL\r
-                       | impl_attr K_OPTIL\r
-                       | impl_attr K_MANAGED\r
-                       | impl_attr K_UNMANAGED\r
-                       | impl_attr K_FORWARDREF\r
-                       | impl_attr K_PRESERVESIG\r
-                       | impl_attr K_RUNTIME\r
-                       | impl_attr K_INTERNALCALL\r
-                       | impl_attr K_SYNCHRONIZED\r
-                       | impl_attr K_NOINLINING\r
+impl_attr              : /* EMPTY */                   { $$ = new ImplAttr (); }\r
+                       | impl_attr K_NATIVE            { $$ = (ImplAttr) $1 | ImplAttr.Native; }\r
+                       | impl_attr K_CIL               { $$ = (ImplAttr) $1 | ImplAttr.IL; }\r
+                       | impl_attr K_OPTIL             { $$ = (ImplAttr) $1 | ImplAttr.Optil; }\r
+                       | impl_attr K_MANAGED           { /* should this reset? */ }\r
+                       | impl_attr K_UNMANAGED         { $$ = (ImplAttr) $1 | ImplAttr.Unmanaged; }\r
+                       | impl_attr K_FORWARDREF        { $$ = (ImplAttr) $1 | ImplAttr.ForwardRef; }\r
+                       | impl_attr K_PRESERVESIG       { $$ = (ImplAttr) $1 | ImplAttr.PreserveSig; }\r
+                       | impl_attr K_RUNTIME           { $$ = (ImplAttr) $1 | ImplAttr.Runtime; }\r
+                       | impl_attr K_INTERNALCALL      { $$ = (ImplAttr) $1 | ImplAttr.InternalCall; }\r
+                       | impl_attr K_SYNCHRONIZED      { $$ = (ImplAttr) $1 | ImplAttr.Synchronised; }\r
+                       | impl_attr K_NOINLINING        { $$ = (ImplAttr) $1 | ImplAttr.NoInLining; }\r
                        ;\r
 \r
-sig_args               : /* EMPTY */\r
+sig_args               :               { $$ = new ArrayList (); }\r
                        | sig_arg_list\r
                        ;\r
 \r
-sig_arg_list           : sig_arg\r
+sig_arg_list           : sig_arg\r
+                          {\r
+                                ArrayList sig_list = new ArrayList ();\r
+                                sig_list.Add ($1);\r
+                                $$ = sig_list;\r
+                          }\r
                        | sig_arg_list COMMA sig_arg\r
+                          {\r
+                                ArrayList sig_list = (ArrayList) $1;\r
+                                sig_list.Add ($3);\r
+                                $$ = sig_list;\r
+                          }\r
                        ;\r
 \r
 sig_arg                        : param_attr type\r
+                          {\r
+                                $$ = new ParamDef ((ParamAttr) $1, null, (ITypeRef) $2);\r
+                          }\r
                        | param_attr type id\r
+                          {\r
+                                $$ = new ParamDef ((ParamAttr) $1, (string) $3, (ITypeRef) $2);\r
+                          }\r
                        | param_attr type K_MARSHAL OPEN_PARENS native_type CLOSE_PARENS\r
                        | param_attr type K_MARSHAL OPEN_PARENS native_type CLOSE_PARENS id\r
                        ;\r
 \r
+type_list               : /* EMPTY */   { $$ = new ArrayList (); }\r
+                        | type\r
+                          {\r
+                                ArrayList type_list = new ArrayList ();\r
+                                type_list.Add ($1);\r
+                                $$ = type_list;\r
+                          }\r
+                        | type_list COMMA type\r
+                          {\r
+                                ArrayList type_list = (ArrayList) $1;\r
+                                type_list.Add ($3);\r
+                          }\r
+                        ;\r
+\r
 method_decls           : /* EMPTY */\r
                        | method_decls method_decl\r
                        ;\r
 \r
 method_decl            : D_EMITBYTE int32\r
                        | D_MAXSTACK int32\r
-                       | D_LOCALS OPEN_PARENS sig_args CLOSE_PARENS\r
-                       | D_LOCALS K_INIT OPEN_PARENS sig_args CLOSE_PARENS\r
+                       | D_LOCALS OPEN_PARENS local_list CLOSE_PARENS\r
+                          {\r
+                                codegen.CurrentMethodDef.AddLocals (\r
+                                        (ArrayList) $3);\r
+                          }\r
+                       | D_LOCALS K_INIT OPEN_PARENS local_list CLOSE_PARENS\r
+                          {\r
+                                codegen.CurrentMethodDef.AddLocals (\r
+                                        (ArrayList) $4);\r
+                                codegen.CurrentMethodDef.InitLocals ();\r
+                          }\r
                        | D_ENTRYPOINT\r
+                          {\r
+                                codegen.CurrentMethodDef.EntryPoint ();\r
+                          }\r
                        | D_ZEROINIT\r
                        | D_EXPORT OPEN_BRACKET int32 CLOSE_BRACKET\r
                        | D_EXPORT OPEN_BRACKET int32 CLOSE_BRACKET K_AS id\r
@@ -1026,6 +1470,9 @@ method_decl               : D_EMITBYTE int32
                        | scope_block\r
                        | D_PARAM OPEN_BRACKET int32 CLOSE_BRACKET init_opt\r
                        | id COLON\r
+                          {\r
+                                codegen.CurrentMethodDef.AddLabel ((string) $1);\r
+                          }\r
                        | seh_block\r
                        | instr\r
                        | sec_decl\r
@@ -1035,6 +1482,38 @@ method_decl              : D_EMITBYTE int32
                        | data_decl\r
                        ;\r
 \r
+local_list              : /* EMPTY */\r
+                        | local\r
+                          {\r
+                                ArrayList local_list = new ArrayList ();\r
+                                local_list.Add ($1);\r
+                                $$ = local_list;\r
+                          }\r
+                        | local_list COMMA local\r
+                          {\r
+                                ArrayList local_list = (ArrayList) $1;\r
+                                local_list.Add ($3);\r
+                          }\r
+                        ;\r
+\r
+local                   : type\r
+                          {\r
+                                $$ = new Local (-1, (ITypeRef) $1);\r
+                          }\r
+                        | type id\r
+                          {\r
+                                $$ = new Local (-1, (string) $2, (ITypeRef) $1);\r
+                          }\r
+                        | OPEN_BRACKET int32 CLOSE_BRACKET type\r
+                          {\r
+                                $$ = new Local ((int) $2, (ITypeRef) $4);\r
+                          }\r
+                        | OPEN_BRACKET int32 CLOSE_BRACKET type id\r
+                          {\r
+                                $$ = new Local ((int) $2, (string) $5, (ITypeRef) $4);\r
+                          }\r
+                        ;\r
+\r
 type_spec              : class_ref\r
                        | OPEN_BRACKET comp_name CLOSE_BRACKET\r
                        | OPEN_BRACKET D_MODULE comp_name CLOSE_BRACKET\r
@@ -1073,40 +1552,122 @@ handler_block          : scope_block
                        ;\r
 \r
 instr                  : INSTR_NONE\r
+                          {\r
+                                codegen.CurrentMethodDef.AddInstr (\r
+                                        new SimpInstr ((Op) $1));\r
+                          }\r
                        | INSTR_VAR int32\r
+                          {\r
+                               \r
+                          }\r
                        | INSTR_I int32\r
-                       | INSTR_I id /* Allow variable names :p */\r
+                          {\r
+                                codegen.CurrentMethodDef.AddInstr (new\r
+                                        IntInstr ((IntOp) $1, (int) $2));\r
+                          }\r
+                       | INSTR_I id /* Allow variable names */\r
                        | INSTR_I8 int64\r
+                          {\r
+                                codegen.CurrentMethodDef.AddInstr (new\r
+                                        IntInstr ((IntOp) $1, (int) $2));\r
+                          }\r
                        | INSTR_R float64\r
+                          {\r
+                                switch ((MiscInstr) $1) {\r
+                                case MiscInstr.ldc_r4:\r
+                                case MiscInstr.ldc_r8:\r
+                                         codegen.CurrentMethodDef.AddInstr (new LdcInstr ((MiscInstr) $1, (double) $2));\r
+                                         break;\r
+                                }\r
+                          }\r
                        | INSTR_R int64\r
+                          {\r
+                                switch ((MiscInstr) $1) {\r
+                                        case MiscInstr.ldc_r8:\r
+                                        codegen.CurrentMethodDef.AddInstr (new LdcInstr ((MiscInstr) $1, (double) $2));\r
+                                        break;\r
+                                }\r
+                          }\r
                        | INSTR_R OPEN_PARENS bytes CLOSE_PARENS\r
                        | INSTR_BRTARGET int32\r
+                          {\r
+                                // Need to add this to PEAPI        \r
+                          }\r
                        | INSTR_BRTARGET id\r
+                          {\r
+                                codegen.CurrentMethodDef.AddInstr (new BranchInstr ((BranchOp) $1,\r
+                                        codegen.CurrentMethodDef, (string) $2));\r
+                          }\r
                        | INSTR_METHOD method_ref\r
+                          {\r
+                                codegen.CurrentMethodDef.AddInstr (new MethodInstr ((MethodOp) $1,\r
+                                        (IMethodRef) $2));\r
+                          }\r
                        | INSTR_FIELD type type_spec DOUBLE_COLON id\r
                        | INSTR_FIELD type id\r
-                       | INSTR_TYPE K_FIELD type type_spec DOUBLE_COLON id                     // ****** ADDED\r
-                       | INSTR_TYPE K_FIELD type id                                            // ****** ADDED\r
                        | INSTR_TYPE type_spec\r
+                          {\r
+                                codegen.CurrentMethodDef.AddInstr (new TypeInstr ((TypeOp) $1,\r
+                                        (ITypeRef) $2));\r
+                          }\r
                        | INSTR_STRING comp_qstring\r
+                          {\r
+                                if ((MiscInstr) $1 == MiscInstr.ldstr)\r
+                                        codegen.CurrentMethodDef.AddInstr (new LdstrInstr ((string) $2));\r
+                          }\r
                        | INSTR_STRING K_BYTEARRAY ASSIGN OPEN_PARENS bytes CLOSE_PARENS\r
                        | INSTR_STRING K_BYTEARRAY OPEN_PARENS bytes CLOSE_PARENS               // ****** ADDED\r
                        | INSTR_SIG call_conv type OPEN_PARENS sig_args CLOSE_PARENS\r
                        | INSTR_TOK owner_type\r
                        | INSTR_SWITCH OPEN_PARENS labels CLOSE_PARENS\r
+                          {\r
+                                codegen.CurrentMethodDef.AddInstr (new SwitchInstr ((ArrayList) $3,\r
+                                        codegen.CurrentMethodDef));\r
+                          }\r
                        ;\r
 \r
 method_ref             : call_conv type type_spec DOUBLE_COLON method_name \r
-                         OPEN_PARENS sig_args CLOSE_PARENS\r
+                         OPEN_PARENS type_list CLOSE_PARENS\r
+                          {\r
+                                IClassRef owner = (IClassRef) $3;\r
+                                ArrayList arg_list = (ArrayList) $7;\r
+                                \r
+                                $$ = owner.GetMethodRef ((ITypeRef) $2, (string) $5,\r
+                                        (ITypeRef[]) arg_list.ToArray (typeof (ITypeRef)));\r
+                          }\r
                        | call_conv type method_name \r
-                         OPEN_PARENS sig_args CLOSE_PARENS\r
+                         OPEN_PARENS type_list CLOSE_PARENS\r
+                          {\r
+                                ArrayList arg_list = (ArrayList) $5;\r
+\r
+                                $$ = new GlobalMethodRef ((ITypeRef) $2, (string) $3,\r
+                                        (ITypeRef[]) arg_list.ToArray (typeof (ITypeRef)));\r
+                          }\r
                        ;\r
 \r
 labels                 : /* EMPTY */\r
                        | id\r
+                          {\r
+                                ArrayList label_list = new ArrayList ();\r
+                                label_list.Add ($1);\r
+                                $$ = label_list;\r
+                          }\r
                        | int32\r
+                          {\r
+                                ArrayList label_list = new ArrayList ();\r
+                                label_list.Add ($1);\r
+                                $$ = label_list;\r
+                          }\r
                        | labels COMMA id\r
+                          {\r
+                                ArrayList label_list = (ArrayList) $1;\r
+                                label_list.Add ($3);\r
+                          }\r
                        | labels COMMA int32\r
+                          {\r
+                                ArrayList label_list = (ArrayList) $1;\r
+                                label_list.Add ($3);\r
+                          }\r
                        ;\r
 \r
 owner_type             : type_spec\r
@@ -1268,7 +1829,19 @@ assemblyref_all          : assemblyref_head OPEN_BRACE assemblyref_decls CLOSE_BRACE
                        ;\r
 \r
 assemblyref_head       : D_ASSEMBLY K_EXTERN comp_name\r
+                          {\r
+                                System.Reflection.AssemblyName asmb_name = \r
+                                       new System.Reflection.AssemblyName ();\r
+                               asmb_name.Name = (string) $3;\r
+                               codegen.ExternTable.AddAssembly ((string) $3, asmb_name);\r
+                          }\r
                        | D_ASSEMBLY K_EXTERN comp_name K_AS comp_name\r
+                          {\r
+                                System.Reflection.AssemblyName asmb_name = \r
+                                       new System.Reflection.AssemblyName ();\r
+                               asmb_name.Name = (string) $3;\r
+                               codegen.ExternTable.AddAssembly ((string) $5, asmb_name);\r
+                          }\r
                        ;\r
 \r
 assemblyref_decls      : /* EMPTY */\r
@@ -1327,20 +1900,24 @@ manifestres_decl        : D_FILE comp_name K_AT int32
                        | customattr_decl\r
                        ;\r
 \r
-dotted_name            : id\r
-                       | dotted_name DOT id    { $$ = String.Format ("{0}.{1}", $1, $3); }\r
-                       ;\r
-\r
 comp_qstring           : QSTRING\r
                        | comp_qstring PLUS QSTRING     { $$ = String.Format ("{0}{1}", $1, $3); }\r
                        ;\r
 \r
 int32                  : INT32\r
-                       | INT64\r
+                        | INT64\r
+                          {\r
+                                Int64 int64 = (Int64) $1;\r
+\r
+                                if (int64 > Int32.MaxValue)\r
+                                        $$ = Int32.MaxValue;\r
+                                else if (int64 < Int32.MinValue)\r
+                                        $$ = Int32.MinValue;  \r
+                          }\r
                        ;\r
 \r
-int64                  : INT32\r
-                       | INT64\r
+int64                  : INT64\r
+                        | INT32\r
                        ;\r
 \r
 float64                        : FLOAT64\r
@@ -1349,16 +1926,32 @@ float64                 : FLOAT64
                        ;\r
 \r
 hexbyte                        : HEXBYTE\r
-                        | INT32                                 // ******** ADDED\r
-                        | ID                                    // ******** ADDED\r
+                        | INT32         { $$ = Convert.ToByte ($1); }\r
+                        | ID\r
+                          {\r
+                                $$ = Byte.Parse ((string) $1, NumberStyles.HexNumber);\r
+                          }\r
                        ;\r
 \r
-bytes                  : /* EMPTY */\r
+bytes                  : /* EMPTY */   { $$ = new byte[0]; }\r
                        | hexbytes\r
+                          {\r
+                                ArrayList byte_list = (ArrayList) $1;\r
+                                $$ = byte_list.ToArray (typeof (byte));\r
+                          }\r
                        ;\r
 \r
 hexbytes               : hexbyte\r
+                          {\r
+                                ArrayList byte_list = new ArrayList ();\r
+                                byte_list.Add (Convert.ToByte ($1));\r
+                                $$ = byte_list;\r
+                          }\r
                        | hexbytes hexbyte\r
+                          {\r
+                                ArrayList byte_list = (ArrayList) $1;\r
+                                byte_list.Add (Convert.ToByte ($2));\r
+                          }\r
                        ;\r
 \r
 truefalse              : K_TRUE\r
@@ -1370,11 +1963,10 @@ id                      : ID
                        ;\r
 \r
 comp_name              : id\r
-                       | dotted_name\r
-                       ;\r
-\r
-dotted_name            : id\r
-                       | dotted_name DOT id\r
+                       | comp_name DOT id\r
+                          {\r
+                                $$ = (string) $1 + '.' + (string) $3;\r
+                          }\r
                        ;\r
 \r
 \r