typo on last commit
[mono.git] / mcs / ilasm / parser / ILParser.jay
index 9034617b177730993242fd39a55576c141426e27..67c9d234af1832d42a69b145f5b1b42b584a2df6 100644 (file)
@@ -1,41 +1,55 @@
 %{\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
        public class ILParser {\r
 \r
-               // private Method method;\r
-\r
-               // private InstrBase currentInstr;\r
-\r
-               // private CallingConventions currentCallConv;\r
-\r
-               // private TypeAttributes currentTypeAttrs;\r
-\r
-               // private Class currentClass;\r
-\r
                private CodeGen codegen;\r
 \r
-               private string defaultAsmName = "output";\r
-\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 {\r
-                               return codegen;\r
-                       }\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
@@ -49,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
@@ -58,6 +75,8 @@ namespace Mono.ILASM {
 /* FLOAT64 - floating point number */\r
 %token FLOAT64\r
 \r
+/* HEXBYTE - two digit hex number */\r
+%token HEXBYTE\r
 \r
 \r
 /* Punctuation */\r
@@ -80,7 +99,8 @@ namespace Mono.ILASM {
 %token BANG          "!"\r
 %token ELLIPSIS      "..."\r
 %token DASH          "-"\r
-\r
+%token OPEN_ANGLE_BRACKET   "<"\r
+%token CLOSE_ANGLE_BRACKET  ">"\r
 \r
 \r
 \r
@@ -104,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
@@ -125,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
@@ -146,7 +168,7 @@ namespace Mono.ILASM {
 %token D_LOCALE\r
 %token D_LOCALS\r
 %token D_MANIFESTRES\r
-%token D_MAXSTCCK\r
+%token D_MAXSTACK\r
 %token D_METHOD\r
 %token D_MIME\r
 %token D_MODULE\r
@@ -341,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
@@ -358,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
@@ -370,1117 +393,2279 @@ namespace Mono.ILASM {
 %%\r
 \r
 il_file                        : decls\r
-                       ;      \r
-\r
-decls                   : /* EMPTY */\r
-                       | decls decl                                            \r
-                       ;\r
-\r
-decl                    : classAll\r
-                       | nameSpaceHead OPEN_BRACE decls CLOSE_BRACE { codegen.CurrentNameSpace = String.Empty; }\r
-                       | methodAll\r
-                       | fieldDecl\r
-                       | dataDecl\r
-                       | vtableDecl\r
-                       | vtfixupDecl\r
-                       | extSourceSpec\r
-                       | fileDecl\r
-                       | assemblyHead OPEN_BRACE assemblyDecls CLOSE_BRACE \r
-                       | assemblyRefHead OPEN_BRACE assemblyRefDecls CLOSE_BRACE \r
-                       | comtypeHead OPEN_BRACE comtypeDecls CLOSE_BRACE \r
-                       | manifestResHead OPEN_BRACE manifestResDecls CLOSE_BRACE \r
-                       | moduleHead\r
-                       | secDecl\r
-                       | customAttrDecl\r
-                       | D_SUBSYSTEM int32     \r
-                       | D_CORFLAGS int32      \r
-                       | D_FILE K_ALIGNMENT int32      \r
-                       | languageDecl\r
-                       ;\r
-\r
-compQstring             : QSTRING \r
-                       | compQstring PLUS QSTRING {$$ = ($1 as string) + ($3 as string);}\r
-                       ;\r
-\r
-languageDecl           : D_LANGUAGE SQSTRING   \r
-                       | D_LANGUAGE SQSTRING COMMA SQSTRING    \r
-                       | D_LANGUAGE SQSTRING COMMA SQSTRING COMMA SQSTRING     \r
-                       ;\r
-\r
-customAttrDecl          : D_CUSTOM customType \r
-                       | D_CUSTOM customType ASSIGN compQstring \r
-                       | customHead bytes CLOSE_PARENS \r
-                       | D_CUSTOM OPEN_PARENS customType CLOSE_PARENS customType \r
-                       | D_CUSTOM OPEN_PARENS customType CLOSE_PARENS customType ASSIGN compQstring \r
-                       | customHeadWithOwner bytes CLOSE_PARENS \r
-                       ;\r
-\r
-moduleHead              : D_MODULE \r
-                       | D_MODULE name1 \r
-                       | D_MODULE K_EXTERN name1       \r
-                       ;\r
-\r
-vtfixupDecl             : D_VTFIXUP OPEN_BRACKET int32 CLOSE_BRACKET vtfixupAttr K_AT id \r
-                       ;\r
-\r
-vtfixupAttr             : /* EMPTY */ \r
-                       | vtfixupAttr K_INT32 \r
-                       | vtfixupAttr K_INT64 \r
-                       | vtfixupAttr K_FROMUNMANAGED \r
-                       | vtfixupAttr K_CALLMOSTDERIVED \r
-                       ;\r
-\r
-vtableDecl              : vtableHead bytes CLOSE_PARENS \r
                        ;\r
 \r
-vtableHead              : D_VTABLE ASSIGN OPEN_PARENS \r
-                       ;\r
+decls                  : /* EMPTY */\r
+                       | decls decl\r
+                       ;\r
+\r
+decl                   : class_all\r
+                       | namespace_all\r
+                       | method_all\r
+                       | field_decl\r
+                       | data_decl\r
+                       | vtfixup_decl\r
+                       | file_decl\r
+                       | assembly_all\r
+                       | assemblyref_all\r
+                       | exptype_all\r
+                       | manifestres_all\r
+                       | module_head\r
+                       | 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
+                          {\r
+                                codegen.SetImageBase ((long) $2);\r
+                          }\r
+                       | extsource_spec\r
+                       | language_decl\r
+                       ;\r
+\r
+extsource_spec         : D_LINE int32 SQSTRING\r
+                       | D_LINE int32\r
+                       | D_LINE int32 COLON int32 SQSTRING\r
+                       | D_LINE int32 COLON int32\r
+                       ;\r
+\r
+language_decl          : D_LANGUAGE SQSTRING\r
+                       | D_LANGUAGE SQSTRING COMMA SQSTRING\r
+                       | 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 K_INT32\r
+                       | vtfixup_attr K_INT64\r
+                       | vtfixup_attr K_FROMUNMANAGED\r
+                       | vtfixup_attr K_CALLMOSTDERIVED\r
+                       ;\r
+\r
+namespace_all          : namespace_head OPEN_BRACE decls CLOSE_BRACE\r
+                          {\r
+                                codegen.CurrentNameSpace = null;\r
+                          }\r
+                       ;\r
+\r
+namespace_head         : D_NAMESPACE comp_name\r
+                          {\r
+                                codegen.CurrentNameSpace = (string) $2;\r
+                          }\r
+                       ;\r
+\r
+class_all              : class_head OPEN_BRACE class_decls CLOSE_BRACE\r
+                          {\r
+                                codegen.EndTypeDef ();\r
+                          }\r
+                       ;\r
+\r
+class_head             : D_CLASS class_attr id formal_typars_clause extends_clause\r
+                          impl_clause\r
+                          {\r
+                                codegen.BeginTypeDef ((TypeAttr) $2, (string) $3, \r
+                                               $5 as IClassRef, $6 as ArrayList, null);\r
+                               \r
+                               if (is_value_class)\r
+                                       codegen.CurrentTypeDef.MakeValueClass ();\r
+                               if (is_enum_class)\r
+                                       codegen.CurrentTypeDef.MakeEnumClass ();\r
 \r
-nameSpaceHead           : D_NAMESPACE name1 \r
-                       {\r
-                               codegen.CurrentNameSpace = (string) $2;\r
-                       }\r
-                       ;\r
-\r
-classHead               : D_CLASS type_attr id extendsClause implClause\r
-                       {\r
-                               if ($4 != null) {\r
-                                       codegen.AddClass ((TypeAttr) $2, (string) $3, $4 as Class, null);\r
-                               } else {\r
-                                       codegen.AddClass ((TypeAttr)$2, (string) $3, null);\r
-                               }\r
-                               // TODO: extends/implements\r
-                       }\r
-                       ;\r
-\r
-type_attr               : /* EMPTY */                          { $$ = new TypeAttr (); }\r
-                       | type_attr K_PUBLIC                    { $$ = (TypeAttr)$1 | TypeAttr.Public; }\r
-                       | type_attr K_PRIVATE                   { $$ = (TypeAttr)$1 | TypeAttr.Private; }\r
-                       | type_attr K_INTERFACE                 { $$ = (TypeAttr)$1 | TypeAttr.Interface; }\r
-                       | type_attr K_SEALED                    { $$ = (TypeAttr)$1 | TypeAttr.Sealed; }\r
-                       | type_attr K_ABSTRACT                  { $$ = (TypeAttr)$1 | TypeAttr.Abstract; }\r
-                       | type_attr K_AUTO                      { /* */ }\r
-                       | type_attr K_SEQUENTIAL                { $$ = (TypeAttr)$1 | TypeAttr.SequentialLayout; }\r
-                       | type_attr K_EXPLICIT                  { $$ = (TypeAttr)$1 | TypeAttr.ExplicitLayout; }\r
-                       | type_attr K_ANSI                      { /*  */ }\r
-                       | type_attr K_UNICODE                   { $$ = (TypeAttr)$1 | TypeAttr.UnicodeClass; }\r
-                       | type_attr K_AUTOCHAR                  { $$ = (TypeAttr)$1 | TypeAttr.AutoClass; }\r
-                       | type_attr K_IMPORT                    { $$ = (TypeAttr)$1 | TypeAttr.Import; }\r
-                       | type_attr K_SERIALIZABLE              { $$ = (TypeAttr)$1 | TypeAttr.Serializable; }\r
-                       | type_attr K_NESTED K_PUBLIC           { $$ = (TypeAttr)$1 | TypeAttr.NestedPublic; }\r
-                       | type_attr K_NESTED K_PRIVATE          { $$ = (TypeAttr)$1 | TypeAttr.NestedPrivate; }\r
-                       | type_attr K_NESTED K_FAMILY           { $$ = (TypeAttr)$1 | TypeAttr.NestedFamily; }\r
-                       | type_attr K_NESTED K_ASSEMBLY         { $$ = (TypeAttr)$1 | TypeAttr.NestedAssembly; }\r
-                       | type_attr K_NESTED K_FAMANDASSEM      { $$ = (TypeAttr)$1 | TypeAttr.NestedFamAndAssem; }\r
-                       | type_attr K_NESTED K_FAMORASSEM       { $$ = (TypeAttr)$1 | TypeAttr.NestedFamOrAssem; }\r
-                       | type_attr K_BEFOREFIELDINIT           { $$ = (TypeAttr)$1 | TypeAttr.BeforeFieldInit; }\r
-                       | type_attr K_SPECIALNAME               { $$ = (TypeAttr)$1 | TypeAttr.SpecialName; }\r
-                       | type_attr K_RTSPECIALNAME             { $$ = (TypeAttr)$1 | TypeAttr.RTSpecialName; }\r
-                       ;\r
-\r
-classAttr               : /* EMPTY */ \r
-                       | classAttr K_PUBLIC                    { /* currentTypeAttrs |= TypeAttributes.Public; */}\r
-                       | classAttr K_PRIVATE                   { /* currentTypeAttrs &= ~TypeAttributes.Public; */}\r
-                       | classAttr K_VALUE                     { /* FIXME */ }\r
-                       | classAttr K_ENUM                      { /* FIXME */ }\r
-                       | classAttr K_INTERFACE                 { /* currentTypeAttrs |= TypeAttributes.Interface; */ }\r
-                       | classAttr K_SEALED                    { /* currentTypeAttrs |= TypeAttributes.Sealed; */ }\r
-                       | classAttr K_ABSTRACT                  { /* currentTypeAttrs |= TypeAttributes.Abstract; */ }\r
-                       | classAttr K_AUTO                      { /* currentTypeAttrs |= TypeAttributes.AutoLayout; */ }\r
-                       | classAttr K_SEQUENTIAL                { /* currentTypeAttrs |= TypeAttributes.SequentialLayout; */ }\r
-                       | classAttr K_EXPLICIT                  { /* currentTypeAttrs |= TypeAttributes.ExplicitLayout; */ }\r
-                       | classAttr K_ANSI                      { /* currentTypeAttrs |= TypeAttributes.AnsiClass; */ }\r
-                       | classAttr K_UNICODE                   { /* currentTypeAttrs |= TypeAttributes.UnicodeClass; */ }\r
-                       | classAttr K_AUTOCHAR                  { /* currentTypeAttrs |= TypeAttributes.AutoClass; */ }\r
-                       | classAttr K_IMPORT                    { /* currentTypeAttrs |= TypeAttributes.Import; */ }\r
-                       | classAttr K_SERIALIZABLE              { /* currentTypeAttrs |= TypeAttributes.Serializable; */ }\r
-                       | classAttr K_NESTED K_PUBLIC           { /* currentTypeAttrs |= TypeAttributes.NestedPublic; */ }\r
-                       | classAttr K_NESTED K_PRIVATE          { /* currentTypeAttrs |= TypeAttributes.NestedPrivate; */ }\r
-                       | classAttr K_NESTED K_FAMILY           { /* currentTypeAttrs |= TypeAttributes.NestedFamily; */ }\r
-                       | classAttr K_NESTED K_ASSEMBLY         { /* currentTypeAttrs |= TypeAttributes.NestedAssembly; */ }\r
-                       | classAttr K_NESTED K_FAMANDASSEM      { /* currentTypeAttrs |= TypeAttributes.NestedFamANDAssem; */ }\r
-                       | classAttr K_NESTED K_FAMORASSEM       { /* currentTypeAttrs |= TypeAttributes.NestedFamORAssem; */ }\r
-                       | classAttr K_BEFOREFIELDINIT           { /* currentTypeAttrs |= TypeAttributes.BeforeFieldInit; */ }\r
-                       | classAttr K_SPECIALNAME               { /* currentTypeAttrs |= TypeAttributes.SpecialName; */ }\r
-                       | classAttr K_RTSPECIALNAME             { /* currentTypeAttrs |= TypeAttributes.RTSpecialName; */ }\r
+                                if ($4 != null) {\r
+                                        ArrayList typars_list = (ArrayList) $4;\r
+                                        foreach (string id in typars_list)\r
+                                                codegen.CurrentTypeDef.AddGenericParam (id);\r
+                                }                                \r
+                          }\r
                        ;\r
 \r
-extendsClause           : /* EMPTY */                                           \r
-                       | K_EXTENDS type_ref    {$$ = $2;}\r
-                       ;\r
-\r
-implClause              : /* EMPTY */\r
-                       | K_IMPLEMENTS classNames\r
+class_attrs            : class_attrs class_attr\r
                        ;\r
 \r
-classNames              : classNames COMMA className \r
-                       | className \r
-                       ;\r
-\r
-classDecls              : /* EMPTY */\r
-                       | classDecls classDecl\r
-                       ;\r
-\r
-\r
-classAll               : classHead OPEN_BRACE classDecls CLOSE_BRACE\r
-                       {\r
-                               /*\r
-                               codegen.AddClass (currentClass);\r
-                               currentClass = null;\r
-                               */\r
-                       }\r
-                       ;\r
-\r
-\r
-classDecl               : methodAll\r
-                       | classAll\r
-                       | eventHead OPEN_BRACE eventDecls CLOSE_BRACE \r
-                       | propHead OPEN_BRACE propDecls CLOSE_BRACE \r
-                       | fieldDecl\r
-                       | dataDecl\r
-                       | secDecl\r
-                       | extSourceSpec\r
-                       | customAttrDecl\r
-                       | D_SIZE int32 \r
-                       | D_PACK int32 \r
-                       | exportHead OPEN_BRACE comtypeDecls CLOSE_BRACE \r
-                       | D_OVERRIDE typeSpec DOUBLE_COLON methodName K_WITH callConv type typeSpec DOUBLE_COLON methodName OPEN_PARENS sigArgs0 CLOSE_PARENS \r
-                       | languageDecl\r
-                       ;\r
-\r
-fieldDecl               : D_FIELD repeatOpt fieldAttr type_ref id atOpt initOpt \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
+                       | class_attr K_NESTED K_PUBLIC          { $$ = (TypeAttr)$1 | TypeAttr.NestedPublic; }\r
+                       | class_attr K_NESTED K_FAMILY          { $$ = (TypeAttr)$1 | TypeAttr.NestedFamily; }\r
+                       | 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                    { 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
+                       | class_attr K_AUTO                     {  }\r
+                       | class_attr K_SEQUENTIAL               { $$ = (TypeAttr)$1 | TypeAttr.SequentialLayout; }\r
+                       | class_attr K_EXPLICIT                 { $$ = (TypeAttr)$1 | TypeAttr.ExplicitLayout; }\r
+                       | class_attr K_ANSI                     {  }\r
+                       | class_attr K_UNICODE                  { $$ = (TypeAttr)$1 | TypeAttr.UnicodeClass; }\r
+                       | class_attr K_AUTOCHAR                 { $$ = (TypeAttr)$1 | TypeAttr.AutoClass; }\r
+                       | class_attr K_IMPORT                   { $$ = (TypeAttr)$1 | TypeAttr.Import; }\r
+                       | class_attr K_SERIALIZABLE             { $$ = (TypeAttr)$1 | TypeAttr.Serializable; }\r
+                       | class_attr K_BEFOREFIELDINIT          { $$ = (TypeAttr)$1 | TypeAttr.BeforeFieldInit; }\r
+                       | class_attr K_SPECIALNAME              { $$ = (TypeAttr)$1 | TypeAttr.SpecialName; }\r
+                       | class_attr K_RTSPECIALNAME            { $$ = (TypeAttr)$1 | TypeAttr.RTSpecialName; }\r
+                       ;\r
+\r
+extends_clause         : /* EMPTY */\r
+                       | K_EXTENDS class_ref\r
+                          {\r
+                                $$ = $2;\r
+                          }\r
+                       ;\r
+\r
+impl_clause            : /* EMPTY */\r
+                       | K_IMPLEMENTS class_refs\r
+                          {\r
+                                $$ = $2;\r
+                          }\r
+                       ;\r
+\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
+                                typars_list.Add ($1);\r
+                                $$ = typars_list;\r
+                          }\r
+                        | typars COMMA type\r
+                          {\r
+                                ArrayList typars_list = (ArrayList) $1;\r
+                                typars_list.Add ($3);\r
+                                $$ = typars_list;\r
+                          }\r
+                        ;\r
+\r
+formal_typars           : formal_typar\r
+                          {\r
+                                ArrayList formal_list = new ArrayList ();\r
+                                formal_list.Add ($1);\r
+                                $$ = formal_list;\r
+                          }\r
+                        | formal_typars COMMA formal_typar\r
+                          {\r
+                                ArrayList formal_list = (ArrayList) $1;\r
+                                formal_list.Add ($3);\r
+                                $$ = formal_list;\r
+                          }\r
+                        ;\r
+\r
+\r
+formal_typar            : id\r
+                          {\r
+                                $$ = $1;\r
+                          }\r
+                        ;\r
+                        \r
+class_refs             : class_ref\r
+                          {\r
+                                ArrayList class_list = new ArrayList ();\r
+                                class_list.Add ($1);\r
+                                $$ = class_list; \r
+                          }\r
+                       | class_refs COMMA class_ref\r
+                          {\r
+                                ArrayList class_list = (ArrayList) $1;\r
+                                class_list.Add ($3);\r
+                          }\r
+                       ;\r
+\r
+slashed_name           : comp_name\r
+                       | slashed_name SLASH comp_name\r
+                          {\r
+                                $$ = String.Format ("{0}/{1}", $1, $3);\r
+                          }\r
+                       ;\r
+\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
+                                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
+                       | slashed_name\r
+                          {\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
+                       | class_decls class_decl\r
+                       ;\r
+\r
+class_decl             : method_all\r
+                       | class_all\r
+                       | event_all\r
+                       | prop_all\r
+                       | field_decl\r
+                       | data_decl\r
+                       | sec_decl\r
+                       | extsource_spec\r
+                       | customattr_decl\r
+                          {\r
+                                codegen.CurrentTypeDef.AddCustomAttribute ((CustomAttr) $1);\r
+                          }\r
+                       | D_SIZE int32\r
+                          {\r
+                                codegen.CurrentTypeDef.SetSize ((int) $2);\r
+                          }\r
+                       | D_PACK int32\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
+                          {\r
+                                $$ = $2;\r
+                          }\r
+                       | K_OBJECT\r
+                          {\r
+                                $$ = new PrimitiveTypeRef (PrimitiveType.Object, "System.Object");\r
+                          }\r
+                       | K_STRING\r
+                          {\r
+                                $$ = new PrimitiveTypeRef (PrimitiveType.String, "System.String");\r
+                          }\r
+                       | K_VALUE K_CLASS class_ref\r
+                          {\r
+                               IClassRef class_ref = (IClassRef) $3;\r
+                               class_ref.MakeValueClass ();\r
+                                $$ = class_ref;\r
+                          }\r
+                       | K_VALUETYPE OPEN_BRACKET slashed_name CLOSE_BRACKET slashed_name\r
+                          {\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
+                                ITypeRef base_type = GetTypeRef ((ITypeRef) $1);\r
+                                base_type.MakeArray ();\r
+                                $$ = base_type;\r
+                          }\r
+                       | type OPEN_BRACKET bounds CLOSE_BRACKET\r
+                          {\r
+                                ITypeRef base_type = GetTypeRef ((ITypeRef) $1);\r
+                                ArrayList bound_list = (ArrayList) $3;\r
+                                base_type.MakeBoundArray (bound_list);\r
+                                $$ = base_type;\r
+                          }\r
+                       | type AMPERSAND\r
+                          {\r
+                                ITypeRef base_type = GetTypeRef ((ITypeRef) $1);\r
+                                base_type.MakeManagedPointer ();\r
+                                $$ = base_type;\r
+                          }\r
+                       | type STAR\r
+                          {\r
+                                ITypeRef base_type = GetTypeRef ((ITypeRef) $1);\r
+                                base_type.MakeUnmanagedPointer ();\r
+                                $$ = base_type;\r
+                          }\r
+                       | type K_PINNED\r
+                          {\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
+                                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
+                                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 PrimitiveTypeRef (PrimitiveType.TypedRef,\r
+                                        "System.TypedReference");\r
+                          }\r
+                       | K_CHAR\r
+                          {\r
+                                $$ = new PrimitiveTypeRef (PrimitiveType.Char, "System.Char");\r
+                          }\r
+                       | K_WCHAR\r
                          {\r
-                               codegen.CurrentClass.AddField ((FieldAttr) $3, \r
-                                       (string) $5, (PEAPI.Type) $4);\r
+                               $$ = new PrimitiveTypeRef (PrimitiveType.Char, "System.Char");\r
                          }\r
-                       ;\r
-\r
-type_ref               : primative_type_ref\r
-                       | internal_type_ref\r
-                       | external_type_ref\r
-                       ;\r
-\r
-primative_type_ref     : K_CHAR                {$$ = PrimitiveType.Char; }\r
-                       | K_VOID                {$$ = PrimitiveType.Void; }\r
-                       | K_BOOL                {$$ = PrimitiveType.Boolean; }\r
-                       | K_INT8                {$$ = PrimitiveType.Int8; }\r
-                       | K_INT16               {$$ = PrimitiveType.Int16; }\r
-                       | K_INT32               {$$ = PrimitiveType.Int32; }\r
-                       | K_INT64               {$$ = PrimitiveType.Int64; }\r
-                       | K_FLOAT32             {$$ = PrimitiveType.Float32; }\r
-                       | K_FLOAT64             {$$ = PrimitiveType.Float64; }\r
-                       | K_UNSIGNED K_INT8     {$$ = PrimitiveType.UInt8; }\r
-                       | K_UNSIGNED K_INT16    {$$ = PrimitiveType.UInt16; }\r
-                       | K_UNSIGNED K_INT32    {$$ = PrimitiveType.UInt32; }\r
-                       | K_UNSIGNED K_INT64    {$$ = PrimitiveType.UInt64; }\r
-                       | K_STRING              {$$ = PrimitiveType.String; }\r
-                       ;\r
-\r
-internal_type_ref      : name1\r
+                       | K_VOID\r
+                          {\r
+                                $$ = new PrimitiveTypeRef (PrimitiveType.Void, "System.Void");\r
+                          }\r
+                       | K_BOOL\r
+                          {\r
+                                $$ = new PrimitiveTypeRef (PrimitiveType.Boolean, "System.Bool");\r
+                          }\r
+                       | K_INT8\r
+                          {\r
+                                $$ = new PrimitiveTypeRef (PrimitiveType.Int8, "System.Int8");\r
+                          }\r
+                       | K_INT16\r
+                          {\r
+                                $$ = new PrimitiveTypeRef (PrimitiveType.Int16, "System.Int16");\r
+                          }\r
+                       | K_INT32\r
+                          {\r
+                                $$ = new PrimitiveTypeRef (PrimitiveType.Int32, "System.Int32");\r
+                          }\r
+                       | K_INT64\r
+                          {\r
+                                $$ = new PrimitiveTypeRef (PrimitiveType.Int64, "System.Int64");\r
+                          }\r
+                       | K_FLOAT32\r
+                          {\r
+                                $$ = new PrimitiveTypeRef (PrimitiveType.Float32, "System.Float32");\r
+                          }\r
+                       | K_FLOAT64\r
+                          {\r
+                                $$ = new PrimitiveTypeRef (PrimitiveType.Float64, "System.Float64");\r
+                          }\r
+                       | K_UNSIGNED K_INT8\r
+                          {\r
+                                $$ = new PrimitiveTypeRef (PrimitiveType.UInt8, "System.UInt8");\r
+                          }\r
+                       | K_UNSIGNED K_INT16\r
+                          {\r
+                                $$ = new PrimitiveTypeRef (PrimitiveType.UInt16, "System.UInt16");     \r
+                          }\r
+                       | K_UNSIGNED K_INT32\r
+                          {\r
+                                $$ = new PrimitiveTypeRef (PrimitiveType.UInt32, "System.UInt32");\r
+                          }\r
+                       | K_UNSIGNED K_INT64\r
+                          {\r
+                                $$ = new PrimitiveTypeRef (PrimitiveType.UInt64, "System.UInt64");\r
+                          }\r
+                       | K_NATIVE K_INT\r
+                          {\r
+                                // TODO: Is this the proper full name\r
+                                $$ = new PrimitiveTypeRef (PrimitiveType.NativeInt, "System.IntPtr");\r
+                          }\r
+                        \r
+                       | K_NATIVE K_UNSIGNED K_INT\r
+                          {\r
+                                $$ = new PrimitiveTypeRef (PrimitiveType.NativeUInt, "System.UIntPtr");\r
+                          }\r
+                        | BANG int32\r
+                          {\r
+                                GenericTypeSpec spec = new GenericTypeSpec ((int) $2);\r
+                                $$ = new GenericTypeRef (spec, $2.ToString ());\r
+                          }\r
+                        | BANG BANG int32\r
+                          {\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
+bounds                 : bound\r
+                          {\r
+                                ArrayList bound_list = new ArrayList ();\r
+                                bound_list.Add ($1);\r
+                                $$ = bound_list;\r
+                          }\r
+                       | bounds COMMA bound\r
+                          {\r
+                                ArrayList bound_list = (ArrayList) $1;\r
+                                bound_list.Add ($3);\r
+                          }\r
+                       ;\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 (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 (TypeRef.Ellipsis, $1);\r
+                          }\r
+                       | int32 ELLIPSIS int32\r
+                          {\r
+                                // lower bound and size\r
+                                $$ = new DictionaryEntry ($1, $3);\r
+                          }\r
+                       | int32 ELLIPSIS\r
+                          {\r
+                                // Just lower bound\r
+                                $$ = new DictionaryEntry ($1, TypeRef.Ellipsis);\r
+                          }\r
+                       ;\r
+\r
+call_conv              : K_INSTANCE call_conv\r
+                          {\r
+                                $$ = (CallConv) $2 | CallConv.Instance;\r
+                          }\r
+                       | K_EXPLICIT call_conv\r
+                          {\r
+                                $$ = (CallConv) $2 | CallConv.InstanceExplicit;\r
+                          }\r
+                       | call_kind\r
+                       ;\r
+\r
+call_kind              : /* EMPTY */\r
+                          {\r
+                                $$ = new CallConv ();\r
+                          }\r
+                       | K_DEFAULT\r
+                          {\r
+                                $$ = CallConv.Default;\r
+                          }\r
+                       | K_VARARG\r
+                          {\r
+                                $$ = CallConv.Vararg;\r
+                          }\r
+                       | K_UNMANAGED K_CDECL\r
+                          {\r
+                                $$ = CallConv.Cdecl;\r
+                          }\r
+                       | K_UNMANAGED K_STDCALL\r
+                          {\r
+                                $$ = CallConv.Stdcall;\r
+                          }\r
+                       | K_UNMANAGED K_THISCALL\r
+                          {\r
+                                $$ = CallConv.Thiscall;\r
+                          }\r
+                       | K_UNMANAGED K_FASTCALL\r
+                          {\r
+                                $$ = CallConv.Fastcall;\r
+                          }\r
+                       ;\r
+\r
+native_type            : /* EMPTY */\r
+                       | K_CUSTOM OPEN_PARENS comp_qstring COMMA comp_qstring CLOSE_PARENS\r
+                       | K_FIXED K_SYSSTRING OPEN_BRACKET int32 CLOSE_BRACKET\r
+                          {\r
+                                $$ = NativeType.FixedSysString;\r
+                          }\r
+                       | K_FIXED K_ARRAY OPEN_BRACKET int32 CLOSE_BRACKET\r
+                       | K_VARIANT\r
+                       | K_CURRENCY\r
+                          {\r
+                                $$ = NativeType.Currency;\r
+                          }\r
+                       | K_SYSCHAR\r
+                       | K_VOID\r
+                          {\r
+                                $$ = NativeType.Void;\r
+                          }\r
+                       | K_BOOL\r
+                          {\r
+                                $$ = NativeType.Boolean;\r
+                          }\r
+                       | K_INT8\r
+                          {\r
+                                $$ = NativeType.Int8;\r
+                          }\r
+                       | K_INT16\r
+                          {\r
+                                $$ = NativeType.Int16;\r
+                          }\r
+                       | K_INT32\r
+                          {\r
+                                $$ = NativeType.Int32;\r
+                          }\r
+                       | K_INT64\r
+                          {\r
+                                $$ = NativeType.Int64;\r
+                          }\r
+                       | K_FLOAT32\r
+                          {\r
+                                $$ = NativeType.Float32;\r
+                          }\r
+                       | K_FLOAT64\r
+                          {\r
+                                $$ = NativeType.Float64;\r
+                          }\r
+                       | K_ERROR\r
+                       | K_UNSIGNED K_INT8\r
+                          {\r
+                                $$ = NativeType.UInt8;\r
+                          }\r
+                       | K_UNSIGNED K_INT16\r
+                          {\r
+                                $$ = NativeType.UInt16;\r
+                          }\r
+                       | K_UNSIGNED K_INT32\r
+                          {\r
+                                $$ = NativeType.UInt32;\r
+                          }\r
+                       | K_UNSIGNED K_INT64\r
+                          {\r
+                                $$ = NativeType.UInt64;\r
+                          }\r
+                       | native_type STAR\r
+                       | native_type OPEN_BRACKET CLOSE_BRACKET\r
+                       | native_type OPEN_BRACKET int32 CLOSE_BRACKET\r
+                       | native_type OPEN_BRACKET int32 PLUS int32 CLOSE_BRACKET\r
+                       | native_type OPEN_BRACKET PLUS int32 CLOSE_BRACKET\r
+                       | K_DECIMAL\r
+                       | K_DATE\r
+                       | K_BSTR\r
+                          {\r
+                                $$ = NativeType.BStr;\r
+                          }\r
+                       | K_LPSTR\r
+                          {\r
+                                $$ = NativeType.LPStr;\r
+                          }\r
+                       | K_LPWSTR\r
+                          {\r
+                                $$ = NativeType.LPWStr;\r
+                          }\r
+                       | K_LPTSTR\r
+                          {\r
+                                $$ = NativeType.LPTStr;\r
+                          }\r
+                       | K_OBJECTREF\r
+                       | K_IUNKNOWN\r
+                          {\r
+                                $$ = NativeType.IUnknown;\r
+                          }\r
+                       | K_IDISPATCH\r
+                          {\r
+                                $$ = NativeType.IDispatch;\r
+                          }\r
+                       | K_STRUCT\r
+                          {\r
+                                $$ = NativeType.Struct;\r
+                          }\r
+                       | K_INTERFACE\r
+                          {\r
+                                $$ = NativeType.Interface;\r
+                          }\r
+                       | K_SAFEARRAY variant_type\r
+                       | K_SAFEARRAY variant_type COMMA comp_qstring\r
+                       | K_INT\r
+                          {\r
+                                $$ = NativeType.Int;\r
+                          }\r
+                       | K_UNSIGNED K_INT\r
+                          {\r
+                                $$ = NativeType.UInt;\r
+                          }\r
+                       | K_NESTED K_STRUCT\r
+                       | K_BYVALSTR\r
+                          {\r
+                                $$ = NativeType.ByValStr;\r
+                          }\r
+                       | K_ANSI K_BSTR\r
+                          {\r
+                                $$ = NativeType.AnsiBStr;\r
+                          }\r
+                       | K_TBSTR\r
+                          {\r
+                                $$ = NativeType.TBstr;\r
+                          }\r
+                       | K_VARIANT K_BOOL\r
+                          {\r
+                                $$ = NativeType.VariantBool;\r
+                          }\r
+                       | K_METHOD\r
+                       | K_AS K_ANY\r
+                          {\r
+                                $$ = NativeType.AsAny;\r
+                          }\r
+                       | K_LPSTRUCT\r
+                       ;\r
+\r
+variant_type           : /* EMPTY */\r
+                       | K_NULL\r
+                       | K_VARIANT\r
+                       | K_CURRENCY\r
+                       | K_VOID\r
+                       | K_BOOL\r
+                       | K_INT8\r
+                       | K_INT16\r
+                       | K_INT32\r
+                       | K_INT64\r
+                       | K_FLOAT32\r
+                       | K_FLOAT64\r
+                       | K_UNSIGNED K_INT8\r
+                       | K_UNSIGNED K_INT16\r
+                       | K_UNSIGNED K_INT32\r
+                       | K_UNSIGNED K_INT64\r
+                       | STAR\r
+                       | variant_type OPEN_BRACKET CLOSE_BRACKET\r
+                       | variant_type K_VECTOR\r
+                       | variant_type AMPERSAND\r
+                       | K_DECIMAL\r
+                       | K_DATE\r
+                       | K_BSTR\r
+                       | K_LPSTR\r
+                       | K_LPWSTR\r
+                       | K_IUNKNOWN\r
+                       | K_IDISPATCH\r
+                       | K_SAFEARRAY\r
+                       | K_INT\r
+                       | K_UNSIGNED K_INT\r
+                       | K_ERROR\r
+                       | K_HRESULT\r
+                       | K_CARRAY\r
+                       | K_USERDEFINED\r
+                       | K_RECORD\r
+                       | K_FILETIME\r
+                       | K_BLOB\r
+                       | K_STREAM\r
+                       | K_STORAGE\r
+                       | K_STREAMED_OBJECT\r
+                       | K_STORED_OBJECT\r
+                       | K_BLOB_OBJECT\r
+                       | K_CF\r
+                       | K_CLSID\r
+                       ;\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
-                               $$ = codegen.ClassTable.GetReference ((string) $1, null); \r
+                               $$ = new CharConst (Convert.ToChar ($3));\r
                          }\r
-                       ;\r
-\r
-external_type_ref      : assembly_name namespace_name DOT id\r
+                       | K_INT8 OPEN_PARENS int64 CLOSE_PARENS\r
+                          {\r
+                                $$ = new IntConst (Convert.ToByte ($3));\r
+                          }\r
+                       | K_BOOL OPEN_PARENS truefalse CLOSE_PARENS\r
+                          {\r
+                                $$ = new BoolConst ((bool) $3);\r
+                          }\r
+                       | K_BYTEARRAY 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
+                          {\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 */   { $$ = false; }\r
+                       | K_TLS         { $$ = true; }\r
+                       ;\r
+\r
+data_body              : OPEN_BRACE dataitem_list CLOSE_BRACE\r
+                       | dataitem\r
+                       ;\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
-                               $$ = codegen.ExternTable.GetClass ($1 as string, $2 as string, $4 as string);\r
+                               $$ = new StringConst ((string) $4);\r
                          }\r
+                       | AMPERSAND OPEN_PARENS id CLOSE_PARENS\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
+                          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 */                   { $$ = 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 */ { $$ = 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
+                       | D_CCTOR\r
+                       | comp_name\r
+                       ;\r
+\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 */                   { $$ = 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
+                          {\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
+                          {\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
+                          {\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 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
-namespace_name         : /* EMPTY */\r
-                       | id\r
-                       | namespace_name DOT id {$$ = String.Format ("{0}.{1}", $1, $3); }\r
-                       ;\r
-\r
-atOpt                   : /* EMPTY */  \r
-                       | K_AT id \r
-                       ;\r
-\r
-initOpt                 : /* EMPTY */ \r
-                       | ASSIGN fieldInit \r
-                       ;\r
-\r
-repeatOpt              : /* EMPTY */ \r
-                       | OPEN_BRACKET int32 CLOSE_BRACKET \r
-                       ;\r
-\r
-customHead              : D_CUSTOM customType ASSIGN OPEN_PARENS \r
-                       ;\r
-\r
-customHeadWithOwner     : D_CUSTOM OPEN_PARENS customType CLOSE_PARENS customType ASSIGN OPEN_PARENS \r
-                       ;\r
-\r
-customType              : typeSpec \r
-                       | callConv type typeSpec DOUBLE_COLON methodName OPEN_PARENS sigArgs0 CLOSE_PARENS \r
-                       | callConv type methodName OPEN_PARENS sigArgs0 CLOSE_PARENS \r
-                       ;\r
-\r
-eventHead               : D_EVENT eventAttr typeSpec id \r
-                       | D_EVENT eventAttr id \r
-                       ;\r
-\r
-\r
-eventAttr               : /* EMPTY */ \r
-                       | eventAttr K_RTSPECIALNAME /**/\r
-                       | eventAttr K_SPECIALNAME \r
-                       ;\r
-\r
-eventDecls              : /* EMPTY */\r
-                       | eventDecls eventDecl\r
-                       ;\r
-\r
-eventDecl               : D_ADDON callConv type typeSpec DOUBLE_COLON methodName OPEN_PARENS sigArgs0 CLOSE_PARENS \r
-                       | D_ADDON callConv type methodName OPEN_PARENS sigArgs0 CLOSE_PARENS \r
-                       | D_REMOVEON callConv type typeSpec DOUBLE_COLON methodName OPEN_PARENS sigArgs0 CLOSE_PARENS \r
-                       | D_REMOVEON callConv type methodName OPEN_PARENS sigArgs0 CLOSE_PARENS \r
-                       | D_FIRE callConv type typeSpec DOUBLE_COLON methodName OPEN_PARENS sigArgs0 CLOSE_PARENS \r
-                       | D_FIRE callConv type methodName OPEN_PARENS sigArgs0 CLOSE_PARENS \r
-                       | D_OTHER callConv type typeSpec DOUBLE_COLON methodName OPEN_PARENS sigArgs0 CLOSE_PARENS \r
-                       | D_OTHER callConv type methodName OPEN_PARENS sigArgs0 CLOSE_PARENS \r
-                       | extSourceSpec\r
-                       | customAttrDecl\r
-                       | languageDecl\r
-                       ;\r
-\r
-propHead                : D_PROPERTY propAttr callConv type id OPEN_PARENS sigArgs0 CLOSE_PARENS initOpt \r
-                       ;\r
-\r
-propAttr                : /* EMPTY */ \r
-                       | propAttr K_RTSPECIALNAME /**/\r
-                       | propAttr K_SPECIALNAME \r
-                       ;\r
-\r
-propDecls               : /* EMPTY */\r
-                       | propDecls propDecl\r
-                       ;\r
-\r
-\r
-propDecl                : D_SET callConv type typeSpec DOUBLE_COLON methodName OPEN_PARENS sigArgs0 CLOSE_PARENS \r
-                       | D_SET callConv type methodName OPEN_PARENS sigArgs0 CLOSE_PARENS \r
-                       | D_GET callConv type typeSpec DOUBLE_COLON methodName OPEN_PARENS sigArgs0 CLOSE_PARENS \r
-                       | D_GET callConv type methodName OPEN_PARENS sigArgs0 CLOSE_PARENS \r
-                       | D_OTHER callConv type typeSpec DOUBLE_COLON methodName OPEN_PARENS sigArgs0 CLOSE_PARENS \r
-                       | D_OTHER callConv type methodName OPEN_PARENS sigArgs0 CLOSE_PARENS \r
-                       | customAttrDecl\r
-                       | extSourceSpec\r
-                       | languageDecl\r
-                       ;\r
-\r
-\r
-methodHeadPart1         : D_METHOD\r
-                       {\r
-                               /*\r
-                               method = new Method ();\r
-                               currentCallConv = 0;\r
-                               */\r
-                       }\r
-                       ;\r
-\r
-methodHead              : methodHeadPart1 methAttr callConv paramAttr type methodName OPEN_PARENS arg_list CLOSE_PARENS implAttr OPEN_BRACE \r
-                       {\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
-                               /*\r
-                               method.SetMethodName ($6 as MethodName);\r
-                               method.SetParamList ($8 as ArrayList);\r
-                               method.CallConv = currentCallConv;\r
-                               method.RetType = $5 as string;\r
-                               */\r
-                       }\r
-                       | methodHeadPart1 methAttr callConv paramAttr type K_MARSHAL OPEN_PARENS nativeType CLOSE_PARENS methodName OPEN_PARENS sigArgs0 CLOSE_PARENS implAttr OPEN_BRACE\r
-                       ;\r
-\r
-\r
-methodAll              : methodHead methodDecls CLOSE_BRACE\r
-                       {\r
-                               /*\r
-                               // Console.WriteLine (method);\r
-                               currentClass.AddMethod (method);\r
-                               */\r
-                       }\r
-                       ;\r
-\r
-\r
-methAttr                : /* EMPTY */ \r
-                       | methAttr K_STATIC             {/* method.Attrs |=  MethodAttributes.Static; */}\r
-                       | methAttr K_PUBLIC             {/* method.Attrs |=  MethodAttributes.Public; */}\r
-                       | methAttr K_PRIVATE            {/* method.Attrs &= ~MethodAttributes.Public; */}\r
-                       | methAttr K_FAMILY             {/* method.Attrs |=  MethodAttributes.Family; */}\r
-                       | methAttr K_FINAL              {/* method.Attrs |=  MethodAttributes.Final; */}\r
-                       | methAttr K_SPECIALNAME        {/* method.Attrs |=  MethodAttributes.SpecialName; */}\r
-                       | methAttr K_VIRTUAL            {/* method.Attrs |=  MethodAttributes.Virtual; */}\r
-                       | methAttr K_ABSTRACT           {/* method.Attrs |=  MethodAttributes.Abstract; */}\r
-                       | methAttr K_ASSEMBLY           {/* method.Attrs |=  MethodAttributes.Assembly; */}\r
-                       | methAttr K_FAMANDASSEM        {/* method.Attrs |=  MethodAttributes.FamANDAssem; */}\r
-                       | methAttr K_FAMORASSEM         {/* method.Attrs |=  MethodAttributes.FamORAssem; */}\r
-                       | methAttr K_COMPILERCONTROLLED {/* FIXME */}\r
-                       | methAttr K_HIDEBYSIG          {/* method.Attrs |=  MethodAttributes.HideBySig; */}\r
-                       | methAttr K_NEWSLOT            {/* method.Attrs |=  MethodAttributes.NewSlot; */}\r
-                       | methAttr K_RTSPECIALNAME /**/ {/* FIXME */}\r
-                       | methAttr K_UNMANAGEDEXP       {/*method.Attrs |=  MethodAttributes.UnmanagedExport; */}\r
-                       | methAttr K_REQSECOBJ          {/* method.Attrs |=  MethodAttributes.RequireSecObject; */}\r
-                       | methAttr K_PINVOKEIMPL OPEN_PARENS compQstring K_AS compQstring pinvAttr CLOSE_PARENS {/* FIXME */}\r
-                       | methAttr K_PINVOKEIMPL OPEN_PARENS compQstring  pinvAttr CLOSE_PARENS                 {/* FIXME */}\r
-                       | methAttr K_PINVOKEIMPL OPEN_PARENS pinvAttr CLOSE_PARENS                              {/* FIXME */}\r
-                       ;\r
-\r
-pinvAttr                : /* EMPTY */ \r
-                       | pinvAttr K_NOMANGLE \r
-                       | pinvAttr K_ANSI \r
-                       | pinvAttr K_UNICODE \r
-                       | pinvAttr K_AUTOCHAR \r
-                       | pinvAttr K_LASTERR \r
-                       | pinvAttr K_WINAPI \r
-                       | pinvAttr K_CDECL \r
-                       | pinvAttr K_STDCALL \r
-                       | pinvAttr K_THISCALL \r
-                       | pinvAttr K_FASTCALL \r
-                       ;\r
-\r
-methodName              : D_CTOR       {/*$$ = new MethodName ("ctor", true); */}\r
-                       | D_CCTOR       {/*$$ = new MethodName ("cctor", true); */}\r
-                       | name1         {/*$$ = new MethodName ($1 as string); */}\r
-                       ;\r
-\r
-paramAttr               : /* EMPTY */ \r
-                       | paramAttr OPEN_BRACKET K_IN CLOSE_BRACKET \r
-                       | paramAttr OPEN_BRACKET K_OUT CLOSE_BRACKET \r
-                       | paramAttr OPEN_BRACKET K_OPT CLOSE_BRACKET \r
-                       | paramAttr OPEN_BRACKET int32 CLOSE_BRACKET  \r
-                       ;\r
-        \r
-fieldAttr               : /* EMPTY */                  {$$ = FieldAttr.Default; }\r
-                       | fieldAttr K_STATIC            {$$ = FieldAttr.Static; }\r
-                       | fieldAttr K_PUBLIC            {$$ = FieldAttr.Public; }\r
-                       | fieldAttr K_PRIVATE           {$$ = FieldAttr.Private; }\r
-                       | fieldAttr K_FAMILY            {$$ = FieldAttr.Family; }\r
-                       | fieldAttr K_INITONLY          {$$ = FieldAttr.Initonly; }\r
-                       | fieldAttr K_RTSPECIALNAME     {$$ = FieldAttr.RTSpecialName; }\r
-                       | fieldAttr K_SPECIALNAME       {$$ = FieldAttr.SpecialName; }\r
-                               /* commented out because PInvoke for fields is not supported by EE\r
-                       | fieldAttr K_PINVOKEIMPL OPEN_PARENS compQstring K_AS compQstring pinvAttr CLOSE_PARENS \r
-                       | fieldAttr K_PINVOKEIMPL OPEN_PARENS compQstring  pinvAttr CLOSE_PARENS \r
-                       | fieldAttr K_PINVOKEIMPL OPEN_PARENS pinvAttr CLOSE_PARENS \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
-                       | fieldAttr K_MARSHAL OPEN_PARENS nativeType CLOSE_PARENS \r
-                               */\r
-                       | fieldAttr K_ASSEMBLY          {$$ = FieldAttr.Assembly; }\r
-                       | fieldAttr K_FAMANDASSEM       {$$ = FieldAttr.FamAndAssem; }\r
-                       | fieldAttr K_FAMORASSEM        {$$ = FieldAttr.FamOrAssem; }\r
-               /*      | fieldAttr K_COMPILERCONTROLLED {$$ = FieldAttr. */\r
-                       | fieldAttr K_LITERAL           {$$ = FieldAttr.Literal; }\r
-                       | fieldAttr K_NOTSERIALIZED     {$$ = FieldAttr.Notserialized; }\r
-                       ;\r
-\r
-implAttr                : /* empty */ \r
-                       | implAttr K_NATIVE \r
-                       | implAttr ELLIPSIS\r
-                       | implAttr K_IL  /* LAMESPEC: absent in docs */\r
-                       | implAttr K_CIL /* LAMESPEC: same as above */\r
-                       | implAttr K_OPTIL \r
-                       | implAttr K_MANAGED \r
-                       | implAttr K_UNMANAGED \r
-                       | implAttr K_FORWARDREF \r
-                       | implAttr K_PRESERVESIG \r
-                       | implAttr K_RUNTIME \r
-                       | implAttr K_INTERNALCALL \r
-                       | implAttr K_SYNCHRONIZED \r
-                       | implAttr K_NOINLINING \r
-                       ;\r
-\r
-localsHead              : D_LOCALS\r
-                       ;\r
-\r
-                                       \r
-methodDecl              : D_EMITBYTE int32 \r
-                       | sehBlock \r
-                       | D_MAXSTACK int32      \r
-                       | localsHead OPEN_PARENS sigArgs0 CLOSE_PARENS \r
-                       | localsHead K_INIT OPEN_PARENS named_arg_list CLOSE_PARENS  \r
-                               {\r
-                                       /*\r
-                                       ArrayList arg_list = $4 as ArrayList;\r
-                                       \r
-                                       if (arg_list != null) {\r
-                                               foreach (DictionaryEntry local in arg_list) {\r
-                                                       method.AddLocal (local);\r
-                                               }\r
-                                       }\r
-                                       */\r
-                               }\r
-                       | D_ENTRYPOINT          {/* method.IsEntryPoint = true; */}\r
-                       | D_ZEROINIT \r
-                       | dataDecl\r
-                       | instr {\r
-                               /*      method.AddInstruction (currentInstr); */\r
-                               }\r
-                       | id COLON \r
-                       | secDecl\r
-                       | extSourceSpec\r
-                       | languageDecl\r
-                       | customAttrDecl\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 typeSpec DOUBLE_COLON methodName \r
-                       | scopeBlock\r
-                       | D_PARAM OPEN_BRACKET int32 CLOSE_BRACKET initOpt \r
-                       ;\r
-\r
-scopeBlock              : scopeOpen methodDecls CLOSE_BRACE \r
-                       ;\r
-\r
-scopeOpen               : OPEN_BRACE \r
-                       ;\r
-\r
-sehBlock                : tryBlock sehClauses\r
-                       ;\r
-\r
-sehClauses              : sehClause sehClauses\r
-                       | sehClause\r
-                       ;\r
-\r
-tryBlock                : tryHead scopeBlock \r
-                       | tryHead id K_TO id \r
-                       | tryHead int32 K_TO int32 \r
-                       ;\r
-\r
-tryHead                 : D_TRY \r
-                       ;\r
-\r
-\r
-sehClause               : catchClause handlerBlock \r
-                       | filterClause handlerBlock \r
-                       | finallyClause handlerBlock \r
-                       | faultClause handlerBlock \r
-                       ;\r
-\r
-         \r
-filterClause            : filterHead scopeBlock \r
-                       | filterHead id \r
-                       | filterHead int32 \r
-                       ;\r
-\r
-filterHead              : K_FILTER  \r
-                       ;\r
-\r
-catchClause             : K_CATCH className \r
-                       ;\r
-\r
-finallyClause           : K_FINALLY \r
-                       ;\r
-\r
-faultClause             : K_FAULT \r
-                       ;\r
-\r
-handlerBlock            : scopeBlock                  \r
-                       | K_HANDLER id K_TO id \r
-                       | K_HANDLER int32 K_TO int32 \r
-                       ;\r
-\r
-\r
-methodDecls             : /* EMPTY */\r
-                       | methodDecls methodDecl\r
-                       ;\r
-\r
-dataDecl                : ddHead ddBody\r
-                       ;\r
-\r
-ddHead                  : D_DATA tls id ASSIGN \r
-                       | D_DATA tls  \r
-                       ;\r
-\r
-tls                     : /* EMPTY */ \r
-                       | K_TLS \r
-                       ;\r
-\r
-ddBody                  : OPEN_BRACE ddItemList CLOSE_BRACE\r
-                       | ddItem\r
-                       ;\r
-\r
-ddItemList              : ddItem COMMA ddItemList\r
-                       | ddItem\r
-                       ;\r
-\r
-ddItemCount             : /* EMPTY */ \r
-                       | OPEN_BRACKET int32 CLOSE_BRACKET \r
-                       ;\r
-\r
-ddItem                  : K_CHAR STAR OPEN_PARENS compQstring CLOSE_PARENS \r
-                       | AMPERSAND OPEN_PARENS id CLOSE_PARENS \r
-                       | bytearrayhead bytes CLOSE_PARENS \r
-                       | K_FLOAT32 OPEN_PARENS float64 CLOSE_PARENS ddItemCount \r
-                       | K_FLOAT64 OPEN_PARENS float64 CLOSE_PARENS ddItemCount \r
-                       | K_INT64 OPEN_PARENS int64 CLOSE_PARENS ddItemCount  \r
-                       | K_INT32 OPEN_PARENS int32 CLOSE_PARENS ddItemCount  \r
-                       | K_INT16 OPEN_PARENS int32 CLOSE_PARENS ddItemCount \r
-                       | K_INT8 OPEN_PARENS int32 CLOSE_PARENS ddItemCount \r
-                       | K_FLOAT32 ddItemCount \r
-                       | K_FLOAT64 ddItemCount \r
-                       | K_INT64 ddItemCount  \r
-                       | K_INT32 ddItemCount  \r
-                       | K_INT16 ddItemCount \r
-                       | K_INT8 ddItemCount \r
-                       ;\r
-\r
-fieldInit               : K_FLOAT32 OPEN_PARENS float64 CLOSE_PARENS \r
-                       | K_FLOAT64 OPEN_PARENS float64 CLOSE_PARENS \r
-                       | K_FLOAT32 OPEN_PARENS int64 CLOSE_PARENS \r
-                       | K_FLOAT64 OPEN_PARENS int64 CLOSE_PARENS \r
-                       | K_INT64 OPEN_PARENS int64 CLOSE_PARENS  \r
-                       | K_INT32 OPEN_PARENS int64 CLOSE_PARENS \r
-                       | K_INT16 OPEN_PARENS int64 CLOSE_PARENS \r
-                       | K_CHAR OPEN_PARENS int64 CLOSE_PARENS \r
-                       | K_INT8 OPEN_PARENS int64 CLOSE_PARENS \r
-                       | K_BOOL OPEN_PARENS truefalse CLOSE_PARENS \r
-                       | compQstring \r
-                       | bytearrayhead bytes CLOSE_PARENS \r
-                       | K_NULLREF \r
-                       ;\r
-\r
-bytearrayhead           : K_BYTEARRAY OPEN_PARENS \r
-                       ;\r
-\r
-\r
-hexbyte                        : INT32\r
-                       | id\r
-                       ;\r
-\r
-bytes                  : /* EMPTY */ \r
-                       | hexbytes \r
-                       ;\r
-\r
-hexbytes                : hexbyte \r
-                       | hexbytes hexbyte \r
-                       ;\r
-\r
-instr_r_head            : INSTR_R OPEN_PARENS \r
-                       ;\r
-\r
-methodSpec              : K_METHOD \r
+                               $$ = new TryBlock (new HandlerBlock (from, to));\r
+                         }\r
                        ;\r
 \r
-instr                   : INSTR_NONE           {/* currentInstr = new InstrNone ((OpCode) $1);*/}\r
-                       | INSTR_VAR int32       {/* currentInstr = new InstrVar ((OpCode) $1, $2);*/}\r
-                       | INSTR_VAR id          {/* currentInstr = new InstrVar ((OpCode) $1, $2); */}\r
-                       | INSTR_I int32         {/* currentInstr = new InstrI ((OpCode) $1, (Int32) $2);*/}\r
-                       | INSTR_I8 int64        {/* currentInstr = new InstrI8 ((OpCode) $1, (Int64) $2);*/}\r
-                       | INSTR_R float64       {/* currentInstr = new InstrR ((OpCode) $1, (Double) $2);*/}\r
-                       | INSTR_R int64         {/* currentInstr = new InstrR ((OpCode) $1, (Int64) $2);*/}\r
-                       | instr_r_head bytes CLOSE_PARENS \r
-                       | INSTR_BRTARGET int32  \r
-                       | INSTR_BRTARGET id \r
-                       | INSTR_METHOD binding_flags type full_type DOUBLE_COLON call_name OPEN_PARENS arg_list CLOSE_PARENS \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
-                               /*\r
-                               if (OpCodes.Call.Equals ((OpCode)$1) || OpCodes.Callvirt.Equals ((OpCode)$1)) {\r
-                                       currentInstr = new InstrCall ((OpCode) $1, (string)$2, (string)$3, \r
-                                               (string)$4, (string)$6, $8 as ArrayList);\r
-                               } else if (OpCodes.Newobj.Equals ((OpCode)$1)) {\r
-                                       currentInstr = new InstrNewobj ((OpCode) $1, (string)$2, (string)$3, \r
-                                               (string)$4, (string)$6, $8 as ArrayList);\r
-                               }\r
-                               */                      \r
+                               LabelInfo from = codegen.CurrentMethodDef.AddLabel ((int) $2);\r
+                               FilterBlock fb = new FilterBlock (new HandlerBlock (from, null));\r
+                               $$ = fb;\r
                          }\r
-\r
-                                       \r
-                       | INSTR_METHOD callConv type methodName OPEN_PARENS sigArgs0 CLOSE_PARENS \r
-                                               {\r
-               \r
-                                               }\r
-                       | INSTR_NEWOBJ callConv type assembly_name name1 DOUBLE_COLON call_name OPEN_PARENS signature_args CLOSE_PARENS\r
-                                               { \r
-                                                       \r
-                                               }\r
-                       | INSTR_FIELD type typeSpec DOUBLE_COLON id \r
-                       | INSTR_FIELD type id \r
-                       | INSTR_TYPE typeSpec \r
-                       | INSTR_STRING compQstring \r
-                               {\r
-                               /*      currentInstr = new InstrString ((OpCode) $1, $2 as string); */\r
-                               }\r
-                       | INSTR_STRING bytearrayhead bytes CLOSE_PARENS \r
-                       | INSTR_SIG callConv type OPEN_PARENS sigArgs0 CLOSE_PARENS \r
-                       | INSTR_RVA id \r
-                       | INSTR_RVA int32 \r
-                       | INSTR_TOK methodSpec callConv type typeSpec DOUBLE_COLON methodName OPEN_PARENS sigArgs0 CLOSE_PARENS \r
-                       | INSTR_TOK methodSpec callConv type methodName OPEN_PARENS sigArgs0 CLOSE_PARENS \r
-                       | INSTR_TOK K_FIELD type typeSpec DOUBLE_COLON id \r
-                       | INSTR_TOK K_FIELD type id \r
-                       | INSTR_TOK typeSpec \r
-                       | INSTR_SWITCH OPEN_PARENS labels CLOSE_PARENS \r
-                       | INSTR_PHI int16s \r
-                       ;\r
-\r
-full_type\r
-       : type\r
-       | ID { $$ = $1; }\r
-       | assembly_name name1 { $$ = String.Format ("[{0}]{1}", $1, $2); }\r
-       ;\r
-\r
-arg_list \r
-       : /* EMPTY */\r
-       | full_type\r
-         {\r
-               ArrayList arg_list = new ArrayList ();\r
-               arg_list.Add ($1);\r
-               \r
-               $$ = arg_list;\r
-         }\r
-       | arg_list COMMA type \r
-         {\r
-               ArrayList arg_list = (ArrayList) $1;\r
-               arg_list.Add ($3);\r
-               \r
-               $$ = arg_list;\r
-         }\r
-       ;\r
-\r
-named_arg\r
-       : full_type ID\r
-         {\r
-               $$ = new DictionaryEntry ((string) $1, (string) $2);\r
-         }\r
-       ;\r
-\r
-named_arg_list         \r
-       : /* EMPTY */\r
-       | named_arg\r
-         {\r
-               ArrayList arg_list = new ArrayList ();\r
-               arg_list.Add ($1);\r
-\r
-               $$ = arg_list;                                  \r
-         }\r
-       | named_arg_list COMMA named_arg \r
-         {\r
-               ArrayList arg_list = (ArrayList) $1;\r
-               arg_list.Add ($3);\r
-                               \r
-               $$ = arg_list;\r
-         }\r
-       ;           \r
-\r
-       \r
-signature_args         : /* EMPTY */\r
-                       | type\r
-                       | type COMMA signature_args\r
-                       ;\r
-\r
-binding_flags          : /* EMPTY */\r
-                       | K_INSTANCE\r
                        ;\r
 \r
-sigArgs0                : /* EMPTY */ \r
-                       | sigArgs1 \r
-                       ;\r
-\r
-sigArgs1                : sigArg \r
-                       | sigArgs1 COMMA sigArg { $$ = String.Format ("{0},{1}", $1, $2); }\r
-                       ;\r
-\r
-sigArg                  : ELLIPSIS \r
-                       | paramAttr type \r
-                       | paramAttr type id { $$ = String.Format ("{0} {1}", $2, $3); }\r
-                       | paramAttr type K_MARSHAL OPEN_PARENS nativeType CLOSE_PARENS \r
-                       | paramAttr type K_MARSHAL OPEN_PARENS nativeType CLOSE_PARENS id \r
-sint                   ;\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
-dottedName             : id DOT id     {$$ = ($1 as string) + "." + ($3 as string);}\r
+                               $$ = new HandlerBlock (from, to);\r
+                         }\r
                        ;\r
 \r
-\r
-name1                   : id\r
-                       | dottedName\r
-                       | name1 DOT name1       {$$ = String.Format ("{0}.{1}", $1, $3); }\r
+instr                  : INSTR_NONE\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
+                          {\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
+                          {\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
+                          {\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
+                          {\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 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 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
-call_name              : \r
+labels                 : /* EMPTY */\r
                        | id\r
-                       | D_CTOR\r
-                       | D_CCTOR\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 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
+                       | event_decls event_decl\r
+                       ;\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 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
+                       | prop_decls prop_decl\r
+                       ;\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 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
+                         bytes_list\r
                        ;\r
                        \r
-assembly_ref           : id\r
-                       | id DASH id {$$ = String.Format ("{0}-{1}", $1, $3);}\r
-                       | id DASH assembly_ref {$$ = String.Format ("{0}-{1}", $1, $3);}\r
-                       ;\r
-\r
-assembly_name          : OPEN_BRACKET assembly_ref CLOSE_BRACKET {$$ = ($2 as string);}\r
-                       ;\r
-\r
-className               : OPEN_BRACKET name1 CLOSE_BRACKET slashedName \r
-                       | OPEN_BRACKET D_MODULE name1 CLOSE_BRACKET slashedName \r
-                       | slashedName \r
-                       ;\r
-\r
-slashedName             : name1\r
-                       | slashedName SLASH name1       {$$ = ($1 as string) + "/" + ($3 as string);}\r
-                       ;\r
-\r
-typeSpec                : className \r
-                       | OPEN_BRACKET name1 CLOSE_BRACKET \r
-                       | OPEN_BRACKET D_MODULE name1 CLOSE_BRACKET \r
-                       | type \r
-                       ;\r
-\r
-callConv                : K_INSTANCE callConv  { /* currentCallConv |= CallingConventions.HasThis; */}\r
-                       | K_EXPLICIT callConv   { /* currentCallConv |= CallingConventions.ExplicitThis; */}\r
-                       | callKind \r
-                       ;\r
-\r
-callKind                : /* EMPTY */ \r
-                       | K_DEFAULT             { /* currentCallConv |= CallingConventions.Standard; */}\r
-                       | K_VARARG              { /* currentCallConv |= CallingConventions.VarArgs; */}\r
-                       | K_UNMANAGED K_CDECL \r
-                       | K_UNMANAGED K_STALL \r
-                       | K_UNMANAGED K_THISCALL \r
-                       | K_UNMANAGED K_FASTCALL \r
-                       ;\r
-\r
-nativeType              : /* EMPTY */  \r
-                       | K_CUSTOM OPEN_PARENS compQstring COMMA compQstring COMMA compQstring COMMA compQstring CLOSE_PARENS \r
-                       | K_CUSTOM OPEN_PARENS compQstring COMMA compQstring CLOSE_PARENS \r
-                       | K_FIXED K_SYSSTRING OPEN_BRACKET int32 CLOSE_BRACKET \r
-                       | K_FIXED K_ARRAY OPEN_BRACKET int32 CLOSE_BRACKET \r
-                       | K_VARIANT \r
-                       | K_CURRENCY \r
-                       | K_SYSCHAR \r
-                       | K_VOID \r
-                       | K_BOOL \r
-                       | K_INT8 \r
-                       | K_INT16 \r
-                       | K_INT32 \r
-                       | K_INT64 \r
-                       | K_FLOAT32 \r
-                       | K_FLOAT64 \r
-                       | K_ERROR \r
-                       | K_UNSIGNED K_INT8 \r
-                       | K_UNSIGNED K_INT16 \r
-                       | K_UNSIGNED K_INT32 \r
-                       | K_UNSIGNED K_INT64 \r
-                       | nativeType STAR \r
-                       | nativeType OPEN_BRACKET CLOSE_BRACKET \r
-                       | nativeType OPEN_BRACKET int32 CLOSE_BRACKET \r
-                       | nativeType OPEN_BRACKET int32 PLUS int32 CLOSE_BRACKET \r
-                       | nativeType OPEN_BRACKET PLUS int32 CLOSE_BRACKET \r
-                       | K_DECIMAL \r
-                       | K_DATE \r
-                       | K_BSTR \r
-                       | K_LPSTR \r
-                       | K_LPWSTR \r
-                       | K_LPTSTR \r
-                       | K_OBJECTREF \r
-                       | K_IUNKNOWN \r
-                       | K_IDISPATCH \r
-                       | K_STRUCT \r
-                       | K_INTERFACE \r
-                       | K_SAFEARRAY variantType \r
-                       | K_INT \r
-                       | K_UNSIGNED K_INT \r
-                       | K_NESTED K_STRUCT \r
-                       | K_BYVALSTR \r
-                       | K_ANSI K_BSTR \r
-                       | K_TBSTR \r
-                       | K_VARIANT K_BOOL \r
-                       | methodSpec \r
-                       | K_AS K_ANY \r
-                       | K_LPSTRUCT \r
-                       ;\r
-\r
-variantType             : /* EMPTY */ \r
-                       | K_NULL \r
-                       | K_VARIANT \r
-                       | K_CURRENCY \r
-                       | K_VOID \r
-                       | K_BOOL \r
-                       | K_INT8 \r
-                       | K_INT16 \r
-                       | K_INT32 \r
-                       | K_INT64 \r
-                       | K_FLOAT32 \r
-                       | K_FLOAT64 \r
-                       | K_UNSIGNED K_INT8 \r
-                       | K_UNSIGNED K_INT16 \r
-                       | K_UNSIGNED K_INT32 \r
-                       | K_UNSIGNED K_INT64 \r
-                       | STAR \r
-                       | variantType OPEN_BRACKET CLOSE_BRACKET \r
-                       | variantType K_VECTOR \r
-                       | variantType AMPERSAND \r
-                       | K_DECIMAL \r
-                       | K_DATE \r
-                       | K_BSTR \r
-                       | K_LPSTR \r
-                       | K_LPWSTR \r
-                       | K_IUNKNOWN \r
-                       | K_IDISPATCH \r
-                       | K_SAFEARRAY \r
-                       | K_INT \r
-                       | K_UNSIGNED K_INT \r
-                       | K_ERROR \r
-                       | K_HRESULT \r
-                       | K_CARRAY \r
-                       | K_USERDEFINED \r
-                       | K_RECORD \r
-                       | K_FILETIME \r
-                       | K_BLOB \r
-                       | K_STREAM \r
-                       | K_STORAGE \r
-                       | K_STREAMED_OBJECT \r
-                       | K_STORED_OBJECT \r
-                       | K_BLOB_OBJECT \r
-                       | K_CF \r
-                       | K_CLSID \r
-                       ;\r
-\r
-type                    : K_CLASS className \r
-                       | K_OBJECT  \r
-                       | K_STRING  \r
-                       | K_VALUE K_CLASS className  \r
-                       | K_VALUETYPE className  \r
-                       | type OPEN_BRACKET CLOSE_BRACKET  \r
-                       | type OPEN_BRACKET bounds1 CLOSE_BRACKET  \r
-                       /* uncomment when and if this type is supported by the Runtime\r
-                       | type K_VALUE OPEN_BRACKET int32 CLOSE_BRACKET \r
-                        */\r
-                       | type AMPERSAND \r
-                       | type STAR \r
-                       | type K_PINNED \r
-                       | type K_MODREQ OPEN_PARENS className CLOSE_PARENS \r
-                       | type K_MODOPT OPEN_PARENS className CLOSE_PARENS \r
-                       | BANG int32 \r
-                       | methodSpec callConv type STAR OPEN_PARENS sigArgs0 CLOSE_PARENS \r
-                       | K_TYPEDREF \r
-                       | K_CHAR \r
-                       | K_VOID \r
-                       | K_BOOL \r
-                       | K_INT8 \r
-                       | K_INT16 \r
-                       | K_INT32 \r
-                       | K_INT64 \r
-                       | K_FLOAT32 \r
-                       | K_FLOAT64 \r
-                       | K_UNSIGNED K_INT8     {$$ = "uint8";}\r
-                       | K_UNSIGNED K_INT16    {$$ = "uint16";}\r
-                       | K_UNSIGNED K_INT32    {$$ = "uint32";}\r
-                       | K_UNSIGNED K_INT64    {$$ = "uint64";}\r
-                       | K_NATIVE K_INT \r
-                       | K_NATIVE K_UNSIGNED K_INT \r
-                       | K_NATIVE K_FLOAT \r
-                       ;\r
-\r
-bounds1                 : bound \r
-                       | bounds1 COMMA bound \r
-                       ;\r
-\r
-bound                   : /* EMPTY */ \r
-                       | ELLIPSIS \r
-                       | int32  \r
-                       | int32 ELLIPSIS int32    \r
-                       | int32 ELLIPSIS  \r
-                       ;\r
-\r
-labels                  : /* empty */ \r
-                       | id COMMA labels \r
-                       | int32 COMMA labels \r
-                       | id \r
-                       | int32 \r
-                       ;\r
-\r
-\r
-id                      : ID \r
-                       | SQSTRING \r
-                       ;\r
-\r
-int16s                  : /* EMPTY */ \r
-                       | int16s int32 \r
-                       ;\r
-                                \r
-int32                   : INT32 /* NOTE: it's INT64 in docs */\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 bytes_list\r
+                       ;\r
+\r
+nameval_pairs          : nameval_pair \r
+                       | nameval_pairs COMMA nameval_pair\r
+                       ;\r
+\r
+nameval_pair           : comp_qstring ASSIGN cavalue\r
+                       ;\r
+\r
+cavalue                : truefalse\r
+                       | int32\r
+                       | int32 OPEN_PARENS int32 CLOSE_PARENS\r
+                       | comp_qstring \r
+                       | class_ref OPEN_PARENS K_INT8 COLON int32 CLOSE_PARENS\r
+                       | class_ref OPEN_PARENS K_INT16 COLON int32 CLOSE_PARENS\r
+                       | class_ref OPEN_PARENS K_INT32 COLON int32 CLOSE_PARENS\r
+                       | class_ref OPEN_PARENS int32 CLOSE_PARENS\r
+                       ;\r
+\r
+sec_action             : K_REQUEST\r
+                       | K_DEMAND\r
+                       | K_ASSERT\r
+                       | K_DENY\r
+                       | K_PERMITONLY\r
+                       | K_LINKCHECK\r
+                       | K_INHERITCHECK\r
+                       | K_REQMIN\r
+                       | K_REQOPT\r
+                       | K_REQREFUSE\r
+                       | K_PREJITGRANT\r
+                       | K_PREJITDENY\r
+                       | K_NONCASDEMAND\r
+                       | K_NONCASLINKDEMAND\r
+                       | K_NONCASINHERITANCE\r
+                       ;\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
+                         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
-int64                   : INT64 \r
+assembly_head          : D_ASSEMBLY asm_attr slashed_name\r
+                          {\r
+                                codegen.SetAssemblyName ((string) $3);\r
+                          }\r
                        ;\r
 \r
-float64                 : FLOAT64 \r
-                       | K_FLOAT32 OPEN_PARENS int32 CLOSE_PARENS \r
-                       | K_FLOAT64 OPEN_PARENS int64 CLOSE_PARENS \r
+asm_attr               : /* EMPTY */\r
+                       | asm_attr K_NOAPPDOMAIN\r
+                       | asm_attr K_NOPROCESS\r
+                       | asm_attr K_NOMACHINE\r
                        ;\r
 \r
-secDecl                 : D_PERMISSION secAction typeSpec OPEN_PARENS nameValPairs CLOSE_PARENS \r
-                       | D_PERMISSION secAction typeSpec \r
-                       | psetHead bytes CLOSE_PARENS \r
+assembly_decls         : /* EMPTY */\r
+                       | assembly_decls assembly_decl\r
                        ;\r
 \r
-psetHead                : D_PERMISSIONSET secAction ASSIGN OPEN_PARENS \r
-                       ;\r
-\r
-nameValPairs            : nameValPair \r
-                       | nameValPair COMMA nameValPairs \r
-                       ;\r
-\r
-nameValPair             : compQstring ASSIGN caValue \r
-                       ;\r
-\r
-truefalse              : K_TRUE \r
-                       | K_FALSE \r
-                       ;\r
-\r
-caValue                 : truefalse \r
-                       | int32 \r
-                       | K_INT32 OPEN_PARENS int32 CLOSE_PARENS \r
-                       | compQstring \r
-                       | className OPEN_PARENS K_INT8 COLON int32 CLOSE_PARENS \r
-                       | className OPEN_PARENS K_INT16 COLON int32 CLOSE_PARENS \r
-                       | className OPEN_PARENS K_INT32 COLON int32 CLOSE_PARENS \r
-                       | className OPEN_PARENS int32 CLOSE_PARENS \r
-                       ;\r
-\r
-secAction               : K_REQUEST \r
-                       | K_DEMAND \r
-                       | K_ASSERT \r
-                       | K_DENY \r
-                       | K_PERMITONLY \r
-                       | K_LINKCHECK \r
-                       | K_INHERITCHECK \r
-                       | K_REQMIN \r
-                       | K_REQOPT \r
-                       | K_REQREFUSE \r
-                       | K_PREJITGRANT \r
-                       | K_PREJITDENY \r
-                       | K_NONCASDEMAND \r
-                       | K_NONCASLINKDEMAND \r
-                       | K_NONCASINHERITANCE \r
-                       ;\r
-\r
-extSourceSpec           : D_LINE int32 SQSTRING \r
-                       | D_LINE int32 \r
-                       | D_XLINE int32 QSTRING \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
                        ;\r
 \r
-fileDecl                : D_FILE fileAttr name1 fileEntry hashHead bytes CLOSE_PARENS fileEntry \r
-                       | D_FILE fileAttr name1 fileEntry \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 bytes_list\r
+                       | customattr_decl\r
                        ;\r
 \r
-fileAttr                : /* EMPTY */ \r
-                       | fileAttr K_NOMETADATA \r
+assemblyref_all                : assemblyref_head OPEN_BRACE assemblyref_decls CLOSE_BRACE\r
                        ;\r
 \r
-fileEntry               : /* EMPTY */ \r
-                       | D_ENTRYPOINT \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_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
-hashHead                : D_HASH ASSIGN OPEN_PARENS \r
+exptype_all            : exptype_head OPEN_BRACE exptype_decls CLOSE_BRACE\r
                        ;\r
 \r
-assemblyHead            : D_ASSEMBLY asmAttr name1\r
-                       {\r
-                               /*\r
-                               // TODO: set assembly attrs\r
-                               codegen.SetName ($3 as string);\r
-                               */\r
-                       }\r
+exptype_head           : D_CLASS K_EXTERN expt_attr comp_name\r
                        ;\r
 \r
-asmAttr                 : /* EMPTY */ \r
-                       | asmAttr K_NOAPPDOMAIN \r
-                       | asmAttr K_NOPROCESS \r
-                       | asmAttr K_NOMACHINE \r
+expt_attr              : /* EMPTY */\r
+                       | expt_attr K_PRIVATE\r
+                       | expt_attr K_PUBLIC \r
+                       | expt_attr K_NESTED K_PUBLIC\r
+                       | expt_attr K_NESTED K_PRIVATE\r
+                       | expt_attr K_NESTED K_FAMILY\r
+                       | expt_attr K_NESTED K_ASSEMBLY\r
+                       | expt_attr K_NESTED K_FAMANDASSEM\r
+                       | expt_attr K_NESTED K_FAMORASSEM\r
                        ;\r
 \r
-assemblyDecls           : /* EMPTY */\r
-                       | assemblyDecls assemblyDecl\r
+exptype_decls          : /* EMPTY */\r
+                       | exptype_decls exptype_decl\r
                        ;\r
 \r
-assemblyDecl            : D_HASH K_ALGORITHM int32 \r
-                       | secDecl\r
-                       | asmOrRefDecl\r
+exptype_decl           : D_FILE comp_name\r
+                       | D_CLASS K_EXTERN comp_name\r
+                       | D_CLASS int32\r
+                       | customattr_decl\r
                        ;\r
 \r
-asmOrRefDecl            : publicKeyHead bytes CLOSE_PARENS \r
-                       | D_VER int32 COLON int32 COLON int32 COLON int32 \r
-                       | D_LOCALE compQstring \r
-                       | localeHead bytes CLOSE_PARENS \r
-                       | D_PROCESSOR int32 \r
-                       | D_OS int32 D_VER int32 COLON int32 \r
-                       | customAttrDecl\r
+manifestres_all                : manifestres_head OPEN_BRACE manifestres_decls CLOSE_BRACE\r
                        ;\r
 \r
-publicKeyHead           : D_PUBLICKEY ASSIGN OPEN_PARENS \r
+manifestres_head       : D_MRESOURCE manres_attr comp_name     \r
                        ;\r
 \r
-publicKeyTokenHead      : D_PUBLICKEYTOKEN ASSIGN OPEN_PARENS \r
+manres_attr            : /* EMPTY */\r
+                       | manres_attr K_PUBLIC\r
+                       | manres_attr K_PRIVATE\r
                        ;\r
 \r
-localeHead              : D_LOCALE ASSIGN OPEN_PARENS \r
+manifestres_decls      : /* EMPTY */\r
+                       | manifestres_decls manifestres_decl\r
                        ;\r
 \r
-assemblyRefHead         : D_ASSEMBLY K_EXTERN name1 \r
-                         {\r
-                               System.Reflection.AssemblyName asmb_name = \r
-                                       new System.Reflection.AssemblyName ();\r
-                               asmb_name.Name = (string) $3;\r
-                               codegen.ExternTable.AddAssembly ((string) $3, asmb_name);\r
-                         }\r
+manifestres_decl       : D_FILE comp_name K_AT int32\r
+                       | D_ASSEMBLY K_EXTERN slashed_name\r
+                       | customattr_decl\r
                        ;\r
 \r
-assemblyRefDecls        : /* EMPTY */\r
-                       | assemblyRefDecls assemblyRefDecl\r
+comp_qstring           : QSTRING\r
+                       | comp_qstring PLUS QSTRING     { $$ = String.Format ("{0}{1}", $1, $3); }\r
                        ;\r
 \r
-assemblyRefDecl         : hashHead bytes CLOSE_PARENS \r
-                       | asmOrRefDecl\r
-                       | publicKeyTokenHead bytes CLOSE_PARENS \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
-comtypeHead             : D_CLASS K_EXTERN comtAttr name1  \r
+int64                  : INT64\r
                        ;\r
 \r
-exportHead              : D_EXPORT comtAttr name1 \r
+float64                        : FLOAT64\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
-comtAttr                : /* EMPTY */ \r
-                       | comtAttr K_PRIVATE \r
-                       | comtAttr K_PUBLIC \r
-                       | comtAttr K_NESTED K_PUBLIC \r
-                       | comtAttr K_NESTED K_PRIVATE \r
-                       | comtAttr K_NESTED K_FAMILY \r
-                       | comtAttr K_NESTED K_ASSEMBLY \r
-                       | comtAttr K_NESTED K_FAMANDASSEM \r
-                       | comtAttr K_NESTED K_FAMORASSEM \r
+hexbyte                        : HEXBYTE       { }\r
                        ;\r
 \r
-comtypeDecls            : /* EMPTY */\r
-                       | comtypeDecls comtypeDecl\r
-                       ;\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
-comtypeDecl             : D_FILE name1 \r
-                       | D_CLASS K_EXTERN name1 \r
-                       | D_CLASS  int32 \r
-                       | customAttrDecl\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
-manifestResHead         : D_MRESOURCE manresAttr name1 \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
-manresAttr              : /* EMPTY */ \r
-                       | manresAttr K_PUBLIC \r
-                       | manresAttr K_PRIVATE \r
+truefalse              : K_TRUE\r
+                          {\r
+                                $$ = true;\r
+                          }\r
+                       | K_FALSE\r
+                          {\r
+                                $$ = false;\r
+                          }\r
                        ;\r
 \r
-manifestResDecls        : /* EMPTY */\r
-                       | manifestResDecls manifestResDecl\r
+id                     : ID\r
+                       | SQSTRING\r
                        ;\r
 \r
-manifestResDecl         : D_FILE name1 K_AT int32 \r
-                       | D_ASSEMBLY K_EXTERN name1 \r
-                       | customAttrDecl\r
+comp_name              : id\r
+                       | comp_name DOT id\r
+                          {\r
+                                $$ = (string) $1 + '.' + (string) $3;\r
+                          }\r
+                        | COMP_NAME\r
                        ;\r
 \r
-\r
-\r
 %%\r
 \r
-} // namespace Mono.ILASM\r
+}\r
+\r