-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
-field_ref : internal_field_ref\r
- | external_field_ref\r
- ;\r
-\r
-internal_field_ref : type_ref internal_type_ref DOUBLE_COLON id\r
- {\r
- $$ = codegen.GetFieldRef ((TypeRef) $1, (TypeRef) $2, (string) $4, null);\r
- }\r
- ;\r
-\r
-external_field_ref : type_ref external_type_ref DOUBLE_COLON id\r
- {\r
- ClassRef parent = ((TypeRef) $2).Type as ClassRef;\r
- TypeRef type = (TypeRef) $1;\r
- \r
- $$ = parent.AddField ((string) $4, type.Type);\r
- }\r
- ;\r
-\r
-method_name : name1\r
- | D_CTOR\r
- | D_CCTOR\r
- ;\r
-\r
-method_ref : internal_method_ref\r
- | external_method_ref\r
- ;\r
-\r
-external_method_ref : type_ref external_type_ref DOUBLE_COLON method_name OPEN_PARENS param_list CLOSE_PARENS\r
- {\r
- TypeRef ret_type = (TypeRef)$1;\r
- ClassRef parent = (ClassRef) ((TypeRef) $2).Type;\r
- PEAPI.Type[] type_array;\r
- if ($6 != null) {\r
- ArrayList param_list = $6 as ArrayList;\r
- int index = 0;\r
- type_array = new PEAPI.Type[param_list.Count];\r
- foreach (TypeRef type in param_list) {\r
- type_array[index] = type.Type;\r
- index++;\r
- }\r
- } else {\r
- type_array = new PEAPI.Type[0];\r
- } \r
- $$ = parent.AddMethod ((string) $4, ret_type.Type, type_array);\r
- \r
- }\r
- ; \r
-\r
-internal_method_ref : type_ref internal_type_ref DOUBLE_COLON method_name OPEN_PARENS param_list CLOSE_PARENS\r
- { \r
- TypeRef parent, return_type;\r
- parent = (TypeRef) $2;\r
- return_type = (TypeRef) $1;\r
-\r
- Param[] param_array;\r
- TypeRef[] typeref_array;\r
- if ($6 != null) {\r
- ArrayList param_list = $6 as ArrayList;\r
- int index = 0;\r
- param_array = new Param[param_list.Count];\r
- typeref_array = new TypeRef[param_list.Count];\r
- foreach (TypeRef type in param_list) {\r
- param_array[index] = new Param (ParamAttr.Default, \r
- String.Empty, type.Type);\r
- typeref_array[index] = type;\r
- index++;\r
- }\r
- } else {\r
- param_array = new Param[0];\r
- typeref_array = new TypeRef[0];\r
- }\r
- \r
- $$ = codegen.GetMethodRef (parent, (string) $4, return_type, param_array, \r
- typeref_array, null);\r
- }\r
- ;\r
-\r
-\r
-methodHead : D_METHOD methAttr callConv type_ref methodName \r
- OPEN_PARENS arg_list CLOSE_PARENS implAttr OPEN_BRACE \r
- {\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
- | 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 */ { $$ = new MethAttr (); }\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 { $$ = (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_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\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
+ | D_CORFLAGS int32\r
+ | D_FILE K_ALIGNMENT int32\r
+ /* | D_IMAGEBASE int64 */\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
+vtfixup_decl : D_VTFIXUP OPEN_BRACKET int32 CLOSE_BRACKET \r
+ vtfixup_attr K_AT id\r
+ ;\r
+\r
+vtfixup_attr : /* EMPTY */\r
+ | vtfixup_attr 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 typars_clause extends_clause\r
+ impl_clause\r
+ {\r
+ codegen.BeginTypeDef ((TypeAttr) $2, (string) $3, \r
+ $5 as IClassRef, $6 as ArrayList, null);\r
+\r
+ /*\r
+ // Lets not worry about generics for now :p\r
+ if ($4 != null) {\r
+ ArrayList typars_list = (ArrayList) $4;\r
+ int index = 0;\r
+ foreach (DictionaryEntry entry in typars_list) {\r
+ TypeRef type = (TypeRef) entry.Key;\r
+ string name = (string) entry.Value;\r
+ codegen.CurrentClass.AddGenericParameter ((short) index++, type.Type, name);\r
+ }\r
+ }\r
+ */\r
+ }\r
+ ;\r
+\r
+class_attrs : class_attrs class_attr\r
+ ;\r
+\r
+class_attr : /* EMPTY */ { $$ = new TypeAttr (); }\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 { }\r
+ | class_attr K_ENUM { }\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
+typars_clause : /* EMPTY */\r
+ | OPEN_ANGLE_BRACKET formal_typars CLOSE_ANGLE_BRACKET\r
+ {\r
+ $$ = $2;\r
+ }\r
+ ;\r
+\r
+typars : type\r
+ {\r
+ ArrayList typars_list = new ArrayList ();\r
+ typars_list.Add ($1);\r
+ $$ = typars_list;\r
+ }\r
+ | typars COMMA type\r
+ {\r
+ ArrayList typars_list = (ArrayList) $1;\r
+ typars_list.Add ($3);\r
+ $$ = typars_list;\r
+ }\r
+ ;\r
+\r
+formal_typars : formal_typar\r
+ {\r
+ ArrayList formal_list = new ArrayList ();\r
+ formal_list.Add ($1);\r
+ $$ = formal_list;\r
+ }\r
+ | formal_typars COMMA formal_typar\r
+ {\r
+ ArrayList formal_list = (ArrayList) $1;\r
+ formal_list.Add ($3);\r
+ $$ = formal_list;\r
+ }\r
+ ;\r
+\r
+\r
+formal_typar : type { $$ = new DictionaryEntry ($1, null); }\r
+ | type id { $$ = new DictionaryEntry ($1, $2); }\r
+ ;\r
+ \r
+class_refs : class_ref\r
+ {\r
+ ArrayList class_list = new ArrayList ();\r
+ 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 comp_name CLOSE_BRACKET slashed_name\r
+ {\r
+ ClassRef klass = codegen.ExternTable.GetClass ((string) $2, (string)$4);\r
+ $$ = new ExternTypeRef (klass, (string) $4);\r
+ }\r
+ | OPEN_BRACKET D_MODULE comp_name CLOSE_BRACKET slashed_name\r
+ | slashed_name\r
+ {\r
+ $$ = new TypeRef ((string) $1, null);\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
+ | D_SIZE int32\r
+ {\r
+ \r
+ }\r
+ | D_PACK int32\r
+ | D_OVERRIDE type_spec DOUBLE_COLON method_name\r
+ K_WITH call_conv type type_spec DOUBLE_COLON method_name\r
+ OPEN_PARENS sig_args CLOSE_PARENS\r
+ | language_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
+ $$ = $3;\r
+ }\r
+ | K_VALUETYPE class_ref\r
+ {\r
+ $$ = $2;\r
+ }\r
+ | type OPEN_BRACKET CLOSE_BRACKET\r
+ {\r
+ ITypeRef base_type = (ITypeRef) $1;\r
+ base_type.MakeArray ();\r
+ }\r
+ | type OPEN_BRACKET bounds CLOSE_BRACKET\r
+ {\r
+ ITypeRef base_type = (ITypeRef) $1;\r
+ ArrayList bound_list = (ArrayList) $3;\r
+ base_type.MakeBoundArray (bound_list);\r
+ }\r
+ | type AMPERSAND\r
+ {\r
+ ITypeRef base_type = (ITypeRef) $1;\r
+ base_type.MakeManagedPointer ();\r
+ }\r
+ | type STAR\r
+ {\r
+ ITypeRef base_type = (ITypeRef) $1;\r
+ base_type.MakeUnmanagedPointer ();\r
+ }\r
+ | type K_PINNED\r
+ {\r
+ ITypeRef base_type = (ITypeRef) $1;\r
+ base_type.MakePinned ();\r
+ }\r
+ | type K_MODREQ OPEN_PARENS class_ref CLOSE_PARENS\r
+ {\r
+ /*\r
+ ITypeRef base_type = (ITypeRef) $1;\r
+ ITypeRef class_ref = (ITypeRef) $4;\r
+\r
+ $$ = new CustomModifiedType (base_type.Type,\r
+ CustomModifier.modreq, (Class) class_ref.Type);\r
+ */\r
+ }\r
+ | type K_MODOPT OPEN_PARENS class_ref CLOSE_PARENS\r
+ {\r
+ /*\r
+ TypeRef base_type = (TypeRef) $1;\r
+ TypeRef class_ref = (TypeRef) $4;\r
+\r
+ $$ = new CustomModifiedType (base_type.Type,\r
+ CustomModifier.modopt, (Class) class_ref.Type);\r
+ */\r
+ }\r
+ | K_METHOD call_conv type STAR OPEN_PARENS sig_args CLOSE_PARENS\r
+ | K_TYPEDREF\r
+ {\r
+ $$ = new PrimitiveTypeRef (PrimitiveType.TypedRef,\r
+ "System.TypedReference");\r
+ }\r
+ | K_CHAR\r
+ {\r
+ $$ = new PrimitiveTypeRef (PrimitiveType.Char, "System.Char");\r
+ }\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
+ // access class type parameter by number\r
+ }\r
+ | BANG BANG int32\r
+ {\r
+ // access method type parameter by number\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
+ | ELLIPSIS\r
+ {\r
+ // No lower bound or size\r
+ $$ = new DictionaryEntry (null,null);\r
+ }\r
+ | int32\r
+ {\r
+ // ******** Not sure what this is?\r
+ // For now I will say it is size because there\r
+ // is allready a way to set lower\r
+ $$ = new DictionaryEntry (null, $1);\r
+ }\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, null);\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 ((DataConstant) $6);\r
+ }\r
+ */\r
+ if ($7 != null) {\r
+ field_def.SetValue ((Constant) $7);\r
+ }\r
+ }\r
+ ;\r
+\r
+repeat_opt : /* EMPTY */\r
+ | OPEN_BRACKET int32 CLOSE_BRACKET\r
+ {\r
+ $$ = $2;\r
+ }\r
+ ;\r
+\r
+field_attr : /* EMPTY */\r
+ {\r
+ $$ = new FieldAttr ();\r
+ }\r
+ | field_attr K_PUBLIC\r
+ {\r
+ $$ = (FieldAttr) $1 | FieldAttr.Public;\r
+ }\r
+ | field_attr K_PRIVATE\r
+ {\r
+ $$ = (FieldAttr) $1 | FieldAttr.Private;\r
+ }\r
+ | field_attr K_FAMILY\r
+ {\r
+ $$ = (FieldAttr) $1 | FieldAttr.Family;\r
+ }\r
+ | field_attr K_ASSEMBLY\r
+ {\r
+ $$ = (FieldAttr) $1 | FieldAttr.Assembly;\r
+ }\r
+ | field_attr K_FAMANDASSEM\r
+ {\r
+ $$ = (FieldAttr) $1 | FieldAttr.FamAndAssem;\r
+ }\r
+ | field_attr K_FAMORASSEM\r
+ {\r
+ $$ = (FieldAttr) $1 | FieldAttr.FamOrAssem;\r
+ }\r
+ | field_attr K_PRIVATESCOPE\r
+ {\r
+ // This is just 0x0000\r
+ }\r
+ | field_attr K_STATIC\r
+ {\r
+ $$ = (FieldAttr) $1 | FieldAttr.Static;\r
+ }\r
+ | field_attr K_INITONLY\r
+ {\r
+ $$ = (FieldAttr) $1 | FieldAttr.Initonly;\r
+ }\r
+ | field_attr K_RTSPECIALNAME\r
+ {\r
+ $$ = (FieldAttr) $1 | FieldAttr.RTSpecialName;\r
+ }\r
+ | field_attr K_SPECIALNAME\r
+ {\r
+ $$ = (FieldAttr) $1 | FieldAttr.SpecialName;\r
+ }\r
+ | field_attr K_MARSHAL OPEN_PARENS native_type CLOSE_PARENS\r
+ {\r
+ \r
+ }\r
+ | field_attr K_LITERAL\r
+ {\r
+ $$ = (FieldAttr) $1 | FieldAttr.Literal;\r
+ }\r
+ | field_attr K_NOTSERIALIZED\r
+ {\r
+ $$ = (FieldAttr) $1 | FieldAttr.Notserialized;\r
+ }\r
+ ;\r
+\r
+at_opt : /* EMPTY */\r
+ | K_AT id\r
+ {\r
+ // TODO: Implement DataTable\r
+ // $$ = new DataConstant (DataTable.GetOffset ((string) $2));\r
+ }\r
+ ;\r
+\r
+init_opt : /* EMPTY */\r
+ | ASSIGN field_init\r
+ {\r
+ $$ = $2;\r
+ }\r
+ ;\r
+\r
+field_init : K_FLOAT32 OPEN_PARENS float64 CLOSE_PARENS\r
+ {\r
+ $$ = new FloatConst (Convert.ToSingle ($3));\r
+ }\r
+ | K_FLOAT64 OPEN_PARENS float64 CLOSE_PARENS\r
+ {\r
+ $$ = new DoubleConst (Convert.ToDouble ($3));\r
+ }\r
+ | K_FLOAT32 OPEN_PARENS int64 CLOSE_PARENS\r
+ {\r
+ $$ = new FloatConst (Convert.ToSingle ($3));\r
+ }\r
+ | K_FLOAT64 OPEN_PARENS int64 CLOSE_PARENS\r
+ {\r
+ $$ = new DoubleConst (Convert.ToDouble (3));\r
+ }\r
+ | K_INT64 OPEN_PARENS int64 CLOSE_PARENS\r
+ {\r
+ $$ = new IntConst (Convert.ToInt64 ($3));\r
+ }\r
+ | K_INT32 OPEN_PARENS int64 CLOSE_PARENS\r
+ {\r
+ $$ = new IntConst (Convert.ToUInt32 ($3));\r
+ }\r
+ | K_INT16 OPEN_PARENS int64 CLOSE_PARENS\r
+ {\r
+ $$ = new IntConst (Convert.ToUInt16 ($3));\r
+ }\r
+ | K_CHAR OPEN_PARENS int64 CLOSE_PARENS\r
+ {\r
+ $$ = new CharConst (Convert.ToChar ($3));\r
+ }\r
+ | K_INT8 OPEN_PARENS int64 CLOSE_PARENS\r
+ {\r
+ $$ = new IntConst (Convert.ToByte ($3));\r
+ }\r
+ | K_BOOL OPEN_PARENS truefalse CLOSE_PARENS\r
+ {\r
+ $$ = new BoolConst ((bool) $3);\r
+ }\r
+ | K_BYTEARRAY OPEN_PARENS bytes CLOSE_PARENS\r
+ {\r
+ $$ = new ByteArrConst ((byte[]) $3);\r
+ }\r
+ | comp_qstring\r
+ {\r
+ // ******** THIS IS NOT IN THE DOCUMENTATION ******** //\r
+ $$ = new StringConst ((string) $1);\r
+ }\r
+ | K_NULLREF\r
+ {\r
+ $$ = new NullConst ();\r
+ }\r
+ ;\r
+\r
+data_decl : data_head data_body\r
+ {\r
+ /*\r
+ Console.WriteLine ("Creating data decl: '{0}' '{1}'", $1, $2);\r
+\r
+ DataDef datadef = (DataDef) $1;\r
+ \r
+ if ($2 is ArrayList) {\r
+ ArrayList const_list = (ArrayList) $2;\r
+ DataConstant[] const_arr = new DataConstant[const_list.Count];\r
+ \r
+ for (int i=0; i<const_arr.Length; i++)\r
+ const_arr[i] = (DataConstant) const_list[i];\r
+\r
+ datadef.PeapiConstant = new ArrayConstant (const_arr);\r
+ } else {\r
+ datadef.PeapiConstant = (PEAPI.Constant) $2;\r
+ }\r
+ */\r
+ }\r
+ ;\r
+\r
+data_head : D_DATA tls id ASSIGN\r
+ {\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
+ | dataitem_list COMMA dataitem\r
+ ;\r
+\r
+dataitem : K_CHAR STAR OPEN_PARENS comp_qstring CLOSE_PARENS\r
+ | AMPERSAND OPEN_PARENS id CLOSE_PARENS\r
+ | K_BYTEARRAY ASSIGN OPEN_PARENS bytes CLOSE_PARENS\r
+ {\r
+ $$ = new ByteArrConst ((byte[]) $4);\r
+ }\r
+ | K_BYTEARRAY OPEN_PARENS bytes CLOSE_PARENS\r
+ {\r
+ // ******** THIS IS NOT IN THE SPECIFICATION ******** //\r
+ $$ = new ByteArrConst ((byte[]) $3);\r
+ }\r
+ | K_FLOAT32 OPEN_PARENS float64 CLOSE_PARENS repeat_opt\r
+ {\r
+ FloatConst float_const = new FloatConst ((float) $3);\r
+\r
+ if ($5 != null)\r
+ $$ = new RepeatedConstant (float_const, (int) $5);\r
+ else\r
+ $$ = float_const;\r
+ }\r
+ | K_FLOAT64 OPEN_PARENS float64 CLOSE_PARENS repeat_opt\r
+ {\r
+ DoubleConst double_const = new DoubleConst ((double) $3);\r
+\r
+ if ($5 != null)\r
+ $$ = new RepeatedConstant (double_const, (int) $5);\r
+ else\r
+ $$ = double_const;\r
+ }\r
+ | K_INT64 OPEN_PARENS int64 CLOSE_PARENS repeat_opt\r
+ {\r
+ IntConst int_const = new IntConst ((long) $3);\r
+\r
+ if ($5 != null)\r
+ $$ = new RepeatedConstant (int_const, (int) $5);\r
+ else\r
+ $$ = int_const;\r
+ }\r
+ | K_INT32 OPEN_PARENS int32 CLOSE_PARENS repeat_opt\r
+ {\r
+ IntConst int_const = new IntConst ((int) $3);\r
+\r
+ if ($5 != null)\r
+ $$ = new RepeatedConstant (int_const, (int) $5);\r
+ else\r
+ $$ = int_const;\r
+ }\r
+ | K_INT16 OPEN_PARENS int32 CLOSE_PARENS repeat_opt\r
+ {\r
+ IntConst int_const = new IntConst ((short) $3);\r
+\r
+ if ($5 != null)\r
+ $$ = new RepeatedConstant (int_const, (int) $5);\r
+ else\r
+ $$ = int_const;\r
+ }\r
+ | K_INT8 OPEN_PARENS int32 CLOSE_PARENS repeat_opt\r
+ {\r
+ IntConst int_const = new IntConst ((sbyte) $3);\r
+\r
+ if ($5 != null)\r
+ $$ = new RepeatedConstant (int_const, (int) $5);\r
+ else\r
+ $$ = int_const;\r
+ }\r
+ | K_FLOAT32 repeat_opt\r
+ {\r
+ FloatConst float_const = new FloatConst (0F);\r
+\r
+ if ($2 != null)\r
+ $$ = new RepeatedConstant (float_const, (int) $2);\r
+ else\r
+ $$ = float_const;\r
+ }\r
+ | K_FLOAT64 repeat_opt\r
+ {\r
+ DoubleConst double_const = new DoubleConst (0);\r
+\r
+ if ($2 != null)\r
+ $$ = new RepeatedConstant (double_const, (int) $2);\r
+ else\r
+ $$ = double_const;\r
+ }\r
+ | K_INT64 repeat_opt\r
+ {\r
+ IntConst int_const = new IntConst ((long) 0);\r
+\r
+ if ($2 != null)\r
+ $$ = new RepeatedConstant (int_const, (int) $2);\r
+ else\r
+ $$ = int_const;\r
+ }\r
+ | K_INT32 repeat_opt\r
+ {\r
+ IntConst int_const = new IntConst ((int) 0);\r
+\r
+ if ($2 != null)\r
+ $$ = new RepeatedConstant (int_const, (int) $2);\r
+ else\r
+ $$ = int_const;\r
+ }\r
+ | K_INT16 repeat_opt\r
+ {\r
+ IntConst int_const = new IntConst ((short) 0);\r
+\r
+ if ($2 != null)\r
+ $$ = new RepeatedConstant (int_const, (int) $2);\r
+ else\r
+ $$ = int_const;\r
+ }\r
+ | K_INT8 repeat_opt\r
+ {\r
+ IntConst int_const = new IntConst ((sbyte) 0);\r
+\r
+ if ($2 != null)\r
+ $$ = new RepeatedConstant (int_const, (int) $2);\r
+ else\r
+ $$ = int_const;\r
+ }\r
+ ;\r
+\r
+method_all : method_head OPEN_BRACE method_decls CLOSE_BRACE\r
+ {\r
+ codegen.EndMethodDef ();\r
+ }\r
+ ;\r
+\r
+method_head : D_METHOD meth_attr call_conv param_attr type method_name\r
+ typars_clause OPEN_PARENS sig_args CLOSE_PARENS impl_attr\r
+ {\r
+ MethodDef methdef = new MethodDef ((MethAttr) $2,\r
+ (ImplAttr) $11, (string) $6, (ITypeRef) $5,\r
+ (ArrayList) $9);\r
+ codegen.BeginMethodDef (methdef);\r
+ }\r
+ | D_METHOD meth_attr call_conv param_attr type \r
+ K_MARSHAL OPEN_PARENS native_type CLOSE_PARENS method_name\r
+ OPEN_PARENS sig_args CLOSE_PARENS impl_attr\r
+ ;\r
+\r
+meth_attr : /* EMPTY */ { $$ = new MethAttr (); }\r
+ | meth_attr K_STATIC { $$ = (MethAttr) $1 | MethAttr.Static; }\r
+ | meth_attr K_PUBLIC { $$ = (MethAttr) $1 | MethAttr.Public; }\r
+ | meth_attr K_PRIVATE { $$ = (MethAttr) $1 | MethAttr.Private; }\r
+ | meth_attr K_FAMILY { $$ = (MethAttr) $1 | MethAttr.Family; }\r
+ | meth_attr K_ASSEMBLY { $$ = (MethAttr) $1 | MethAttr.Assembly; }\r
+ | meth_attr K_FAMANDASSEM { $$ = (MethAttr) $1 | MethAttr.FamAndAssem; } \r
+ | meth_attr K_FAMORASSEM { $$ = (MethAttr) $1 | MethAttr.FamOrAssem; } \r
+ | meth_attr K_PRIVATESCOPE { /* CHECK HEADERS */ }\r
+ | meth_attr K_FINAL { $$ = (MethAttr) $1 | MethAttr.Final; } \r
+ | meth_attr K_VIRTUAL { $$ = (MethAttr) $1 | MethAttr.Virtual; }\r
+ | meth_attr K_ABSTRACT { $$ = (MethAttr) $1 | MethAttr.Abstract; }\r
+ | meth_attr K_HIDEBYSIG { $$ = (MethAttr) $1 | MethAttr.HideBySig; }\r
+ | meth_attr K_NEWSLOT { $$ = (MethAttr) $1 | MethAttr.NewSlot; }\r
+ | meth_attr K_REQSECOBJ { $$ = (MethAttr) $1 | MethAttr.RequireSecObject; }\r
+ | meth_attr K_SPECIALNAME { $$ = (MethAttr) $1 | MethAttr.SpecialName; }\r
+ | meth_attr K_RTSPECIALNAME { $$ = (MethAttr) $1 | MethAttr.RTSpecialName; }\r
+ | meth_attr K_UNMANAGEDEXP \r
+ | meth_attr K_PINVOKEIMPL OPEN_PARENS comp_qstring K_AS\r
+ comp_qstring pinv_attr CLOSE_PARENS\r
+ | meth_attr K_PINVOKEIMPL OPEN_PARENS comp_qstring pinv_attr CLOSE_PARENS\r
+ | meth_attr K_PINVOKEIMPL OPEN_PARENS pinv_attr CLOSE_PARENS\r
+ ;\r
+\r
+pinv_attr : /* EMPTY */\r
+ | pinv_attr K_NOMANGLE\r
+ | pinv_attr K_ANSI\r
+ | pinv_attr K_UNICODE\r
+ | pinv_attr K_AUTOCHAR\r
+ | pinv_attr K_LASTERR\r
+ | pinv_attr K_WINAPI\r
+ | pinv_attr K_CDECL\r
+ | pinv_attr K_STDCALL\r
+ | pinv_attr K_THISCALL\r
+ | pinv_attr K_FASTCALL\r
+ ;\r
+\r
+method_name : D_CTOR\r