* ILParser.jay: Remove unused references
[mono.git] / mcs / ilasm / parser / ILParser.jay
index 4350cfa6c6ffddca1e026e28d7c007e2e9b87505..9bcebe7fe9f4e25328dab6db92ee96c193fb9b04 100644 (file)
@@ -3,35 +3,24 @@
 //\r
 // (C) Sergey Chaban (serge@wildwestsoftware.com)\r
 \r
+using PEAPI;\r
 using System;\r
-using System.Reflection;\r
-using System.Reflection.Emit;\r
+using System.Collections;\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
+               public ILParser (CodeGen codegen) {\r
+                       this.codegen = codegen;\r
+               }\r
 \r
                public CodeGen CodeGen {\r
-                       get {\r
-                               return codegen;\r
-                       }\r
+                       get { return codegen; }\r
                }\r
-\r
+               \r
 %}\r
 \r
 %token EOF\r
@@ -75,7 +64,7 @@ namespace Mono.ILASM {
 %token SLASH         "/"\r
 %token BANG          "!"\r
 %token ELLIPSIS      "..."\r
-\r
+%token DASH          "-"\r
 \r
 \r
 \r
@@ -91,6 +80,7 @@ namespace Mono.ILASM {
 %token INSTR_R\r
 %token INSTR_BRTARGET\r
 %token INSTR_METHOD\r
+%token INSTR_NEWOBJ\r
 %token INSTR_FIELD\r
 %token INSTR_TYPE\r
 %token INSTR_STRING\r
@@ -106,7 +96,6 @@ namespace Mono.ILASM {
 \r
 \r
 \r
-\r
 /* Mechanically generated  - DO NOT EDIT! */\r
 \r
 \r
@@ -373,7 +362,7 @@ decls                   : /* EMPTY */
                        ;\r
 \r
 decl                    : classAll\r
-                       | nameSpaceHead OPEN_BRACE decls CLOSE_BRACE \r
+                       | nameSpaceHead OPEN_BRACE decls CLOSE_BRACE { codegen.CurrentNameSpace = String.Empty; }\r
                        | methodAll\r
                        | fieldDecl\r
                        | dataDecl\r
@@ -433,55 +422,99 @@ vtableHead              : D_VTABLE ASSIGN OPEN_PARENS
                        ;\r
 \r
 nameSpaceHead           : D_NAMESPACE name1 \r
+                       {\r
+                               codegen.CurrentNameSpace = (string) $2;\r
+                       }\r
                        ;\r
 \r
-classHead               : D_CLASS classAttr id extendsClause implClause\r
+classHead               : D_CLASS type_attr id extendsClause implClause\r
                        {\r
-                               currentTypeAttrs = 0;\r
-                               currentClass = new Class ($3 as string);\r
-                               currentClass.Attrs = currentTypeAttrs;\r
-\r
-                               // TODO: extends/implemets\r
+                               if ($4 != null) {\r
+                                       codegen.AddClass ((TypeAttr) $2, (string) $3, \r
+                                               ((TypeRef)$4).Type as Class, null);\r
+                               } else {\r
+                                       codegen.AddClass ((TypeAttr)$2, (string) $3, null);\r
+                               }\r
+                               \r
+                               ArrayList impl_list = (ArrayList) $5;\r
+                               if (impl_list != null) {\r
+                                       foreach (TypeRef type_ref in impl_list)\r
+                                               codegen.CurrentClass.AddImplementedInterface (type_ref.Type as Class);\r
+                               }\r
                        }\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_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
+                       | 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
                        ;\r
 \r
 extendsClause           : /* EMPTY */                                           \r
-                       | K_EXTENDS className \r
+                       | K_EXTENDS class_ref   {$$ = $2;}\r
                        ;\r
 \r
 implClause              : /* EMPTY */\r
-                       | K_IMPLEMENTS classNames\r
+                       | K_IMPLEMENTS classNames       {$$ = $2; }\r
                        ;\r
 \r
-classNames              : classNames COMMA className \r
-                       | className \r
+classNames              : classNames COMMA class_ref\r
+                         {\r
+                               ArrayList class_list = (ArrayList) $1;\r
+                               class_list.Add ($3);\r
+                         }\r
+                       | class_ref\r
+                         {\r
+                               ArrayList class_list = new ArrayList ();\r
+                               class_list.Add ($1);\r
+                               $$ = class_list;\r
+                         }\r
                        ;\r
 \r
 classDecls              : /* EMPTY */\r
@@ -491,8 +524,10 @@ classDecls              : /* EMPTY */
 \r
 classAll               : classHead OPEN_BRACE classDecls CLOSE_BRACE\r
                        {\r
+                               /*\r
                                codegen.AddClass (currentClass);\r
                                currentClass = null;\r
+                               */\r
                        }\r
                        ;\r
 \r
@@ -513,10 +548,71 @@ classDecl               : methodAll
                        | languageDecl\r
                        ;\r
 \r
-fieldDecl               : D_FIELD repeatOpt fieldAttr type id atOpt initOpt \r
+fieldDecl               : D_FIELD repeatOpt fieldAttr type_ref id atOpt initOpt \r
+                         {\r
+                               codegen.CurrentClass.AddField ((FieldAttr) $3, \r
+                                       (string) $5, ((TypeRef) $4).Type);\r
+                         }\r
+                       ;\r
+\r
+type_ref               : primative_type_ref\r
+                       | internal_type_ref\r
+                       | external_type_ref\r
+                       ;\r
+\r
+class_ref              : internal_type_ref\r
+                       | external_type_ref\r
+                       ;\r
+\r
+primative_type_ref     : K_CHAR                \r
+                         {$$ = new TypeRef (PrimitiveType.Char, "System.Char"); }\r
+                       | K_VOID                \r
+                         {$$ = new TypeRef (PrimitiveType.Void, "System.Void"); }\r
+                       | K_BOOL                \r
+                         {$$ = new TypeRef (PrimitiveType.Boolean, "System.Bool"); }\r
+                       | K_INT8                \r
+                         {$$ = new TypeRef (PrimitiveType.Int8, "System.Int8"); }\r
+                       | K_INT16               \r
+                         {$$ = new TypeRef (PrimitiveType.Int16, "System.Int16"); }\r
+                       | K_INT32               \r
+                         {$$ = new TypeRef (PrimitiveType.Int32, "System.Int32"); }\r
+                       | K_INT64               \r
+                         {$$ = new TypeRef (PrimitiveType.Int64, "System.Int64"); }\r
+                       | K_FLOAT32             \r
+                         {$$ = new TypeRef (PrimitiveType.Float32, "System.Float32"); }\r
+                       | K_FLOAT64             \r
+                         {$$ = new TypeRef (PrimitiveType.Float64, "System.Float64"); }\r
+                       | K_UNSIGNED K_INT8     \r
+                         {$$ = new TypeRef (PrimitiveType.UInt8, "System.UInt8"); }\r
+                       | K_UNSIGNED K_INT16    \r
+                         {$$ = new TypeRef (PrimitiveType.UInt16, "System.UInt16"); }\r
+                       | K_UNSIGNED K_INT32    \r
+                         {$$ = new TypeRef (PrimitiveType.UInt32, "System.UInt32"); }\r
+                       | K_UNSIGNED K_INT64    \r
+                         {$$ = new TypeRef (PrimitiveType.UInt64, "System.UInt64"); }\r
+                       | K_STRING              \r
+                         {$$ = new TypeRef (PrimitiveType.String, "System.String"); }\r
+                       ;\r
+\r
+internal_type_ref      : name1\r
+                         {\r
+                               $$ = new TypeRef (codegen.ClassTable.GetReference ((string) $1, null),\r
+                                       (string) $1);\r
+                         }\r
+                       ;\r
+\r
+external_type_ref      : assembly_name namespace_name DOT id\r
+                         {\r
+                               $$ = new TypeRef (codegen.ExternTable.GetClass ($1 as string, \r
+                                       $2 as string, $4 as string), String.Format ("{0}.{1}", $2, $4));\r
+                         }\r
+                       ;\r
+\r
+namespace_name         : /* EMPTY */\r
+                       | id\r
+                       | namespace_name DOT id {$$ = String.Format ("{0}.{1}", $1, $3); }\r
                        ;\r
 \r
-\r
 atOpt                   : /* EMPTY */  \r
                        | K_AT id \r
                        ;\r
@@ -592,52 +688,66 @@ propDecl                : D_SET callConv type typeSpec DOUBLE_COLON methodName O
                        ;\r
 \r
 \r
-methodHeadPart1         : D_METHOD\r
-                       {\r
-                               method = new Method ();\r
-                               currentCallConv = 0; /*?*/\r
-                       }\r
-                       ;\r
-\r
-methodHead              : methodHeadPart1 methAttr callConv paramAttr type methodName OPEN_PARENS sigArgs0 CLOSE_PARENS implAttr OPEN_BRACE \r
+methodHead              : D_METHOD methAttr callConv type_ref methodName \r
+                               OPEN_PARENS arg_list CLOSE_PARENS implAttr OPEN_BRACE \r
                        {\r
-                               method.SetMethodName ($6 as MethodName);\r
-                               method.CallConv = currentCallConv;\r
-                               method.RetType = $5 as string;\r
+                               Param[] param_array;\r
+                               TypeRef[] typeref_array;\r
+                               if ($7 != null) {\r
+                                       ArrayList param_list = $7 as ArrayList;\r
+                                       int index = 0;\r
+                                       param_array = new Param[param_list.Count];\r
+                                       typeref_array = new TypeRef[param_list.Count];\r
+                                       foreach (DictionaryEntry entry in param_list) {\r
+                                               param_array[index] = entry.Key as Param;\r
+                                               typeref_array[index] = entry.Value as TypeRef;\r
+                                               index++;\r
+                                       }\r
+                               } else {\r
+                                       param_array = new Param[0];\r
+                                       typeref_array = new TypeRef[0];\r
+                               }\r
+                               \r
+                               codegen.AddMethod ((MethAttr) $2, (ImplAttr) $9, (CallConv) $3, (string) $5, \r
+                                       (TypeRef) $4, param_array, typeref_array, null);\r
                        }\r
-                       | methodHeadPart1 methAttr callConv paramAttr type K_MARSHAL OPEN_PARENS nativeType CLOSE_PARENS methodName OPEN_PARENS sigArgs0 CLOSE_PARENS implAttr OPEN_BRACE\r
+                       | D_METHOD 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                : /* EMPTY */                  { $$ = MethAttr.Default; }\r
+                       | methAttr K_STATIC             { $$ = (MethAttr) $1 | MethAttr.Static; }\r
+                       | methAttr K_PUBLIC             { $$ = (MethAttr) $1 | MethAttr.Public; }\r
+                       | methAttr K_PRIVATE            { $$ = (MethAttr) $1 | MethAttr.Private; }\r
+                       | methAttr K_FAMILY             { $$ = (MethAttr) $1 | MethAttr.Family; }\r
+                       | methAttr K_FINAL              { $$ = (MethAttr) $1 | MethAttr.Final; }\r
+                       | methAttr K_SPECIALNAME        { $$ = (MethAttr) $1 | MethAttr.SpecialName; }\r
+                       | methAttr K_VIRTUAL            { $$ = (MethAttr) $1 | MethAttr.Virtual; }\r
+                       | methAttr K_ABSTRACT           { $$ = (MethAttr) $1 | MethAttr.Abstract; }\r
+                       | methAttr K_ASSEMBLY           { $$ = (MethAttr) $1 | MethAttr.Assembly; }\r
+                       | methAttr K_FAMANDASSEM        { $$ = (MethAttr) $1 | MethAttr.FamAndAssem; }\r
+                       | methAttr K_FAMORASSEM         { $$ = (MethAttr) $1 | MethAttr.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
+                       | methAttr K_HIDEBYSIG          { $$ = (MethAttr) $1 | MethAttr.HideBySig; }\r
+                       | methAttr K_NEWSLOT            { $$ = (MethAttr) $1 | MethAttr.NewSlot; }\r
+                       | methAttr K_RTSPECIALNAME      { $$ = (MethAttr) $1 | MethAttr.RTSpecialName; }\r
+                       | methAttr K_UNMANAGEDEXP       {/* FIXME */}\r
+                       | methAttr K_REQSECOBJ          { $$ = (MethAttr) $1 | MethAttr.RequireSecObject; }\r
+                       /*\r
+                       | methAttr K_PINVOKEIMPL OPEN_PARENS compQstring K_AS compQstring pinvAttr CLOSE_PARENS { }\r
+                       | methAttr K_PINVOKEIMPL OPEN_PARENS compQstring  pinvAttr CLOSE_PARENS                 { }\r
+                       | methAttr K_PINVOKEIMPL OPEN_PARENS pinvAttr CLOSE_PARENS                              { }\r
+                       */\r
                        ;\r
 \r
 pinvAttr                : /* EMPTY */ \r
@@ -653,69 +763,89 @@ pinvAttr                : /* EMPTY */
                        | 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
+methodName              : D_CTOR\r
+                       | D_CCTOR\r
+                       | name1\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
+paramAttr               : /* EMPTY */                                  {$$ = ParamAttr.Default; }\r
+                       | paramAttr OPEN_BRACKET K_IN CLOSE_BRACKET     {$$ = (ParamAttr) $1 | ParamAttr.In; }\r
+                       | paramAttr OPEN_BRACKET K_OUT CLOSE_BRACKET    {$$ = (ParamAttr) $1 | ParamAttr.Out; }\r
+                       | paramAttr OPEN_BRACKET K_OPT CLOSE_BRACKET    {$$ = (ParamAttr) $1 | ParamAttr.Opt; }\r
+                       /* | paramAttr OPEN_BRACKET int32 CLOSE_BRACKET  */\r
                        ;\r
         \r
-fieldAttr               : /* EMPTY */ \r
-                       | fieldAttr K_STATIC \r
-                       | fieldAttr K_PUBLIC \r
-                       | fieldAttr K_PRIVATE \r
-                       | fieldAttr K_FAMILY \r
-                       | fieldAttr K_INITONLY \r
-                       | fieldAttr K_RTSPECIALNAME  /**/\r
-                       | fieldAttr K_SPECIALNAME \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
-                               */\r
+                               \r
                        | fieldAttr K_MARSHAL OPEN_PARENS nativeType CLOSE_PARENS \r
-                       | fieldAttr K_ASSEMBLY \r
-                       | fieldAttr K_FAMANDASSEM \r
-                       | fieldAttr K_FAMORASSEM \r
-                       | fieldAttr K_COMPILERCONTROLLED \r
-                       | fieldAttr K_LITERAL \r
-                       | fieldAttr K_NOTSERIALIZED \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
+implAttr                : /* empty */          {$$ = new ImplAttr (); }\r
+                       | implAttr K_NATIVE     {$$ = (ImplAttr) $1 | ImplAttr.Native; }\r
+                       | implAttr K_IL         {$$ = (ImplAttr) $1 | ImplAttr.IL; }\r
+                       | implAttr K_CIL        { /* Do nothing */ }\r
+                       | implAttr K_OPTIL      {$$ = (ImplAttr) $1 | ImplAttr.Optil; }\r
+                       | implAttr K_MANAGED    { /* Do nothing */ }\r
+                       | implAttr K_UNMANAGED  {$$ = (ImplAttr) $1 | ImplAttr.Unmanaged; }\r
+                       | implAttr K_FORWARDREF {$$ = (ImplAttr) $1 | ImplAttr.ForwardRef; }\r
+                       | implAttr K_PRESERVESIG {$$ = (ImplAttr) $1 | ImplAttr.PreserveSig; }\r
+                       | implAttr K_RUNTIME    {$$ = (ImplAttr) $1 | ImplAttr.PreserveSig; }\r
+                       | implAttr K_INTERNALCALL {$$ = (ImplAttr) $1 | ImplAttr.InternalCall; }\r
+                       | implAttr K_SYNCHRONIZED {$$ = (ImplAttr) $1 | ImplAttr.Synchronized; }\r
+                       | implAttr K_NOINLINING {$$ = (ImplAttr) $1 | ImplAttr.NoInLining; }\r
                        ;\r
 \r
+localsHead              : D_LOCALS\r
+                       ;\r
 \r
+                                       \r
 methodDecl              : D_EMITBYTE int32 \r
                        | sehBlock \r
                        | D_MAXSTACK int32 \r
+                         {\r
+                               codegen.CurrentMethod.SetMaxStack ((int) $2);\r
+                         }\r
                        | localsHead OPEN_PARENS sigArgs0 CLOSE_PARENS \r
-                       | localsHead K_INIT OPEN_PARENS sigArgs0 CLOSE_PARENS \r
-                       | D_ENTRYPOINT \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          \r
+                         { \r
+                               codegen.CurrentMethod.DeclareEntryPoint ();\r
+                         }\r
                        | D_ZEROINIT \r
                        | dataDecl\r
-                       | instr                 {method.AddInstruction (currentInstr);}\r
+                       | instr {\r
+                               /*      method.AddInstruction (currentInstr); */\r
+                               }\r
                        | id COLON \r
                        | secDecl\r
                        | extSourceSpec\r
@@ -862,22 +992,48 @@ instr_r_head            : INSTR_R OPEN_PARENS
 methodSpec              : K_METHOD \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                   : INSTR_NONE           \r
+                         { \r
+                               codegen.CodeBuffer.Inst ((Op) $1); \r
+                         }\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 int32  \r
                        | INSTR_BRTARGET id \r
-                       | INSTR_METHOD callConv type typeSpec DOUBLE_COLON methodName OPEN_PARENS sigArgs0 CLOSE_PARENS \r
+                       | INSTR_METHOD binding_flags type type_ref DOUBLE_COLON call_name OPEN_PARENS arg_list CLOSE_PARENS \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
+                         }\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      {currentInstr = new InstrString ((OpCode) $1, $2 as string);}\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
@@ -891,22 +1047,82 @@ instr                   : INSTR_NONE             {currentInstr = new InstrNone ((OpCode) $1
                        | INSTR_PHI int16s \r
                        ;\r
 \r
+param_name             : /* EMPTY */\r
+                       | name1\r
+                       ;\r
+\r
+arg_list \r
+       : /* EMPTY */\r
+       | paramAttr type_ref param_name\r
+         {\r
+               ArrayList arg_list = new ArrayList ();\r
+               Param param = new Param ((ParamAttr) $1, $3 as string, ((TypeRef) $2).Type);\r
+               DictionaryEntry entry = new DictionaryEntry (param, $2);\r
+\r
+               arg_list.Add (entry);           \r
+               $$ = arg_list;\r
+         }\r
+       | arg_list COMMA paramAttr type_ref param_name\r
+         {\r
+               ArrayList arg_list = (ArrayList) $1;\r
+               Param param = new Param ((ParamAttr) $3, $5 as string, ((TypeRef) $4).Type);\r
+               DictionaryEntry entry = new DictionaryEntry (param, $4);\r
+\r
+               arg_list.Add (entry);\r
+               $$ = arg_list;\r
+         }\r
+       ;\r
+\r
+named_arg\r
+       : type_ref 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 \r
+                       | sigArgs1 COMMA sigArg { $$ = String.Format ("{0},{1}", $1, $2); }\r
                        ;\r
 \r
-sigArg                  : ELLIPSIS \r
-                       | paramAttr type \r
-                       | paramAttr type id \r
+sigArg                  : ELLIPSIS             \r
+                       | paramAttr type_ref \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
                        ;\r
-\r
-\r
+                       \r
 \r
 dottedName             : id DOT id     {$$ = ($1 as string) + "." + ($3 as string);}\r
                        ;\r
@@ -914,7 +1130,21 @@ dottedName                : id DOT id     {$$ = ($1 as string) + "." + ($3 as string);}
 \r
 name1                   : id\r
                        | dottedName\r
-                       | name1 DOT name1\r
+                       | name1 DOT name1       {$$ = String.Format ("{0}.{1}", $1, $3); }\r
+                       ;\r
+\r
+call_name              : \r
+                       | id\r
+                       | D_CTOR\r
+                       | D_CCTOR\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
@@ -932,18 +1162,17 @@ typeSpec                : className
                        | type \r
                        ;\r
 \r
-callConv                : K_INSTANCE callConv  {currentCallConv |= CallingConventions.HasThis;}\r
-                       | K_EXPLICIT callConv   {currentCallConv |= CallingConventions.ExplicitThis;}\r
+callConv                : K_INSTANCE callConv  { $$ = (CallConv) $1 | CallConv.Instance; }\r
+                       | K_EXPLICIT callConv   { $$ = (CallConv) $1 | CallConv.InstanceExplicit; }\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_STDCALL \r
-                       | K_UNMANAGED K_THISCALL \r
-                       | K_UNMANAGED K_FASTCALL \r
+callKind                : /* EMPTY */          { $$ = CallConv.Default; }\r
+                       | K_DEFAULT             { $$ = (CallConv) $1 | CallConv.Default; }\r
+                       | K_VARARG              { $$ = (CallConv) $1 | CallConv.Vararg; }\r
+                       | K_UNMANAGED K_CDECL   { $$ = (CallConv) $1 | CallConv.Cdecl; }\r
+                       | K_UNMANAGED K_THISCALL { $$ = (CallConv) $1 | CallConv.Thiscall; }\r
+                       | K_UNMANAGED K_FASTCALL { $$ = (CallConv) $1 | CallConv.Fastcall; }\r
                        ;\r
 \r
 nativeType              : /* EMPTY */  \r
@@ -1042,7 +1271,7 @@ variantType             : /* EMPTY */
                        | K_CLSID \r
                        ;\r
 \r
-type                    : K_CLASS className  \r
+type                    : K_CLASS className \r
                        | K_OBJECT  \r
                        | K_STRING  \r
                        | K_VALUE K_CLASS className  \r
@@ -1184,10 +1413,10 @@ hashHead                : D_HASH ASSIGN OPEN_PARENS
 \r
 assemblyHead            : D_ASSEMBLY asmAttr name1\r
                        {\r
-                               codegen = new CodeGen (defaultAsmName);\r
-\r
+                               /*\r
                                // TODO: set assembly attrs\r
                                codegen.SetName ($3 as string);\r
+                               */\r
                        }\r
                        ;\r
 \r
@@ -1225,6 +1454,12 @@ localeHead              : D_LOCALE ASSIGN OPEN_PARENS
                        ;\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
                        ;\r
 \r
 assemblyRefDecls        : /* EMPTY */\r
@@ -1281,6 +1516,7 @@ manifestResDecl         : D_FILE name1 K_AT int32
                        ;\r
 \r
 \r
+\r
 %%\r
 \r
 } // namespace Mono.ILASM\r