[ilasm] Adds AggressiveInlining support
[mono.git] / mcs / ilasm / parser / ILParser.jay
index 2a6561756ff339d7201714af7cf18c9985fb6dee..b564427b568fa5956bc83bf9fee47d3c78750b79 100644 (file)
@@ -32,7 +32,7 @@ namespace Mono.ILASM {
                 private string pinvoke_meth;\r
                 private PEAPI.PInvokeAttr pinvoke_attr;\r
                 private ILTokenizer tokenizer;\r
-               static int yacc_verbose_flag;\r
+               const int yacc_verbose_flag = 0;\r
                KeyValuePair<string, TypeAttr> current_extern;\r
 \r
                 class NameValuePair {\r
@@ -59,13 +59,14 @@ namespace Mono.ILASM {
 \r
                 public bool CheckSecurityActionValidity (System.Security.Permissions.SecurityAction action, bool for_assembly)\r
                 {\r
+#pragma warning disable 618\r
                         if ((action == System.Security.Permissions.SecurityAction.RequestMinimum || \r
                                 action == System.Security.Permissions.SecurityAction.RequestOptional || \r
                                 action == System.Security.Permissions.SecurityAction.RequestRefuse) && !for_assembly) {\r
                                 Report.Warning (String.Format ("System.Security.Permissions.SecurityAction '{0}' is not valid for this declaration", action));\r
                                 return false;\r
                         }\r
-\r
+#pragma warning restore 618\r
                         return true;\r
                 }\r
 \r
@@ -287,6 +288,7 @@ namespace Mono.ILASM {
 /* Keywords */\r
 %token K_AT\r
 %token K_AS\r
+%token K_AGGRESSIVEINLINING\r
 %token K_IMPLICITCOM\r
 %token K_IMPLICITRES\r
 %token K_NOAPPDOMAIN\r
@@ -359,6 +361,7 @@ namespace Mono.ILASM {
 %token K_INTERNALCALL\r
 %token K_SYNCHRONIZED\r
 %token K_NOINLINING\r
+%token K_NOOPTIMIZATION\r
 %token K_CUSTOM\r
 %token K_FIXED\r
 %token K_SYSSTRING\r
@@ -480,6 +483,9 @@ namespace Mono.ILASM {
 %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
@@ -591,9 +597,6 @@ class_head          : D_CLASS class_attr comp_name formal_typars_clause extends_clause
                           }\r
                        ;\r
 \r
-class_attrs            : class_attrs class_attr\r
-                       ;\r
-\r
 class_attr             : /* EMPTY */                           \r
                          { \r
                                // Reset some flags\r
@@ -610,8 +613,7 @@ class_attr          : /* EMPTY */
                        | 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
@@ -689,13 +691,13 @@ constraints_clause        : /* EMTPY */
                        ;\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
@@ -707,6 +709,10 @@ generic_class_ref  : class_ref
                          {\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
@@ -921,17 +927,13 @@ class_decl                : method_all
 \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
@@ -939,7 +941,7 @@ type                        : generic_class_ref
                                 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
@@ -948,51 +950,51 @@ type                      : generic_class_ref
                                 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
@@ -1004,8 +1006,6 @@ type                      : generic_class_ref
                        | primitive_type\r
                        ;\r
 \r
-                       ;\r
-\r
 primitive_type         : K_INT8\r
                           {\r
                                 $$ = new PrimitiveTypeRef (PrimitiveType.Int8, "System.SByte");\r
@@ -1485,7 +1485,12 @@ variant_type             : /* EMPTY */
                        | 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
@@ -1652,11 +1657,14 @@ field_init_primitive    : K_FLOAT32 OPEN_PARENS float64 CLOSE_PARENS
                           }\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
@@ -1668,6 +1676,30 @@ field_init               : field_init_primitive
                           }\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
@@ -1687,18 +1719,19 @@ data_decl               : data_head data_body
                           }\r
                        ;\r
 \r
-data_head              : D_DATA tls id ASSIGN\r
+data_head              : D_DATA data_attr id ASSIGN\r
                           {\r
-                                $$ = new DataDef ((string) $3, (bool) $2);    \r
+                                $$ = new DataDef ((string) $3, (DataSegment) $2);\r
                           } \r
-                       | D_DATA tls\r
+                       | D_DATA data_attr\r
                           {\r
-                                $$ = new DataDef (String.Empty, (bool) $2);\r
+                                $$ = new DataDef (String.Empty, (DataSegment) $2);\r
                           }\r
                        ;\r
 \r
-tls                    : /* EMPTY */   { $$ = false; }\r
-                       | K_TLS         { $$ = true; }\r
+data_attr              : /* EMPTY */                   { $$ = DataSegment.Data; }\r
+                       | K_TLS                         { $$ = DataSegment.TLS; }\r
+                       | K_CIL                         { $$ = DataSegment.CIL; }\r
                        ;\r
 \r
 data_body              : OPEN_BRACE dataitem_list CLOSE_BRACE\r
@@ -1983,6 +2016,8 @@ impl_attr         : /* EMPTY */                   { $$ = new ImplAttr (); }
                        | 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
+                       | impl_attr K_NOOPTIMIZATION    { $$ = (ImplAttr) $1 | ImplAttr.NoOptimization; }\r
+                       | impl_attr K_AGGRESSIVEINLINING{ $$ = (ImplAttr) $1 | ImplAttr.AggressiveInlining; }\r
                        ;\r
 \r
 sig_args               : /* EMPTY */\r
@@ -2683,22 +2718,22 @@ event_decls             : /* EMPTY */
                        | 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
@@ -2774,21 +2809,76 @@ prop_decl               : D_SET method_ref
                        | 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
@@ -2892,18 +2982,10 @@ permission_member       : prop_or_field primitive_type perm_mbr_nameval_pair
                          }\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
@@ -3076,9 +3158,9 @@ assembly_all              : assembly_head OPEN_BRACE assembly_decls CLOSE_BRACE
                          }\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
@@ -3138,19 +3220,19 @@ asm_or_ref_decl         : D_PUBLICKEY ASSIGN bytes_list
 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
@@ -3185,6 +3267,7 @@ assemblyref_decl  : D_VER int32 COLON int32 COLON int32 COLON int32
                                 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
@@ -3199,13 +3282,13 @@ exptype_head            : D_CLASS K_EXTERN expt_attr comp_name
 expt_attr              : { $$ = 0; } /* EMPTY */\r
                        | expt_attr K_PRIVATE                   { $$ = (TypeAttr)$1 | TypeAttr.Private; }\r
                        | expt_attr K_PUBLIC                    { $$ = (TypeAttr)$1 | TypeAttr.Public; }\r
+                       | expt_attr K_FORWARDER                 { $$ = (TypeAttr)$1 | TypeAttr.Forwarder; }\r
                        | expt_attr K_NESTED K_PUBLIC           { $$ = (TypeAttr)$1 | TypeAttr.NestedPublic; }\r
                        | expt_attr K_NESTED K_PRIVATE          { $$ = (TypeAttr)$1 | TypeAttr.NestedPrivate; }\r
                        | expt_attr K_NESTED K_FAMILY           { $$ = (TypeAttr)$1 | TypeAttr.NestedFamily; }\r
                        | expt_attr K_NESTED K_ASSEMBLY         { $$ = (TypeAttr)$1 | TypeAttr.NestedAssembly;}\r
                        | expt_attr K_NESTED K_FAMANDASSEM      { $$ = (TypeAttr)$1 | TypeAttr.NestedFamAndAssem; }\r
                        | expt_attr K_NESTED K_FAMORASSEM       { $$ = (TypeAttr)$1 | TypeAttr.NestedFamOrAssem; }\r
-                       | K_FORWARDER                           { $$ = TypeAttr.Forwarder; }\r
                        ;\r
 \r
 exptype_decls          : /* EMPTY */\r
@@ -3346,6 +3429,15 @@ comp_name                : id
                         | 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