+ | AMPERSAND OPEN_PARENS id CLOSE_PARENS\r
+ {\r
+ // DataDef def = codegen.CurrentTypeDef.GetDataDef ((string) $3);\r
+ // $$ = new AddressConstant ((DataConstant) def.PeapiConstant);\r
+ }\r
+ | K_BYTEARRAY ASSIGN bytes_list\r
+ {\r
+ $$ = new ByteArrConst ((byte[]) $3);\r
+ }\r
+ | K_BYTEARRAY bytes_list\r
+ {\r
+ // ******** THIS IS NOT IN THE SPECIFICATION ******** //\r
+ $$ = new ByteArrConst ((byte[]) $2);\r
+ }\r
+ | K_FLOAT32 OPEN_PARENS float64 CLOSE_PARENS repeat_opt\r
+ {\r
+ double d = (double) $3;\r
+ FloatConst float_const = new FloatConst ((float) d);\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
+ int i = (int) $3;\r
+ IntConst int_const = new IntConst ((short) i);\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
+ int i = (int) $3;\r
+ IntConst int_const = new IntConst ((sbyte) i);\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
+ formal_typars_clause OPEN_PARENS sig_args CLOSE_PARENS impl_attr\r
+ {\r
+ MethodDef methdef = new MethodDef ((MethAttr) $2, (CallConv) $3,\r
+ (ImplAttr) $11, (string) $6, (ITypeRef) $5,\r
+ (ArrayList) $9);\r
+ codegen.BeginMethodDef (methdef);\r
+\r
+ if (pinvoke_info) {\r
+ ExternModule mod = codegen.ExternTable.AddModule (pinvoke_mod);\r
+ methdef.AddPInvokeInfo (pinvoke_attr, mod, pinvoke_meth);\r
+ pinvoke_info = false;\r
+ }\r
+\r
+ if ($7 != null) {\r
+ ArrayList typars_list = (ArrayList) $7;\r
+ foreach (string id in typars_list)\r
+ methdef.AddGenericParam (id);\r
+ }\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_COMPILERCONTROLLED { /* Do nothing */ }\r
+ | meth_attr K_UNMANAGEDEXP \r
+ | meth_attr K_PINVOKEIMPL OPEN_PARENS comp_qstring K_AS\r
+ comp_qstring pinv_attr CLOSE_PARENS\r
+ {\r
+ pinvoke_info = true;\r
+ pinvoke_mod = (string) $4;\r
+ pinvoke_meth = (string) $6;\r
+ pinvoke_attr = (PInvokeAttr) $7;\r
+ }\r
+ | meth_attr K_PINVOKEIMPL OPEN_PARENS comp_qstring pinv_attr CLOSE_PARENS\r
+ {\r
+ pinvoke_info = true;\r
+ pinvoke_mod = (string) $4;\r
+ pinvoke_meth = null;\r
+ pinvoke_attr = (PInvokeAttr) $5;\r
+ }\r
+ | meth_attr K_PINVOKEIMPL OPEN_PARENS pinv_attr CLOSE_PARENS\r
+ {\r
+ pinvoke_info = true;\r
+ pinvoke_mod = null;\r
+ pinvoke_meth = null;\r
+ pinvoke_attr = (PInvokeAttr) $4;\r
+ }\r
+ ;\r
+\r
+pinv_attr : /* EMPTY */ { $$ = new PInvokeAttr (); }\r
+ | pinv_attr K_NOMANGLE { $$ = (PInvokeAttr) $1 | PInvokeAttr.nomangle; }\r
+ | pinv_attr K_ANSI { $$ = (PInvokeAttr) $1 | PInvokeAttr.ansi; }\r
+ | pinv_attr K_UNICODE { $$ = (PInvokeAttr) $1 | PInvokeAttr.unicode; }\r
+ | pinv_attr K_AUTOCHAR { $$ = (PInvokeAttr) $1 | PInvokeAttr.autochar; }\r
+ | pinv_attr K_LASTERR { $$ = (PInvokeAttr) $1 | PInvokeAttr.lasterr; }\r
+ | pinv_attr K_WINAPI { $$ = (PInvokeAttr) $1 | PInvokeAttr.winapi; }\r
+ | pinv_attr K_CDECL { $$ = (PInvokeAttr) $1 | PInvokeAttr.cdecl; }\r
+ | pinv_attr K_STDCALL { $$ = (PInvokeAttr) $1 | PInvokeAttr.stdcall; }\r
+ | pinv_attr K_THISCALL { $$ = (PInvokeAttr) $1 | PInvokeAttr.thiscall; }\r
+ | pinv_attr K_FASTCALL { $$ = (PInvokeAttr) $1 | PInvokeAttr.fastcall; }\r
+ ;\r
+\r
+method_name : D_CTOR\r
+ | D_CCTOR\r
+ | comp_name\r
+ ;\r
+\r
+param_attr : /* EMPTY */ { $$ = new ParamAttr (); }\r
+ | param_attr OPEN_BRACKET K_IN CLOSE_BRACKET { $$ = (ParamAttr) $1 | ParamAttr.In; }\r
+ | param_attr OPEN_BRACKET K_OUT CLOSE_BRACKET { $$ = (ParamAttr) $1 | ParamAttr.Out; }\r
+ | param_attr OPEN_BRACKET K_OPT CLOSE_BRACKET { $$ = (ParamAttr) $1 | ParamAttr.Opt; }\r
+ ;\r
+\r
+impl_attr : /* EMPTY */ { $$ = new ImplAttr (); }\r
+ | impl_attr K_NATIVE { $$ = (ImplAttr) $1 | ImplAttr.Native; }\r
+ | impl_attr K_CIL { $$ = (ImplAttr) $1 | ImplAttr.IL; }\r
+ | impl_attr K_IL { $$ = (ImplAttr) $1 | ImplAttr.IL; }\r
+ | impl_attr K_OPTIL { $$ = (ImplAttr) $1 | ImplAttr.Optil; }\r
+ | impl_attr K_MANAGED { /* should this reset? */ }\r
+ | impl_attr K_UNMANAGED { $$ = (ImplAttr) $1 | ImplAttr.Unmanaged; }\r
+ | impl_attr K_FORWARDREF { $$ = (ImplAttr) $1 | ImplAttr.ForwardRef; }\r
+ | impl_attr K_PRESERVESIG { $$ = (ImplAttr) $1 | ImplAttr.PreserveSig; }\r
+ | impl_attr K_RUNTIME { $$ = (ImplAttr) $1 | ImplAttr.Runtime; }\r
+ | impl_attr K_INTERNALCALL { $$ = (ImplAttr) $1 | ImplAttr.InternalCall; }\r
+ | impl_attr K_SYNCHRONIZED { $$ = (ImplAttr) $1 | ImplAttr.Synchronised; }\r
+ | impl_attr K_NOINLINING { $$ = (ImplAttr) $1 | ImplAttr.NoInLining; }\r
+ ;\r
+\r
+sig_args : /* EMPTY */\r
+ | sig_arg_list\r
+ ;\r
+\r
+sig_arg_list : sig_arg\r
+ {\r
+ ArrayList sig_list = new ArrayList ();\r
+ sig_list.Add ($1);\r
+ $$ = sig_list;\r
+ }\r
+ | sig_arg_list COMMA sig_arg\r
+ {\r
+ ArrayList sig_list = (ArrayList) $1;\r
+ sig_list.Add ($3);\r
+ $$ = sig_list;\r
+ }\r
+ ;\r
+\r
+sig_arg : param_attr type\r
+ {\r
+ $$ = new ParamDef ((ParamAttr) $1, null, (ITypeRef) $2);\r
+ }\r
+ | param_attr type id\r
+ {\r
+ $$ = new ParamDef ((ParamAttr) $1, (string) $3, (ITypeRef) $2);\r
+ }\r
+ | ELLIPSIS\r
+ {\r
+ $$ = new ParamDef ((ParamAttr) 0, "...", new SentinelTypeRef ());\r
+ // $$ = ParamDef.Ellipsis;\r
+ }\r
+ | param_attr type K_MARSHAL OPEN_PARENS native_type CLOSE_PARENS\r
+ | param_attr type K_MARSHAL OPEN_PARENS native_type CLOSE_PARENS id\r
+ ;\r
+\r
+type_list : /* EMPTY */\r
+ {\r
+ $$ = new ArrayList (0);\r
+ }\r
+ | ELLIPSIS\r
+ {\r
+ ArrayList type_list = new ArrayList ();\r
+ // type_list.Add (TypeRef.Ellipsis);\r
+ type_list.Add (new SentinelTypeRef ());\r
+ $$ = type_list;\r
+ }\r
+ | type_list COMMA ELLIPSIS\r
+ {\r
+ ArrayList type_list = (ArrayList) $1;\r
+ // type_list.Add (TypeRef.Ellipsis);\r
+ type_list.Add (new SentinelTypeRef ());\r
+ $$ = type_list;\r
+ }\r
+ | param_attr type opt_id\r
+ {\r
+ ArrayList type_list = new ArrayList ();\r
+ type_list.Add ($2);\r
+ $$ = type_list;\r
+ }\r
+ | type_list COMMA param_attr type opt_id\r
+ {\r
+ ArrayList type_list = (ArrayList) $1;\r
+ type_list.Add ($4);\r
+ }\r
+ ;\r
+\r
+opt_id : /* EMPTY */\r
+ | id\r
+ ;\r
+\r
+method_decls : /* EMPTY */\r
+ | method_decls method_decl\r
+ ;\r
+\r
+method_decl : D_EMITBYTE int32\r
+ | D_MAXSTACK int32\r
+ {\r
+ codegen.CurrentMethodDef.SetMaxStack ((int) $2);\r
+ }\r
+ | D_LOCALS OPEN_PARENS local_list CLOSE_PARENS\r
+ {\r
+ if ($3 != null) {\r
+ codegen.CurrentMethodDef.AddLocals (\r
+ (ArrayList) $3);\r
+ }\r
+ }\r
+ | D_LOCALS K_INIT OPEN_PARENS local_list CLOSE_PARENS\r
+ {\r
+ if ($4 != null) {\r
+ codegen.CurrentMethodDef.AddLocals (\r
+ (ArrayList) $4);\r
+ codegen.CurrentMethodDef.InitLocals ();\r
+ }\r
+ }\r
+ | D_ENTRYPOINT\r
+ {\r
+ codegen.CurrentMethodDef.EntryPoint ();\r
+ }\r
+ | D_ZEROINIT\r
+ {\r
+ codegen.CurrentMethodDef.ZeroInit ();\r
+ }\r
+ | D_EXPORT OPEN_BRACKET int32 CLOSE_BRACKET\r
+ | D_EXPORT OPEN_BRACKET int32 CLOSE_BRACKET K_AS id\r
+ | D_VTENTRY int32 COLON int32 \r
+ | D_OVERRIDE type_spec DOUBLE_COLON method_name\r
+ {\r
+ codegen.CurrentTypeDef.AddOverride (codegen.CurrentMethodDef,\r
+ (ITypeRef) $2, (string) $4);\r
+ \r
+ }\r
+ | scope_block\r
+ | D_PARAM OPEN_BRACKET int32 CLOSE_BRACKET init_opt\r
+ | id COLON\r
+ {\r
+ codegen.CurrentMethodDef.AddLabel ((string) $1);\r
+ }\r
+ | seh_block\r
+ | instr\r
+ | sec_decl\r
+ | extsource_spec\r
+ | language_decl\r
+ | customattr_decl\r
+ {\r
+ codegen.CurrentMethodDef.AddCustomAttr ((CustomAttr) $1);\r
+ }\r
+ | data_decl\r
+ ;\r
+\r
+local_list : /* EMPTY */\r
+ | local\r
+ {\r
+ ArrayList local_list = new ArrayList ();\r
+ local_list.Add ($1);\r
+ $$ = local_list;\r
+ }\r
+ | local_list COMMA local\r
+ {\r
+ ArrayList local_list = (ArrayList) $1;\r
+ local_list.Add ($3);\r
+ }\r
+ ;\r
+\r
+local : type\r
+ {\r
+ $$ = new Local (-1, (ITypeRef) $1);\r
+ }\r
+ | type id\r
+ {\r
+ $$ = new Local (-1, (string) $2, (ITypeRef) $1);\r
+ }\r
+ | slot_num type\r
+ {\r
+ $$ = new Local ((int) $1, (ITypeRef) $2);\r
+ }\r
+ | slot_num type id\r
+ {\r
+ $$ = new Local ((int) $1, (string) $3, (ITypeRef) $2);\r
+ }\r
+ ;\r
+\r
+slot_num : OPEN_BRACKET int32 CLOSE_BRACKET\r
+ {\r
+ $$ = $2;\r
+ }\r
+ ;\r
+\r
+type_spec : class_ref\r
+ | OPEN_BRACKET slashed_name CLOSE_BRACKET\r
+ {\r
+ // This is a reference to a global method in another\r
+ // assembly. This is not supported in the MS version of ilasm\r
+ }\r
+ | OPEN_BRACKET D_MODULE slashed_name CLOSE_BRACKET\r
+ {\r
+ string module = (string) $3;\r
+\r
+ if (codegen.IsThisModule (module)) {\r
+ // This is not handled yet.\r
+ } else {\r
+ $$ = codegen.ExternTable.GetModuleTypeRef ((string) $3, "<Module>", false);\r
+ }\r
+\r
+ }\r
+ | type\r