%token K_OFF\r
%token K_FORWARDER\r
%token K_CHARMAPERROR\r
+%token K_LEGACY\r
+%token K_LIBRARY\r
+%token K_AUTO\r
\r
/* end generated */\r
\r
}\r
;\r
\r
-class_attrs : class_attrs class_attr\r
- ;\r
-\r
class_attr : /* EMPTY */ \r
{ \r
// Reset some flags\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 { is_value_class = true; }\r
- | class_attr K_ENUM { is_enum_class = true; is_value_class = true;\r
- }\r
+ | class_attr K_ENUM { is_enum_class = true; }\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
formal_typars_clause : /* EMPTY */\r
| OPEN_ANGLE_BRACKET formal_typars CLOSE_ANGLE_BRACKET\r
{\r
-#if NET_2_0 || BOOTSTRAP_NET_2_0\r
$$ = $2;\r
-#else\r
- Report.Error ("Use ilasm2 for generics support.");\r
-#endif\r
}\r
;\r
\r
typars_clause : /* EMPTY */\r
| OPEN_ANGLE_BRACKET typars CLOSE_ANGLE_BRACKET\r
{\r
-#if NET_2_0 || BOOTSTRAP_NET_2_0\r
$$ = $2;\r
-#else\r
- Report.Error ("Use ilasm2 for generics support.");\r
-#endif\r
}\r
;\r
\r
;\r
\r
\r
-constraints : generic_class_ref\r
+constraints : type\r
{\r
ArrayList al = new ArrayList ();\r
al.Add ($1);\r
$$ = al;\r
}\r
- | constraints COMMA generic_class_ref\r
+ | constraints COMMA type\r
{\r
ArrayList al = (ArrayList) $1;\r
al.Add ($3);\r
{\r
$$ = $1;\r
}\r
+ | K_OBJECT\r
+ {\r
+ $$ = new PrimitiveTypeRef (PrimitiveType.Object, "System.Object");\r
+ }\r
| K_CLASS class_ref typars_clause\r
{\r
if ($3 != null)\r
\r
type : generic_class_ref\r
{\r
- $$ = $1;\r
- }\r
- | K_OBJECT\r
- {\r
- $$ = new PrimitiveTypeRef (PrimitiveType.Object, "System.Object");\r
+ $$ = GetTypeRef ((BaseTypeRef) $1);\r
}\r
| K_VALUE K_CLASS class_ref\r
{\r
- BaseClassRef class_ref = (BaseClassRef) $3;\r
- class_ref.MakeValueClass ();\r
- $$ = class_ref;\r
+ BaseClassRef class_ref = (BaseClassRef) $3;\r
+ class_ref.MakeValueClass ();\r
+ $$ = GetTypeRef (class_ref);\r
}\r
| K_VALUETYPE OPEN_BRACKET slashed_name CLOSE_BRACKET slashed_name typars_clause\r
{\r
if ($6 != null)\r
$$ = ext_ref.GetGenericTypeInst ((GenericArguments) $6);\r
else\r
- $$ = ext_ref;\r
+ $$ = GetTypeRef (ext_ref);\r
}\r
| K_VALUETYPE slashed_name typars_clause\r
{\r
if ($3 != null)\r
$$ = t_ref.GetGenericTypeInst ((GenericArguments) $3);\r
else\r
- $$ = t_ref;\r
+ $$ = GetTypeRef (t_ref);\r
}\r
| type OPEN_BRACKET CLOSE_BRACKET\r
{\r
- BaseTypeRef base_type = GetTypeRef ((BaseTypeRef) $1);\r
+ BaseTypeRef base_type = (BaseTypeRef) $1;\r
base_type.MakeArray ();\r
$$ = base_type;\r
}\r
| type OPEN_BRACKET bounds CLOSE_BRACKET\r
{\r
- BaseTypeRef base_type = GetTypeRef ((BaseTypeRef) $1);\r
+ BaseTypeRef base_type = (BaseTypeRef) $1;\r
ArrayList bound_list = (ArrayList) $3;\r
base_type.MakeBoundArray (bound_list);\r
$$ = base_type;\r
}\r
| type AMPERSAND\r
{\r
- BaseTypeRef base_type = GetTypeRef ((BaseTypeRef) $1);\r
+ BaseTypeRef base_type = (BaseTypeRef) $1;\r
base_type.MakeManagedPointer ();\r
$$ = base_type;\r
}\r
| type STAR\r
{\r
- BaseTypeRef base_type = GetTypeRef ((BaseTypeRef) $1);\r
+ BaseTypeRef base_type = (BaseTypeRef) $1;\r
base_type.MakeUnmanagedPointer ();\r
$$ = base_type;\r
}\r
| type K_PINNED\r
{\r
- BaseTypeRef base_type = GetTypeRef ((BaseTypeRef) $1);\r
+ BaseTypeRef base_type = (BaseTypeRef) $1;\r
base_type.MakePinned ();\r
$$ = base_type;\r
}\r
- | type K_MODREQ OPEN_PARENS class_ref CLOSE_PARENS\r
+ | type K_MODREQ OPEN_PARENS custom_modifier_type CLOSE_PARENS\r
{\r
- BaseTypeRef base_type = GetTypeRef ((BaseTypeRef) $1);\r
- BaseClassRef class_ref = (BaseClassRef) $4;\r
+ BaseTypeRef base_type = (BaseTypeRef) $1;\r
+ BaseTypeRef class_ref = (BaseTypeRef) $4;\r
base_type.MakeCustomModified (codegen,\r
CustomModifier.modreq, class_ref);\r
$$ = base_type;\r
}\r
- | type K_MODOPT OPEN_PARENS class_ref CLOSE_PARENS\r
+ | type K_MODOPT OPEN_PARENS custom_modifier_type CLOSE_PARENS\r
{\r
- BaseTypeRef base_type = GetTypeRef ((BaseTypeRef) $1);\r
- BaseClassRef class_ref = (BaseClassRef) $4;\r
+ BaseTypeRef base_type = (BaseTypeRef) $1;\r
+ BaseTypeRef class_ref = (BaseTypeRef) $4;\r
base_type.MakeCustomModified (codegen,\r
CustomModifier.modopt, class_ref);\r
$$ = base_type;\r
| primitive_type\r
;\r
\r
- ;\r
-\r
primitive_type : K_INT8\r
{\r
$$ = new PrimitiveTypeRef (PrimitiveType.Int8, "System.SByte");\r
| K_CLSID\r
;\r
\r
-field_decl : D_FIELD repeat_opt field_attr type id at_opt init_opt\r
+custom_modifier_type\r
+ : primitive_type\r
+ | class_ref\r
+ ;\r
+\r
+field_decl : D_FIELD repeat_opt field_attr type id at_opt init_opt semicolon_opt\r
{\r
FieldDef field_def = new FieldDef((FieldAttr) $3, \r
(string) $5, (BaseTypeRef) $4);\r
}\r
;\r
\r
-field_init : field_init_primitive\r
+field_init_full : field_init_primitive\r
| K_BYTEARRAY bytes_list\r
{\r
$$ = new ByteArrConst ((byte[]) $2);\r
}\r
+ ;\r
+\r
+field_init : field_init_full\r
| comp_qstring\r
{\r
// ******** THIS IS NOT IN THE DOCUMENTATION ******** //\r
}\r
;\r
\r
+member_init : field_init_full\r
+ | K_STRING OPEN_PARENS SQSTRING CLOSE_PARENS\r
+ {\r
+ $$ = new StringConst ((string) $3);\r
+ }\r
+ ;\r
+\r
+opt_truefalse_list\r
+ : truefalse_list\r
+ ;\r
+\r
+truefalse_list\r
+ : truefalse\r
+ {\r
+ $$ = new List<BoolConst> () { new BoolConst ((bool) $1) };\r
+ }\r
+ | truefalse_list truefalse\r
+ {\r
+ var l = (List<BoolConst>) $1;\r
+ l.Add (new BoolConst ((bool) $2));\r
+ $$ = l;\r
+ }\r
+ ;\r
+\r
data_decl : data_head data_body\r
{\r
DataDef datadef = (DataDef) $1;\r
| event_decls event_decl\r
;\r
\r
-event_decl : D_ADDON method_ref\r
+event_decl : D_ADDON method_ref semicolon_opt\r
{\r
codegen.CurrentTypeDef.CurrentEvent.AddAddon (\r
(MethodRef) $2); \r
}\r
- | D_REMOVEON method_ref\r
+ | D_REMOVEON method_ref semicolon_opt\r
{\r
codegen.CurrentTypeDef.CurrentEvent.AddRemoveon (\r
(MethodRef) $2);\r
}\r
- | D_FIRE method_ref\r
+ | D_FIRE method_ref semicolon_opt\r
{\r
codegen.CurrentTypeDef.CurrentEvent.AddFire (\r
(MethodRef) $2);\r
}\r
- | D_OTHER method_ref\r
+ | D_OTHER method_ref semicolon_opt\r
{\r
codegen.CurrentTypeDef.CurrentEvent.AddOther (\r
(MethodRef) $2);\r
| language_decl\r
;\r
\r
-customattr_decl : D_CUSTOM custom_type\r
- {\r
- $$ = new CustomAttr ((BaseMethodRef) $2, null);\r
- }\r
- | D_CUSTOM custom_type ASSIGN comp_qstring\r
- | D_CUSTOM custom_type ASSIGN bytes_list\r
- {\r
- $$ = new CustomAttr ((BaseMethodRef) $2,\r
- (byte[]) $4);\r
- }\r
- | D_CUSTOM OPEN_PARENS owner_type CLOSE_PARENS custom_type\r
- | D_CUSTOM OPEN_PARENS owner_type CLOSE_PARENS custom_type ASSIGN comp_qstring\r
- | D_CUSTOM OPEN_PARENS owner_type CLOSE_PARENS custom_type ASSIGN\r
- bytes_list\r
- ;\r
+customattr_decl\r
+ : D_CUSTOM customattr_owner_type_opt custom_type\r
+ {\r
+ $$ = new CustomAttr ((BaseMethodRef) $3, null);\r
+ }\r
+ | D_CUSTOM customattr_owner_type_opt custom_type ASSIGN comp_qstring\r
+ | D_CUSTOM customattr_owner_type_opt custom_type ASSIGN bytes_list\r
+ {\r
+ $$ = new CustomAttr ((BaseMethodRef) $3, new ByteArrConst ((byte[]) $5));\r
+ }\r
+ | D_CUSTOM customattr_owner_type_opt custom_type ASSIGN OPEN_BRACE customattr_values CLOSE_BRACE\r
+ {\r
+ $$ = new CustomAttr ((BaseMethodRef) $3, (PEAPI.Constant) $6);\r
+ }\r
+ ;\r
+\r
+// TODO: unused for now\r
+customattr_owner_type_opt\r
+ : /* empty */\r
+ | OPEN_PARENS type CLOSE_PARENS\r
+ ;\r
+\r
+customattr_values\r
+ : /* empty */\r
+ | K_BOOL OPEN_BRACKET int32 CLOSE_BRACKET OPEN_PARENS opt_truefalse_list CLOSE_PARENS\r
+ {\r
+ var l = (List<BoolConst>) $6;\r
+ $$ = new ArrayConstant (l?.ToArray ()) {\r
+ ExplicitSize = (int) $3\r
+ };\r
+ }\r
+ | K_BYTEARRAY bytes_list\r
+ {\r
+ $$ = new ByteArrConst ((byte[]) $2);\r
+ }\r
+ | K_STRING OPEN_PARENS SQSTRING CLOSE_PARENS\r
+ {\r
+ $$ = new StringConst ((string) $3);\r
+ }\r
+ | customattr_ctor_args\r
+ {\r
+ var c = $1 as Constant;\r
+ $$ = c ?? new ArrayConstant (((List<DataConstant>) $1).ToArray ());\r
+ }\r
+ ;\r
+\r
+customattr_ctor_args\r
+ : customattr_ctor_arg\r
+ | customattr_ctor_args customattr_ctor_arg\r
+ {\r
+ var l = $1 as List<DataConstant>;\r
+ if (l == null) {\r
+ l = new List<DataConstant> () {\r
+ (DataConstant) $1\r
+ };\r
+ }\r
+\r
+ l.Add ((DataConstant) $2);\r
+ $$ = l;\r
+ }\r
+ ;\r
+\r
+customattr_ctor_arg\r
+ : field_init_primitive\r
+ | K_TYPE OPEN_PARENS type CLOSE_PARENS\r
+ {\r
+ $$ = new StringConst (((TypeRef) $3).FullName);\r
+ }\r
+ ;\r
+\r
\r
custom_type : call_conv type type_spec DOUBLE_COLON method_name OPEN_PARENS type_list CLOSE_PARENS\r
{\r
}\r
| D_PERMISSIONSET sec_action ASSIGN OPEN_BRACE permissions CLOSE_BRACE\r
{\r
-#if NET_2_0\r
$$ = new MIPermissionSet ((PEAPI.SecurityAction) $2, (ArrayList) $5);\r
-#else\r
- Report.Error ("Use ilasm2 for 2.0 style declarative security attributes.");\r
-#endif\r
}\r
;\r
\r
}\r
;\r
\r
-perm_mbr_nameval_pair : SQSTRING ASSIGN field_init_primitive\r
+perm_mbr_nameval_pair : SQSTRING ASSIGN member_init\r
{\r
$$ = new NameValuePair ((string) $1, (PEAPI.Constant) $3);\r
}\r
- | SQSTRING ASSIGN K_BYTEARRAY bytes_list\r
- {\r
- $$ = new NameValuePair ((string) $1, new ByteArrConst ((byte[]) $4));\r
- }\r
- | SQSTRING ASSIGN K_STRING OPEN_PARENS SQSTRING CLOSE_PARENS\r
- {\r
- $$ = new NameValuePair ((string) $1, new StringConst ((string) $5));\r
- }\r
;\r
\r
prop_or_field : K_PROPERTY\r
}\r
;\r
\r
-assembly_head : D_ASSEMBLY asm_attr slashed_name\r
+assembly_head : D_ASSEMBLY legacylibrary_opt asm_attr slashed_name\r
{\r
- codegen.SetThisAssembly ((string) $3, (PEAPI.AssemAttr) $2);\r
+ codegen.SetThisAssembly ((string) $4, (PEAPI.AssemAttr) $3);\r
codegen.CurrentCustomAttrTarget = codegen.ThisAssembly;\r
codegen.CurrentDeclSecurityTarget = codegen.ThisAssembly;\r
}\r
assemblyref_all : assemblyref_head OPEN_BRACE assemblyref_decls CLOSE_BRACE\r
;\r
\r
-assemblyref_head : D_ASSEMBLY K_EXTERN asm_attr slashed_name\r
+assemblyref_head : D_ASSEMBLY K_EXTERN legacylibrary_opt asm_attr slashed_name\r
{\r
System.Reflection.AssemblyName asmb_name = \r
new System.Reflection.AssemblyName ();\r
- asmb_name.Name = (string) $4;\r
- codegen.BeginAssemblyRef ((string) $4, asmb_name, (PEAPI.AssemAttr) $3);\r
+ asmb_name.Name = (string) $5;\r
+ codegen.BeginAssemblyRef ((string) $5, asmb_name, (PEAPI.AssemAttr) $4);\r
}\r
- | D_ASSEMBLY K_EXTERN asm_attr slashed_name K_AS slashed_name\r
+ | D_ASSEMBLY K_EXTERN legacylibrary_opt asm_attr slashed_name K_AS slashed_name\r
{\r
System.Reflection.AssemblyName asmb_name = \r
new System.Reflection.AssemblyName ();\r
- asmb_name.Name = (string) $4;\r
- codegen.BeginAssemblyRef ((string) $6, asmb_name, (PEAPI.AssemAttr) $3);\r
+ asmb_name.Name = (string) $5;\r
+ codegen.BeginAssemblyRef ((string) $7, asmb_name, (PEAPI.AssemAttr) $4);\r
}\r
;\r
\r
if (codegen.CurrentCustomAttrTarget != null)\r
codegen.CurrentCustomAttrTarget.AddCustomAttribute ((CustomAttr) $1);\r
}\r
+ | K_AUTO /* MS ilasm uses this keyword to lookup the specified assembly in the GAC and embeds its attributes, we just ignore it */\r
;\r
\r
exptype_all : exptype_head OPEN_BRACE exptype_decls CLOSE_BRACE\r
| COMP_NAME\r
;\r
\r
+semicolon_opt\r
+ : /* empty */\r
+ | SEMICOLON\r
+ ;\r
+\r
+legacylibrary_opt : /* empty */\r
+ | K_LEGACY K_LIBRARY /* MS ilasm has these keywords for backwards compatibility, we just ignore them */\r
+ ;\r
+\r
%%\r
\r
}\r