//\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
%token SLASH "/"\r
%token BANG "!"\r
%token ELLIPSIS "..."\r
-\r
+%token DASH "-"\r
\r
\r
\r
%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
\r
\r
\r
-\r
/* Mechanically generated - DO NOT EDIT! */\r
\r
\r
;\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
;\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
\r
classAll : classHead OPEN_BRACE classDecls CLOSE_BRACE\r
{\r
+ /*\r
codegen.AddClass (currentClass);\r
currentClass = null;\r
+ */\r
}\r
;\r
\r
| 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
;\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
| 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
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
| 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
\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
| 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
| 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
\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
;\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
;\r
\r
\r
+\r
%%\r
\r
} // namespace Mono.ILASM\r