%{ // Mono::ILASM::ILParser // // (C) Sergey Chaban (serge@wildwestsoftware.com) using PEAPI; using System; using System.Collections; namespace Mono.ILASM { public class ILParser { private CodeGen codegen; 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 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 /* 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_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 /* 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 | D_CORFLAGS int32 | D_FILE K_ALIGNMENT int32 /* | D_IMAGEBASE int64 */ | 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 ; vtfixup_decl : D_VTFIXUP OPEN_BRACKET int32 CLOSE_BRACKET vtfixup_attr K_AT id ; vtfixup_attr : /* EMPTY */ | vtfixup_attr int32 | 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.CompleteClass (); } ; class_head : D_CLASS class_attr id extends_clause impl_clause { if ($4 != null) { codegen.AddClass ((TypeAttr) $2, (string) $3, ((TypeRef)$4).Type as Class, null); } else { codegen.AddClass ((TypeAttr)$2, (string) $3, null); } ArrayList impl_list = (ArrayList) $5; if (impl_list != null) { foreach (TypeRef type_ref in impl_list) codegen.CurrentClass.AddImplementedInterface (type_ref.Type as Class); } } ; class_attrs : class_attrs class_attr ; class_attr : /* EMPTY */ { $$ = 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 { } | class_attr K_ENUM { } | 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; } ; 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 comp_name CLOSE_BRACKET slashed_name { PEAPI.Type type = codegen.ExternTable.GetClass ((string) $2, (string)$4); $$ = new TypeRef (type, (string) $4); } | OPEN_BRACKET D_MODULE comp_name CLOSE_BRACKET slashed_name | slashed_name { $$ = new TypeRef (codegen.ClassTable.GetReference ((string) $1, null), (string) $1); } ; 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 | D_SIZE int32 | D_PACK int32 | D_OVERRIDE type_spec DOUBLE_COLON method_name K_WITH call_conv type type_spec DOUBLE_COLON method_name OPEN_PARENS sig_args CLOSE_PARENS | language_decl ; type : K_CLASS class_ref { $$ = $2; } | K_OBJECT { $$ = new TypeRef (PrimitiveType.Object, "System.Object"); } | K_STRING { $$ = new TypeRef (PrimitiveType.String, "System.String"); } | K_VALUE K_CLASS class_ref { $$ = $3; } | K_VALUETYPE class_ref { $$ = $2; } | type OPEN_BRACKET CLOSE_BRACKET { TypeRef base_type = (TypeRef) $1; PEAPI.Type arr_type = new ZeroBasedArray (base_type.Type); $$ = new TypeRef (arr_type, base_type.FullName + "[]"); } | type OPEN_BRACKET bounds CLOSE_BRACKET { TypeRef base_type = (TypeRef) $1; ArrayList bound_list = (ArrayList) $3; int dimen = bound_list.Count; int[] lower_array = new int[dimen]; int[] size_array = new int[dimen]; bool lower_set = false; bool size_set = false; bool prev_lower_set = true; bool prev_size_set = true; // TODO: There should probably be an error reported if // something like [3...,3...5] is done for (int i=0; i