typo on last commit
[mono.git] / mcs / ilasm / parser / ILParser.jay
index 04c3d3054f0282167aaaf50f50bd84e58d37256a..67c9d234af1832d42a69b145f5b1b42b584a2df6 100644 (file)
@@ -1,11 +1,16 @@
 %{\r
-// Mono::ILASM::ILParser\r
 //\r
+// Mono::ILASM::ILParser\r
+// \r
 // (C) Sergey Chaban (serge@wildwestsoftware.com)\r
+// (C) 2003 Jackson Harper, All rights reserved\r
+//\r
 \r
 using PEAPI;\r
 using System;\r
+using System.IO;\r
 using System.Collections;\r
+using System.Globalization;\r
 \r
 namespace Mono.ILASM {\r
 \r
@@ -13,14 +18,38 @@ namespace Mono.ILASM {
 \r
                private CodeGen codegen;\r
 \r
-               public ILParser (CodeGen codegen) {\r
+               private bool is_value_class;\r
+               private bool is_enum_class;\r
+                private bool pinvoke_info;\r
+                private string pinvoke_mod;\r
+                private string pinvoke_meth;\r
+                private PEAPI.PInvokeAttr pinvoke_attr;\r
+                private ILTokenizer tokenizer;\r
+                                \r
+               public ILParser (CodeGen codegen, ILTokenizer tokenizer)\r
+                {\r
                        this.codegen = codegen;\r
+                        this.tokenizer = tokenizer;\r
                }\r
 \r
                public CodeGen CodeGen {\r
                        get { return codegen; }\r
                }\r
-               \r
+\r
+                private ITypeRef GetTypeRef (ITypeRef b)\r
+                {\r
+                        ExternTypeRefInst etri = b as ExternTypeRefInst;\r
+                        ExternTypeRef etr;\r
+\r
+                        if (etri != null)\r
+                                return etri.Clone ();\r
+\r
+                        etr = b as ExternTypeRef;\r
+                        if (etr != null)\r
+                                return etr.Clone ();\r
+\r
+                        return b;\r
+                }\r
 %}\r
 \r
 %token EOF\r
@@ -34,6 +63,9 @@ namespace Mono.ILASM {
 /* SQSTRING - single quoted string */\r
 %token SQSTRING\r
 \r
+/* COMP_NAME - A name with dots */\r
+%token COMP_NAME\r
+\r
 /* INT32 - 32 bit integer */\r
 %token INT32\r
 \r
@@ -92,8 +124,8 @@ namespace Mono.ILASM {
 %token INSTR_TOK\r
 %token INSTR_SWITCH\r
 %token INSTR_PHI\r
-\r
-\r
+%token INSTR_LOCAL\r
+%token INSTR_PARAM\r
 \r
 \r
 \r
@@ -113,6 +145,8 @@ namespace Mono.ILASM {
 %token D_CLASS\r
 %token D_COMTYPE\r
 %token D_CONFIG\r
+%token D_CONSTRAINT\r
+%token D_IMAGEBASE\r
 %token D_CORFLAGS\r
 %token D_CTOR\r
 %token D_CUSTOM\r
@@ -329,8 +363,8 @@ namespace Mono.ILASM {
 %token K_NOMETADATA\r
 %token K_ALGORITHM\r
 %token K_FULLORIGIN\r
-%token K_NAN\r
-%token K_INF\r
+// %token K_NAN\r
+// %token K_INF\r
 %token K_PUBLICKEY\r
 %token K_ENABLEJITTRACKING\r
 %token K_DISABLEJITOPTIMIZER\r
@@ -346,6 +380,7 @@ namespace Mono.ILASM {
 %token K_STRING\r
 %token K_TRUE\r
 %token K_FALSE\r
+%token K_IS\r
 \r
 /* end generated */\r
 \r
@@ -379,9 +414,18 @@ decl                       : class_all
                        | sec_decl\r
                        | customattr_decl\r
                        | D_SUBSYSTEM int32\r
+                          {\r
+                                codegen.SetSubSystem ((int) $2);\r
+                          }\r
                        | D_CORFLAGS int32\r
+                          {\r
+                                codegen.SetCorFlags ((int) $2);\r
+                          }\r
                        | D_FILE K_ALIGNMENT int32\r
-               /*      | D_IMAGEBASE int64     */\r
+                       | D_IMAGEBASE int64\r
+                          {\r
+                                codegen.SetImageBase ((long) $2);\r
+                          }\r
                        | extsource_spec\r
                        | language_decl\r
                        ;\r
@@ -397,13 +441,19 @@ language_decl             : D_LANGUAGE SQSTRING
                        | D_LANGUAGE SQSTRING COMMA SQSTRING COMMA SQSTRING\r
                        ;\r
 \r
+constraint_decl         : D_CONSTRAINT BANG int32 K_IS type\r
+                          {\r
+                                codegen.CurrentTypeDef.AddGenericConstraint ((int) $3, (ITypeRef) $5);\r
+                          }\r
+                        ;\r
+                        \r
 vtfixup_decl           : D_VTFIXUP OPEN_BRACKET int32 CLOSE_BRACKET \r
                          vtfixup_attr K_AT id\r
                        ;\r
 \r
 vtfixup_attr           : /* EMPTY */\r
-                       | vtfixup_attr int32\r
-                       | vtfixup_attr int64\r
+                       | vtfixup_attr K_INT32\r
+                       | vtfixup_attr K_INT64\r
                        | vtfixup_attr K_FROMUNMANAGED\r
                        | vtfixup_attr K_CALLMOSTDERIVED\r
                        ;\r
@@ -422,41 +472,39 @@ namespace_head            : D_NAMESPACE comp_name
 \r
 class_all              : class_head OPEN_BRACE class_decls CLOSE_BRACE\r
                           {\r
-                                codegen.CompleteClass ();\r
+                                codegen.EndTypeDef ();\r
                           }\r
                        ;\r
 \r
-class_head             : D_CLASS class_attr id typars_clause extends_clause\r
+class_head             : D_CLASS class_attr id formal_typars_clause extends_clause\r
                           impl_clause\r
                           {\r
-                                if ($5 != null) {\r
-                                       codegen.AddClass ((TypeAttr) $2, (string) $3, \r
-                                               ((TypeRef)$5).Type as Class, null);\r
-                               } else {\r
-                                       codegen.AddClass ((TypeAttr)$2, (string) $3, null);\r
-                               }\r
-                                \r
-                               ArrayList impl_list = (ArrayList) $6;\r
-                               if (impl_list != null) {\r
-                                       foreach (TypeRef type_ref in impl_list)\r
-                                               codegen.CurrentClass.AddImplementedInterface (type_ref.Type as Class);\r
-                               }\r
+                                codegen.BeginTypeDef ((TypeAttr) $2, (string) $3, \r
+                                               $5 as IClassRef, $6 as ArrayList, null);\r
+                               \r
+                               if (is_value_class)\r
+                                       codegen.CurrentTypeDef.MakeValueClass ();\r
+                               if (is_enum_class)\r
+                                       codegen.CurrentTypeDef.MakeEnumClass ();\r
 \r
                                 if ($4 != null) {\r
                                         ArrayList typars_list = (ArrayList) $4;\r
-                                        foreach (DictionaryEntry entry in typars_list) {\r
-                                                TypeRef type = (TypeRef) entry.Key;\r
-                                                string name = (string) entry.Value;\r
-                                                codegen.CurrentClass.AddGenericParameter (type.Type, name);\r
-                                        }\r
-                                }\r
+                                        foreach (string id in typars_list)\r
+                                                codegen.CurrentTypeDef.AddGenericParam (id);\r
+                                }                                \r
                           }\r
                        ;\r
 \r
 class_attrs            : class_attrs class_attr\r
                        ;\r
 \r
-class_attr             : /* EMPTY */                           { $$ = new TypeAttr (); }\r
+class_attr             : /* EMPTY */                           \r
+                         { \r
+                               // Reset some flags\r
+                               is_value_class = false;\r
+                               is_enum_class = false;\r
+                               $$ = new TypeAttr ();\r
+                         }\r
                        | class_attr K_PUBLIC                   { $$ = (TypeAttr)$1 | TypeAttr.Public; }        \r
                        | class_attr K_PRIVATE                  { $$ = (TypeAttr)$1 | TypeAttr.Private; }\r
                        | class_attr K_NESTED K_PRIVATE         { $$ = (TypeAttr)$1 | TypeAttr.NestedPrivate; }\r
@@ -465,8 +513,9 @@ class_attr          : /* EMPTY */                           { $$ = new TypeAttr (); }
                        | class_attr K_NESTED K_ASSEMBLY        { $$ = (TypeAttr)$1 | TypeAttr.NestedAssembly;}\r
                        | class_attr K_NESTED K_FAMANDASSEM     { $$ = (TypeAttr)$1 | TypeAttr.NestedFamAndAssem; }\r
                        | class_attr K_NESTED K_FAMORASSEM      { $$ = (TypeAttr)$1 | TypeAttr.NestedFamOrAssem; }\r
-                       | class_attr K_VALUE                    {  }\r
-                       | class_attr K_ENUM                     {  }\r
+                       | class_attr K_VALUE                    { is_value_class = true; }\r
+                       | class_attr K_ENUM                     { is_enum_class = true; is_value_class = true;\r
+                         }\r
                        | class_attr K_INTERFACE                { $$ = (TypeAttr)$1 | TypeAttr.Interface; }\r
                        | class_attr K_SEALED                   { $$ = (TypeAttr)$1 | TypeAttr.Sealed; }\r
                        | class_attr K_ABSTRACT                 { $$ = (TypeAttr)$1 | TypeAttr.Abstract; }\r
@@ -497,13 +546,20 @@ impl_clause               : /* EMPTY */
                           }\r
                        ;\r
 \r
-typars_clause           : /* EMPTY */\r
+formal_typars_clause           : /* EMPTY */\r
                         | OPEN_ANGLE_BRACKET formal_typars CLOSE_ANGLE_BRACKET\r
                           {\r
                                 $$ = $2;\r
                           }\r
                         ;\r
 \r
+typars_clause           : /* EMPTY */\r
+                        | OPEN_ANGLE_BRACKET typars CLOSE_ANGLE_BRACKET\r
+                          {\r
+                                $$ = $2;\r
+                          }\r
+                        ;\r
+\r
 typars                  : type\r
                           {\r
                                 ArrayList typars_list = new ArrayList ();\r
@@ -533,8 +589,10 @@ formal_typars           : formal_typar
                         ;\r
 \r
 \r
-formal_typar            : type          { $$ = new DictionaryEntry ($1, null); }\r
-                        | type id       { $$ = new DictionaryEntry ($1, $2); }\r
+formal_typar            : id\r
+                          {\r
+                                $$ = $1;\r
+                          }\r
                         ;\r
                         \r
 class_refs             : class_ref\r
@@ -557,17 +615,32 @@ slashed_name              : comp_name
                           }\r
                        ;\r
 \r
-class_ref              : OPEN_BRACKET comp_name CLOSE_BRACKET slashed_name\r
+class_ref              : OPEN_BRACKET slashed_name CLOSE_BRACKET slashed_name\r
+                          {\r
+                                if (codegen.IsThisAssembly ((string) $2)) {\r
+                                        $$ = new TypeRef ((string) $4, false, null);\r
+                                } else {\r
+                                        $$ = codegen.ExternTable.GetTypeRef ((string) $2, (string) $4, false);\r
+                                }\r
+                          }\r
+                       | OPEN_BRACKET D_MODULE slashed_name CLOSE_BRACKET slashed_name\r
                           {\r
-                                Class klass = codegen.ExternTable.GetClass ((string) $2, (string)$4);\r
-                                $$ = new ClassRef (klass, (string) $4);\r
+                                if (codegen.IsThisModule ((string) $3)) {\r
+                                        $$ = new TypeRef ((string) $5, false, null);\r
+                                } else {\r
+                                        $$ = codegen.ExternTable.GetModuleTypeRef ((string) $3, (string) $5, false);\r
+                                }\r
                           }\r
-                       | OPEN_BRACKET D_MODULE comp_name CLOSE_BRACKET slashed_name\r
                        | slashed_name\r
                           {\r
-                                $$ = new ClassRef (codegen.ClassTable.GetReference ((string) $1, null),\r
-                                       (string) $1);\r
+                                PrimitiveTypeRef prim = PrimitiveTypeRef.GetPrimitiveType ((string) $1);\r
+\r
+                                if (prim != null)\r
+                                        $$ = prim;\r
+                                else\r
+                                        $$ = new TypeRef ((string) $1, false, null);\r
                           }\r
+                      \r
                        ;\r
 \r
 class_decls            : /* EMPTY */\r
@@ -583,15 +656,44 @@ class_decl                : method_all
                        | sec_decl\r
                        | extsource_spec\r
                        | customattr_decl\r
+                          {\r
+                                codegen.CurrentTypeDef.AddCustomAttribute ((CustomAttr) $1);\r
+                          }\r
                        | D_SIZE int32\r
                           {\r
-                                \r
+                                codegen.CurrentTypeDef.SetSize ((int) $2);\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
+                          {\r
+                                codegen.CurrentTypeDef.SetPack ((int) $2);\r
+                          }\r
+                       | D_OVERRIDE type_spec DOUBLE_COLON method_name K_WITH call_conv type\r
+                          type_spec DOUBLE_COLON method_name type_list\r
+                          {\r
+                                //\r
+                                // My copy of the spec didn't have a type_list but\r
+                                // it seems pretty crucial\r
+                                //\r
+                                ITypeRef owner = (ITypeRef) $2;\r
+                                ArrayList arg_list = (ArrayList) $11;\r
+                                ITypeRef[] param_list;\r
+                                IMethodRef decl;\r
+\r
+                                if (arg_list != null)\r
+                                        param_list = (ITypeRef[]) arg_list.ToArray (typeof (ITypeRef));\r
+                                else\r
+                                        param_list = new ITypeRef[0];\r
+\r
+                                decl = owner.GetMethodRef ((ITypeRef) $7,\r
+                                        (CallConv) $6, (string) $4, param_list);\r
+\r
+                                string sig = MethodDef.CreateSignature ((string) $10,\r
+                                                                        param_list);\r
+                                codegen.CurrentTypeDef.AddOverride (sig, decl);                                        \r
+                          }\r
                          OPEN_PARENS sig_args CLOSE_PARENS\r
                        | language_decl\r
+                        | constraint_decl\r
                        ;\r
 \r
 type                   : K_CLASS class_ref\r
@@ -600,175 +702,172 @@ 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
-                                $$ = $3;\r
+                               IClassRef class_ref = (IClassRef) $3;\r
+                               class_ref.MakeValueClass ();\r
+                                $$ = class_ref;\r
                           }\r
-                       | K_VALUETYPE class_ref\r
+                       | K_VALUETYPE OPEN_BRACKET slashed_name CLOSE_BRACKET slashed_name\r
                           {\r
-                                $$ = $2;\r
+                                ExternTypeRef ext_ref = codegen.ExternTable.GetTypeRef ((string) $3, (string) $5, false);\r
+                                ExternTypeRefInst inst = new ExternTypeRefInst (ext_ref, true);\r
+                                $$ = inst;\r
+                          }\r
+                        | K_VALUETYPE slashed_name\r
+                          {\r
+                                TypeRef t_ref = new TypeRef ((string) $2, true, null);\r
+                                t_ref.MakeValueClass ();\r
+                                $$ = t_ref;\r
                           }\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 = GetTypeRef ((ITypeRef) $1);\r
+                                base_type.MakeArray ();\r
+                                $$ = base_type;\r
                           }\r
                        | type OPEN_BRACKET bounds CLOSE_BRACKET\r
                           {\r
-                                TypeRef base_type = (TypeRef) $1;\r
+                                ITypeRef base_type = GetTypeRef ((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
+                                $$ = base_type;\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 = GetTypeRef ((ITypeRef) $1);\r
+                                base_type.MakeManagedPointer ();\r
+                                $$ = base_type;\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 = GetTypeRef ((ITypeRef) $1);\r
+                                base_type.MakeUnmanagedPointer ();\r
+                                $$ = base_type;\r
                           }\r
                        | type K_PINNED\r
                           {\r
-                                TypeRef type = (TypeRef) $1;\r
-                                type.Pinned = true;\r
+                                ITypeRef base_type = GetTypeRef ((ITypeRef) $1);\r
+                                base_type.MakePinned ();\r
+                                $$ = base_type;\r
                           }\r
                        | type K_MODREQ OPEN_PARENS class_ref CLOSE_PARENS\r
                           {\r
-                                TypeRef base_type = (TypeRef) $1;\r
-                                TypeRef class_ref = (TypeRef) $4;\r
-\r
-                                $$ = new CustomModifiedType (base_type.Type,\r
-                                        CustomModifier.modreq, (Class) class_ref.Type);\r
+                                ITypeRef base_type = GetTypeRef ((ITypeRef) $1);\r
+                                IClassRef class_ref = (IClassRef) $4;\r
+                                base_type.MakeCustomModified (codegen,\r
+                                        CustomModifier.modopt, class_ref);\r
+                                $$ = base_type;\r
                           }\r
                        | type K_MODOPT OPEN_PARENS class_ref CLOSE_PARENS\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
+                                ITypeRef base_type = GetTypeRef ((ITypeRef) $1);\r
+                                IClassRef class_ref = (IClassRef) $4;\r
+                                base_type.MakeCustomModified (codegen,\r
+                                        CustomModifier.modopt, class_ref);\r
+                                $$ = base_type;\r
                           }\r
                        | K_METHOD call_conv type STAR OPEN_PARENS sig_args CLOSE_PARENS\r
+                          {\r
+                                $$ = new MethodPointerTypeRef ((CallConv) $2, (ITypeRef) $3, (ArrayList) $6);\r
+                          }\r
                        | K_TYPEDREF\r
                           {\r
-                                $$ = new TypeRef (PrimitiveType.TypedRef,\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_WCHAR\r
+                         {\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, "System.IntPtr");\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, "System.UIntPtr");\r
+                                $$ = new PrimitiveTypeRef (PrimitiveType.NativeUInt, "System.UIntPtr");\r
                           }\r
                         | BANG int32\r
                           {\r
-                                // access class type parameter by number\r
+                                GenericTypeSpec spec = new GenericTypeSpec ((int) $2);\r
+                                $$ = new GenericTypeRef (spec, $2.ToString ());\r
                           }\r
                         | BANG BANG int32\r
                           {\r
-                                // access method type parameter by number\r
+                                MVar mvar = new MVar ((int) $3);\r
+                                $$ = new GenericTypeRef (mvar, $3.ToString ());\r
+                          }\r
+                        | K_CLASS slashed_name OPEN_ANGLE_BRACKET BANG int32 CLOSE_ANGLE_BRACKET\r
+                          {\r
+                                $$ = new TypeRef ((string) $2, false, null);\r
+                          }\r
+                        | K_CLASS slashed_name OPEN_ANGLE_BRACKET typars CLOSE_ANGLE_BRACKET\r
+                          {\r
+                                ArrayList typar_list = (ArrayList) $4;\r
+                                ITypeRef[] typar_array = (ITypeRef[]) typar_list.ToArray (typeof (ITypeRef));\r
+                                \r
+                                $$ = new GenericTypeInst ((string)$2, typar_array);\r
                           }\r
                        ;\r
 \r
@@ -786,17 +885,21 @@ bounds                    : bound
                        ;\r
 \r
 bound                  : /* EMPTY */\r
+                          {\r
+                                // This is shortref for no lowerbound or size\r
+                                $$ = new DictionaryEntry (TypeRef.Ellipsis, TypeRef.Ellipsis);\r
+                          }\r
                        | ELLIPSIS\r
                           {\r
                                 // No lower bound or size\r
-                                $$ = new DictionaryEntry (null,null);\r
+                                $$ = new DictionaryEntry (TypeRef.Ellipsis, TypeRef.Ellipsis);\r
                           }\r
                        | int32\r
                           {\r
                                 // ******** Not sure what this is?\r
                                 // For now I will say it is size because there\r
                                 // is allready a way to set lower\r
-                                $$ = new DictionaryEntry (null, $1);\r
+                                $$ = new DictionaryEntry (TypeRef.Ellipsis, $1);\r
                           }\r
                        | int32 ELLIPSIS int32\r
                           {\r
@@ -806,7 +909,7 @@ bound                       : /* EMPTY */
                        | int32 ELLIPSIS\r
                           {\r
                                 // Just lower bound\r
-                                $$ = new DictionaryEntry ($1, null);\r
+                                $$ = new DictionaryEntry ($1, TypeRef.Ellipsis);\r
                           }\r
                        ;\r
 \r
@@ -1035,61 +1138,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 ((string) $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
+                                $$ = $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.ToInt32 ($3));\r
+                          }\r
                        | K_INT16 OPEN_PARENS int64 CLOSE_PARENS\r
+                          {\r
+                                $$ = new IntConst (Convert.ToInt16 ($3));\r
+                          }\r
                        | K_CHAR OPEN_PARENS int64 CLOSE_PARENS\r
+                          {\r
+                                $$ = new CharConst (Convert.ToChar ($3));\r
+                          }\r
+                       | K_WCHAR 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
-                       | K_BYTEARRAY OPEN_PARENS bytes CLOSE_PARENS\r
-                       | comp_qstring                                          // ******** ADDED\r
+                          {\r
+                                $$ = new BoolConst ((bool) $3);\r
+                          }\r
+                       | K_BYTEARRAY bytes_list\r
+                          {\r
+                                $$ = new ByteArrConst ((byte[]) $2);\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
+                                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
+                                codegen.AddDataDef (datadef);\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
@@ -1097,72 +1337,238 @@ data_body              : OPEN_BRACE dataitem_list CLOSE_BRACE
                        ;\r
 \r
 dataitem_list          : dataitem\r
+                          {\r
+                                ArrayList dataitem_list = new ArrayList ();\r
+                                dataitem_list.Add ($1);\r
+                                $$ = dataitem_list;\r
+                          }\r
                        | dataitem_list COMMA dataitem\r
+                          {\r
+                                ArrayList list = (ArrayList) $1;\r
+                                list.Add ($3);\r
+                          }\r
                        ;\r
 \r
 dataitem               : K_CHAR STAR OPEN_PARENS comp_qstring CLOSE_PARENS\r
+                          {\r
+                                $$ = new StringConst ((string) $4);\r
+                          }\r
+                       | K_WCHAR STAR OPEN_PARENS comp_qstring CLOSE_PARENS\r
+                         {\r
+                               $$ = new StringConst ((string) $4);\r
+                         }\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
+                           //     DataDef def = codegen.CurrentTypeDef.GetDataDef ((string) $3);\r
+                           //     $$ = new AddressConstant ((DataConstant) def.PeapiConstant);\r
+                          }\r
+                       | K_BYTEARRAY ASSIGN bytes_list\r
+                          {\r
+                                $$ = new ByteArrConst ((byte[]) $3);\r
+                          }\r
+                       | K_BYTEARRAY bytes_list\r
+                          {\r
+                                // ******** THIS IS NOT IN THE SPECIFICATION ******** //\r
+                                $$ = new ByteArrConst ((byte[]) $2);\r
+                          }\r
                        | K_FLOAT32 OPEN_PARENS float64 CLOSE_PARENS repeat_opt\r
+                          {\r
+                                double d = (double) $3;\r
+                                FloatConst float_const = new FloatConst ((float) d);\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
+                                int i = (int) $3;\r
+                                IntConst int_const = new IntConst ((short) i);\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
+                                int i = (int) $3;\r
+                                IntConst int_const = new IntConst ((sbyte) i);\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
-                          typars_clause OPEN_PARENS sig_args CLOSE_PARENS impl_attr\r
+                          formal_typars_clause OPEN_PARENS sig_args CLOSE_PARENS impl_attr\r
+                          {\r
+                                MethodDef methdef = new MethodDef ((MethAttr) $2, (CallConv) $3,\r
+                                        (ImplAttr) $11, (string) $6, (ITypeRef) $5,\r
+                                        (ArrayList) $9);\r
+                                codegen.BeginMethodDef (methdef);\r
+\r
+                                if (pinvoke_info) {\r
+                                        ExternModule mod = codegen.ExternTable.AddModule (pinvoke_mod);\r
+                                        methdef.AddPInvokeInfo (pinvoke_attr, mod, pinvoke_meth);\r
+                                        pinvoke_info = false;\r
+                                }\r
+\r
+                                if ($7 != null) {\r
+                                        ArrayList typars_list = (ArrayList) $7;\r
+                                        foreach (string id in typars_list)\r
+                                                methdef.AddGenericParam (id);\r
+                                }\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_COMPILERCONTROLLED { /* Do nothing */ }\r
+                       | meth_attr K_UNMANAGEDEXP      \r
                        | meth_attr K_PINVOKEIMPL OPEN_PARENS comp_qstring K_AS\r
                                comp_qstring pinv_attr CLOSE_PARENS\r
+                          {\r
+                                pinvoke_info = true;\r
+                                pinvoke_mod = (string) $4;\r
+                                pinvoke_meth = (string) $6;\r
+                                pinvoke_attr = (PInvokeAttr) $7;\r
+                          }\r
                        | meth_attr K_PINVOKEIMPL OPEN_PARENS comp_qstring pinv_attr CLOSE_PARENS\r
+                          {\r
+                                pinvoke_info = true;\r
+                                pinvoke_mod = (string) $4;\r
+                                pinvoke_meth = null;\r
+                                pinvoke_attr = (PInvokeAttr) $5;\r
+                          }\r
                        | meth_attr K_PINVOKEIMPL OPEN_PARENS pinv_attr CLOSE_PARENS\r
+                          {\r
+                                pinvoke_info = true;\r
+                                pinvoke_mod = null;\r
+                                pinvoke_meth = null;\r
+                                pinvoke_attr = (PInvokeAttr) $4;\r
+                          }\r
                        ;\r
 \r
-pinv_attr              : /* EMPTY */\r
-                       | pinv_attr K_NOMANGLE\r
-                       | pinv_attr K_ANSI\r
-                       | pinv_attr K_UNICODE\r
-                       | pinv_attr K_AUTOCHAR\r
-                       | pinv_attr K_LASTERR\r
-                       | pinv_attr K_WINAPI\r
-                       | pinv_attr K_CDECL\r
-                       | pinv_attr K_STDCALL\r
-                       | pinv_attr K_THISCALL\r
-                       | pinv_attr K_FASTCALL\r
+pinv_attr              : /* EMPTY */ { $$ = new PInvokeAttr (); }\r
+                       | pinv_attr K_NOMANGLE { $$ = (PInvokeAttr) $1 | PInvokeAttr.nomangle; }\r
+                       | pinv_attr K_ANSI { $$ = (PInvokeAttr) $1 | PInvokeAttr.ansi; }\r
+                       | pinv_attr K_UNICODE { $$ = (PInvokeAttr) $1 | PInvokeAttr.unicode; }\r
+                       | pinv_attr K_AUTOCHAR { $$ = (PInvokeAttr) $1 | PInvokeAttr.autochar; }\r
+                       | pinv_attr K_LASTERR { $$ = (PInvokeAttr) $1 | PInvokeAttr.lasterr; }\r
+                       | pinv_attr K_WINAPI { $$ = (PInvokeAttr) $1 | PInvokeAttr.winapi; }\r
+                       | pinv_attr K_CDECL { $$ = (PInvokeAttr) $1 | PInvokeAttr.cdecl; }\r
+                       | pinv_attr K_STDCALL { $$ = (PInvokeAttr) $1 | PInvokeAttr.stdcall; }\r
+                       | pinv_attr K_THISCALL { $$ = (PInvokeAttr) $1 | PInvokeAttr.thiscall; }\r
+                       | pinv_attr K_FASTCALL { $$ = (PInvokeAttr) $1 | PInvokeAttr.fastcall; }\r
                        ;\r
 \r
 method_name            : D_CTOR\r
@@ -1170,159 +1576,634 @@ 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_IL                { $$ = (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_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
+                        | ELLIPSIS\r
+                          {\r
+                               $$ = new ParamDef ((ParamAttr) 0, "...", new SentinelTypeRef ());\r
+                                // $$ = ParamDef.Ellipsis;\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 */\r
+                          {\r
+                                $$ = new ArrayList (0);\r
+                          }\r
+                        | ELLIPSIS\r
+                          {\r
+                                ArrayList type_list = new ArrayList ();\r
+                                // type_list.Add (TypeRef.Ellipsis);\r
+                               type_list.Add (new SentinelTypeRef ());\r
+                                $$ = type_list;\r
+                          }\r
+                        | type_list COMMA ELLIPSIS\r
+                          {\r
+                                ArrayList type_list = (ArrayList) $1;\r
+                                // type_list.Add (TypeRef.Ellipsis);\r
+                               type_list.Add (new SentinelTypeRef ());\r
+                               $$ = type_list;\r
+                          }\r
+                        | param_attr type opt_id\r
+                          {\r
+                                ArrayList type_list = new ArrayList ();\r
+                                type_list.Add ($2);\r
+                                $$ = type_list;\r
+                          }\r
+                        | type_list COMMA param_attr type opt_id\r
+                          {\r
+                                ArrayList type_list = (ArrayList) $1;\r
+                                type_list.Add ($4);\r
+                          }\r
+                        ;\r
+\r
+opt_id                  : /* EMPTY */\r
+                        | id\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
+                          {\r
+                                codegen.CurrentMethodDef.SetMaxStack ((int) $2);\r
+                          }\r
+                       | D_LOCALS OPEN_PARENS local_list CLOSE_PARENS\r
+                          {\r
+                                if ($3 != null) {\r
+                                        codegen.CurrentMethodDef.AddLocals (\r
+                                                (ArrayList) $3);\r
+                                }\r
+                          }\r
+                       | D_LOCALS K_INIT OPEN_PARENS local_list CLOSE_PARENS\r
+                          {\r
+                                if ($4 != null) {\r
+                                        codegen.CurrentMethodDef.AddLocals (\r
+                                                (ArrayList) $4);\r
+                                        codegen.CurrentMethodDef.InitLocals ();\r
+                                }\r
+                          }\r
                        | D_ENTRYPOINT\r
+                          {\r
+                                codegen.CurrentMethodDef.EntryPoint ();\r
+                          }\r
                        | D_ZEROINIT\r
+                          {\r
+                                codegen.CurrentMethodDef.ZeroInit ();\r
+                          }\r
                        | D_EXPORT OPEN_BRACKET int32 CLOSE_BRACKET\r
                        | D_EXPORT OPEN_BRACKET int32 CLOSE_BRACKET K_AS id\r
                        | D_VTENTRY int32 COLON int32 \r
                        | D_OVERRIDE type_spec DOUBLE_COLON method_name\r
-                       | scope_block\r
+                          {\r
+                                codegen.CurrentTypeDef.AddOverride (codegen.CurrentMethodDef,\r
+                                        (ITypeRef) $2, (string) $4);\r
+                                \r
+                          }\r
+                       | 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
                        | extsource_spec\r
                        | language_decl\r
                        | customattr_decl\r
+                          {\r
+                                codegen.CurrentMethodDef.AddCustomAttr ((CustomAttr) $1);\r
+                          }\r
                        | 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
+                        | slot_num type\r
+                          {\r
+                                $$ = new Local ((int) $1, (ITypeRef) $2);\r
+                          }\r
+                        | slot_num type id\r
+                          {\r
+                                $$ = new Local ((int) $1, (string) $3, (ITypeRef) $2);\r
+                          }\r
+                        ;\r
+\r
+slot_num                : OPEN_BRACKET int32 CLOSE_BRACKET\r
+                          {\r
+                                $$ = $2;\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
+                       | OPEN_BRACKET slashed_name CLOSE_BRACKET\r
+                          {\r
+                                // This is a reference to a global method in another\r
+                                // assembly. This is not supported in the MS version of ilasm\r
+                          }\r
+                       | OPEN_BRACKET D_MODULE slashed_name CLOSE_BRACKET\r
+                          {\r
+                                string module = (string) $3;\r
+\r
+                                if (codegen.IsThisModule (module)) {\r
+                                    // This is not handled yet.\r
+                                } else {\r
+                                    $$ = codegen.ExternTable.GetModuleTypeRef ((string) $3, "<Module>", false);\r
+                                }\r
+\r
+                          }\r
                        | type\r
                        ;\r
 \r
-scope_block            : OPEN_BRACE method_decls CLOSE_BRACE\r
+scope_block            : scope_block_begin method_decls CLOSE_BRACE\r
+                          {\r
+                                $$ = new HandlerBlock ((LabelInfo) $1,\r
+                                        codegen.CurrentMethodDef.AddLabel ());\r
+                          }\r
                        ;\r
 \r
+scope_block_begin       : OPEN_BRACE\r
+                          {\r
+                                $$ = codegen.CurrentMethodDef.AddLabel ();\r
+                          }\r
+                        ;\r
+                        \r
+                        \r
 seh_block              : try_block seh_clauses\r
+                          {\r
+                                TryBlock try_block = (TryBlock) $1;\r
+\r
+                                ArrayList clause_list = (ArrayList) $2;\r
+                                foreach (object clause in clause_list)\r
+                                        try_block.AddSehClause ((ISehClause) clause);\r
+\r
+                                codegen.CurrentMethodDef.AddInstr (try_block);\r
+                          }\r
                        ;\r
 \r
 try_block              : D_TRY scope_block\r
+                          {\r
+                                $$ = new TryBlock ((HandlerBlock) $2);\r
+                          }\r
                        | D_TRY id K_TO id\r
+                          {\r
+                               LabelInfo from = codegen.CurrentMethodDef.AddLabelRef ((string) $2);\r
+                               LabelInfo to = codegen.CurrentMethodDef.AddLabelRef ((string) $4);\r
+                               \r
+                                $$ = new TryBlock (new HandlerBlock (from, to));\r
+                          }\r
                        | D_TRY int32 K_TO int32\r
+                         {\r
+                               LabelInfo from = codegen.CurrentMethodDef.AddLabel ((int) $2);\r
+                               LabelInfo to = codegen.CurrentMethodDef.AddLabel ((int) $4);\r
+                               \r
+                               $$ = new TryBlock (new HandlerBlock (from, to));\r
+                         }\r
                        ;\r
 \r
 seh_clauses            : seh_clause\r
+                          {\r
+                                ArrayList clause_list = new ArrayList ();\r
+                                clause_list.Add ($1);\r
+                                $$ = clause_list;\r
+                          }\r
                        | seh_clauses seh_clause\r
+                          {\r
+                                ArrayList clause_list = (ArrayList) $1;\r
+                                clause_list.Add ($2);\r
+                          }\r
                        ;\r
 \r
 seh_clause             : K_CATCH class_ref handler_block\r
+                          {\r
+                                IClassRef type = (IClassRef) $2;\r
+                                CatchBlock cb = new CatchBlock (type);\r
+                                cb.SetHandlerBlock ((HandlerBlock) $3);\r
+                                $$ = cb;\r
+                          }\r
                        | K_FINALLY handler_block\r
+                          {\r
+                                FinallyBlock fb = new FinallyBlock ();\r
+                                fb.SetHandlerBlock ((HandlerBlock) $2);\r
+                                $$ = fb;\r
+                          }\r
                        | K_FAULT handler_block\r
+                          {\r
+                                FaultBlock fb = new FaultBlock ();\r
+                                fb.SetHandlerBlock ((HandlerBlock) $2);\r
+                                $$ = fb;\r
+                          }\r
                        | filter_clause handler_block\r
+                          {\r
+                                FilterBlock fb = (FilterBlock) $1;\r
+                                fb.SetHandlerBlock ((HandlerBlock) $2);\r
+                          }\r
                        ;\r
 \r
 filter_clause          : K_FILTER scope_block\r
+                          {\r
+                                HandlerBlock block = (HandlerBlock) $2;\r
+                                FilterBlock fb = new FilterBlock (block);\r
+                                $$ = fb;\r
+                          }\r
                        | K_FILTER id\r
+                          {\r
+                               LabelInfo from = codegen.CurrentMethodDef.AddLabelRef ((string) $2);\r
+                                FilterBlock fb = new FilterBlock (new HandlerBlock (from, null));\r
+                                $$ = fb;\r
+                          }\r
                        | K_FILTER int32\r
+                         {\r
+                               LabelInfo from = codegen.CurrentMethodDef.AddLabel ((int) $2);\r
+                               FilterBlock fb = new FilterBlock (new HandlerBlock (from, null));\r
+                               $$ = fb;\r
+                         }\r
                        ;\r
 \r
 handler_block          : scope_block\r
+                          {\r
+                                \r
+                          }\r
                        | K_HANDLER id K_TO id\r
+                          {    \r
+                               LabelInfo from = codegen.CurrentMethodDef.AddLabelRef ((string) $2);\r
+                               LabelInfo to = codegen.CurrentMethodDef.AddLabelRef ((string) $4);\r
+\r
+                                $$ = new HandlerBlock (from, to);\r
+                          }\r
                        | K_HANDLER int32 K_TO int32\r
+                         {\r
+                               LabelInfo from = codegen.CurrentMethodDef.AddLabelRef ((string) $2);\r
+                               LabelInfo to = codegen.CurrentMethodDef.AddLabelRef ((string) $4);\r
+\r
+                               $$ = new HandlerBlock (from, to);\r
+                         }\r
                        ;\r
 \r
 instr                  : INSTR_NONE\r
-                       | INSTR_VAR int32\r
+                          {\r
+                                codegen.CurrentMethodDef.AddInstr (\r
+                                        new SimpInstr ((Op) $1));\r
+                          }\r
+                       | INSTR_LOCAL int32\r
+                          {\r
+                                codegen.CurrentMethodDef.AddInstr (\r
+                                        new IntInstr ((IntOp) $1, (int) $2));        \r
+                          }\r
+                        | INSTR_LOCAL id\r
+                          {\r
+                                int slot = codegen.CurrentMethodDef.GetNamedLocalSlot ((string) $2);\r
+                                codegen.CurrentMethodDef.AddInstr (\r
+                                        new IntInstr ((IntOp) $1, slot));\r
+                          }\r
+                        | INSTR_PARAM int32\r
+                          {\r
+                                codegen.CurrentMethodDef.AddInstr (\r
+                                        new IntInstr ((IntOp) $1, (int) $2));\r
+                          }\r
+                        | INSTR_PARAM id\r
+                          {\r
+                                int pos = codegen.CurrentMethodDef.GetNamedParamPos ((string) $2);\r
+                                codegen.CurrentMethodDef.AddInstr (\r
+                                        new IntInstr ((IntOp) $1, pos));\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\r
+                          {\r
+                                int slot = codegen.CurrentMethodDef.GetNamedLocalSlot ((string) $2);\r
+                                codegen.CurrentMethodDef.AddInstr (new\r
+                                        IntInstr ((IntOp) $1, slot));\r
+                          }\r
                        | INSTR_I8 int64\r
+                          {\r
+                                if ($1 is MiscInstr) {\r
+                                        switch ((MiscInstr) $1) {\r
+                                        case MiscInstr.ldc_i8:\r
+                                        codegen.CurrentMethodDef.AddInstr (new LdcInstr ((MiscInstr) $1,\r
+                                                (long) $2));\r
+                                        break;\r
+                                        }\r
+                                }\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
-                       | INSTR_R OPEN_PARENS bytes CLOSE_PARENS\r
+                          {\r
+                                long l = (long) $2;\r
+                                \r
+                                switch ((MiscInstr) $1) {\r
+                                        case MiscInstr.ldc_r4:\r
+                                        case MiscInstr.ldc_r8:\r
+                                        codegen.CurrentMethodDef.AddInstr (new LdcInstr ((MiscInstr) $1, (double) l));\r
+                                        break;\r
+                                }\r
+                          }\r
+                       | INSTR_R bytes_list\r
                        | INSTR_BRTARGET int32\r
+                          {\r
+                               LabelInfo target = codegen.CurrentMethodDef.AddLabel ((int) $2);\r
+                                codegen.CurrentMethodDef.AddInstr (new BranchInstr ((BranchOp) $1,\r
+                                                                  target));  \r
+                          }\r
                        | INSTR_BRTARGET id\r
+                          {\r
+                               LabelInfo target = codegen.CurrentMethodDef.AddLabelRef ((string) $2);\r
+                                codegen.CurrentMethodDef.AddInstr (new BranchInstr ((BranchOp) $1,\r
+                                                                  target));\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
+                          {\r
+                                \r
+                                ITypeRef owner = (ITypeRef) $3;\r
+                                IFieldRef fieldref = owner.GetFieldRef (\r
+                                        (ITypeRef) $2, (string) $5);\r
+\r
+                                codegen.CurrentMethodDef.AddInstr (new FieldInstr ((FieldOp) $1, fieldref));\r
+                          }\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
+                          {\r
+                                GlobalFieldRef fieldref = new GlobalFieldRef ((ITypeRef) $2, (string) $3);\r
+\r
+                                codegen.CurrentMethodDef.AddInstr (new FieldInstr ((FieldOp) $1, fieldref));\r
+                          }\r
                        | INSTR_TYPE type_spec\r
+                          {\r
+                                codegen.CurrentMethodDef.AddInstr (new TypeInstr ((TypeOp) $1,\r
+                                        (ITypeRef) $2));\r
+                          }\r
                        | INSTR_STRING comp_qstring\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
+                          {\r
+                                if ((MiscInstr) $1 == MiscInstr.ldstr)\r
+                                        codegen.CurrentMethodDef.AddInstr (new LdstrInstr ((string) $2));\r
+                          }\r
+                       | INSTR_STRING K_BYTEARRAY ASSIGN bytes_list\r
+                          {\r
+                                byte[] bs = (byte[]) $4;\r
+                                if ((MiscInstr) $1 == MiscInstr.ldstr)\r
+                                        codegen.CurrentMethodDef.AddInstr (new LdstrInstr (bs));\r
+                          }\r
+                       | INSTR_STRING K_BYTEARRAY bytes_list\r
+                          {\r
+                                byte[] bs = (byte[]) $3;\r
+                                if ((MiscInstr) $1 == MiscInstr.ldstr)\r
+                                        codegen.CurrentMethodDef.AddInstr (new LdstrInstr (bs));\r
+                          }\r
+                       | INSTR_SIG call_conv type OPEN_PARENS type_list CLOSE_PARENS\r
+                          {\r
+                                ArrayList arg_list = (ArrayList) $5;\r
+                                ITypeRef[] arg_array = null;\r
+\r
+                                if (arg_list != null)\r
+                                        arg_array = (ITypeRef[]) arg_list.ToArray (typeof (ITypeRef));\r
+\r
+                                codegen.CurrentMethodDef.AddInstr (new CalliInstr ((CallConv) $2,\r
+                                        (ITypeRef) $3, arg_array));\r
+                          }     \r
                        | INSTR_TOK owner_type\r
+                          {\r
+                                if ((MiscInstr) $1 == MiscInstr.ldtoken) {\r
+                                        if ($2 is IMethodRef)\r
+                                                codegen.CurrentMethodDef.AddInstr (new LdtokenInstr ((IMethodRef) $2));\r
+                                        else if ($2 is IFieldRef)\r
+                                                codegen.CurrentMethodDef.AddInstr (new LdtokenInstr ((IFieldRef) $2));\r
+                                        else\r
+                                                codegen.CurrentMethodDef.AddInstr (new LdtokenInstr ((ITypeRef) $2));\r
+                                                \r
+                                }\r
+                          }\r
                        | INSTR_SWITCH OPEN_PARENS labels CLOSE_PARENS\r
+                          {\r
+                                codegen.CurrentMethodDef.AddInstr (new SwitchInstr ((ArrayList) $3));\r
+                          }\r
                        ;\r
 \r
-method_ref             : call_conv type type_spec DOUBLE_COLON method_name \r
-                         OPEN_PARENS sig_args CLOSE_PARENS\r
+method_ref             : call_conv type type_spec DOUBLE_COLON method_name\r
+                          OPEN_PARENS type_list CLOSE_PARENS \r
+                          {\r
+                                ITypeRef owner = (ITypeRef) $3;\r
+                                ArrayList arg_list = (ArrayList) $7;\r
+                                ITypeRef[] param_list;\r
+                                IMethodRef methref;\r
+\r
+                                if (arg_list != null)\r
+                                        param_list = (ITypeRef[]) arg_list.ToArray (typeof (ITypeRef));\r
+                                else\r
+                                        param_list = new ITypeRef[0];\r
+\r
+                                if (owner.UseTypeSpec) {\r
+                                        methref = new TypeSpecMethodRef (owner, (ITypeRef) $2,\r
+                                                (CallConv) $1, (string) $5, param_list);\r
+                                } else {\r
+                                        methref = owner.GetMethodRef ((ITypeRef) $2,\r
+                                                (CallConv) $1, (string) $5, param_list);\r
+                                }\r
+\r
+                                $$ = methref;\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
+                                ITypeRef[] param_list;\r
+  \r
+                                if (arg_list != null)\r
+                                        param_list = (ITypeRef[]) arg_list.ToArray (typeof (ITypeRef));\r
+                                else\r
+                                        param_list = new ITypeRef[0];\r
+\r
+                                $$ = new GlobalMethodRef ((ITypeRef) $2, (CallConv) $1,\r
+                                        (string) $3, param_list);\r
+                          }\r
+                        | call_conv type type_spec DOUBLE_COLON method_name\r
+                          typars_clause OPEN_PARENS type_list CLOSE_PARENS \r
+                          {\r
+                                ITypeRef owner = (ITypeRef) $3;\r
+                                ArrayList arg_list = (ArrayList) $8;\r
+                                ITypeRef[] param_list;\r
+                                IMethodRef methref;\r
+\r
+                                if (arg_list != null)\r
+                                        param_list = (ITypeRef[]) arg_list.ToArray (typeof (ITypeRef));\r
+                                else\r
+                                        param_list = new ITypeRef[0];\r
+\r
+                                if (owner.UseTypeSpec) {\r
+                                        methref = new TypeSpecMethodRef (owner, (ITypeRef) $2,\r
+                                                (CallConv) $1, (string) $5, param_list);\r
+                                } else {\r
+                                        methref = owner.GetMethodRef ((ITypeRef) $2,\r
+                                                (CallConv) $1, (string) $5, param_list);\r
+                                }\r
+\r
+                                if ($6 != null) {\r
+                                        ArrayList tp = (ArrayList) $6;\r
+                                        ITypeRef[] ta = (ITypeRef[]) tp.ToArray (typeof (ITypeRef));\r
+                                        \r
+                                        methref = new GenericMethodRef (methref, new GenericMethodSig (ta));\r
+                                }\r
+                                \r
+                                $$ = methref;\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
                        | member_ref\r
                        ;\r
 \r
-member_ref             : K_METHOD member_ref\r
+member_ref             : K_METHOD method_ref\r
+                          {\r
+                                $$ = $2;\r
+                          }\r
                        | K_FIELD type type_spec DOUBLE_COLON id\r
+                          {\r
+                                ITypeRef owner = (ITypeRef) $3;\r
+\r
+                                $$ = owner.GetFieldRef (\r
+                                        (ITypeRef) $2, (string) $5);\r
+                          }\r
                        | K_FIELD type id\r
+                          {\r
+                                $$ = new GlobalFieldRef ((ITypeRef) $2, (string) $3);\r
+                          }\r
                        ;\r
 \r
 event_all              : event_head OPEN_BRACE event_decls CLOSE_BRACE\r
+                          {\r
+                                codegen.CurrentTypeDef.EndEventDef ();\r
+                          }\r
                        ;\r
 \r
 event_head             : D_EVENT event_attr type_spec id\r
+                          {\r
+                                EventDef event_def = new EventDef ((FeatureAttr) $2,\r
+                                        (ITypeRef) $3, (string) $4);\r
+                                codegen.CurrentTypeDef.BeginEventDef (event_def);\r
+                          }\r
                        | D_EVENT event_attr id\r
                        ;\r
 \r
 event_attr             : /* EMPTY */\r
+                          {\r
+                                $$ = new FeatureAttr ();\r
+                          }\r
                        | event_attr K_RTSPECIALNAME\r
+                          {\r
+                                $$ = (FeatureAttr) $1 & FeatureAttr.Rtspecialname;\r
+                          }\r
                        | event_attr K_SPECIALNAME\r
+                          {\r
+                                $$ = (FeatureAttr) $1 & FeatureAttr.Specialname;\r
+                          }\r
                        ;\r
 \r
 event_decls            : /* EMPTY */\r
@@ -1330,23 +2211,63 @@ event_decls             : /* EMPTY */
                        ;\r
 \r
 event_decl             : D_ADDON method_ref\r
+                          {\r
+                                codegen.CurrentTypeDef.CurrentEvent.AddAddon (\r
+                                        (MethodRef) $2);                                \r
+                          }\r
                        | D_REMOVEON method_ref\r
+                          {\r
+                                codegen.CurrentTypeDef.CurrentEvent.AddRemoveon (\r
+                                        (MethodRef) $2);\r
+                          }\r
                        | D_FIRE method_ref\r
+                          {\r
+                                codegen.CurrentTypeDef.CurrentEvent.AddFire (\r
+                                        (MethodRef) $2);\r
+                          }\r
                        | D_OTHER method_ref\r
+                          {\r
+                                codegen.CurrentTypeDef.CurrentEvent.AddOther (\r
+                                        (MethodRef) $2);\r
+                          }\r
                        | customattr_decl\r
                        | extsource_spec\r
                        | language_decl\r
                        ;\r
 \r
 prop_all               : prop_head OPEN_BRACE prop_decls CLOSE_BRACE\r
+                          {\r
+                                codegen.CurrentTypeDef.EndPropertyDef ();\r
+                          }\r
                        ;\r
 \r
-prop_head              : D_PROPERTY prop_attr type id OPEN_PARENS sig_args CLOSE_PARENS init_opt\r
+prop_head              : D_PROPERTY prop_attr type id OPEN_PARENS type_list CLOSE_PARENS init_opt\r
+                          {\r
+                                PropertyDef prop_def = new PropertyDef ((FeatureAttr) $2, (ITypeRef) $3,\r
+                                        (string) $4, (ArrayList) $6);\r
+                                codegen.CurrentTypeDef.BeginPropertyDef (prop_def);\r
+\r
+                                if ($8 != null) {\r
+                                        prop_def.AddInitValue ((Constant) $8);\r
+                                }\r
+                          }\r
                        ;\r
 \r
 prop_attr              : /* EMPTY */\r
+                          {\r
+                                $$ = new FeatureAttr ();\r
+                          }\r
                        | prop_attr K_RTSPECIALNAME\r
+                          {\r
+                                $$ = (FeatureAttr) $1 | FeatureAttr.Rtspecialname;\r
+                          }\r
                        | prop_attr K_SPECIALNAME\r
+                          {\r
+                                $$ = (FeatureAttr) $1 | FeatureAttr.Specialname;\r
+                          }\r
+                        | prop_attr K_INSTANCE\r
+                          {\r
+                          }\r
                        ;\r
 \r
 prop_decls             : /* EMPTY */\r
@@ -1354,29 +2275,70 @@ prop_decls              : /* EMPTY */
                        ;\r
 \r
 prop_decl              : D_SET method_ref\r
+                          {\r
+                                codegen.CurrentTypeDef.CurrentProperty.AddSet ((MethodRef) $2);\r
+                          }\r
                        | D_GET method_ref\r
+                          {\r
+                                codegen.CurrentTypeDef.CurrentProperty.AddGet ((MethodRef) $2);\r
+                          }\r
                        | D_OTHER method_ref\r
+                          {\r
+                                codegen.CurrentTypeDef.CurrentProperty.AddOther ((MethodRef) $2);\r
+                          }\r
                        | customattr_decl\r
                        | extsource_spec\r
                        | language_decl\r
                        ;\r
 \r
 customattr_decl                : D_CUSTOM custom_type\r
+                          {\r
+                                $$ = new CustomAttr ((IMethodRef) $2, null);\r
+                          }\r
                        | D_CUSTOM custom_type ASSIGN comp_qstring\r
-                       | D_CUSTOM custom_type ASSIGN OPEN_PARENS bytes CLOSE_PARENS\r
+                       | D_CUSTOM custom_type ASSIGN bytes_list\r
+                          {\r
+                                $$ = new CustomAttr ((IMethodRef) $2,\r
+                                        (byte[]) $4);\r
+                          }\r
                        | D_CUSTOM OPEN_PARENS owner_type CLOSE_PARENS custom_type\r
                        | D_CUSTOM OPEN_PARENS owner_type CLOSE_PARENS custom_type ASSIGN comp_qstring\r
                        | D_CUSTOM OPEN_PARENS owner_type CLOSE_PARENS custom_type ASSIGN\r
-                         OPEN_PARENS bytes CLOSE_PARENS\r
+                         bytes_list\r
                        ;\r
                        \r
-custom_type            : call_conv type type_spec DOUBLE_COLON D_CTOR OPEN_PARENS sig_args CLOSE_PARENS\r
-                       | call_conv type D_CTOR OPEN_PARENS sig_args CLOSE_PARENS\r
+custom_type            : call_conv type type_spec DOUBLE_COLON D_CTOR OPEN_PARENS type_list CLOSE_PARENS\r
+                          {\r
+                                ITypeRef owner = (ITypeRef) $3;\r
+                                ArrayList arg_list = (ArrayList) $7;\r
+                                ITypeRef[] param_list;\r
+  \r
+                                if (arg_list != null)\r
+                                        param_list = (ITypeRef[]) arg_list.ToArray (typeof (ITypeRef));\r
+                                else\r
+                                        param_list = new ITypeRef[0];\r
+\r
+                                $$ = owner.GetMethodRef ((ITypeRef) $2,\r
+                                        (CallConv) $1, (string) $5, param_list);\r
+                          }\r
+                       | call_conv type D_CTOR OPEN_PARENS type_list CLOSE_PARENS\r
+                          {\r
+                                ArrayList arg_list = (ArrayList) $5;\r
+                                ITypeRef[] param_list;\r
+  \r
+                                if (arg_list != null)\r
+                                        param_list = (ITypeRef[]) arg_list.ToArray (typeof (ITypeRef));\r
+                                else\r
+                                        param_list = new ITypeRef[0];\r
+\r
+                                $$ = new GlobalMethodRef ((ITypeRef) $2, (CallConv) $1,\r
+                                        (string) $3, param_list);\r
+                          }\r
                        ;\r
 \r
 sec_decl               : D_PERMISSION sec_action type_spec OPEN_PARENS nameval_pairs CLOSE_PARENS\r
                        | D_PERMISSION sec_action type_spec\r
-                       | D_PERMISSIONSET sec_action ASSIGN OPEN_PARENS bytes CLOSE_PARENS\r
+                       | D_PERMISSIONSET sec_action ASSIGN bytes_list\r
                        ;\r
 \r
 nameval_pairs          : nameval_pair \r
@@ -1414,27 +2376,57 @@ sec_action              : K_REQUEST
                        ;\r
 \r
 module_head            : D_MODULE\r
+                          {\r
+                          }\r
                        | D_MODULE comp_name\r
+                          {\r
+                                codegen.SetModuleName ((string) $2);\r
+                          }\r
                        | D_MODULE K_EXTERN comp_name\r
+                          {\r
+                                codegen.ExternTable.AddModule ((string) $3);                         \r
+                          }\r
                        ;\r
 \r
 file_decl              : D_FILE file_attr comp_name file_entry D_HASH ASSIGN\r
-                         OPEN_PARENS bytes CLOSE_PARENS file_entry\r
+                         bytes_list file_entry\r
+                          {\r
+                                codegen.SetFileRef (new FileRef ((string) $3, (byte []) $7, (bool) $2, (bool) $8)); \r
+                          }\r
                        | D_FILE file_attr comp_name file_entry\r
+                          {\r
+                                // We need to compute the hash ourselves. :-(\r
+                                // AssemblyName an = AssemblyName.GetName ((string) $3);\r
+                          }\r
                        ;\r
 \r
 file_attr              : /* EMPTY */\r
+                          {\r
+                                $$ = true;\r
+                          }\r
                        | file_attr K_NOMETADATA\r
+                          {\r
+                                $$ = false;\r
+                          }\r
                        ;\r
 \r
 file_entry             : /* EMPTY */\r
+                          {\r
+                                $$ = false;\r
+                          }\r
                        | D_ENTRYPOINT\r
+                          {\r
+                                $$ = true;\r
+                          }\r
                        ;\r
 \r
 assembly_all           : assembly_head OPEN_BRACE assembly_decls CLOSE_BRACE\r
                        ;\r
 \r
-assembly_head          : D_ASSEMBLY asm_attr comp_name\r
+assembly_head          : D_ASSEMBLY asm_attr slashed_name\r
+                          {\r
+                                codegen.SetAssemblyName ((string) $3);\r
+                          }\r
                        ;\r
 \r
 asm_attr               : /* EMPTY */\r
@@ -1447,32 +2439,86 @@ assembly_decls          : /* EMPTY */
                        | assembly_decls assembly_decl\r
                        ;\r
 \r
-assembly_decl          : D_HASH K_ALGORITHM int32\r
+assembly_decl          : D_PUBLICKEY ASSIGN bytes_list\r
+                         {\r
+                               codegen.SetAssemblyPublicKey ((byte []) $3);\r
+                         }\r
+                       | D_VER int32 COLON int32 COLON int32 COLON int32\r
+                         {\r
+                               codegen.SetAssemblyVersion ((int) $2, (int) $4, (int) $6, (int) $8);\r
+                         }\r
+                       | D_LOCALE comp_qstring\r
+                         {\r
+                               codegen.SetAssemblyLocale ((string) $2);\r
+                         }\r
+                       | D_LOCALE ASSIGN bytes_list\r
+                       | D_HASH K_ALGORITHM int32\r
+                         {\r
+                               codegen.SetAssemblyHashAlgorithm ((int) $3);\r
+                         }\r
+                       | customattr_decl\r
+                         {\r
+                               codegen.AddAssemblyCustomAttribute ((CustomAttr) $1);\r
+                         }\r
                        | sec_decl\r
-                       | asm_or_ref_decl\r
                        ;\r
 \r
-asm_or_ref_decl                : D_PUBLICKEY ASSIGN OPEN_PARENS bytes CLOSE_PARENS\r
+asm_or_ref_decl                : D_PUBLICKEY ASSIGN bytes_list\r
                        | D_VER int32 COLON int32 COLON int32 COLON int32 \r
                        | D_LOCALE comp_qstring\r
-                       | D_LOCALE ASSIGN OPEN_PARENS bytes CLOSE_PARENS\r
+                       | D_LOCALE ASSIGN bytes_list\r
                        | customattr_decl\r
                        ;\r
 \r
 assemblyref_all                : assemblyref_head OPEN_BRACE assemblyref_decls CLOSE_BRACE\r
                        ;\r
 \r
-assemblyref_head       : D_ASSEMBLY K_EXTERN comp_name\r
-                       | D_ASSEMBLY K_EXTERN comp_name K_AS comp_name\r
+assemblyref_head       : D_ASSEMBLY K_EXTERN slashed_name\r
+                          {\r
+                                System.Reflection.AssemblyName asmb_name = \r
+                                       new System.Reflection.AssemblyName ();\r
+                               asmb_name.Name = (string) $3;\r
+                               codegen.BeginAssemblyRef ((string) $3, asmb_name);\r
+                          }\r
+                       | D_ASSEMBLY K_EXTERN slashed_name K_AS slashed_name\r
+                          {\r
+                                System.Reflection.AssemblyName asmb_name = \r
+                                       new System.Reflection.AssemblyName ();\r
+                               asmb_name.Name = (string) $3;\r
+                               codegen.BeginAssemblyRef ((string) $5, asmb_name);\r
+                          }\r
                        ;\r
 \r
 assemblyref_decls      : /* EMPTY */\r
                        | assemblyref_decls assemblyref_decl\r
                        ;\r
 \r
-assemblyref_decl       : D_HASH ASSIGN OPEN_PARENS bytes CLOSE_PARENS\r
-                       | asm_or_ref_decl\r
-                       | D_PUBLICKEYTOKEN ASSIGN OPEN_PARENS bytes CLOSE_PARENS\r
+assemblyref_decl       : D_VER int32 COLON int32 COLON int32 COLON int32\r
+                          {\r
+                                codegen.CurrentAssemblyRef.SetVersion ((int) $2, (int) $4, (int) $6, (int) $8);\r
+                          }\r
+                        | D_PUBLICKEY ASSIGN bytes_list\r
+                          {\r
+                                codegen.CurrentAssemblyRef.SetPublicKey ((byte []) $3);\r
+                          }\r
+                        | D_PUBLICKEYTOKEN ASSIGN bytes_list\r
+                          {\r
+                                codegen.CurrentAssemblyRef.SetPublicKeyToken ((byte []) $3);\r
+                          }\r
+                       | D_LOCALE comp_qstring\r
+                          {\r
+                                codegen.CurrentAssemblyRef.SetLocale ((string) $2);\r
+                          }\r
+                       | D_LOCALE ASSIGN bytes_list\r
+                       \r
+                        | D_HASH ASSIGN bytes_list\r
+                          {\r
+                                codegen.CurrentAssemblyRef.SetHash ((byte []) $3);\r
+                          }\r
+                        | customattr_decl\r
+                          {\r
+                                codegen.CurrentAssemblyRef.AddCustomAttribute ((CustomAttr) $1);\r
+                          }\r
                        ;\r
 \r
 exptype_all            : exptype_head OPEN_BRACE exptype_decls CLOSE_BRACE\r
@@ -1518,46 +2564,93 @@ manifestres_decls       : /* EMPTY */
                        ;\r
 \r
 manifestres_decl       : D_FILE comp_name K_AT int32\r
-                       | D_ASSEMBLY K_EXTERN comp_name\r
+                       | D_ASSEMBLY K_EXTERN slashed_name\r
                        | 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
+int32                  : INT64\r
+                          {\r
+                                long l = (long) $1;\r
+                                byte[] intb = BitConverter.GetBytes (l);\r
+                                $$ = BitConverter.ToInt32 (intb, BitConverter.IsLittleEndian ? 0 : 4);\r
+                          }\r
                        ;\r
 \r
-int64                  : INT32\r
-                       | INT64\r
+int64                  : INT64\r
                        ;\r
 \r
 float64                        : FLOAT64\r
-                       | K_FLOAT32 OPEN_PARENS int32 CLOSE_PARENS\r
-                       | K_FLOAT64 OPEN_PARENS int64 CLOSE_PARENS\r
+                       | K_FLOAT32 OPEN_PARENS INT32 CLOSE_PARENS\r
+                          {\r
+                                int i = (int) $3;\r
+                                byte[] intb = BitConverter.GetBytes (i);\r
+                                $$ = (double) BitConverter.ToSingle (intb, BitConverter.IsLittleEndian ? 0 : 4);\r
+                          }\r
+                        | K_FLOAT32 OPEN_PARENS INT64 CLOSE_PARENS\r
+                          {\r
+                                long l = (long) $3;\r
+                                byte[] intb = BitConverter.GetBytes (l);\r
+                                $$ = (double) BitConverter.ToSingle (intb, BitConverter.IsLittleEndian ? 0 : 4);\r
+                          }\r
+                       | K_FLOAT64 OPEN_PARENS INT64 CLOSE_PARENS\r
+                          {\r
+                                byte[] intb = BitConverter.GetBytes ((long) $3);\r
+                               $$ = BitConverter.ToDouble (intb, BitConverter.IsLittleEndian ? 0 : 4);\r
+                          }\r
+                        | K_FLOAT64 OPEN_PARENS INT32 CLOSE_PARENS\r
+                          {\r
+                                byte[] intb = BitConverter.GetBytes ((int) $3);\r
+                                $$ = (double) BitConverter.ToSingle (intb, BitConverter.IsLittleEndian ? 0 : 4);\r
+                          }\r
                        ;\r
 \r
-hexbyte                        : HEXBYTE\r
-                        | INT32                                 // ******** ADDED\r
-                        | ID                                    // ******** ADDED\r
+hexbyte                        : HEXBYTE       { }\r
                        ;\r
 \r
-bytes                  : /* EMPTY */\r
+bytes_list              : OPEN_PARENS\r
+                          {\r
+                                tokenizer.InByteArray = true;\r
+                          }\r
+                          bytes CLOSE_PARENS\r
+                          {\r
+                                $$ = $3;\r
+                                tokenizer.InByteArray = false;\r
+                          }\r
+                        ;\r
+\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
+                          {\r
+                                $$ = true;\r
+                          }\r
                        | K_FALSE\r
+                          {\r
+                                $$ = false;\r
+                          }\r
                        ;\r
 \r
 id                     : ID\r
@@ -1565,14 +2658,13 @@ 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
+                        | COMP_NAME\r
                        ;\r
 \r
-\r
 %%\r
 \r
 }\r