using PEAPI;\r
using System;\r
using System.Collections;\r
+using System.Globalization;\r
\r
namespace Mono.ILASM {\r
\r
%token BANG "!"\r
%token ELLIPSIS "..."\r
%token DASH "-"\r
-\r
+%token OPEN_ANGLE_BRACKET "<"\r
+%token CLOSE_ANGLE_BRACKET ">"\r
\r
\r
\r
\r
\r
\r
-\r
/* Mechanically generated - DO NOT EDIT! */\r
\r
\r
;\r
\r
vtfixup_attr : /* EMPTY */\r
- | vtfixup_attr int32\r
| vtfixup_attr int64\r
| vtfixup_attr K_FROMUNMANAGED\r
| vtfixup_attr K_CALLMOSTDERIVED\r
}\r
;\r
\r
-class_all : class_head OPEN_BRACE class_decls\r
- CLOSE_BRACE\r
+class_all : class_head OPEN_BRACE class_decls CLOSE_BRACE\r
{\r
- codegen.CompleteClass ();\r
+ codegen.EndTypeDef ();\r
}\r
- \r
;\r
\r
-class_head : D_CLASS class_attr id extends_clause\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
- 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
+ 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
}\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
\r
class_ref : OPEN_BRACKET comp_name CLOSE_BRACKET slashed_name\r
{\r
- PEAPI.Type type = codegen.ExternTable.GetClass ((string) $2, (string)$4);\r
- $$ = new TypeRef (type, (string) $4);\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 (codegen.ClassTable.GetReference ((string) $1, null),\r
- (string) $1);\r
+ $$ = new TypeRef ((string) $1, null);\r
}\r
;\r
\r
| extsource_spec\r
| customattr_decl\r
| D_SIZE int32\r
+ {\r
+ codegen.CurrentTypeDef.SetSize ((int) $2);\r
+ }\r
| D_PACK int32\r
+ {\r
+ codegen.CurrentTypeDef.SetPack ((int) $2);\r
+ }\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
}\r
| K_OBJECT\r
{\r
- $$ = new TypeRef (PrimitiveType.Object, "System.Object");\r
+ $$ = new PrimitiveTypeRef (PrimitiveType.Object, "System.Object");\r
}\r
| K_STRING\r
{\r
- $$ = new TypeRef (PrimitiveType.String, "System.String");\r
+ $$ = new PrimitiveTypeRef (PrimitiveType.String, "System.String");\r
}\r
| K_VALUE K_CLASS class_ref\r
{\r
}\r
| type OPEN_BRACKET CLOSE_BRACKET\r
{\r
- TypeRef base_type = (TypeRef) $1;\r
- PEAPI.Type arr_type = new ZeroBasedArray (base_type.Type);\r
- $$ = new TypeRef (arr_type, base_type.FullName + "[]");\r
+ ITypeRef base_type = (ITypeRef) $1;\r
+ base_type.MakeArray ();\r
}\r
| type OPEN_BRACKET bounds CLOSE_BRACKET\r
{\r
- TypeRef base_type = (TypeRef) $1;\r
+ ITypeRef base_type = (ITypeRef) $1;\r
ArrayList bound_list = (ArrayList) $3;\r
- int dimen = bound_list.Count;\r
- int[] lower_array = new int[dimen];\r
- int[] size_array = new int[dimen];\r
- bool lower_set = false;\r
- bool size_set = false;\r
- bool prev_lower_set = true;\r
- bool prev_size_set = true;\r
-\r
- // TODO: There should probably be an error reported if\r
- // something like [3...,3...5] is done\r
- for (int i=0; i<dimen; i++) {\r
- DictionaryEntry bound = (DictionaryEntry) bound_list[i];\r
- \r
- if (bound.Key != null && prev_lower_set) {\r
- lower_array[i] = (int) bound.Key;\r
- lower_set = true;\r
- } else {\r
- prev_lower_set = false;\r
- } \r
- if (bound.Value != null && prev_size_set) {\r
- size_array[i] = (int) bound.Value;\r
- size_set = true;\r
- } else {\r
- prev_size_set = false;\r
- }\r
- }\r
- if (lower_set && size_set) {\r
- $$ = new BoundArray (base_type.Type,\r
- (uint) dimen, lower_array, size_array);\r
- } else if (size_set) {\r
- $$ = new BoundArray (base_type.Type,\r
- (uint) dimen, size_array);\r
- } else {\r
- $$ = new BoundArray (base_type.Type, (uint) dimen);\r
- }\r
+ base_type.MakeBoundArray (bound_list);\r
}\r
| type AMPERSAND\r
{\r
- TypeRef base_type = $1 as TypeRef;\r
- PEAPI.Type ref_type = new ManagedPointer (base_type.Type);\r
- $$ = new TypeRef (ref_type, base_type.FullName + '&');\r
+ ITypeRef base_type = (ITypeRef) $1;\r
+ base_type.MakeManagedPointer ();\r
}\r
| type STAR\r
{\r
- TypeRef base_type = (TypeRef) $1;\r
- PEAPI.Type ptr_type = new UnmanagedPointer (base_type.Type);\r
- $$ = new TypeRef (ptr_type, base_type.FullName + '&');\r
+ ITypeRef base_type = (ITypeRef) $1;\r
+ base_type.MakeUnmanagedPointer ();\r
}\r
| type K_PINNED\r
{\r
- TypeRef type = (TypeRef) $1;\r
- type.Pinned = true;\r
+ ITypeRef base_type = (ITypeRef) $1;\r
+ base_type.MakePinned ();\r
}\r
| type K_MODREQ OPEN_PARENS class_ref CLOSE_PARENS\r
{\r
- TypeRef base_type = (TypeRef) $1;\r
- TypeRef class_ref = (TypeRef) $4;\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 TypeRef (PrimitiveType.TypedRef,\r
+ $$ = new PrimitiveTypeRef (PrimitiveType.TypedRef,\r
"System.TypedReference");\r
}\r
| K_CHAR\r
{\r
- $$ = new TypeRef (PrimitiveType.Char, "System.Char");\r
+ $$ = new PrimitiveTypeRef (PrimitiveType.Char, "System.Char");\r
}\r
| K_VOID\r
{\r
- $$ = new TypeRef (PrimitiveType.Void, "System.Void");\r
+ $$ = new PrimitiveTypeRef (PrimitiveType.Void, "System.Void");\r
}\r
| K_BOOL\r
{\r
- $$ = new TypeRef (PrimitiveType.Boolean, "System.Bool");\r
+ $$ = new PrimitiveTypeRef (PrimitiveType.Boolean, "System.Bool");\r
}\r
| K_INT8\r
{\r
- $$ = new TypeRef (PrimitiveType.Int8, "System.Int8");\r
+ $$ = new PrimitiveTypeRef (PrimitiveType.Int8, "System.Int8");\r
}\r
| K_INT16\r
{\r
- $$ = new TypeRef (PrimitiveType.Int16, "System.Int16");\r
+ $$ = new PrimitiveTypeRef (PrimitiveType.Int16, "System.Int16");\r
}\r
| K_INT32\r
{\r
- $$ = new TypeRef (PrimitiveType.Int32, "System.Int32");\r
+ $$ = new PrimitiveTypeRef (PrimitiveType.Int32, "System.Int32");\r
}\r
| K_INT64\r
{\r
- $$ = new TypeRef (PrimitiveType.Int64, "System.Int64");\r
+ $$ = new PrimitiveTypeRef (PrimitiveType.Int64, "System.Int64");\r
}\r
| K_FLOAT32\r
{\r
- $$ = new TypeRef (PrimitiveType.Float32, "System.Float32");\r
+ $$ = new PrimitiveTypeRef (PrimitiveType.Float32, "System.Float32");\r
}\r
| K_FLOAT64\r
{\r
- $$ = new TypeRef (PrimitiveType.Float64, "System.Float64");\r
+ $$ = new PrimitiveTypeRef (PrimitiveType.Float64, "System.Float64");\r
}\r
| K_UNSIGNED K_INT8\r
{\r
- $$ = new TypeRef (PrimitiveType.UInt8, "System.UInt8");\r
+ $$ = new PrimitiveTypeRef (PrimitiveType.UInt8, "System.UInt8");\r
}\r
| K_UNSIGNED K_INT16\r
{\r
- $$ = new TypeRef (PrimitiveType.UInt16, "System.UInt16"); \r
+ $$ = new PrimitiveTypeRef (PrimitiveType.UInt16, "System.UInt16"); \r
}\r
| K_UNSIGNED K_INT32\r
{\r
- $$ = new TypeRef (PrimitiveType.UInt32, "System.UInt32");\r
+ $$ = new PrimitiveTypeRef (PrimitiveType.UInt32, "System.UInt32");\r
}\r
| K_UNSIGNED K_INT64\r
{\r
- $$ = new TypeRef (PrimitiveType.UInt64, "System.UInt64");\r
+ $$ = new PrimitiveTypeRef (PrimitiveType.UInt64, "System.UInt64");\r
}\r
| K_NATIVE K_INT\r
{\r
// TODO: Is this the proper full name\r
- $$ = new TypeRef (PrimitiveType.NativeInt, "native int");\r
+ $$ = new PrimitiveTypeRef (PrimitiveType.NativeInt, "System.IntPtr");\r
}\r
\r
| K_NATIVE K_UNSIGNED K_INT\r
{\r
- // TODO: Is this the proper full name\r
- $$ = new TypeRef (PrimitiveType.NativeUInt, "native uint");\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
;\r
\r
call_kind : /* EMPTY */\r
+ {\r
+ $$ = new CallConv ();\r
+ }\r
| K_DEFAULT\r
{\r
$$ = CallConv.Default;\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
| 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
;\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
- | comp_qstring // ******** ADDED\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
+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 */\r
- | K_TLS\r
+tls : /* EMPTY */ { $$ = false; }\r
+ | K_TLS { $$ = true; }\r
;\r
\r
data_body : OPEN_BRACE dataitem_list CLOSE_BRACE\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
- | K_BYTEARRAY OPEN_PARENS bytes CLOSE_PARENS // ******** ADDED\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
- OPEN_PARENS sig_args CLOSE_PARENS impl_attr\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 */\r
- | meth_attr K_STATIC\r
- | meth_attr K_PUBLIC\r
- | meth_attr K_PRIVATE\r
- | meth_attr K_FAMILY\r
- | meth_attr K_ASSEMBLY\r
- | meth_attr K_FAMANDASSEM\r
- | meth_attr K_FAMORASSEM\r
- | meth_attr K_PRIVATESCOPE\r
- | meth_attr K_FINAL\r
- | meth_attr K_VIRTUAL\r
- | meth_attr K_ABSTRACT\r
- | meth_attr K_HIDEBYSIG\r
- | meth_attr K_NEWSLOT\r
- | meth_attr K_REQSECOBJ\r
- | meth_attr K_SPECIALNAME\r
- | meth_attr K_RTSPECIALNAME\r
- | meth_attr K_UNMANAGEDEXP\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
| comp_name\r
;\r
\r
-param_attr : /* EMPTY */\r
- | param_attr OPEN_BRACKET K_IN CLOSE_BRACKET\r
- | param_attr OPEN_BRACKET K_OUT CLOSE_BRACKET\r
- | param_attr OPEN_BRACKET K_OPT CLOSE_BRACKET\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 */\r
- | impl_attr K_NATIVE\r
- | impl_attr K_CIL\r
- | impl_attr K_OPTIL\r
- | impl_attr K_MANAGED\r
- | impl_attr K_UNMANAGED\r
- | impl_attr K_FORWARDREF\r
- | impl_attr K_PRESERVESIG\r
- | impl_attr K_RUNTIME\r
- | impl_attr K_INTERNALCALL\r
- | impl_attr K_SYNCHRONIZED\r
- | impl_attr K_NOINLINING\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_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_args : { $$ = new ArrayList (); }\r
| sig_arg_list\r
;\r
\r
-sig_arg_list : sig_arg\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
| 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 */ { $$ = new ArrayList (); }\r
+ | type\r
+ {\r
+ ArrayList type_list = new ArrayList ();\r
+ type_list.Add ($1);\r
+ $$ = type_list;\r
+ }\r
+ | type_list COMMA type\r
+ {\r
+ ArrayList type_list = (ArrayList) $1;\r
+ type_list.Add ($3);\r
+ }\r
+ ;\r
+\r
method_decls : /* EMPTY */\r
| method_decls method_decl\r
;\r
\r
method_decl : D_EMITBYTE int32\r
| D_MAXSTACK int32\r
- | D_LOCALS OPEN_PARENS sig_args CLOSE_PARENS\r
- | D_LOCALS K_INIT OPEN_PARENS sig_args CLOSE_PARENS\r
+ | D_LOCALS OPEN_PARENS local_list CLOSE_PARENS\r
+ {\r
+ codegen.CurrentMethodDef.AddLocals (\r
+ (ArrayList) $3);\r
+ }\r
+ | D_LOCALS K_INIT OPEN_PARENS local_list CLOSE_PARENS\r
+ {\r
+ codegen.CurrentMethodDef.AddLocals (\r
+ (ArrayList) $4);\r
+ codegen.CurrentMethodDef.InitLocals ();\r
+ }\r
| D_ENTRYPOINT\r
+ {\r
+ codegen.CurrentMethodDef.EntryPoint ();\r
+ }\r
| D_ZEROINIT\r
| D_EXPORT OPEN_BRACKET int32 CLOSE_BRACKET\r
| D_EXPORT OPEN_BRACKET int32 CLOSE_BRACKET K_AS id\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
| 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
+ | OPEN_BRACKET int32 CLOSE_BRACKET type\r
+ {\r
+ $$ = new Local ((int) $2, (ITypeRef) $4);\r
+ }\r
+ | OPEN_BRACKET int32 CLOSE_BRACKET type id\r
+ {\r
+ $$ = new Local ((int) $2, (string) $5, (ITypeRef) $4);\r
+ }\r
+ ;\r
+\r
type_spec : class_ref\r
| OPEN_BRACKET comp_name CLOSE_BRACKET\r
| OPEN_BRACKET D_MODULE comp_name CLOSE_BRACKET\r
;\r
\r
instr : INSTR_NONE\r
+ {\r
+ codegen.CurrentMethodDef.AddInstr (\r
+ new SimpInstr ((Op) $1));\r
+ }\r
| INSTR_VAR int32\r
+ {\r
+ \r
+ }\r
| INSTR_I int32\r
- | INSTR_I id /* Allow variable names :p */\r
+ {\r
+ codegen.CurrentMethodDef.AddInstr (new\r
+ IntInstr ((IntOp) $1, (int) $2));\r
+ }\r
+ | INSTR_I id /* Allow variable names */\r
| INSTR_I8 int64\r
+ {\r
+ codegen.CurrentMethodDef.AddInstr (new\r
+ IntInstr ((IntOp) $1, (int) $2));\r
+ }\r
| INSTR_R float64\r
+ {\r
+ switch ((MiscInstr) $1) {\r
+ case MiscInstr.ldc_r4:\r
+ case MiscInstr.ldc_r8:\r
+ codegen.CurrentMethodDef.AddInstr (new LdcInstr ((MiscInstr) $1, (double) $2));\r
+ break;\r
+ }\r
+ }\r
| INSTR_R int64\r
+ {\r
+ switch ((MiscInstr) $1) {\r
+ case MiscInstr.ldc_r8:\r
+ codegen.CurrentMethodDef.AddInstr (new LdcInstr ((MiscInstr) $1, (double) $2));\r
+ break;\r
+ }\r
+ }\r
| INSTR_R OPEN_PARENS bytes CLOSE_PARENS\r
| INSTR_BRTARGET int32\r
+ {\r
+ // Need to add this to PEAPI \r
+ }\r
| INSTR_BRTARGET id\r
+ {\r
+ codegen.CurrentMethodDef.AddInstr (new BranchInstr ((BranchOp) $1,\r
+ codegen.CurrentMethodDef, (string) $2));\r
+ }\r
| INSTR_METHOD method_ref\r
+ {\r
+ codegen.CurrentMethodDef.AddInstr (new MethodInstr ((MethodOp) $1,\r
+ (IMethodRef) $2));\r
+ }\r
| INSTR_FIELD type type_spec DOUBLE_COLON id\r
+ {\r
+ IClassRef owner = (IClassRef) $3;\r
+ IFieldRef fieldref = owner.GetFieldRef ((ITypeRef) $2, (string) $5);\r
+\r
+ codegen.CurrentMethodDef.AddInstr (new FieldInstr ((FieldOp) $1, fieldref));\r
+ }\r
| INSTR_FIELD type id\r
- | INSTR_TYPE K_FIELD type type_spec DOUBLE_COLON id // ****** ADDED\r
- | INSTR_TYPE K_FIELD type id // ****** ADDED\r
+ {\r
+ GlobalFieldRef fieldref = new GlobalFieldRef ((ITypeRef) $2, (string) $3);\r
+\r
+ codegen.CurrentMethodDef.AddInstr (new FieldInstr ((FieldOp) $1, fieldref));\r
+ }\r
| INSTR_TYPE type_spec\r
+ {\r
+ codegen.CurrentMethodDef.AddInstr (new TypeInstr ((TypeOp) $1,\r
+ (ITypeRef) $2));\r
+ }\r
| INSTR_STRING comp_qstring\r
+ {\r
+ if ((MiscInstr) $1 == MiscInstr.ldstr)\r
+ codegen.CurrentMethodDef.AddInstr (new LdstrInstr ((string) $2));\r
+ }\r
| INSTR_STRING K_BYTEARRAY ASSIGN OPEN_PARENS bytes CLOSE_PARENS\r
| INSTR_STRING K_BYTEARRAY OPEN_PARENS bytes CLOSE_PARENS // ****** ADDED\r
| INSTR_SIG call_conv type OPEN_PARENS sig_args CLOSE_PARENS\r
| INSTR_TOK owner_type\r
| INSTR_SWITCH OPEN_PARENS labels CLOSE_PARENS\r
+ {\r
+ codegen.CurrentMethodDef.AddInstr (new SwitchInstr ((ArrayList) $3,\r
+ codegen.CurrentMethodDef));\r
+ }\r
;\r
\r
method_ref : call_conv type type_spec DOUBLE_COLON method_name \r
- OPEN_PARENS sig_args CLOSE_PARENS\r
+ OPEN_PARENS type_list CLOSE_PARENS\r
+ {\r
+ IClassRef owner = (IClassRef) $3;\r
+ ArrayList arg_list = (ArrayList) $7;\r
+ \r
+ $$ = owner.GetMethodRef ((ITypeRef) $2, (string) $5,\r
+ (ITypeRef[]) arg_list.ToArray (typeof (ITypeRef)));\r
+ }\r
| call_conv type method_name \r
- OPEN_PARENS sig_args CLOSE_PARENS\r
+ OPEN_PARENS type_list CLOSE_PARENS\r
+ {\r
+ ArrayList arg_list = (ArrayList) $5;\r
+\r
+ $$ = new GlobalMethodRef ((ITypeRef) $2, (string) $3,\r
+ (ITypeRef[]) arg_list.ToArray (typeof (ITypeRef)));\r
+ }\r
;\r
\r
labels : /* EMPTY */\r
| id\r
+ {\r
+ ArrayList label_list = new ArrayList ();\r
+ label_list.Add ($1);\r
+ $$ = label_list;\r
+ }\r
| int32\r
+ {\r
+ ArrayList label_list = new ArrayList ();\r
+ label_list.Add ($1);\r
+ $$ = label_list;\r
+ }\r
| labels COMMA id\r
+ {\r
+ ArrayList label_list = (ArrayList) $1;\r
+ label_list.Add ($3);\r
+ }\r
| labels COMMA int32\r
+ {\r
+ ArrayList label_list = (ArrayList) $1;\r
+ label_list.Add ($3);\r
+ }\r
;\r
\r
owner_type : type_spec\r
;\r
\r
assemblyref_head : D_ASSEMBLY K_EXTERN comp_name\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
| D_ASSEMBLY K_EXTERN comp_name K_AS comp_name\r
+ {\r
+ System.Reflection.AssemblyName asmb_name = \r
+ new System.Reflection.AssemblyName ();\r
+ asmb_name.Name = (string) $3;\r
+ codegen.ExternTable.AddAssembly ((string) $5, asmb_name);\r
+ }\r
;\r
\r
assemblyref_decls : /* EMPTY */\r
| customattr_decl\r
;\r
\r
-dotted_name : id\r
- | dotted_name DOT id { $$ = String.Format ("{0}.{1}", $1, $3); }\r
- ;\r
-\r
comp_qstring : QSTRING\r
| comp_qstring PLUS QSTRING { $$ = String.Format ("{0}{1}", $1, $3); }\r
;\r
\r
int32 : INT32\r
- | INT64\r
+ | INT64\r
+ {\r
+ Int64 int64 = (Int64) $1;\r
+\r
+ if (int64 > Int32.MaxValue)\r
+ $$ = Int32.MaxValue;\r
+ else if (int64 < Int32.MinValue)\r
+ $$ = Int32.MinValue; \r
+ }\r
;\r
\r
-int64 : INT32\r
- | INT64\r
+int64 : INT64\r
+ | INT32\r
;\r
\r
float64 : FLOAT64\r
;\r
\r
hexbyte : HEXBYTE\r
- | INT32 // ******** ADDED\r
- | ID // ******** ADDED\r
+ | INT32 { $$ = Convert.ToByte ($1); }\r
+ | ID\r
+ {\r
+ $$ = Byte.Parse ((string) $1, NumberStyles.HexNumber);\r
+ }\r
;\r
\r
-bytes : /* EMPTY */\r
+bytes : /* EMPTY */ { $$ = new byte[0]; }\r
| hexbytes\r
+ {\r
+ ArrayList byte_list = (ArrayList) $1;\r
+ $$ = byte_list.ToArray (typeof (byte));\r
+ }\r
;\r
\r
hexbytes : hexbyte\r
+ {\r
+ ArrayList byte_list = new ArrayList ();\r
+ byte_list.Add (Convert.ToByte ($1));\r
+ $$ = byte_list;\r
+ }\r
| hexbytes hexbyte\r
+ {\r
+ ArrayList byte_list = (ArrayList) $1;\r
+ byte_list.Add (Convert.ToByte ($2));\r
+ }\r
;\r
\r
truefalse : K_TRUE\r
;\r
\r
comp_name : id\r
- | dotted_name\r
- ;\r
-\r
-dotted_name : id\r
- | dotted_name DOT id\r
+ | comp_name DOT id\r
+ {\r
+ $$ = (string) $1 + '.' + (string) $3;\r
+ }\r
;\r
\r
\r