%{ // // Mono::ILASM::ILParser // // (C) Sergey Chaban (serge@wildwestsoftware.com) // (C) 2003 Jackson Harper, All rights reserved // using PEAPI; using System; using System.IO; using System.Collections; using System.Globalization; namespace Mono.ILASM { public class ILParser { private CodeGen codegen; private bool is_value_class; private bool is_enum_class; public ILParser (CodeGen codegen) { this.codegen = codegen; } public CodeGen CodeGen { get { return codegen; } } %} %token EOF /* ID - alpha-numeric identifier */ %token ID /* QSTRING - quoted string */ %token QSTRING /* SQSTRING - single quoted string */ %token SQSTRING /* INT32 - 32 bit integer */ %token INT32 /* INT64 - 64 bit integer */ %token INT64 /* FLOAT64 - floating point number */ %token FLOAT64 /* HEXBYTE - two digit hex number */ %token HEXBYTE /* Punctuation */ %token DOT "." %token OPEN_BRACE "{" %token CLOSE_BRACE "}" %token OPEN_BRACKET "[" %token CLOSE_BRACKET "]" %token OPEN_PARENS "(" %token CLOSE_PARENS ")" %token COMMA "," %token COLON ":" %token DOUBLE_COLON "::" %token SEMICOLON ";" %token ASSIGN "=" %token STAR "*" %token AMPERSAND "&" %token PLUS "+" %token SLASH "/" %token BANG "!" %token ELLIPSIS "..." %token DASH "-" %token OPEN_ANGLE_BRACKET "<" %token CLOSE_ANGLE_BRACKET ">" %token UNKNOWN /* INSTR_* instruction types */ %token INSTR_NONE %token INSTR_VAR %token INSTR_I %token INSTR_I8 %token INSTR_R %token INSTR_BRTARGET %token INSTR_METHOD %token INSTR_NEWOBJ %token INSTR_FIELD %token INSTR_TYPE %token INSTR_STRING %token INSTR_SIG %token INSTR_RVA %token INSTR_TOK %token INSTR_SWITCH %token INSTR_PHI %token INSTR_LOCAL %token INSTR_PARAM /* Mechanically generated - DO NOT EDIT! */ /* Directives */ %token D_ADDON %token D_ALGORITHM %token D_ASSEMBLY %token D_BACKING %token D_BLOB %token D_CAPABILITY %token D_CCTOR %token D_CLASS %token D_COMTYPE %token D_CONFIG %token D_CONSTRAINT %token D_IMAGEBASE %token D_CORFLAGS %token D_CTOR %token D_CUSTOM %token D_DATA %token D_EMITBYTE %token D_ENTRYPOINT %token D_EVENT %token D_EXELOC %token D_EXPORT %token D_FIELD %token D_FILE %token D_FIRE %token D_GET %token D_HASH %token D_IMPLICITCOM %token D_LANGUAGE %token D_LINE %token D_XLINE %token D_LOCALE %token D_LOCALS %token D_MANIFESTRES %token D_MAXSTACK %token D_METHOD %token D_MIME %token D_MODULE %token D_MRESOURCE %token D_NAMESPACE %token D_ORIGINATOR %token D_OS %token D_OTHER %token D_OVERRIDE %token D_PACK %token D_PARAM %token D_PERMISSION %token D_PERMISSIONSET %token D_PROCESSOR %token D_PROPERTY %token D_PUBLICKEY %token D_PUBLICKEYTOKEN %token D_REMOVEON %token D_SET %token D_SIZE %token D_SUBSYSTEM %token D_TITLE %token D_TRY %token D_VER %token D_VTABLE %token D_VTENTRY %token D_VTFIXUP %token D_ZEROINIT /* Keywords */ %token K_AT %token K_AS %token K_IMPLICITCOM %token K_IMPLICITRES %token K_NOAPPDOMAIN %token K_NOPROCESS %token K_NOMACHINE %token K_EXTERN %token K_INSTANCE %token K_EXPLICIT %token K_DEFAULT %token K_VARARG %token K_UNMANAGED %token K_CDECL %token K_STDCALL %token K_THISCALL %token K_FASTCALL %token K_MARSHAL %token K_IN %token K_OUT %token K_OPT %token K_LCID %token K_RETVAL %token K_STATIC %token K_PUBLIC %token K_PRIVATE %token K_FAMILY %token K_INITONLY %token K_RTSPECIALNAME %token K_SPECIALNAME %token K_ASSEMBLY %token K_FAMANDASSEM %token K_FAMORASSEM %token K_PRIVATESCOPE %token K_LITERAL %token K_NOTSERIALIZED %token K_VALUE %token K_NOT_IN_GC_HEAP %token K_INTERFACE %token K_SEALED %token K_ABSTRACT %token K_AUTO %token K_SEQUENTIAL %token K_ANSI %token K_UNICODE %token K_AUTOCHAR %token K_IMPORT %token K_SERIALIZABLE %token K_NESTED %token K_LATEINIT %token K_EXTENDS %token K_IMPLEMENTS %token K_FINAL %token K_VIRTUAL %token K_HIDEBYSIG %token K_NEWSLOT %token K_UNMANAGEDEXP %token K_PINVOKEIMPL %token K_NOMANGLE %token K_OLE %token K_LASTERR %token K_WINAPI %token K_NATIVE %token K_IL %token K_CIL %token K_OPTIL %token K_MANAGED %token K_FORWARDREF %token K_RUNTIME %token K_INTERNALCALL %token K_SYNCHRONIZED %token K_NOINLINING %token K_CUSTOM %token K_FIXED %token K_SYSSTRING %token K_ARRAY %token K_VARIANT %token K_CURRENCY %token K_SYSCHAR %token K_VOID %token K_BOOL %token K_INT8 %token K_INT16 %token K_INT32 %token K_INT64 %token K_FLOAT32 %token K_FLOAT64 %token K_ERROR %token K_UNSIGNED %token K_DECIMAL %token K_DATE %token K_BSTR %token K_LPSTR %token K_LPWSTR %token K_LPTSTR %token K_OBJECTREF %token K_IUNKNOWN %token K_IDISPATCH %token K_STRUCT %token K_SAFEARRAY %token K_INT %token K_BYVALSTR %token K_TBSTR %token K_LPVOID %token K_ANY %token K_FLOAT %token K_LPSTRUCT %token K_NULL %token K_PTR %token K_VECTOR %token K_HRESULT %token K_CARRAY %token K_USERDEFINED %token K_RECORD %token K_FILETIME %token K_BLOB %token K_STREAM %token K_STORAGE %token K_STREAMED_OBJECT %token K_STORED_OBJECT %token K_BLOB_OBJECT %token K_CF %token K_CLSID %token K_METHOD %token K_CLASS %token K_PINNED %token K_MODREQ %token K_MODOPT %token K_TYPEDREF %token K_WCHAR %token K_CHAR %token K_FROMUNMANAGED %token K_CALLMOSTDERIVED %token K_BYTEARRAY %token K_WITH %token K_INIT %token K_TO %token K_CATCH %token K_FILTER %token K_FINALLY %token K_FAULT %token K_HANDLER %token K_TLS %token K_FIELD %token K_REQUEST %token K_DEMAND %token K_ASSERT %token K_DENY %token K_PERMITONLY %token K_LINKCHECK %token K_INHERITCHECK %token K_REQMIN %token K_REQOPT %token K_REQREFUSE %token K_PREJITGRANT %token K_PREJITDENY %token K_NONCASDEMAND %token K_NONCASLINKDEMAND %token K_NONCASINHERITANCE %token K_READONLY %token K_NOMETADATA %token K_ALGORITHM %token K_FULLORIGIN // %token K_NAN // %token K_INF %token K_PUBLICKEY %token K_ENABLEJITTRACKING %token K_DISABLEJITOPTIMIZER %token K_PRESERVESIG %token K_BEFOREFIELDINIT %token K_ALIGNMENT %token K_NULLREF %token K_VALUETYPE %token K_COMPILERCONTROLLED %token K_REQSECOBJ %token K_ENUM %token K_OBJECT %token K_STRING %token K_TRUE %token K_FALSE %token K_IS /* end generated */ %start il_file %% il_file : decls ; decls : /* EMPTY */ | decls decl ; decl : class_all | namespace_all | method_all | field_decl | data_decl | vtfixup_decl | file_decl | assembly_all | assemblyref_all | exptype_all | manifestres_all | module_head | sec_decl | customattr_decl | D_SUBSYSTEM int32 { codegen.SetSubSystem ((int) $2); } | D_CORFLAGS int32 { codegen.SetCorFlags ((int) $2); } | D_FILE K_ALIGNMENT int32 | D_IMAGEBASE int64 { codegen.SetImageBase ((long) $2); } | extsource_spec | language_decl ; extsource_spec : D_LINE int32 SQSTRING | D_LINE int32 | D_LINE int32 COLON int32 SQSTRING | D_LINE int32 COLON int32 ; language_decl : D_LANGUAGE SQSTRING | D_LANGUAGE SQSTRING COMMA SQSTRING | D_LANGUAGE SQSTRING COMMA SQSTRING COMMA SQSTRING ; constraint_decl : D_CONSTRAINT BANG int32 K_IS type { codegen.CurrentTypeDef.AddGenericConstraint ((int) $3, (ITypeRef) $5); } ; vtfixup_decl : D_VTFIXUP OPEN_BRACKET int32 CLOSE_BRACKET vtfixup_attr K_AT id ; vtfixup_attr : /* EMPTY */ | vtfixup_attr int64 | vtfixup_attr K_FROMUNMANAGED | vtfixup_attr K_CALLMOSTDERIVED ; namespace_all : namespace_head OPEN_BRACE decls CLOSE_BRACE { codegen.CurrentNameSpace = null; } ; namespace_head : D_NAMESPACE comp_name { codegen.CurrentNameSpace = (string) $2; } ; class_all : class_head OPEN_BRACE class_decls CLOSE_BRACE { codegen.EndTypeDef (); } ; class_head : D_CLASS class_attr id formal_typars_clause extends_clause impl_clause { codegen.BeginTypeDef ((TypeAttr) $2, (string) $3, $5 as IClassRef, $6 as ArrayList, null); if (is_value_class) codegen.CurrentTypeDef.MakeValueClass (); if (is_enum_class) codegen.CurrentTypeDef.MakeEnumClass (); if ($4 != null) { ArrayList typars_list = (ArrayList) $4; foreach (string id in typars_list) codegen.CurrentTypeDef.AddGenericParam (id); } } ; class_attrs : class_attrs class_attr ; class_attr : /* EMPTY */ { // Reset some flags is_value_class = false; is_enum_class = false; $$ = new TypeAttr (); } | class_attr K_PUBLIC { $$ = (TypeAttr)$1 | TypeAttr.Public; } | class_attr K_PRIVATE { $$ = (TypeAttr)$1 | TypeAttr.Private; } | class_attr K_NESTED K_PRIVATE { $$ = (TypeAttr)$1 | TypeAttr.NestedPrivate; } | class_attr K_NESTED K_PUBLIC { $$ = (TypeAttr)$1 | TypeAttr.NestedPublic; } | class_attr K_NESTED K_FAMILY { $$ = (TypeAttr)$1 | TypeAttr.NestedFamily; } | class_attr K_NESTED K_ASSEMBLY { $$ = (TypeAttr)$1 | TypeAttr.NestedAssembly;} | class_attr K_NESTED K_FAMANDASSEM { $$ = (TypeAttr)$1 | TypeAttr.NestedFamAndAssem; } | class_attr K_NESTED K_FAMORASSEM { $$ = (TypeAttr)$1 | TypeAttr.NestedFamOrAssem; } | class_attr K_VALUE { is_value_class = true; } | class_attr K_ENUM { is_enum_class = true; } | class_attr K_INTERFACE { $$ = (TypeAttr)$1 | TypeAttr.Interface; } | class_attr K_SEALED { $$ = (TypeAttr)$1 | TypeAttr.Sealed; } | class_attr K_ABSTRACT { $$ = (TypeAttr)$1 | TypeAttr.Abstract; } | class_attr K_AUTO { } | class_attr K_SEQUENTIAL { $$ = (TypeAttr)$1 | TypeAttr.SequentialLayout; } | class_attr K_EXPLICIT { $$ = (TypeAttr)$1 | TypeAttr.ExplicitLayout; } | class_attr K_ANSI { } | class_attr K_UNICODE { $$ = (TypeAttr)$1 | TypeAttr.UnicodeClass; } | class_attr K_AUTOCHAR { $$ = (TypeAttr)$1 | TypeAttr.AutoClass; } | class_attr K_IMPORT { $$ = (TypeAttr)$1 | TypeAttr.Import; } | class_attr K_SERIALIZABLE { $$ = (TypeAttr)$1 | TypeAttr.Serializable; } | class_attr K_BEFOREFIELDINIT { $$ = (TypeAttr)$1 | TypeAttr.BeforeFieldInit; } | class_attr K_SPECIALNAME { $$ = (TypeAttr)$1 | TypeAttr.SpecialName; } | class_attr K_RTSPECIALNAME { $$ = (TypeAttr)$1 | TypeAttr.RTSpecialName; } ; extends_clause : /* EMPTY */ | K_EXTENDS class_ref { $$ = $2; } ; impl_clause : /* EMPTY */ | K_IMPLEMENTS class_refs { $$ = $2; } ; formal_typars_clause : /* EMPTY */ | OPEN_ANGLE_BRACKET formal_typars CLOSE_ANGLE_BRACKET { $$ = $2; } ; typars_clause : /* EMPTY */ | OPEN_ANGLE_BRACKET typars CLOSE_ANGLE_BRACKET { $$ = $2; } ; typars : type { ArrayList typars_list = new ArrayList (); typars_list.Add ($1); $$ = typars_list; } | typars COMMA type { ArrayList typars_list = (ArrayList) $1; typars_list.Add ($3); $$ = typars_list; } ; formal_typars : formal_typar { ArrayList formal_list = new ArrayList (); formal_list.Add ($1); $$ = formal_list; } | formal_typars COMMA formal_typar { ArrayList formal_list = (ArrayList) $1; formal_list.Add ($3); $$ = formal_list; } ; formal_typar : id { $$ = $1; } ; class_refs : class_ref { ArrayList class_list = new ArrayList (); class_list.Add ($1); $$ = class_list; } | class_refs COMMA class_ref { ArrayList class_list = (ArrayList) $1; class_list.Add ($3); } ; slashed_name : comp_name | slashed_name SLASH comp_name { $$ = String.Format ("{0}/{1}", $1, $3); } ; class_ref : OPEN_BRACKET slashed_name CLOSE_BRACKET slashed_name { if (codegen.IsThisAssembly ((string) $2)) { $$ = new TypeRef ((string) $4, false, null); } else { $$ = new ExternTypeRef ((string) $2, (string) $4, false); } } | OPEN_BRACKET D_MODULE slashed_name CLOSE_BRACKET slashed_name | slashed_name { PrimitiveTypeRef prim = PrimitiveTypeRef.GetPrimitiveType ((string) $1); if (prim != null) $$ = prim; else $$ = new TypeRef ((string) $1, false, null); } ; class_decls : /* EMPTY */ | class_decls class_decl ; class_decl : method_all | class_all | event_all | prop_all | field_decl | data_decl | sec_decl | extsource_spec | customattr_decl { codegen.CurrentTypeDef.AddCustomAttribute ((CustomAttr) $1); } | D_SIZE int32 { codegen.CurrentTypeDef.SetSize ((int) $2); } | D_PACK int32 { codegen.CurrentTypeDef.SetPack ((int) $2); } | D_OVERRIDE type_spec DOUBLE_COLON method_name K_WITH call_conv type type_spec DOUBLE_COLON method_name type_list { // // My copy of the spec didn't have a type_list but // it seems pretty crucial // ITypeRef owner = (ITypeRef) $2; ArrayList arg_list = (ArrayList) $11; ITypeRef[] param_list; IMethodRef decl; if (arg_list != null) param_list = (ITypeRef[]) arg_list.ToArray (typeof (ITypeRef)); else param_list = new ITypeRef[0]; decl = owner.GetMethodRef ((ITypeRef) $7, (CallConv) $6, (string) $4, param_list); string sig = MethodDef.CreateSignature ((string) $10, param_list); codegen.CurrentTypeDef.AddOverride (sig, decl); } OPEN_PARENS sig_args CLOSE_PARENS | language_decl | constraint_decl ; type : K_CLASS class_ref { $$ = $2; } | K_OBJECT { $$ = new PrimitiveTypeRef (PrimitiveType.Object, "System.Object"); } | K_STRING { $$ = new PrimitiveTypeRef (PrimitiveType.String, "System.String"); } | K_VALUE K_CLASS class_ref { IClassRef class_ref = (IClassRef) $3; class_ref.MakeValueClass (); $$ = class_ref; } | K_VALUETYPE OPEN_BRACKET slashed_name CLOSE_BRACKET slashed_name { $$ = new ExternTypeRef ((string) $3, (string) $5, true); } | K_VALUETYPE slashed_name { $$ = new TypeRef ((string) $2, true, null); } | type OPEN_BRACKET CLOSE_BRACKET { ITypeRef base_type = (ITypeRef) $1; base_type.MakeArray (); } | type OPEN_BRACKET bounds CLOSE_BRACKET { ITypeRef base_type = (ITypeRef) $1; ArrayList bound_list = (ArrayList) $3; base_type.MakeBoundArray (bound_list); } | type AMPERSAND { ITypeRef base_type = (ITypeRef) $1; base_type.MakeManagedPointer (); } | type STAR { ITypeRef base_type = (ITypeRef) $1; base_type.MakeUnmanagedPointer (); } | type K_PINNED { ITypeRef base_type = (ITypeRef) $1; base_type.MakePinned (); } | type K_MODREQ OPEN_PARENS class_ref CLOSE_PARENS { ITypeRef base_type = (ITypeRef) $1; IClassRef class_ref = (IClassRef) $4; base_type.MakeCustomModified (codegen, CustomModifier.modopt, class_ref); } | type K_MODOPT OPEN_PARENS class_ref CLOSE_PARENS { ITypeRef base_type = (ITypeRef) $1; IClassRef class_ref = (IClassRef) $4; base_type.MakeCustomModified (codegen, CustomModifier.modopt, class_ref); } | K_METHOD call_conv type STAR OPEN_PARENS sig_args CLOSE_PARENS | K_TYPEDREF { $$ = new PrimitiveTypeRef (PrimitiveType.TypedRef, "System.TypedReference"); } | K_CHAR { $$ = new PrimitiveTypeRef (PrimitiveType.Char, "System.Char"); } | K_VOID { $$ = new PrimitiveTypeRef (PrimitiveType.Void, "System.Void"); } | K_BOOL { $$ = new PrimitiveTypeRef (PrimitiveType.Boolean, "System.Bool"); } | K_INT8 { $$ = new PrimitiveTypeRef (PrimitiveType.Int8, "System.Int8"); } | K_INT16 { $$ = new PrimitiveTypeRef (PrimitiveType.Int16, "System.Int16"); } | K_INT32 { $$ = new PrimitiveTypeRef (PrimitiveType.Int32, "System.Int32"); } | K_INT64 { $$ = new PrimitiveTypeRef (PrimitiveType.Int64, "System.Int64"); } | K_FLOAT32 { $$ = new PrimitiveTypeRef (PrimitiveType.Float32, "System.Float32"); } | K_FLOAT64 { $$ = new PrimitiveTypeRef (PrimitiveType.Float64, "System.Float64"); } | K_UNSIGNED K_INT8 { $$ = new PrimitiveTypeRef (PrimitiveType.UInt8, "System.UInt8"); } | K_UNSIGNED K_INT16 { $$ = new PrimitiveTypeRef (PrimitiveType.UInt16, "System.UInt16"); } | K_UNSIGNED K_INT32 { $$ = new PrimitiveTypeRef (PrimitiveType.UInt32, "System.UInt32"); } | K_UNSIGNED K_INT64 { $$ = new PrimitiveTypeRef (PrimitiveType.UInt64, "System.UInt64"); } | K_NATIVE K_INT { // TODO: Is this the proper full name $$ = new PrimitiveTypeRef (PrimitiveType.NativeInt, "System.IntPtr"); } | K_NATIVE K_UNSIGNED K_INT { $$ = new PrimitiveTypeRef (PrimitiveType.NativeUInt, "System.UIntPtr"); } | BANG int32 { GenericTypeSpec spec = new GenericTypeSpec ((int) $2); $$ = new GenericTypeRef (spec, $2.ToString ()); } | BANG BANG int32 { // access method type parameter by number } | K_CLASS slashed_name OPEN_ANGLE_BRACKET BANG int32 CLOSE_ANGLE_BRACKET { $$ = new TypeRef ((string) $2, false, null); } | K_CLASS slashed_name OPEN_ANGLE_BRACKET typars CLOSE_ANGLE_BRACKET { ArrayList typar_list = (ArrayList) $4; ITypeRef[] typar_array = (ITypeRef[]) typar_list.ToArray (typeof (ITypeRef)); $$ = new GenericTypeInst ((string)$2, typar_array); } ; bounds : bound { ArrayList bound_list = new ArrayList (); bound_list.Add ($1); $$ = bound_list; } | bounds COMMA bound { ArrayList bound_list = (ArrayList) $1; bound_list.Add ($3); } ; bound : /* EMPTY */ | ELLIPSIS { // No lower bound or size $$ = new DictionaryEntry (TypeRef.Ellipsis, TypeRef.Ellipsis); } | int32 { // ******** Not sure what this is? // For now I will say it is size because there // is allready a way to set lower $$ = new DictionaryEntry (TypeRef.Ellipsis, $1); } | int32 ELLIPSIS int32 { // lower bound and size $$ = new DictionaryEntry ($1, $3); } | int32 ELLIPSIS { // Just lower bound $$ = new DictionaryEntry ($1, TypeRef.Ellipsis); } ; call_conv : K_INSTANCE call_conv { $$ = (CallConv) $2 | CallConv.Instance; } | K_EXPLICIT call_conv { $$ = (CallConv) $2 | CallConv.InstanceExplicit; } | call_kind ; call_kind : /* EMPTY */ { $$ = new CallConv (); } | K_DEFAULT { $$ = CallConv.Default; } | K_VARARG { $$ = CallConv.Vararg; } | K_UNMANAGED K_CDECL { $$ = CallConv.Cdecl; } | K_UNMANAGED K_STDCALL { $$ = CallConv.Stdcall; } | K_UNMANAGED K_THISCALL { $$ = CallConv.Thiscall; } | K_UNMANAGED K_FASTCALL { $$ = CallConv.Fastcall; } ; native_type : /* EMPTY */ | K_CUSTOM OPEN_PARENS comp_qstring COMMA comp_qstring CLOSE_PARENS | K_FIXED K_SYSSTRING OPEN_BRACKET int32 CLOSE_BRACKET { $$ = NativeType.FixedSysString; } | K_FIXED K_ARRAY OPEN_BRACKET int32 CLOSE_BRACKET | K_VARIANT | K_CURRENCY { $$ = NativeType.Currency; } | K_SYSCHAR | K_VOID { $$ = NativeType.Void; } | K_BOOL { $$ = NativeType.Boolean; } | K_INT8 { $$ = NativeType.Int8; } | K_INT16 { $$ = NativeType.Int16; } | K_INT32 { $$ = NativeType.Int32; } | K_INT64 { $$ = NativeType.Int64; } | K_FLOAT32 { $$ = NativeType.Float32; } | K_FLOAT64 { $$ = NativeType.Float64; } | K_ERROR | K_UNSIGNED K_INT8 { $$ = NativeType.UInt8; } | K_UNSIGNED K_INT16 { $$ = NativeType.UInt16; } | K_UNSIGNED K_INT32 { $$ = NativeType.UInt32; } | K_UNSIGNED K_INT64 { $$ = NativeType.UInt64; } | native_type STAR | native_type OPEN_BRACKET CLOSE_BRACKET | native_type OPEN_BRACKET int32 CLOSE_BRACKET | native_type OPEN_BRACKET int32 PLUS int32 CLOSE_BRACKET | native_type OPEN_BRACKET PLUS int32 CLOSE_BRACKET | K_DECIMAL | K_DATE | K_BSTR { $$ = NativeType.BStr; } | K_LPSTR { $$ = NativeType.LPStr; } | K_LPWSTR { $$ = NativeType.LPWStr; } | K_LPTSTR { $$ = NativeType.LPTStr; } | K_OBJECTREF | K_IUNKNOWN { $$ = NativeType.IUnknown; } | K_IDISPATCH { $$ = NativeType.IDispatch; } | K_STRUCT { $$ = NativeType.Struct; } | K_INTERFACE { $$ = NativeType.Interface; } | K_SAFEARRAY variant_type | K_SAFEARRAY variant_type COMMA comp_qstring | K_INT { $$ = NativeType.Int; } | K_UNSIGNED K_INT { $$ = NativeType.UInt; } | K_NESTED K_STRUCT | K_BYVALSTR { $$ = NativeType.ByValStr; } | K_ANSI K_BSTR { $$ = NativeType.AnsiBStr; } | K_TBSTR { $$ = NativeType.TBstr; } | K_VARIANT K_BOOL { $$ = NativeType.VariantBool; } | K_METHOD | K_AS K_ANY { $$ = NativeType.AsAny; } | K_LPSTRUCT ; variant_type : /* EMPTY */ | K_NULL | K_VARIANT | K_CURRENCY | K_VOID | K_BOOL | K_INT8 | K_INT16 | K_INT32 | K_INT64 | K_FLOAT32 | K_FLOAT64 | K_UNSIGNED K_INT8 | K_UNSIGNED K_INT16 | K_UNSIGNED K_INT32 | K_UNSIGNED K_INT64 | STAR | variant_type OPEN_BRACKET CLOSE_BRACKET | variant_type K_VECTOR | variant_type AMPERSAND | K_DECIMAL | K_DATE | K_BSTR | K_LPSTR | K_LPWSTR | K_IUNKNOWN | K_IDISPATCH | K_SAFEARRAY | K_INT | K_UNSIGNED K_INT | K_ERROR | K_HRESULT | K_CARRAY | K_USERDEFINED | K_RECORD | K_FILETIME | K_BLOB | K_STREAM | K_STORAGE | K_STREAMED_OBJECT | K_STORED_OBJECT | K_BLOB_OBJECT | K_CF | K_CLSID ; field_decl : D_FIELD repeat_opt field_attr type id at_opt init_opt { FieldDef field_def = new FieldDef((FieldAttr) $3, (string) $5, (ITypeRef) $4); codegen.AddFieldDef (field_def); if ($2 != null) { field_def.SetOffset ((uint) $2); } if ($6 != null) { field_def.AddDataValue ((DataConstant) $6); } if ($7 != null) { field_def.SetValue ((Constant) $7); } } ; repeat_opt : /* EMPTY */ | OPEN_BRACKET int32 CLOSE_BRACKET { $$ = $2; } ; field_attr : /* EMPTY */ { $$ = new FieldAttr (); } | field_attr K_PUBLIC { $$ = (FieldAttr) $1 | FieldAttr.Public; } | field_attr K_PRIVATE { $$ = (FieldAttr) $1 | FieldAttr.Private; } | field_attr K_FAMILY { $$ = (FieldAttr) $1 | FieldAttr.Family; } | field_attr K_ASSEMBLY { $$ = (FieldAttr) $1 | FieldAttr.Assembly; } | field_attr K_FAMANDASSEM { $$ = (FieldAttr) $1 | FieldAttr.FamAndAssem; } | field_attr K_FAMORASSEM { $$ = (FieldAttr) $1 | FieldAttr.FamOrAssem; } | field_attr K_PRIVATESCOPE { // This is just 0x0000 } | field_attr K_STATIC { $$ = (FieldAttr) $1 | FieldAttr.Static; } | field_attr K_INITONLY { $$ = (FieldAttr) $1 | FieldAttr.Initonly; } | field_attr K_RTSPECIALNAME { $$ = (FieldAttr) $1 | FieldAttr.RTSpecialName; } | field_attr K_SPECIALNAME { $$ = (FieldAttr) $1 | FieldAttr.SpecialName; } | field_attr K_MARSHAL OPEN_PARENS native_type CLOSE_PARENS { } | field_attr K_LITERAL { $$ = (FieldAttr) $1 | FieldAttr.Literal; } | field_attr K_NOTSERIALIZED { $$ = (FieldAttr) $1 | FieldAttr.Notserialized; } ; at_opt : /* EMPTY */ | K_AT id { // DataDef def = new DataDef ((string) $2, false); // def.PeapiConstant = new DataConstant (DataTable.GetOffset ((string) $2)); } ; init_opt : /* EMPTY */ | ASSIGN field_init { $$ = $2; } ; field_init : K_FLOAT32 OPEN_PARENS float64 CLOSE_PARENS { $$ = new FloatConst (Convert.ToSingle ($3)); } | K_FLOAT64 OPEN_PARENS float64 CLOSE_PARENS { $$ = new DoubleConst (Convert.ToDouble ($3)); } | K_FLOAT32 OPEN_PARENS int64 CLOSE_PARENS { $$ = new FloatConst (Convert.ToSingle ($3)); } | K_FLOAT64 OPEN_PARENS int64 CLOSE_PARENS { $$ = new DoubleConst (Convert.ToDouble (3)); } | K_INT64 OPEN_PARENS int64 CLOSE_PARENS { $$ = new IntConst (Convert.ToInt64 ($3)); } | K_INT32 OPEN_PARENS int64 CLOSE_PARENS { $$ = new IntConst (Convert.ToInt32 ($3)); } | K_INT16 OPEN_PARENS int64 CLOSE_PARENS { $$ = new IntConst (Convert.ToInt16 ($3)); } | K_CHAR OPEN_PARENS int64 CLOSE_PARENS { $$ = new CharConst (Convert.ToChar ($3)); } | K_INT8 OPEN_PARENS int64 CLOSE_PARENS { $$ = new IntConst (Convert.ToByte ($3)); } | K_BOOL OPEN_PARENS truefalse CLOSE_PARENS { $$ = new BoolConst ((bool) $3); } | K_BYTEARRAY OPEN_PARENS bytes CLOSE_PARENS { $$ = new ByteArrConst ((byte[]) $3); } | comp_qstring { // ******** THIS IS NOT IN THE DOCUMENTATION ******** // $$ = new StringConst ((string) $1); } | K_NULLREF { $$ = new NullConst (); } ; data_decl : data_head data_body { DataDef datadef = (DataDef) $1; if ($2 is ArrayList) { ArrayList const_list = (ArrayList) $2; DataConstant[] const_arr = new DataConstant[const_list.Count]; for (int i=0; i