X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mcs%2Fmcs%2Fcs-parser.jay;h=5880df29440d1fc80d14ef9dad4e5bdd7ba5ed81;hb=29f95a7d2392761ca8aa5a0d45f598241b40f947;hp=4b9e3d0d889bda61bf548be86763ab5dc78f7a67;hpb=699e59742843044f6efa1726b7cb64f19d909e64;p=mono.git diff --git a/mcs/mcs/cs-parser.jay b/mcs/mcs/cs-parser.jay old mode 100755 new mode 100644 index 4b9e3d0d889..5880df29440 --- a/mcs/mcs/cs-parser.jay +++ b/mcs/mcs/cs-parser.jay @@ -8,6 +8,7 @@ // Licensed under the terms of the GNU GPL // // (C) 2001 Ximian, Inc (http://www.ximian.com) +// (C) 2004 Novell, Inc // // TODO: // (1) Figure out why error productions dont work. `type-declaration' is a @@ -72,7 +73,7 @@ namespace Mono.CSharp /// Stack switch_stack; - public bool yacc_verbose_flag; + static public int yacc_verbose_flag; // Name of the file we are parsing public string name; @@ -81,13 +82,22 @@ namespace Mono.CSharp /// The current file. /// SourceFile file; - - + + /// + /// Temporary Xml documentation cache. + /// For enum types, we need one more temporary store. + /// + string tmpComment; + string enumTypeComment; + /// Current attribute target string current_attr_target; - /// assembly and module attribute definition is enabled + /// assembly and module attribute definitions are enabled bool global_attrs_enabled = true; + + bool has_get, has_set; + %} %token EOF @@ -216,6 +226,7 @@ namespace Mono.CSharp %token INTERR "?" /* C# multi-character operators. */ +%token DOUBLE_COLON "::" %token OP_INC "++" %token OP_DEC "--" %token OP_SHIFT_LEFT "<<" @@ -283,7 +294,13 @@ compilation_unit opt_EOF : /* empty */ + { + Lexer.check_incorrect_doc_comment (); + } | EOF + { + Lexer.check_incorrect_doc_comment (); + } ; outer_declarations @@ -303,24 +320,33 @@ using_directives using_directive : using_alias_directive + { + if (RootContext.Documentation != null) + Lexer.doc_state = XmlCommentState.Allowed; + } | using_namespace_directive + { + if (RootContext.Documentation != null) + Lexer.doc_state = XmlCommentState.Allowed; + } ; using_alias_directive : USING IDENTIFIER ASSIGN namespace_or_type_name SEMICOLON { - current_namespace.UsingAlias ((string) $2, (MemberName) $4, lexer.Location); + LocatedToken lt = (LocatedToken) $2; + current_namespace.UsingAlias (lt.Value, (MemberName) $4, (Location) $1); } | USING error { - CheckIdentifierToken (yyToken); + CheckIdentifierToken (yyToken, GetLocation ($2)); } ; using_namespace_directive : USING namespace_name SEMICOLON { - current_namespace.Using ((string) $2, lexer.Location); + current_namespace.Using ((MemberName) $2, (Location) $1); } ; @@ -331,22 +357,15 @@ using_namespace_directive // namespace_declaration : opt_attributes NAMESPACE namespace_or_type_name - { - if ($1 != null) { - Report.Error(1518, Lexer.Location, "Attributes cannot be applied to namespaces." - + " Expected class, delegate, enum, interface, or struct"); - } - + { MemberName name = (MemberName) $3; - if ((current_namespace.Parent != null) && (name.Left != null)) { - Report.Error (134, lexer.Location, - "Cannot use qualified namespace names in nested " + - "namespace declarations"); + if ($1 != null) { + Report.Error(1671, name.Location, "A namespace declaration cannot have modifiers or attributes"); } current_namespace = new NamespaceEntry ( - current_namespace, file, name.GetName (), lexer.Location); + current_namespace, file, name.GetName (), name.Location); } namespace_body opt_semicolon { @@ -365,20 +384,18 @@ opt_comma ; namespace_name - : namespace_or_type_name { - MemberName name = (MemberName) $1; - - $$ = name.GetName (); - } + : namespace_or_type_name ; namespace_body : OPEN_BRACE + { + if (RootContext.Documentation != null) + Lexer.doc_state = XmlCommentState.Allowed; + } opt_using_directives opt_namespace_member_declarations CLOSE_BRACE - { - } ; opt_using_directives @@ -399,25 +416,13 @@ namespace_member_declarations namespace_member_declaration : type_declaration { - string name = ""; - int mod_flags; - - if ($1 is Class){ - Class c = (Class) $1; - mod_flags = c.ModFlags; - name = c.Name; - } else if ($1 is Struct){ - Struct s = (Struct) $1; - mod_flags = s.ModFlags; - name = s.Name; - } else - break; + if ($1 != null) { + DeclSpace ds = (DeclSpace)$1; - if ((mod_flags & (Modifiers.PRIVATE|Modifiers.PROTECTED)) != 0){ - Report.Error ( - 1527, lexer.Location, - "Namespace elements cant be explicitly " + - "declared private or protected in `" + name + "'"); + if ((ds.ModFlags & (Modifiers.PRIVATE|Modifiers.PROTECTED)) != 0){ + Report.Error (1527, ds.Location, + "Namespace elements cannot be explicitly declared as private, protected or protected internal"); + } } current_namespace.DeclarationFound = true; } @@ -426,10 +431,10 @@ namespace_member_declaration } | field_declaration { - Report.Error (116, lexer.Location, "A namespace can only contain types and namespace declarations"); + Report.Error (116, ((MemberCore) $1).Location, "A namespace can only contain types and namespace declarations"); } | method_declaration { - Report.Error (116, lexer.Location, "A namespace can only contain types and namespace declarations"); + Report.Error (116, ((MemberCore) $1).Location, "A namespace can only contain types and namespace declarations"); } ; @@ -444,7 +449,7 @@ type_declaration // // | error { // Console.WriteLine ("Token=" + yyToken); -// Report.Error (1518, lexer.Location, "Expected class, struct, interface, enum or delegate"); +// Report.Error (1518, GetLocation ($1), "Expected class, struct, interface, enum or delegate"); // } ; @@ -484,12 +489,19 @@ attribute_sections if (current_attr_target == "module") { CodeGen.Module.AddAttributes (sect); $$ = null; - } else if (current_attr_target == "assembly") { + } else if (current_attr_target != null && current_attr_target.Length > 0) { CodeGen.Assembly.AddAttributes (sect); $$ = null; } else { $$ = new Attributes (sect); } + if ($$ == null) { + if (RootContext.Documentation != null) { + Lexer.check_incorrect_doc_comment (); + Lexer.doc_state = + XmlCommentState.Allowed; + } + } } else { $$ = new Attributes (sect); } @@ -546,8 +558,9 @@ attribute_target_specifier attribute_target : IDENTIFIER { - CheckAttributeTarget ((string) $1); - $$ = $1; + LocatedToken lt = (LocatedToken) $1; + CheckAttributeTarget (lt.Value, lt.Location); + $$ = lt.Value; // Location won't be required anymore. } | EVENT { $$ = "event"; } | RETURN { $$ = "return"; } @@ -572,20 +585,21 @@ attribute_list ; attribute - : attribute_name - { - $$ = lexer.Location; - } - opt_attribute_arguments + : attribute_name opt_attribute_arguments { MemberName mname = (MemberName) $1; - string name = mname.GetName (); + ArrayList arguments = (ArrayList) $2; + MemberName left = mname.Left; + string identifier = mname.Name; + + Expression left_expr = left == null ? null : left.GetTypeExpression (); + if (current_attr_target == "assembly" || current_attr_target == "module") - $$ = new GlobalAttribute (current_container, current_attr_target, - name, (ArrayList) $3, (Location) $2); + // FIXME: supply "nameEscaped" parameter here. + $$ = new GlobalAttribute (current_class, current_attr_target, + left_expr, identifier, arguments, mname.Location, lexer.IsEscapedIdentifier (mname.Location)); else - $$ = new Attribute (current_attr_target, name, (ArrayList) $3, - (Location) $2); + $$ = new Attribute (current_attr_target, left_expr, identifier, arguments, mname.Location, lexer.IsEscapedIdentifier (mname.Location)); } ; @@ -672,7 +686,7 @@ named_argument_list } | named_argument_list COMMA expression { - Report.Error (1016, lexer.Location, "Named attribute argument expected"); + Report.Error (1016, ((Expression) $3).Location, "Named attribute argument expected"); $$ = null; } ; @@ -680,8 +694,9 @@ named_argument_list named_argument : IDENTIFIER ASSIGN expression { + // FIXME: keep location $$ = new DictionaryEntry ( - (string) $1, + ((LocatedToken) $1).Value, new Argument ((Expression) $3, Argument.AType.Expression)); } ; @@ -722,22 +737,21 @@ struct_declaration STRUCT member_name { MemberName name = MakeName ((MemberName) $5); - bool partial = (bool) $3; - - if (partial) { + if ($3 != null) { ClassPart part = PartialContainer.CreatePart ( - current_namespace, current_container, name, (int) $2, - (Attributes) $1, Kind.Struct, lexer.Location); + current_namespace, current_class, name, (int) $2, + (Attributes) $1, Kind.Struct, (Location) $3); current_container = part.PartialContainer; current_class = part; } else { current_class = new Struct ( - current_namespace, current_container, name, (int) $2, - (Attributes) $1, lexer.Location); + current_namespace, current_class, name, (int) $2, + (Attributes) $1); + current_container.AddClassOrStruct (current_class); current_container = current_class; - RootContext.Tree.RecordDecl (name.GetName (true), current_class); + RootContext.Tree.RecordDecl (current_namespace.NS, name, current_class); } } opt_class_base @@ -745,23 +759,30 @@ struct_declaration if ($7 != null) current_class.Bases = (ArrayList) $7; - current_class.Register (); + if (RootContext.Documentation != null) + current_class.DocComment = Lexer.consume_doc_comment (); } struct_body + { + if (RootContext.Documentation != null) + Lexer.doc_state = XmlCommentState.Allowed; + } opt_semicolon { - $$ = current_class; - - current_container = current_container.Parent; - current_class = current_container; + $$ = pop_current_class (); } | opt_attributes opt_modifiers opt_partial STRUCT error { - CheckIdentifierToken (yyToken); + CheckIdentifierToken (yyToken, GetLocation ($5)); } ; struct_body - : OPEN_BRACE opt_struct_member_declarations CLOSE_BRACE + : OPEN_BRACE + { + if (RootContext.Documentation != null) + Lexer.doc_state = XmlCommentState.Allowed; + } + opt_struct_member_declarations CLOSE_BRACE ; opt_struct_member_declarations @@ -804,7 +825,7 @@ constant_declaration foreach (VariableDeclaration constant in (ArrayList) $5){ Location l = constant.Location; if ((modflags & Modifiers.STATIC) != 0) { - Report.Error (504, l, "The constant '{0}' cannot be marked static", current_container.GetSignatureForError () + '.' + (string) constant.identifier); + Report.Error (504, l, "The constant `{0}' cannot be marked static", current_container.GetSignatureForError () + '.' + (string) constant.identifier); continue; } @@ -813,6 +834,10 @@ constant_declaration (Expression) constant.expression_or_array_initializer, modflags, (Attributes) $1, l); + if (RootContext.Documentation != null) { + c.DocComment = Lexer.consume_doc_comment (); + Lexer.doc_state = XmlCommentState.Allowed; + } current_container.AddConstant (c); } } @@ -838,12 +863,12 @@ constant_declarators constant_declarator : IDENTIFIER ASSIGN constant_expression { - $$ = new VariableDeclaration ((string) $1, $3, lexer.Location); + $$ = new VariableDeclaration ((LocatedToken) $1, $3); } | IDENTIFIER { // A const field requires a value to be provided - Report.Error (145, lexer.Location, "A const field requires a value to be provided"); + Report.Error (145, ((LocatedToken) $1).Location, "A const field requires a value to be provided"); $$ = null; } ; @@ -859,21 +884,68 @@ field_declaration int mod = (int) $2; foreach (VariableDeclaration var in (ArrayList) $4){ - Location l = var.Location; - Field field = new Field (current_class, type, mod, var.identifier, var.expression_or_array_initializer, - (Attributes) $1, l); + (Attributes) $1, var.Location); + if (RootContext.Documentation != null) { + field.DocComment = Lexer.consume_doc_comment (); + Lexer.doc_state = XmlCommentState.Allowed; + } current_container.AddField (field); + $$ = field; // FIXME: might be better if it points to the top item } } + | opt_attributes + opt_modifiers + FIXED + type + fixed_variable_declarators + SEMICOLON + { + Expression type = (Expression) $4; + int mod = (int) $2; + + foreach (VariableDeclaration var in (ArrayList) $5) { + FixedField field = new FixedField (current_class, type, mod, var.identifier, + (Expression)var.expression_or_array_initializer, (Attributes) $1, var.Location); + + if (RootContext.Documentation != null) { + field.DocComment = Lexer.consume_doc_comment (); + Lexer.doc_state = XmlCommentState.Allowed; + } + current_container.AddField (field); + $$ = field; // FIXME: might be better if it points to the top item + } + } | opt_attributes opt_modifiers VOID variable_declarators SEMICOLON { - Report.Error (670, lexer.Location, "void type is not allowed for fields"); + Report.Error (670, (Location) $3, "Fields cannot have void type"); + } + ; + +fixed_variable_declarators + : fixed_variable_declarator + { + ArrayList decl = new ArrayList (2); + decl.Add ($1); + $$ = decl; + } + | fixed_variable_declarators COMMA fixed_variable_declarator + { + ArrayList decls = (ArrayList) $1; + decls.Add ($3); + $$ = $1; + } + ; + +fixed_variable_declarator + : IDENTIFIER OPEN_BRACKET expression CLOSE_BRACKET + { + $$ = new VariableDeclaration ((LocatedToken) $1, $3); } ; @@ -881,7 +953,8 @@ variable_declarators : variable_declarator { ArrayList decl = new ArrayList (4); - decl.Add ($1); + if ($1 != null) + decl.Add ($1); $$ = decl; } | variable_declarators COMMA variable_declarator @@ -895,11 +968,17 @@ variable_declarators variable_declarator : IDENTIFIER ASSIGN variable_initializer { - $$ = new VariableDeclaration ((string) $1, $3, lexer.Location); + $$ = new VariableDeclaration ((LocatedToken) $1, $3); } | IDENTIFIER { - $$ = new VariableDeclaration ((string) $1, null, lexer.Location); + $$ = new VariableDeclaration ((LocatedToken) $1, null); + } + | IDENTIFIER OPEN_BRACKET opt_expression CLOSE_BRACKET + { + Report.Error (650, ((LocatedToken) $1).Location, "Syntax error, bad array declarator. To declare a managed array the rank specifier precedes the variable's identifier. " + + "To declare a fixed size buffer field, use the fixed keyword before the field type"); + $$ = null; } ; @@ -914,11 +993,11 @@ variable_initializer } | STACKALLOC type OPEN_BRACKET expression CLOSE_BRACKET { - $$ = new StackAlloc ((Expression) $2, (Expression) $4, lexer.Location); + $$ = new StackAlloc ((Expression) $2, (Expression) $4, (Location) $1); } | STACKALLOC type { - Report.Error (1575, lexer.Location, "A stackalloc expression requires [] after type"); + Report.Error (1575, (Location) $1, "A stackalloc expression requires [] after type"); $$ = null; } ; @@ -926,32 +1005,20 @@ variable_initializer method_declaration : method_header { iterator_container = (IIteratorContainer) $1; + if (RootContext.Documentation != null) + Lexer.doc_state = XmlCommentState.NotAllowed; } method_body { Method method = (Method) $1; - Block b = (Block) $3; - const int extern_abstract = (Modifiers.EXTERN | Modifiers.ABSTRACT); - - if (b == null){ - if ((method.ModFlags & extern_abstract) == 0){ - Report.Error ( - 501, lexer.Location, current_container.MakeName (method.Name) + - "must declare a body because it is not marked abstract or extern"); - } - } else { - if ((method.ModFlags & Modifiers.EXTERN) != 0){ - Report.Error ( - 179, lexer.Location, current_container.MakeName (method.Name) + - " is declared extern, but has a body"); - } - } - method.Block = (ToplevelBlock) $3; current_container.AddMethod (method); current_local_parameters = null; iterator_container = null; + + if (RootContext.Documentation != null) + Lexer.doc_state = XmlCommentState.Allowed; } ; @@ -964,9 +1031,9 @@ opt_error_modifier while (m != 0){ if ((i & m) != 0){ - Report.Error ( - 1585, lexer.Location, "Member modifier `" + - Modifiers.Name (i) + "' must precede member type and name"); + Report.Error (1585, lexer.Location, + "Member modifier `{0}' must precede the member type and name", + Modifiers.Name (i)); } m &= ~i; i = i << 1; @@ -983,11 +1050,13 @@ method_header MemberName name = (MemberName) $4; Method method = new Method (current_class, (Expression) $3, (int) $2, - false, name, (Parameters) $6, (Attributes) $1, - lexer.Location); + false, name, (Parameters) $6, (Attributes) $1); current_local_parameters = (Parameters) $6; + if (RootContext.Documentation != null) + method.DocComment = Lexer.consume_doc_comment (); + $$ = method; } | opt_attributes @@ -999,9 +1068,13 @@ method_header Method method = new Method (current_class, TypeManager.system_void_expr, (int) $2, false, name, (Parameters) $6, - (Attributes) $1, lexer.Location); + (Attributes) $1); current_local_parameters = (Parameters) $6; + + if (RootContext.Documentation != null) + method.DocComment = Lexer.consume_doc_comment (); + $$ = method; } | opt_attributes @@ -1009,17 +1082,19 @@ method_header type modifiers namespace_or_type_name OPEN_PARENS opt_formal_parameter_list CLOSE_PARENS { - Report.Error (1585, lexer.Location, - String.Format ("Modifier {0} should appear before type", - Modifiers.Name ((int) $4))); - MemberName name = (MemberName) $4; + MemberName name = (MemberName) $5; + Report.Error (1585, name.Location, + "Member modifier `{0}' must precede the member type and name", Modifiers.Name ((int) $4)); Method method = new Method (current_class, TypeManager.system_void_expr, - 0, false, name, (Parameters) $7, (Attributes) $1, - lexer.Location); + 0, false, name, (Parameters) $7, (Attributes) $1); current_local_parameters = (Parameters) $7; - $$ = method; + + if (RootContext.Documentation != null) + method.DocComment = Lexer.consume_doc_comment (); + + $$ = null; } ; @@ -1041,7 +1116,7 @@ formal_parameter_list Parameter [] pars = new Parameter [pars_list.Count]; pars_list.CopyTo (pars); - $$ = new Parameters (pars, null, lexer.Location); + $$ = new Parameters (pars, null); } | fixed_parameters COMMA parameter_array { @@ -1050,7 +1125,7 @@ formal_parameter_list Parameter [] pars = new Parameter [pars_list.Count]; pars_list.CopyTo (pars); - $$ = new Parameters (pars, (Parameter) $3, lexer.Location); + $$ = new Parameters (pars, (Parameter) $3); } | fixed_parameters COMMA ARGLIST { @@ -1059,25 +1134,26 @@ formal_parameter_list Parameter [] pars = new Parameter [pars_list.Count]; pars_list.CopyTo (pars); - $$ = new Parameters (pars, true, lexer.Location); + $$ = new Parameters (pars, true); } | parameter_array COMMA fixed_parameters { - Report.Error (231, lexer.Location, "A params parameter must be the last parameter in a formal parameter list"); + if ($1 != null) + Report.Error (231, ((Parameter) $1).Location, "A params parameter must be the last parameter in a formal parameter list"); $$ = null; } | ARGLIST COMMA fixed_parameters { - Report.Error (257, lexer.Location, "An __arglist parameter must be the last parameter in a formal parameter list"); + Report.Error (257, (Location) $1, "An __arglist parameter must be the last parameter in a formal parameter list"); $$ = null; } | parameter_array { - $$ = new Parameters (null, (Parameter) $1, lexer.Location); + $$ = new Parameters (null, (Parameter) $1); } | ARGLIST { - $$ = new Parameters (null, true, lexer.Location); + $$ = new Parameters (null, true); } ; @@ -1104,20 +1180,30 @@ fixed_parameter type IDENTIFIER { - $$ = new Parameter ((Expression) $3, (string) $4, (Parameter.Modifier) $2, (Attributes) $1); + LocatedToken lt = (LocatedToken) $4; + $$ = new Parameter ((Expression) $3, lt.Value, (Parameter.Modifier) $2, (Attributes) $1, lt.Location); } | opt_attributes opt_parameter_modifier type + IDENTIFIER OPEN_BRACKET CLOSE_BRACKET { - Report.Error (1001, lexer.Location, "Identifier expected"); + LocatedToken lt = (LocatedToken) $4; + Report.Error (1552, lt.Location, "Array type specifier, [], must appear before parameter name"); + $$ = null; + } + | opt_attributes + opt_parameter_modifier + type + { + Report.Error (1001, GetLocation ($3), "Identifier expected"); $$ = null; } | opt_attributes opt_parameter_modifier type error { - CheckIdentifierToken (yyToken); + CheckIdentifierToken (yyToken, GetLocation ($4)); $$ = null; } | opt_attributes @@ -1127,7 +1213,8 @@ fixed_parameter ASSIGN constant_expression { - Report.Error (241, lexer.Location, "Default parameter specifiers are not permitted"); + LocatedToken lt = (LocatedToken) $4; + Report.Error (241, lt.Location, "Default parameter specifiers are not permitted"); $$ = null; } ; @@ -1145,16 +1232,17 @@ parameter_modifier parameter_array : opt_attributes PARAMS type IDENTIFIER { - $$ = new Parameter ((Expression) $3, (string) $4, Parameter.Modifier.PARAMS, (Attributes) $1); + LocatedToken lt = (LocatedToken) $4; + $$ = new Parameter ((Expression) $3, lt.Value, Parameter.Modifier.PARAMS, (Attributes) $1, lt.Location); note ("type must be a single-dimension array type"); } | opt_attributes PARAMS parameter_modifier type IDENTIFIER { - Report.Error (1611, lexer.Location, "The params parameter cannot be declared as ref or out"); + Report.Error (1611, (Location) $2, "The params parameter cannot be declared as ref or out"); $$ = null; } | opt_attributes PARAMS type error { - CheckIdentifierToken (yyToken); + CheckIdentifierToken (yyToken, GetLocation ($4)); $$ = null; } ; @@ -1162,63 +1250,75 @@ parameter_array property_declaration : opt_attributes opt_modifiers - type namespace_or_type_name + type + namespace_or_type_name + { + if (RootContext.Documentation != null) + tmpComment = Lexer.consume_doc_comment (); + } OPEN_BRACE { implicit_value_parameter_type = (Expression) $3; lexer.PropertyParsing = true; - - $$ = lexer.Location; - - iterator_container = SimpleIteratorContainer.GetSimple (); } accessor_declarations { lexer.PropertyParsing = false; + has_get = has_set = false; } CLOSE_BRACE { + if ($8 == null) + break; + Property prop; - Pair pair = (Pair) $7; + Pair pair = (Pair) $8; Accessor get_block = (Accessor) pair.First; Accessor set_block = (Accessor) pair.Second; - Location loc = (Location) $6; MemberName name = (MemberName) $4; - prop = new Property (current_class, (Expression) $3, (int) $2, false, - name, (Attributes) $1, get_block, set_block, loc); - if (SimpleIteratorContainer.Simple.Yields) - prop.SetYields (); + prop = new Property (current_class, (Expression) $3, (int) $2, + false, name, (Attributes) $1, get_block, set_block); current_container.AddProperty (prop); implicit_value_parameter_type = null; - iterator_container = null; + + if (RootContext.Documentation != null) + prop.DocComment = ConsumeStoredComment (); + } ; accessor_declarations - : get_accessor_declaration opt_set_accessor_declaration - { - $$ = new Pair ($1, $2); - } - | set_accessor_declaration opt_get_accessor_declaration + : get_accessor_declaration + { + $$ = new Pair ($1, null); + } + | get_accessor_declaration accessor_declarations + { + Pair pair = (Pair) $2; + pair.First = $1; + $$ = pair; + } + | set_accessor_declaration + { + $$ = new Pair (null, $1); + } + | set_accessor_declaration accessor_declarations + { + Pair pair = (Pair) $2; + pair.Second = $1; + $$ = pair; + } + | error { - $$ = new Pair ($2, $1); + Report.Error (1014, GetLocation ($1), "A get or set accessor expected"); + $$ = null; } ; -opt_get_accessor_declaration - : /* empty */ { $$ = null; } - | get_accessor_declaration - ; - -opt_set_accessor_declaration - : /* empty */ { $$ = null; } - | set_accessor_declaration - ; - get_accessor_declaration : opt_attributes opt_modifiers GET { @@ -1229,12 +1329,30 @@ get_accessor_declaration else current_local_parameters = indexer_parameters; lexer.PropertyParsing = false; + + iterator_container = SimpleIteratorContainer.GetSimple (); } accessor_body { - $$ = new Accessor ((ToplevelBlock) $5, (int) $2, (Attributes) $1, lexer.Location); + if (has_get) { + Report.Error (1007, (Location) $3, "Property accessor already defined"); + break; + } + Accessor accessor = new Accessor ((ToplevelBlock) $5, (int) $2, (Attributes) $1, (Location) $3); + has_get = true; current_local_parameters = null; lexer.PropertyParsing = true; + + if (SimpleIteratorContainer.Simple.Yields) + accessor.SetYields (); + + iterator_container = null; + + if (RootContext.Documentation != null) + if (Lexer.doc_state == XmlCommentState.Error) + Lexer.doc_state = XmlCommentState.NotAllowed; + + $$ = accessor; } ; @@ -1244,12 +1362,12 @@ set_accessor_declaration Parameter [] args; Parameter implicit_value_parameter = new Parameter ( implicit_value_parameter_type, "value", - Parameter.Modifier.NONE, null); + Parameter.Modifier.NONE, null, (Location) $3); if (parsing_indexer == false) { args = new Parameter [1]; args [0] = implicit_value_parameter; - current_local_parameters = new Parameters (args, null, lexer.Location); + current_local_parameters = new Parameters (args, null); } else { Parameter [] fpars = indexer_parameters.FixedParameters; @@ -1262,16 +1380,34 @@ set_accessor_declaration } else args = null; current_local_parameters = new Parameters ( - args, indexer_parameters.ArrayParameter, lexer.Location); + args, indexer_parameters.ArrayParameter); } lexer.PropertyParsing = false; + + iterator_container = SimpleIteratorContainer.GetSimple (); } accessor_body { - $$ = new Accessor ((ToplevelBlock) $5, (int) $2, (Attributes) $1, lexer.Location); + if (has_set) { + Report.Error (1007, ((LocatedToken) $3).Location, "Property accessor already defined"); + break; + } + Accessor accessor = new Accessor ((ToplevelBlock) $5, (int) $2, (Attributes) $1, (Location) $3); + has_set = true; current_local_parameters = null; lexer.PropertyParsing = true; + + if (SimpleIteratorContainer.Simple.Yields) + accessor.SetYields (); + + iterator_container = null; + + if (RootContext.Documentation != null + && Lexer.doc_state == XmlCommentState.Error) + Lexer.doc_state = XmlCommentState.NotAllowed; + + $$ = accessor; } ; @@ -1287,40 +1423,44 @@ interface_declaration INTERFACE member_name { MemberName name = MakeName ((MemberName) $5); - bool partial = (bool) $3; - if (partial) { + if ($3 != null) { ClassPart part = PartialContainer.CreatePart ( - current_namespace, current_container, name, (int) $2, - (Attributes) $1, Kind.Interface, lexer.Location); + current_namespace, current_class, name, (int) $2, + (Attributes) $1, Kind.Interface, (Location) $3); current_container = part.PartialContainer; current_class = part; } else { current_class = new Interface ( - current_namespace, current_container, name, (int) $2, - (Attributes) $1, lexer.Location); + current_namespace, current_class, name, (int) $2, + (Attributes) $1); + current_container.AddInterface (current_class); current_container = current_class; - RootContext.Tree.RecordDecl (name.GetName (true), current_class); + RootContext.Tree.RecordDecl (current_namespace.NS, name, current_class); } } opt_class_base { current_class.Bases = (ArrayList) $7; - current_class.Register (); + if (RootContext.Documentation != null) { + current_class.DocComment = Lexer.consume_doc_comment (); + Lexer.doc_state = XmlCommentState.Allowed; + } } interface_body + { + if (RootContext.Documentation != null) + Lexer.doc_state = XmlCommentState.Allowed; + } opt_semicolon { - $$ = current_class; - - current_container = current_container.Parent; - current_class = current_container; + $$ = pop_current_class (); } | opt_attributes opt_modifiers opt_partial INTERFACE error { - CheckIdentifierToken (yyToken); + CheckIdentifierToken (yyToken, GetLocation ($5)); } ; @@ -1343,28 +1483,105 @@ interface_member_declarations interface_member_declaration : interface_method_declaration { + if ($1 == null) + break; + Method m = (Method) $1; + if (m.IsExplicitImpl) + Report.Error (541, m.Location, "`{0}': explicit interface declaration can only be declared in a class or struct", + m.GetSignatureForError ()); + current_container.AddMethod (m); + + if (RootContext.Documentation != null) + Lexer.doc_state = XmlCommentState.Allowed; } | interface_property_declaration { + if ($1 == null) + break; + Property p = (Property) $1; + if (p.IsExplicitImpl) + Report.Error (541, p.Location, "`{0}': explicit interface declaration can only be declared in a class or struct", + p.GetSignatureForError ()); + current_container.AddProperty (p); + + if (RootContext.Documentation != null) + Lexer.doc_state = XmlCommentState.Allowed; } | interface_event_declaration { if ($1 != null){ Event e = (Event) $1; + + if (e.IsExplicitImpl) + Report.Error (541, e.Location, "`{0}': explicit interface declaration can only be declared in a class or struct", + e.GetSignatureForError ()); + current_container.AddEvent (e); } + + if (RootContext.Documentation != null) + Lexer.doc_state = XmlCommentState.Allowed; } | interface_indexer_declaration { + if ($1 == null) + break; + Indexer i = (Indexer) $1; + if (i.IsExplicitImpl) + Report.Error (541, i.Location, "`{0}': explicit interface declaration can only be declared in a class or struct", + i.GetSignatureForError ()); + current_container.AddIndexer (i); + + if (RootContext.Documentation != null) + Lexer.doc_state = XmlCommentState.Allowed; + } + | delegate_declaration + { + if ($1 != null) { + Report.Error (524, GetLocation ($1), "`{0}': Interfaces cannot declare classes, structs, interfaces, delegates, enumerations or constants", + ((MemberCore)$1).GetSignatureForError ()); + } + } + | class_declaration + { + if ($1 != null) { + Report.Error (524, GetLocation ($1), "`{0}': Interfaces cannot declare classes, structs, interfaces, delegates, enumerations or constants", + ((MemberCore)$1).GetSignatureForError ()); + } + } + | struct_declaration + { + if ($1 != null) { + Report.Error (524, GetLocation ($1), "`{0}': Interfaces cannot declare classes, structs, interfaces, delegates, enumerations or constants", + ((MemberCore)$1).GetSignatureForError ()); + } + } + | enum_declaration + { + if ($1 != null) { + Report.Error (524, GetLocation ($1), "`{0}': Interfaces cannot declare classes, structs, interfaces, delegates, enumerations or constants", + ((MemberCore)$1).GetSignatureForError ()); + } + } + | interface_declaration + { + if ($1 != null) { + Report.Error (524, GetLocation ($1), "`{0}': Interfaces cannot declare classes, structs, interfaces, delegates, enumerations or constants", + ((MemberCore)$1).GetSignatureForError ()); + } + } + | constant_declaration + { + Report.Error (525, GetLocation ($1), "Interfaces cannot contain fields or constants"); } ; @@ -1372,7 +1589,7 @@ opt_new : opt_modifiers { int val = (int) $1; - val = Modifiers.Check (Modifiers.NEW | Modifiers.UNSAFE, val, 0, lexer.Location); + val = Modifiers.Check (Modifiers.NEW | Modifiers.UNSAFE, val, 0, GetLocation ($1)); $$ = val; } ; @@ -1382,19 +1599,20 @@ interface_method_declaration OPEN_PARENS opt_formal_parameter_list CLOSE_PARENS SEMICOLON { - MemberName name = (MemberName) $4; - $$ = new Method (current_class, (Expression) $3, (int) $2, true, - name, (Parameters) $6, (Attributes) $1, lexer.Location); + (MemberName) $4, (Parameters) $6, (Attributes) $1); + if (RootContext.Documentation != null) + ((Method) $$).DocComment = Lexer.consume_doc_comment (); } - | opt_attributes opt_new VOID namespace_or_type_name + | opt_attributes opt_new type namespace_or_type_name OPEN_PARENS opt_formal_parameter_list CLOSE_PARENS - SEMICOLON + OPEN_BRACE opt_statement_list CLOSE_BRACE { - MemberName name = (MemberName) $4; + $$ = new Method (current_class, (Expression) $3, (int) $2, true, + (MemberName) $4, (Parameters) $6, (Attributes) $1); - $$ = new Method (current_class, TypeManager.system_void_expr, (int) $2, - true, name, (Parameters) $6, (Attributes) $1, lexer.Location); + Report.Error (531, lexer.Location, "`{0}': interface members cannot have a definition", + ((Method)$$).GetSignatureForError ()); } ; @@ -1404,50 +1622,91 @@ interface_property_declaration type IDENTIFIER OPEN_BRACE { lexer.PropertyParsing = true; } - interface_accessors - { lexer.PropertyParsing = false; } + accessor_declarations + { + has_get = has_set = false; + lexer.PropertyParsing = false; + } CLOSE_BRACE { - InterfaceAccessorInfo pinfo = (InterfaceAccessorInfo) $7; + LocatedToken lt = (LocatedToken) $4; + MemberName name = new MemberName (lt.Value, lt.Location); + + if ($3 == TypeManager.system_void_expr) { + Report.Error (547, lt.Location, "`{0}': property or indexer cannot have void type", lt.Value); + break; + } - $$ = new Property (current_class, (Expression) $3, (int) $2, true, - new MemberName ((string) $4), (Attributes) $1, - pinfo.Get, pinfo.Set, lexer.Location); + Property p = null; + if ($7 == null) { + p = new Property (current_class, (Expression) $3, (int) $2, true, + name, (Attributes) $1, + null, null); + + Report.Error (548, p.Location, "`{0}': property or indexer must have at least one accessor", p.GetSignatureForError ()); + break; + } + + Pair pair = (Pair) $7; + p = new Property (current_class, (Expression) $3, (int) $2, true, + name, (Attributes) $1, + (Accessor)pair.First, (Accessor)pair.Second); + + if (pair.First != null && ((Accessor)(pair.First)).Block != null) { + Report.Error (531, p.Location, "`{0}.get': interface members cannot have a definition", p.GetSignatureForError ()); + $$ = null; + break; + } + + if (pair.Second != null && ((Accessor)(pair.Second)).Block != null) { + Report.Error (531, p.Location, "`{0}.set': interface members cannot have a definition", p.GetSignatureForError ()); + $$ = null; + break; + } + + if (RootContext.Documentation != null) + p.DocComment = Lexer.consume_doc_comment (); + + $$ = p; } | opt_attributes opt_new type error { - CheckIdentifierToken (yyToken); + CheckIdentifierToken (yyToken, GetLocation ($4)); $$ = null; } ; -interface_accessors - : opt_attributes GET SEMICOLON { $$ = new InterfaceAccessorInfo (true, false, (Attributes) $1, null, lexer.Location, lexer.Location); } - | opt_attributes SET SEMICOLON { $$ = new InterfaceAccessorInfo (false, true, null, (Attributes) $1, lexer.Location, lexer.Location); } - | opt_attributes GET SEMICOLON opt_attributes SET SEMICOLON - { $$ = new InterfaceAccessorInfo (true, true, (Attributes) $1, (Attributes) $3, lexer.Location, lexer.Location); } - | opt_attributes SET SEMICOLON opt_attributes GET SEMICOLON - { $$ = new InterfaceAccessorInfo (true, true, (Attributes) $3, (Attributes) $1, lexer.Location, lexer.Location); } - ; interface_event_declaration : opt_attributes opt_new EVENT type IDENTIFIER SEMICOLON { + LocatedToken lt = (LocatedToken) $5; $$ = new EventField (current_class, (Expression) $4, (int) $2, true, - new MemberName ((string) $5), null, - (Attributes) $1, lexer.Location); + new MemberName (lt.Value, lt.Location), null, + (Attributes) $1); + if (RootContext.Documentation != null) + ((EventField) $$).DocComment = Lexer.consume_doc_comment (); } | opt_attributes opt_new EVENT type error { - CheckIdentifierToken (yyToken); + CheckIdentifierToken (yyToken, GetLocation ($5)); $$ = null; } | opt_attributes opt_new EVENT type IDENTIFIER ASSIGN { - Report.Error (68, lexer.Location, "Event declarations on interfaces can not be initialized."); + LocatedToken lt = (LocatedToken) $5; + Report.Error (68, lt.Location, "`{0}.{1}': event in interface cannot have initializer", current_container.Name, lt.Value); $$ = null; } - | opt_attributes opt_new EVENT type IDENTIFIER OPEN_BRACE event_accessor_declarations CLOSE_BRACE { - Report.Error (69, lexer.Location, "Event accessors not valid on interfaces"); + | opt_attributes opt_new EVENT type IDENTIFIER OPEN_BRACE + { + lexer.EventParsing = true; + } + event_accessor_declarations + { + lexer.EventParsing = false; + } + CLOSE_BRACE { + Report.Error (69, (Location) $3, "Event in interface cannot have add or remove accessors"); $$ = null; } ; @@ -1457,16 +1716,46 @@ interface_indexer_declaration OPEN_BRACKET formal_parameter_list CLOSE_BRACKET OPEN_BRACE { lexer.PropertyParsing = true; } - interface_accessors - { lexer.PropertyParsing = false; } + accessor_declarations + { + has_get = has_set = false; + lexer.PropertyParsing = false; + } CLOSE_BRACE { - InterfaceAccessorInfo info = (InterfaceAccessorInfo) $10; + Indexer i = null; + if ($10 == null) { + i = new Indexer (current_class, (Expression) $3, + new MemberName (TypeContainer.DefaultIndexerName, (Location) $4), + (int) $2, true, (Parameters) $6, (Attributes) $1, + null, null); + + Report.Error (548, i.Location, "`{0}': property or indexer must have at least one accessor", i.GetSignatureForError ()); + break; + } - $$ = new Indexer (current_class, (Expression) $3, - new MemberName (TypeContainer.DefaultIndexerName), + Pair pair = (Pair) $10; + i = new Indexer (current_class, (Expression) $3, + new MemberName (TypeContainer.DefaultIndexerName, (Location) $4), (int) $2, true, (Parameters) $6, (Attributes) $1, - info.Get, info.Set, lexer.Location); + (Accessor)pair.First, (Accessor)pair.Second); + + if (pair.First != null && ((Accessor)(pair.First)).Block != null) { + Report.Error (531, i.Location, "`{0}.get': interface members cannot have a definition", i.GetSignatureForError ()); + $$ = null; + break; + } + + if (pair.Second != null && ((Accessor)(pair.Second)).Block != null) { + Report.Error (531, i.Location, "`{0}.set': interface members cannot have a definition", i.GetSignatureForError ()); + $$ = null; + break; + } + + if (RootContext.Documentation != null) + i.DocComment = ConsumeStoredComment (); + + $$ = i; } ; @@ -1477,19 +1766,27 @@ operator_declaration } operator_body { + if ($3 == null) + break; + OperatorDeclaration decl = (OperatorDeclaration) $3; Parameter [] param_list = new Parameter [decl.arg2type != null ? 2 : 1]; - param_list[0] = new Parameter (decl.arg1type, decl.arg1name, Parameter.Modifier.NONE, null); + param_list[0] = new Parameter (decl.arg1type, decl.arg1name, Parameter.Modifier.NONE, null, decl.location); if (decl.arg2type != null) - param_list[1] = new Parameter (decl.arg2type, decl.arg2name, Parameter.Modifier.NONE, null); + param_list[1] = new Parameter (decl.arg2type, decl.arg2name, Parameter.Modifier.NONE, null, decl.location); Operator op = new Operator ( current_class, decl.optype, decl.ret_type, (int) $2, - new Parameters (param_list, null, decl.location), + new Parameters (param_list, null), (ToplevelBlock) $5, (Attributes) $1, decl.location); + if (RootContext.Documentation != null) { + op.DocComment = tmpComment; + Lexer.doc_state = XmlCommentState.Allowed; + } + if (SimpleIteratorContainer.Simple.Yields) op.SetYields (); @@ -1508,9 +1805,10 @@ operator_body operator_declarator : type OPERATOR overloadable_operator OPEN_PARENS type IDENTIFIER CLOSE_PARENS - { + { + LocatedToken lt = (LocatedToken) $6; Operator.OpType op = (Operator.OpType) $3; - CheckUnaryOperator (op); + CheckUnaryOperator (op, lt.Location); if (op == Operator.OpType.Addition) op = Operator.OpType.UnaryPlus; @@ -1519,34 +1817,68 @@ operator_declarator op = Operator.OpType.UnaryNegation; Parameter [] pars = new Parameter [1]; + Expression type = (Expression) $5; - pars [0] = new Parameter ((Expression) $5, (string) $6, Parameter.Modifier.NONE, null); + pars [0] = new Parameter (type, lt.Value, Parameter.Modifier.NONE, null, lt.Location); - current_local_parameters = new Parameters (pars, null, lexer.Location); + current_local_parameters = new Parameters (pars, null); - $$ = new OperatorDeclaration (op, (Expression) $1, (Expression) $5, (string) $6, - null, null, lexer.Location); - } + if (RootContext.Documentation != null) { + tmpComment = Lexer.consume_doc_comment (); + Lexer.doc_state = XmlCommentState.NotAllowed; + } + + $$ = new OperatorDeclaration (op, (Expression) $1, type, lt.Value, + null, null, (Location) $2); + } | type OPERATOR overloadable_operator OPEN_PARENS type IDENTIFIER COMMA type IDENTIFIER CLOSE_PARENS - { - CheckBinaryOperator ((Operator.OpType) $3); + { + LocatedToken ltParam1 = (LocatedToken) $6; + LocatedToken ltParam2 = (LocatedToken) $9; + CheckBinaryOperator ((Operator.OpType) $3, (Location) $2); - Parameter [] pars = new Parameter [2]; + Parameter [] pars = new Parameter [2]; - pars [0] = new Parameter ((Expression) $5, (string) $6, Parameter.Modifier.NONE, null); - pars [1] = new Parameter ((Expression) $8, (string) $9, Parameter.Modifier.NONE, null); + Expression typeL = (Expression) $5; + Expression typeR = (Expression) $8; - current_local_parameters = new Parameters (pars, null, lexer.Location); + pars [0] = new Parameter (typeL, ltParam1.Value, Parameter.Modifier.NONE, null, ltParam1.Location); + pars [1] = new Parameter (typeR, ltParam2.Value, Parameter.Modifier.NONE, null, ltParam2.Location); + + current_local_parameters = new Parameters (pars, null); + + if (RootContext.Documentation != null) { + tmpComment = Lexer.consume_doc_comment (); + Lexer.doc_state = XmlCommentState.NotAllowed; + } $$ = new OperatorDeclaration ((Operator.OpType) $3, (Expression) $1, - (Expression) $5, (string) $6, - (Expression) $8, (string) $9, lexer.Location); - } + typeL, ltParam1.Value, + typeR, ltParam2.Value, (Location) $2); + } | conversion_operator_declarator + | type OPERATOR overloadable_operator + OPEN_PARENS + type IDENTIFIER COMMA + type IDENTIFIER COMMA + type IDENTIFIER + CLOSE_PARENS + { + Report.Error (1534, (Location) $2, "Overloaded binary operator `{0}' takes two parameters", + Operator.GetName ((Operator.OpType) $3)); + $$ = null; + } + | type OPERATOR overloadable_operator + OPEN_PARENS CLOSE_PARENS + { + Report.Error (1535, (Location) $2, "Overloaded unary operator `{0}' takes one parameter", + Operator.GetName ((Operator.OpType) $3)); + $$ = null; + } ; overloadable_operator @@ -1580,33 +1912,45 @@ overloadable_operator conversion_operator_declarator : IMPLICIT OPERATOR type OPEN_PARENS type IDENTIFIER CLOSE_PARENS { + LocatedToken lt = (LocatedToken) $6; Parameter [] pars = new Parameter [1]; - pars [0] = new Parameter ((Expression) $5, (string) $6, Parameter.Modifier.NONE, null); + pars [0] = new Parameter ((Expression) $5, lt.Value, Parameter.Modifier.NONE, null, lt.Location); - current_local_parameters = new Parameters (pars, null, lexer.Location); + current_local_parameters = new Parameters (pars, null); - $$ = new OperatorDeclaration (Operator.OpType.Implicit, (Expression) $3, (Expression) $5, (string) $6, - null, null, lexer.Location); + if (RootContext.Documentation != null) { + tmpComment = Lexer.consume_doc_comment (); + Lexer.doc_state = XmlCommentState.NotAllowed; + } + + $$ = new OperatorDeclaration (Operator.OpType.Implicit, (Expression) $3, (Expression) $5, lt.Value, + null, null, (Location) $2); } | EXPLICIT OPERATOR type OPEN_PARENS type IDENTIFIER CLOSE_PARENS { + LocatedToken lt = (LocatedToken) $6; Parameter [] pars = new Parameter [1]; - pars [0] = new Parameter ((Expression) $5, (string) $6, Parameter.Modifier.NONE, null); + pars [0] = new Parameter ((Expression) $5, lt.Value, Parameter.Modifier.NONE, null, lt.Location); - current_local_parameters = new Parameters (pars, null, lexer.Location); + current_local_parameters = new Parameters (pars, null); - $$ = new OperatorDeclaration (Operator.OpType.Explicit, (Expression) $3, (Expression) $5, (string) $6, - null, null, lexer.Location); + if (RootContext.Documentation != null) { + tmpComment = Lexer.consume_doc_comment (); + Lexer.doc_state = XmlCommentState.NotAllowed; + } + + $$ = new OperatorDeclaration (Operator.OpType.Explicit, (Expression) $3, (Expression) $5, lt.Value, + null, null, (Location) $2); } | IMPLICIT error { - syntax_error (lexer.Location, "'operator' expected"); + syntax_error ((Location) $1, "'operator' expected"); } | EXPLICIT error { - syntax_error (lexer.Location, "'operator' expected"); + syntax_error ((Location) $1, "'operator' expected"); } ; @@ -1621,27 +1965,28 @@ constructor_declaration c.OptAttributes = (Attributes) $1; c.ModFlags = (int) $2; + if (RootContext.Documentation != null) + c.DocComment = ConsumeStoredComment (); + if (c.Name == current_container.Basename){ if ((c.ModFlags & Modifiers.STATIC) != 0){ if ((c.ModFlags & Modifiers.Accessibility) != 0){ - Report.Error ( - 515, c.Location, String.Format ( - "`{0}.{1}': static constructor can not have access modifiers", - c.Name, current_container.Name)); + Report.Error (515, c.Location, + "`{0}': access modifiers are not allowed on static constructors", + c.GetSignatureForError ()); } c.ModFlags = Modifiers.Check (Constructor.AllowedModifiers, (int) $2, Modifiers.PRIVATE, c.Location); if (c.Initializer != null){ - Report.Error ( - 514, c.Location, - "Static constructors can not have an explicit this or base " + - "constructor invocations"); + Report.Error (514, c.Location, + "`{0}': static constructor cannot have an explicit `this' or `base' constructor call", + c.GetSignatureForError ()); } if (!c.Parameters.Empty){ - Report.Error ( - 132, c.Location, "Static constructors should not have parameters"); + Report.Error (132, c.Location, + "`{0}': The static constructor must be parameterless", c.GetSignatureForError ()); } } else { c.ModFlags = Modifiers.Check (Constructor.AllowedModifiers, (int) $2, Modifiers.PRIVATE, c.Location); @@ -1654,22 +1999,28 @@ constructor_declaration current_container.AddConstructor (c); current_local_parameters = null; + if (RootContext.Documentation != null) + Lexer.doc_state = XmlCommentState.Allowed; } ; constructor_declarator - : IDENTIFIER - OPEN_PARENS opt_formal_parameter_list CLOSE_PARENS + : IDENTIFIER { - oob_stack.Push (lexer.Location); - - current_local_parameters = (Parameters) $3; + if (RootContext.Documentation != null) { + tmpComment = Lexer.consume_doc_comment (); + Lexer.doc_state = XmlCommentState.Allowed; + } + } + OPEN_PARENS opt_formal_parameter_list CLOSE_PARENS + { + current_local_parameters = (Parameters) $4; } opt_constructor_initializer { - Location l = (Location) oob_stack.Pop (); - $$ = new Constructor (current_class, (string) $1, 0, (Parameters) $3, - (ConstructorInitializer) $6, l); + LocatedToken lt = (LocatedToken) $1; + $$ = new Constructor (current_class, lt.Value, 0, (Parameters) $4, + (ConstructorInitializer) $7, lt.Location); } ; @@ -1686,14 +2037,14 @@ opt_constructor_initializer constructor_initializer : COLON BASE OPEN_PARENS opt_argument_list CLOSE_PARENS { - $$ = new ConstructorBaseInitializer ((ArrayList) $4, current_local_parameters, lexer.Location); + $$ = new ConstructorBaseInitializer ((ArrayList) $4, (Location) $2); } | COLON THIS OPEN_PARENS opt_argument_list CLOSE_PARENS { - $$ = new ConstructorThisInitializer ((ArrayList) $4, current_local_parameters, lexer.Location); + $$ = new ConstructorThisInitializer ((ArrayList) $4, (Location) $2); } | COLON error { - Report.Error (1018, lexer.Location, "Keyword this or base expected"); + Report.Error (1018, (Location) $1, "Keyword this or base expected"); $$ = null; } ; @@ -1705,14 +2056,22 @@ opt_finalizer ; destructor_declaration - : opt_attributes opt_finalizer TILDE IDENTIFIER OPEN_PARENS CLOSE_PARENS block + : opt_attributes opt_finalizer TILDE + { + if (RootContext.Documentation != null) { + tmpComment = Lexer.consume_doc_comment (); + Lexer.doc_state = XmlCommentState.NotAllowed; + } + } + IDENTIFIER OPEN_PARENS CLOSE_PARENS block { - if ((string) $4 != current_container.Basename){ - Report.Error (574, lexer.Location, "Name of destructor must match name of class"); - } else if (!(current_container is Class)){ - Report.Error (575, lexer.Location, "Destructors are only allowed in class types"); + LocatedToken lt = (LocatedToken) $5; + if (lt.Value != current_container.Basename){ + Report.Error (574, lt.Location, "Name of destructor must match name of class"); + } else if (current_container.Kind != Kind.Class){ + Report.Error (575, lt.Location, "Only class types can contain destructor"); } else { - Location l = lexer.Location; + Location l = lt.Location; int m = (int) $2; if (!RootContext.StdLib && current_container.Name == "System.Object") @@ -1720,19 +2079,13 @@ destructor_declaration else m |= Modifiers.PROTECTED | Modifiers.OVERRIDE; - if ((m & Modifiers.UNSAFE) != 0){ - if (!RootContext.Unsafe){ - Report.Error (227, l, - "Unsafe code requires the -unsafe command " + - "line option to be specified"); - } - } - Method d = new Destructor ( current_class, TypeManager.system_void_expr, m, "Finalize", - new Parameters (null, null, l), (Attributes) $1, l); + new Parameters (null, null), (Attributes) $1, l); + if (RootContext.Documentation != null) + d.DocComment = ConsumeStoredComment (); - d.Block = (ToplevelBlock) $7; + d.Block = (ToplevelBlock) $8; current_container.AddMethod (d); } } @@ -1745,15 +2098,19 @@ event_declaration { foreach (VariableDeclaration var in (ArrayList) $5) { - MemberName name = new MemberName (var.identifier); + MemberName name = new MemberName (var.identifier, + var.Location); Event e = new EventField ( current_class, (Expression) $4, (int) $2, false, name, - var.expression_or_array_initializer, (Attributes) $1, - lexer.Location); + var.expression_or_array_initializer, (Attributes) $1); current_container.AddEvent (e); - + + if (RootContext.Documentation != null) { + e.DocComment = Lexer.consume_doc_comment (); + Lexer.doc_state = XmlCommentState.Allowed; + } } } | opt_attributes @@ -1763,7 +2120,6 @@ event_declaration { implicit_value_parameter_type = (Expression) $4; lexer.EventParsing = true; - oob_stack.Push (lexer.Location); } event_accessor_declarations { @@ -1771,51 +2127,60 @@ event_declaration } CLOSE_BRACE { - Location loc = (Location) oob_stack.Pop (); + MemberName name = (MemberName) $5; if ($8 == null){ - Report.Error (65, lexer.Location, "Event must have both add and remove accesors"); + Report.Error (65, (Location) $3, "`{0}.{1}': event property must have both add and remove accessors", + current_container.Name, name); $$ = null; } else { Pair pair = (Pair) $8; - - MemberName name = (MemberName) $5; + if (pair.First == null || pair.Second == null) + // CS0073 is already reported, so no CS0065 here. + $$ = null; + else { + Event e = new EventProperty ( + current_class, (Expression) $4, (int) $2, false, name, null, + (Attributes) $1, (Accessor) pair.First, (Accessor) pair.Second); + if (RootContext.Documentation != null) { + e.DocComment = Lexer.consume_doc_comment (); + Lexer.doc_state = XmlCommentState.Allowed; + } - Event e = new EventProperty ( - current_class, (Expression) $4, (int) $2, false, name, null, - (Attributes) $1, (Accessor) pair.First, (Accessor) pair.Second, - loc); - - current_container.AddEvent (e); - implicit_value_parameter_type = null; + current_container.AddEvent (e); + implicit_value_parameter_type = null; + } } } - | opt_attributes opt_modifiers EVENT type namespace_or_type_name OPEN_PARENS opt_formal_parameter_list CLOSE_PARENS block { + | opt_attributes opt_modifiers EVENT type namespace_or_type_name error { MemberName mn = (MemberName) $5; if (mn.Left != null) - Report.Error (71, lexer.Location, "Explicit implementation of events requires property syntax"); + Report.Error (71, mn.Location, "An explicit interface implementation of an event must use property syntax"); else - Report.Error (71, lexer.Location, "Event declaration should use property syntax"); + Report.Error (71, mn.Location, "Event declaration should use property syntax"); + + if (RootContext.Documentation != null) + Lexer.doc_state = XmlCommentState.Allowed; } ; event_accessor_declarations : add_accessor_declaration remove_accessor_declaration - { + { $$ = new Pair ($1, $2); - } + } | remove_accessor_declaration add_accessor_declaration - { + { $$ = new Pair ($2, $1); - } + } | add_accessor_declaration { $$ = null; } | remove_accessor_declaration { $$ = null; } | error - { - Report.Error (1055, lexer.Location, "An add or remove accessor expected"); + { + Report.Error (1055, GetLocation ($1), "An add or remove accessor expected"); $$ = null; - } + } | { $$ = null; } ; @@ -1825,20 +2190,24 @@ add_accessor_declaration Parameter [] args = new Parameter [1]; Parameter implicit_value_parameter = new Parameter ( implicit_value_parameter_type, "value", - Parameter.Modifier.NONE, null); + Parameter.Modifier.NONE, null, (Location) $2); args [0] = implicit_value_parameter; - current_local_parameters = new Parameters (args, null, lexer.Location); + current_local_parameters = new Parameters (args, null); lexer.EventParsing = false; } block { - $$ = new Accessor ((ToplevelBlock) $4, 0, (Attributes) $1, lexer.Location); + $$ = new Accessor ((ToplevelBlock) $4, 0, (Attributes) $1, (Location) $2); lexer.EventParsing = true; } | opt_attributes ADD error { - Report.Error (73, lexer.Location, "Add or remove accessor must have a body"); + Report.Error (73, (Location) $2, "An add or remove accessor must have a body"); + $$ = null; + } + | opt_attributes modifiers ADD { + Report.Error (1609, (Location) $3, "Modifiers cannot be placed on event accessor declarations"); $$ = null; } ; @@ -1849,27 +2218,31 @@ remove_accessor_declaration Parameter [] args = new Parameter [1]; Parameter implicit_value_parameter = new Parameter ( implicit_value_parameter_type, "value", - Parameter.Modifier.NONE, null); + Parameter.Modifier.NONE, null, (Location) $2); args [0] = implicit_value_parameter; - current_local_parameters = new Parameters (args, null, lexer.Location); + current_local_parameters = new Parameters (args, null); lexer.EventParsing = false; } block { - $$ = new Accessor ((ToplevelBlock) $4, 0, (Attributes) $1, lexer.Location); + $$ = new Accessor ((ToplevelBlock) $4, 0, (Attributes) $1, (Location) $2); lexer.EventParsing = true; } | opt_attributes REMOVE error { - Report.Error (73, lexer.Location, "Add or remove accessor must have a body"); + Report.Error (73, (Location) $2, "An add or remove accessor must have a body"); + $$ = null; + } + | opt_attributes modifiers REMOVE { + Report.Error (1609, (Location) $3, "Modifiers cannot be placed on event accessor declarations"); $$ = null; } ; indexer_declaration : opt_attributes opt_modifiers indexer_declarator - OPEN_BRACE + OPEN_BRACE { IndexerDeclaration decl = (IndexerDeclaration) $3; @@ -1879,34 +2252,39 @@ indexer_declaration parsing_indexer = true; indexer_parameters = decl.param_list; - oob_stack.Push (lexer.Location); } accessor_declarations { lexer.PropertyParsing = false; + has_get = has_set = false; parsing_indexer = false; } CLOSE_BRACE { + if ($6 == null) + break; + // The signature is computed from the signature of the indexer. Look // at section 3.6 on the spec - Location loc = (Location) oob_stack.Pop (); Indexer indexer; IndexerDeclaration decl = (IndexerDeclaration) $3; + Location loc = decl.location; Pair pair = (Pair) $6; Accessor get_block = (Accessor) pair.First; Accessor set_block = (Accessor) pair.Second; MemberName name; if (decl.interface_type != null) - name = new MemberName (decl.interface_type, - TypeContainer.DefaultIndexerName); + name = new MemberName (decl.interface_type, TypeContainer.DefaultIndexerName, loc); else - name = new MemberName (TypeContainer.DefaultIndexerName); + name = new MemberName (TypeContainer.DefaultIndexerName, loc); indexer = new Indexer (current_class, decl.type, name, (int) $2, false, decl.param_list, (Attributes) $1, - get_block, set_block, loc); + get_block, set_block); + + if (RootContext.Documentation != null) + indexer.DocComment = ConsumeStoredComment (); current_container.AddIndexer (indexer); @@ -1922,12 +2300,16 @@ indexer_declarator Parameters pars = (Parameters) $4; if (pars.HasArglist) { // "__arglist is not valid in this context" - Report.Error (1669, lexer.Location, "__arglist is not valid in this context"); + Report.Error (1669, (Location) $2, "__arglist is not valid in this context"); } else if (pars.FixedParameters == null && pars.ArrayParameter == null){ - Report.Error (1551, lexer.Location, "Indexers must have at least one parameter"); + Report.Error (1551, (Location) $2, "Indexers must have at least one parameter"); + } + if (RootContext.Documentation != null) { + tmpComment = Lexer.consume_doc_comment (); + Lexer.doc_state = XmlCommentState.Allowed; } - $$ = new IndexerDeclaration ((Expression) $1, null, pars); + $$ = new IndexerDeclaration ((Expression) $1, null, pars, (Location) $2); } | type namespace_or_type_name DOT THIS OPEN_BRACKET opt_formal_parameter_list CLOSE_BRACKET { @@ -1935,38 +2317,63 @@ indexer_declarator if (pars.HasArglist) { // "__arglist is not valid in this context" - Report.Error (1669, lexer.Location, "__arglist is not valid in this context"); + Report.Error (1669, (Location) $4, "__arglist is not valid in this context"); } else if (pars.FixedParameters == null && pars.ArrayParameter == null){ - Report.Error (1551, lexer.Location, "Indexers must have at least one parameter"); + Report.Error (1551, (Location) $4, "Indexers must have at least one parameter"); } + MemberName name = (MemberName) $2; - $$ = new IndexerDeclaration ((Expression) $1, name, pars); + $$ = new IndexerDeclaration ((Expression) $1, name, pars, (Location) $4); + + if (RootContext.Documentation != null) { + tmpComment = Lexer.consume_doc_comment (); + Lexer.doc_state = XmlCommentState.Allowed; + } } ; enum_declaration : opt_attributes opt_modifiers + opt_partial ENUM IDENTIFIER - opt_enum_base + opt_enum_base { + if (RootContext.Documentation != null) + enumTypeComment = Lexer.consume_doc_comment (); + } enum_body opt_semicolon - { - Location enum_location = lexer.Location; + { + LocatedToken lt = (LocatedToken) $5; + Location enum_location = lt.Location; + + if ($3 != null) { + Report.Error (267, lt.Location, "The partial modifier can only appear immediately before `class', `struct' or `interface'"); + break; // assumes that the parser put us in a switch + } - MemberName full_name = MakeName (new MemberName ((string) $4)); - Enum e = new Enum (current_namespace, current_container, (Expression) $5, (int) $2, - full_name, (Attributes) $1, enum_location); + MemberName name = MakeName (new MemberName (lt.Value, enum_location)); + Enum e = new Enum (current_namespace, current_class, (Expression) $6, (int) $2, + name, (Attributes) $1); - foreach (VariableDeclaration ev in (ArrayList) $6) { - e.AddEnumMember (ev.identifier, - (Expression) ev.expression_or_array_initializer, - ev.Location, ev.OptAttributes); + if (RootContext.Documentation != null) + e.DocComment = enumTypeComment; + + + EnumMember em = null; + foreach (VariableDeclaration ev in (ArrayList) $8) { + em = new EnumMember (e, em, (Expression) ev.expression_or_array_initializer, + new MemberName (ev.identifier, ev.Location), ev.OptAttributes); + +// if (RootContext.Documentation != null) + em.DocComment = ev.DocComment; + + e.AddEnumMember (em); } - string name = full_name.GetName (); current_container.AddEnum (e); - RootContext.Tree.RecordDecl (name, e); + RootContext.Tree.RecordDecl (current_namespace.NS, name, e); + $$ = e; } ; @@ -1977,9 +2384,20 @@ opt_enum_base ; enum_body - : OPEN_BRACE opt_enum_member_declarations CLOSE_BRACE + : OPEN_BRACE { - $$ = $2; + if (RootContext.Documentation != null) + Lexer.doc_state = XmlCommentState.Allowed; + } + opt_enum_member_declarations + { + // here will be evaluated after CLOSE_BLACE is consumed. + if (RootContext.Documentation != null) + Lexer.doc_state = XmlCommentState.Allowed; + } + CLOSE_BRACE + { + $$ = $3; } ; @@ -2009,15 +2427,32 @@ enum_member_declarations enum_member_declaration : opt_attributes IDENTIFIER { - $$ = new VariableDeclaration ((string) $2, null, lexer.Location, (Attributes) $1); + VariableDeclaration vd = new VariableDeclaration ( + (LocatedToken) $2, null, (Attributes) $1); + + if (RootContext.Documentation != null) { + vd.DocComment = Lexer.consume_doc_comment (); + Lexer.doc_state = XmlCommentState.Allowed; + } + + $$ = vd; } | opt_attributes IDENTIFIER { - $$ = lexer.Location; + if (RootContext.Documentation != null) { + tmpComment = Lexer.consume_doc_comment (); + Lexer.doc_state = XmlCommentState.NotAllowed; + } } ASSIGN expression { - $$ = new VariableDeclaration ((string) $2, $5, lexer.Location, (Attributes) $1); + VariableDeclaration vd = new VariableDeclaration ( + (LocatedToken) $2, $5, (Attributes) $1); + + if (RootContext.Documentation != null) + vd.DocComment = ConsumeStoredComment (); + + $$ = vd; } ; @@ -2028,42 +2463,38 @@ delegate_declaration OPEN_PARENS opt_formal_parameter_list CLOSE_PARENS SEMICOLON { - Location l = lexer.Location; MemberName name = MakeName ((MemberName) $5); - Delegate del = new Delegate (current_namespace, current_container, (Expression) $4, - (int) $2, name, (Parameters) $7, (Attributes) $1, l); + Delegate del = new Delegate (current_namespace, current_class, (Expression) $4, + (int) $2, name, (Parameters) $7, (Attributes) $1); - current_container.AddDelegate (del); - RootContext.Tree.RecordDecl (name.GetName (true), del); - } - | opt_attributes - opt_modifiers - DELEGATE VOID member_name - OPEN_PARENS opt_formal_parameter_list CLOSE_PARENS - SEMICOLON - { - Location l = lexer.Location; - MemberName name = MakeName ((MemberName) $5); - Delegate del = new Delegate ( - current_namespace, current_container, - TypeManager.system_void_expr, (int) $2, name, - (Parameters) $7, (Attributes) $1, l); + if (RootContext.Documentation != null) { + del.DocComment = Lexer.consume_doc_comment (); + Lexer.doc_state = XmlCommentState.Allowed; + } current_container.AddDelegate (del); - RootContext.Tree.RecordDecl (name.GetName (true), del); - } + RootContext.Tree.RecordDecl (current_namespace.NS, name, del); + $$ = del; + } ; namespace_or_type_name : member_name + | IDENTIFIER DOUBLE_COLON IDENTIFIER { + LocatedToken lt1 = (LocatedToken) $1; + LocatedToken lt2 = (LocatedToken) $3; + $$ = new MemberName (lt1.Value, lt2.Value, lt2.Location); + } | namespace_or_type_name DOT IDENTIFIER { - $$ = new MemberName ((MemberName) $1, (string) $3); + LocatedToken lt = (LocatedToken) $3; + $$ = new MemberName ((MemberName) $1, lt.Value); } ; member_name : IDENTIFIER { - $$ = new MemberName ((string) $1); + LocatedToken lt = (LocatedToken) $1; + $$ = new MemberName (lt.Value, lt.Location); } ; @@ -2076,7 +2507,8 @@ member_name type : namespace_or_type_name { - $$ = ((MemberName) $1).GetTypeExpression (lexer.Location); + MemberName name = (MemberName) $1; + $$ = name.GetTypeExpression (); } | builtin_types | array_type @@ -2092,11 +2524,11 @@ pointer_type // can't perform checks during this phase - we do it during // semantic analysis. // - $$ = new ComposedCast ((Expression) $1, "*", lexer.Location); + $$ = new ComposedCast ((Expression) $1, "*", Lexer.Location); } | VOID STAR { - $$ = new ComposedCast (TypeManager.system_void_expr, "*", lexer.Location); + $$ = new ComposedCast (TypeManager.system_void_expr, "*", (Location) $1); } ; @@ -2104,19 +2536,19 @@ non_expression_type : builtin_types | non_expression_type rank_specifier { - $$ = new ComposedCast ((Expression) $1, (string) $2, lexer.Location); + $$ = new ComposedCast ((Expression) $1, (string) $2); } | non_expression_type STAR { - $$ = new ComposedCast ((Expression) $1, "*", lexer.Location); + $$ = new ComposedCast ((Expression) $1, "*"); } | expression rank_specifiers { - $$ = new ComposedCast ((Expression) $1, (string) $2, lexer.Location); + $$ = new ComposedCast ((Expression) $1, (string) $2); } | expression STAR { - $$ = new ComposedCast ((Expression) $1, "*", lexer.Location); + $$ = new ComposedCast ((Expression) $1, "*"); } // @@ -2125,7 +2557,7 @@ non_expression_type // | multiplicative_expression STAR { - $$ = new ComposedCast ((Expression) $1, "*", lexer.Location); + $$ = new ComposedCast ((Expression) $1, "*"); } ; @@ -2176,7 +2608,7 @@ integral_type array_type : type rank_specifiers { - $$ = new ComposedCast ((Expression) $1, (string) $2, lexer.Location); + $$ = new ComposedCast ((Expression) $1, (string) $2); } ; @@ -2191,7 +2623,14 @@ primary_expression | member_name { - $$ = ((MemberName) $1).GetTypeExpression (lexer.Location); + MemberName mn = (MemberName) $1; + $$ = mn.GetTypeExpression (); + } + | IDENTIFIER DOUBLE_COLON IDENTIFIER + { + LocatedToken lt1 = (LocatedToken) $1; + LocatedToken lt2 = (LocatedToken) $3; + $$ = new QualifiedAliasMember (lt1.Value, lt2.Value, lt2.Location); } | parenthesized_expression | member_access @@ -2214,15 +2653,15 @@ literal : boolean_literal | integer_literal | real_literal - | LITERAL_CHARACTER { $$ = new CharLiteral ((char) lexer.Value); } - | LITERAL_STRING { $$ = new StringLiteral ((string) lexer.Value); } - | NULL { $$ = NullLiteral.Null; } + | LITERAL_CHARACTER { $$ = new CharLiteral ((char) lexer.Value, lexer.Location); } + | LITERAL_STRING { $$ = new StringLiteral ((string) lexer.Value, lexer.Location); } + | NULL { $$ = new NullLiteral (lexer.Location); } ; real_literal - : LITERAL_FLOAT { $$ = new FloatLiteral ((float) lexer.Value); } - | LITERAL_DOUBLE { $$ = new DoubleLiteral ((double) lexer.Value); } - | LITERAL_DECIMAL { $$ = new DecimalLiteral ((decimal) lexer.Value); } + : LITERAL_FLOAT { $$ = new FloatLiteral ((float) lexer.Value, lexer.Location); } + | LITERAL_DOUBLE { $$ = new DoubleLiteral ((double) lexer.Value, lexer.Location); } + | LITERAL_DECIMAL { $$ = new DecimalLiteral ((decimal) lexer.Value, lexer.Location); } ; integer_literal @@ -2230,28 +2669,21 @@ integer_literal object v = lexer.Value; if (v is int){ - int i = (int) v; - - if (i == 0) - $$ = IntLiteral.Zero; - else if (i == 1) - $$ = IntLiteral.One; - else - $$ = new IntLiteral (i); + $$ = new IntLiteral ((int) v, lexer.Location); } else if (v is uint) - $$ = new UIntLiteral ((UInt32) v); + $$ = new UIntLiteral ((UInt32) v, lexer.Location); else if (v is long) - $$ = new LongLiteral ((Int64) v); + $$ = new LongLiteral ((Int64) v, lexer.Location); else if (v is ulong) - $$ = new ULongLiteral ((UInt64) v); + $$ = new ULongLiteral ((UInt64) v, lexer.Location); else Console.WriteLine ("OOPS. Unexpected result from scanner"); } ; boolean_literal - : TRUE { $$ = new BoolLiteral (true); } - | FALSE { $$ = new BoolLiteral (false); } + : TRUE { $$ = new BoolLiteral (true, lexer.Location); } + | FALSE { $$ = new BoolLiteral (false, lexer.Location); } ; parenthesized_expression_0 @@ -2275,18 +2707,20 @@ parenthesized_expression // If a parenthesized expression is followed by a minus, we need to wrap // the expression inside a ParenthesizedExpression for the CS0075 check // in Binary.DoResolve(). - $$ = new ParenthesizedExpression ((Expression) $1, lexer.Location); + $$ = new ParenthesizedExpression ((Expression) $1); } ;; member_access : primary_expression DOT IDENTIFIER { - $$ = new MemberAccess ((Expression) $1, (string) $3, lexer.Location); + LocatedToken lt = (LocatedToken) $3; + $$ = new MemberAccess ((Expression) $1, lt.Value, lt.Location); } | predefined_type DOT IDENTIFIER { - $$ = new MemberAccess ((Expression) $1, (string) $3, lexer.Location); + LocatedToken lt = (LocatedToken) $3; + $$ = new MemberAccess ((Expression) $1, lt.Value, lt.Location); } ; @@ -2295,21 +2729,35 @@ predefined_type ; invocation_expression - : primary_expression OPEN_PARENS opt_argument_list CLOSE_PARENS + : primary_expression { + $$ = lexer.Location; + } OPEN_PARENS opt_argument_list CLOSE_PARENS { if ($1 == null) { - Location l = lexer.Location; + Location l = (Location) $3; Report.Error (1, l, "Parse error"); } - $$ = new Invocation ((Expression) $1, (ArrayList) $3, lexer.Location); + $$ = new Invocation ((Expression) $1, (ArrayList) $4); } | parenthesized_expression_0 CLOSE_PARENS_OPEN_PARENS OPEN_PARENS CLOSE_PARENS { - $$ = new Invocation ((Expression) $1, new ArrayList (), lexer.Location); + $$ = new Invocation ((Expression) $1, new ArrayList ()); } | parenthesized_expression_0 CLOSE_PARENS_OPEN_PARENS primary_expression { - $$ = new InvocationOrCast ((Expression) $1, (Expression) $3, lexer.Location); + $$ = new InvocationOrCast ((Expression) $1, (Expression) $3); + } + | parenthesized_expression_0 CLOSE_PARENS_OPEN_PARENS OPEN_PARENS non_simple_argument CLOSE_PARENS + { + ArrayList args = new ArrayList (1); + args.Add ($4); + $$ = new Invocation ((Expression) $1, args); + } + | parenthesized_expression_0 CLOSE_PARENS_OPEN_PARENS OPEN_PARENS argument_list COMMA argument CLOSE_PARENS + { + ArrayList args = ((ArrayList) $4); + args.Add ($6); + $$ = new Invocation ((Expression) $1, args); } ; @@ -2332,7 +2780,8 @@ argument_list $$ = list; } | argument_list error { - CheckToken (1026, yyToken, ", or ) expected"); + CheckToken (1026, yyToken, "Expected `,' or `)'", GetLocation ($2)); + $$ = null; } ; @@ -2341,7 +2790,14 @@ argument { $$ = new Argument ((Expression) $1, Argument.AType.Expression); } - | REF variable_reference + | non_simple_argument + { + $$ = $1; + } + ; + +non_simple_argument + : REF variable_reference { $$ = new Argument ((Expression) $2, Argument.AType.Ref); } @@ -2355,12 +2811,12 @@ argument Argument[] args = new Argument [list.Count]; list.CopyTo (args, 0); - Expression expr = new Arglist (args, lexer.Location); + Expression expr = new Arglist (args, (Location) $1); $$ = new Argument (expr, Argument.AType.Expression); } | ARGLIST { - $$ = new Argument (new ArglistAccess (lexer.Location), Argument.AType.ArgList); + $$ = new Argument (new ArglistAccess ((Location) $1), Argument.AType.ArgList); } ; @@ -2371,7 +2827,7 @@ variable_reference element_access : primary_expression OPEN_BRACKET expression_list CLOSE_BRACKET { - $$ = new ElementAccess ((Expression) $1, (ArrayList) $3, lexer.Location); + $$ = new ElementAccess ((Expression) $1, (ArrayList) $3); } | primary_expression rank_specifiers { @@ -2384,16 +2840,16 @@ element_access Expression expr = (Expression) $1; if (expr is ComposedCast){ - $$ = new ComposedCast (expr, (string) $2, lexer.Location); - } else if (!(expr is SimpleName || expr is MemberAccess)){ - Error_ExpectingTypeName (lexer.Location, expr); + $$ = new ComposedCast (expr, (string) $2); + } else if (!(expr is SimpleName || expr is MemberAccess || expr is QualifiedAliasMember)){ + Error_ExpectingTypeName (expr); $$ = TypeManager.system_object_expr; } else { // // So we extract the string corresponding to the SimpleName // or MemberAccess // - $$ = new ComposedCast (expr, (string) $2, lexer.Location); + $$ = new ComposedCast (expr, (string) $2); } } ; @@ -2416,21 +2872,22 @@ expression_list this_access : THIS { - $$ = new This (current_block, lexer.Location); + $$ = new This (current_block, (Location) $1); } ; base_access : BASE DOT IDENTIFIER { - $$ = new BaseAccess ((string) $3, lexer.Location); + LocatedToken lt = (LocatedToken) $3; + $$ = new BaseAccess (lt.Value, lt.Location); } | BASE OPEN_BRACKET expression_list CLOSE_BRACKET { - $$ = new BaseIndexerAccess ((ArrayList) $3, lexer.Location); + $$ = new BaseIndexerAccess ((ArrayList) $3, (Location) $1); } | BASE error { - Report.Error (175, lexer.Location, "Use of keyword `base' is not valid in this context"); + Report.Error (175, (Location) $1, "Use of keyword `base' is not valid in this context"); $$ = null; } ; @@ -2439,7 +2896,7 @@ post_increment_expression : primary_expression OP_INC { $$ = new UnaryMutator (UnaryMutator.Mode.PostIncrement, - (Expression) $1, lexer.Location); + (Expression) $1, (Location) $2); } ; @@ -2447,7 +2904,7 @@ post_decrement_expression : primary_expression OP_DEC { $$ = new UnaryMutator (UnaryMutator.Mode.PostDecrement, - (Expression) $1, lexer.Location); + (Expression) $1, (Location) $2); } ; @@ -2459,7 +2916,7 @@ new_expression object_or_delegate_creation_expression : NEW type OPEN_PARENS opt_argument_list CLOSE_PARENS { - $$ = new New ((Expression) $2, (ArrayList) $4, lexer.Location); + $$ = new New ((Expression) $2, (ArrayList) $4, (Location) $1); } ; @@ -2468,20 +2925,21 @@ array_creation_expression opt_rank_specifier opt_array_initializer { - $$ = new ArrayCreation ((Expression) $2, (ArrayList) $4, (string) $6, (ArrayList) $7, lexer.Location); + $$ = new ArrayCreation ((Expression) $2, (ArrayList) $4, (string) $6, (ArrayList) $7, (Location) $1); } | NEW type rank_specifiers array_initializer { - $$ = new ArrayCreation ((Expression) $2, (string) $3, (ArrayList) $4, lexer.Location); + $$ = new ArrayCreation ((Expression) $2, (string) $3, (ArrayList) $4, (Location) $1); } | NEW error { - Report.Error (1031, lexer.Location, "Type expected"); + Report.Error (1031, (Location) $1, "Type expected"); $$ = null; } | NEW type error { - Report.Error (1526, lexer.Location, "new expression requires () or [] after type"); + Report.Error (1526, (Location) $1, "A new expression requires () or [] after type"); + $$ = null; } ; @@ -2573,31 +3031,31 @@ variable_initializer_list typeof_expression : TYPEOF OPEN_PARENS VOID CLOSE_PARENS { - $$ = new TypeOfVoid (lexer.Location); + $$ = new TypeOfVoid ((Location) $1); } | TYPEOF OPEN_PARENS type CLOSE_PARENS { - $$ = new TypeOf ((Expression) $3, lexer.Location); + $$ = new TypeOf ((Expression) $3, (Location) $1); } ; sizeof_expression : SIZEOF OPEN_PARENS type CLOSE_PARENS { - $$ = new SizeOf ((Expression) $3, lexer.Location); + $$ = new SizeOf ((Expression) $3, (Location) $1); } ; checked_expression : CHECKED OPEN_PARENS expression CLOSE_PARENS { - $$ = new CheckedExpr ((Expression) $3, lexer.Location); + $$ = new CheckedExpr ((Expression) $3, (Location) $1); } ; unchecked_expression : UNCHECKED OPEN_PARENS expression CLOSE_PARENS { - $$ = new UnCheckedExpr ((Expression) $3, lexer.Location); + $$ = new UnCheckedExpr ((Expression) $3, (Location) $1); } ; @@ -2605,28 +3063,31 @@ pointer_member_access : primary_expression OP_PTR IDENTIFIER { Expression deref; + LocatedToken lt = (LocatedToken) $3; - deref = new Unary (Unary.Operator.Indirection, (Expression) $1, lexer.Location); - $$ = new MemberAccess (deref, (string) $3, lexer.Location); + deref = new Unary (Unary.Operator.Indirection, (Expression) $1, lt.Location); + $$ = new MemberAccess (deref, lt.Value, lt.Location); } ; anonymous_method_expression - : DELEGATE opt_anonymous_method_signature { + : DELEGATE opt_anonymous_method_signature + { oob_stack.Push (current_local_parameters); current_local_parameters = (Parameters)$2; // Force the next block to be created as a ToplevelBlock oob_stack.Push (current_block); oob_stack.Push (top_current_block); - oob_stack.Push (lexer.Location); current_block = null; - } block { - Location loc = (Location) oob_stack.Pop (); + } + block + { + Location loc = (Location) $1; top_current_block = (Block) oob_stack.Pop (); current_block = (Block) oob_stack.Pop (); if (RootContext.Version == LanguageVersion.ISO_1){ - Report.FeatureIsNotStandardized (lexer.Location, "anonymous methods"); + Report.FeatureIsNotStandardized (loc, "anonymous methods"); $$ = null; } else { ToplevelBlock anon_block = (ToplevelBlock) $4; @@ -2653,7 +3114,7 @@ anonymous_method_signature ArrayList par_list = (ArrayList) $2; Parameter [] pars = new Parameter [par_list.Count]; par_list.CopyTo (pars); - $$ = new Parameters (pars, null, lexer.Location); + $$ = new Parameters (pars, null); } } ; @@ -2680,10 +3141,11 @@ anonymous_method_parameter_list anonymous_method_parameter : opt_parameter_modifier type IDENTIFIER { - $$ = new Parameter ((Expression) $2, (string) $3, (Parameter.Modifier) $1, null); + LocatedToken lt = (LocatedToken) $3; + $$ = new Parameter ((Expression) $2, lt.Value, (Parameter.Modifier) $1, null, lt.Location); } | PARAMS type IDENTIFIER { - Report.Error (-221, lexer.Location, "params modifier not allowed in anonymous method declaration"); + Report.Error (1670, ((LocatedToken) $3).Location, "The `params' modifier is not allowed in anonymous method declaration"); $$ = null; } ; @@ -2692,11 +3154,11 @@ unary_expression : primary_expression | BANG prefixed_unary_expression { - $$ = new Unary (Unary.Operator.LogicalNot, (Expression) $2, lexer.Location); + $$ = new Unary (Unary.Operator.LogicalNot, (Expression) $2, (Location) $1); } | TILDE prefixed_unary_expression { - $$ = new Unary (Unary.Operator.OnesComplement, (Expression) $2, lexer.Location); + $$ = new Unary (Unary.Operator.OnesComplement, (Expression) $2, (Location) $1); } | cast_expression ; @@ -2704,11 +3166,11 @@ unary_expression cast_list : parenthesized_expression_0 CLOSE_PARENS_CAST unary_expression { - $$ = new Cast ((Expression) $1, (Expression) $3, lexer.Location); + $$ = new Cast ((Expression) $1, (Expression) $3); } | parenthesized_expression_0 CLOSE_PARENS_OPEN_PARENS cast_expression { - $$ = new Cast ((Expression) $1, (Expression) $3, lexer.Location); + $$ = new Cast ((Expression) $1, (Expression) $3); } ; @@ -2716,6 +3178,7 @@ cast_expression : cast_list | OPEN_PARENS non_expression_type CLOSE_PARENS prefixed_unary_expression { + // TODO: wrong location $$ = new Cast ((Expression) $2, (Expression) $4, lexer.Location); } ; @@ -2728,29 +3191,29 @@ prefixed_unary_expression : unary_expression | PLUS prefixed_unary_expression { - $$ = new Unary (Unary.Operator.UnaryPlus, (Expression) $2, lexer.Location); + $$ = new Unary (Unary.Operator.UnaryPlus, (Expression) $2, (Location) $1); } | MINUS prefixed_unary_expression { - $$ = new Unary (Unary.Operator.UnaryNegation, (Expression) $2, lexer.Location); + $$ = new Unary (Unary.Operator.UnaryNegation, (Expression) $2, (Location) $1); } | OP_INC prefixed_unary_expression { $$ = new UnaryMutator (UnaryMutator.Mode.PreIncrement, - (Expression) $2, lexer.Location); + (Expression) $2, (Location) $1); } | OP_DEC prefixed_unary_expression { $$ = new UnaryMutator (UnaryMutator.Mode.PreDecrement, - (Expression) $2, lexer.Location); + (Expression) $2, (Location) $1); } | STAR prefixed_unary_expression { - $$ = new Unary (Unary.Operator.Indirection, (Expression) $2, lexer.Location); + $$ = new Unary (Unary.Operator.Indirection, (Expression) $2, (Location) $1); } | BITWISE_AND prefixed_unary_expression { - $$ = new Unary (Unary.Operator.AddressOf, (Expression) $2, lexer.Location); + $$ = new Unary (Unary.Operator.AddressOf, (Expression) $2, (Location) $1); } ; @@ -2758,7 +3221,7 @@ pre_increment_expression : OP_INC prefixed_unary_expression { $$ = new UnaryMutator (UnaryMutator.Mode.PreIncrement, - (Expression) $2, lexer.Location); + (Expression) $2, (Location) $1); } ; @@ -2766,7 +3229,7 @@ pre_decrement_expression : OP_DEC prefixed_unary_expression { $$ = new UnaryMutator (UnaryMutator.Mode.PreDecrement, - (Expression) $2, lexer.Location); + (Expression) $2, (Location) $1); } ; @@ -2775,17 +3238,17 @@ multiplicative_expression | multiplicative_expression STAR prefixed_unary_expression { $$ = new Binary (Binary.Operator.Multiply, - (Expression) $1, (Expression) $3, lexer.Location); + (Expression) $1, (Expression) $3); } | multiplicative_expression DIV prefixed_unary_expression { $$ = new Binary (Binary.Operator.Division, - (Expression) $1, (Expression) $3, lexer.Location); + (Expression) $1, (Expression) $3); } | multiplicative_expression PERCENT prefixed_unary_expression { $$ = new Binary (Binary.Operator.Modulus, - (Expression) $1, (Expression) $3, lexer.Location); + (Expression) $1, (Expression) $3); } ; @@ -2794,12 +3257,12 @@ additive_expression | additive_expression PLUS multiplicative_expression { $$ = new Binary (Binary.Operator.Addition, - (Expression) $1, (Expression) $3, lexer.Location); + (Expression) $1, (Expression) $3); } | additive_expression MINUS multiplicative_expression { $$ = new Binary (Binary.Operator.Subtraction, - (Expression) $1, (Expression) $3, lexer.Location); + (Expression) $1, (Expression) $3); } ; @@ -2808,12 +3271,12 @@ shift_expression | shift_expression OP_SHIFT_LEFT additive_expression { $$ = new Binary (Binary.Operator.LeftShift, - (Expression) $1, (Expression) $3, lexer.Location); + (Expression) $1, (Expression) $3); } | shift_expression OP_SHIFT_RIGHT additive_expression { $$ = new Binary (Binary.Operator.RightShift, - (Expression) $1, (Expression) $3, lexer.Location); + (Expression) $1, (Expression) $3); } ; @@ -2822,30 +3285,30 @@ relational_expression | relational_expression OP_LT shift_expression { $$ = new Binary (Binary.Operator.LessThan, - (Expression) $1, (Expression) $3, lexer.Location); + (Expression) $1, (Expression) $3); } | relational_expression OP_GT shift_expression { $$ = new Binary (Binary.Operator.GreaterThan, - (Expression) $1, (Expression) $3, lexer.Location); + (Expression) $1, (Expression) $3); } | relational_expression OP_LE shift_expression { $$ = new Binary (Binary.Operator.LessThanOrEqual, - (Expression) $1, (Expression) $3, lexer.Location); + (Expression) $1, (Expression) $3); } | relational_expression OP_GE shift_expression { $$ = new Binary (Binary.Operator.GreaterThanOrEqual, - (Expression) $1, (Expression) $3, lexer.Location); + (Expression) $1, (Expression) $3); } | relational_expression IS type { - $$ = new Is ((Expression) $1, (Expression) $3, lexer.Location); + $$ = new Is ((Expression) $1, (Expression) $3, (Location) $2); } | relational_expression AS type { - $$ = new As ((Expression) $1, (Expression) $3, lexer.Location); + $$ = new As ((Expression) $1, (Expression) $3, (Location) $2); } ; @@ -2854,12 +3317,12 @@ equality_expression | equality_expression OP_EQ relational_expression { $$ = new Binary (Binary.Operator.Equality, - (Expression) $1, (Expression) $3, lexer.Location); + (Expression) $1, (Expression) $3); } | equality_expression OP_NE relational_expression { $$ = new Binary (Binary.Operator.Inequality, - (Expression) $1, (Expression) $3, lexer.Location); + (Expression) $1, (Expression) $3); } ; @@ -2868,7 +3331,7 @@ and_expression | and_expression BITWISE_AND equality_expression { $$ = new Binary (Binary.Operator.BitwiseAnd, - (Expression) $1, (Expression) $3, lexer.Location); + (Expression) $1, (Expression) $3); } ; @@ -2877,7 +3340,7 @@ exclusive_or_expression | exclusive_or_expression CARRET and_expression { $$ = new Binary (Binary.Operator.ExclusiveOr, - (Expression) $1, (Expression) $3, lexer.Location); + (Expression) $1, (Expression) $3); } ; @@ -2886,7 +3349,7 @@ inclusive_or_expression | inclusive_or_expression BITWISE_OR exclusive_or_expression { $$ = new Binary (Binary.Operator.BitwiseOr, - (Expression) $1, (Expression) $3, lexer.Location); + (Expression) $1, (Expression) $3); } ; @@ -2895,7 +3358,7 @@ conditional_and_expression | conditional_and_expression OP_AND inclusive_or_expression { $$ = new Binary (Binary.Operator.LogicalAnd, - (Expression) $1, (Expression) $3, lexer.Location); + (Expression) $1, (Expression) $3); } ; @@ -2904,7 +3367,7 @@ conditional_or_expression | conditional_or_expression OP_OR conditional_and_expression { $$ = new Binary (Binary.Operator.LogicalOr, - (Expression) $1, (Expression) $3, lexer.Location); + (Expression) $1, (Expression) $3); } ; @@ -2912,84 +3375,64 @@ conditional_expression : conditional_or_expression | conditional_or_expression INTERR expression COLON expression { - $$ = new Conditional ((Expression) $1, (Expression) $3, (Expression) $5, lexer.Location); + $$ = new Conditional ((Expression) $1, (Expression) $3, (Expression) $5); } ; assignment_expression : prefixed_unary_expression ASSIGN expression { - $$ = new Assign ((Expression) $1, (Expression) $3, lexer.Location); + $$ = new Assign ((Expression) $1, (Expression) $3); } | prefixed_unary_expression OP_MULT_ASSIGN expression { - Location l = lexer.Location; - $$ = new CompoundAssign ( - Binary.Operator.Multiply, (Expression) $1, (Expression) $3, l); + Binary.Operator.Multiply, (Expression) $1, (Expression) $3); } | prefixed_unary_expression OP_DIV_ASSIGN expression { - Location l = lexer.Location; - $$ = new CompoundAssign ( - Binary.Operator.Division, (Expression) $1, (Expression) $3, l); + Binary.Operator.Division, (Expression) $1, (Expression) $3); } | prefixed_unary_expression OP_MOD_ASSIGN expression { - Location l = lexer.Location; - $$ = new CompoundAssign ( - Binary.Operator.Modulus, (Expression) $1, (Expression) $3, l); + Binary.Operator.Modulus, (Expression) $1, (Expression) $3); } | prefixed_unary_expression OP_ADD_ASSIGN expression { - Location l = lexer.Location; - $$ = new CompoundAssign ( - Binary.Operator.Addition, (Expression) $1, (Expression) $3, l); + Binary.Operator.Addition, (Expression) $1, (Expression) $3); } | prefixed_unary_expression OP_SUB_ASSIGN expression { - Location l = lexer.Location; - $$ = new CompoundAssign ( - Binary.Operator.Subtraction, (Expression) $1, (Expression) $3, l); + Binary.Operator.Subtraction, (Expression) $1, (Expression) $3); } | prefixed_unary_expression OP_SHIFT_LEFT_ASSIGN expression { - Location l = lexer.Location; - $$ = new CompoundAssign ( - Binary.Operator.LeftShift, (Expression) $1, (Expression) $3, l); + Binary.Operator.LeftShift, (Expression) $1, (Expression) $3); } | prefixed_unary_expression OP_SHIFT_RIGHT_ASSIGN expression { - Location l = lexer.Location; - $$ = new CompoundAssign ( - Binary.Operator.RightShift, (Expression) $1, (Expression) $3, l); + Binary.Operator.RightShift, (Expression) $1, (Expression) $3); } | prefixed_unary_expression OP_AND_ASSIGN expression { - Location l = lexer.Location; - $$ = new CompoundAssign ( - Binary.Operator.BitwiseAnd, (Expression) $1, (Expression) $3, l); + Binary.Operator.BitwiseAnd, (Expression) $1, (Expression) $3); } | prefixed_unary_expression OP_OR_ASSIGN expression { - Location l = lexer.Location; - $$ = new CompoundAssign ( - Binary.Operator.BitwiseOr, (Expression) $1, (Expression) $3, l); + Binary.Operator.BitwiseOr, (Expression) $1, (Expression) $3); } | prefixed_unary_expression OP_XOR_ASSIGN expression { - Location l = lexer.Location; - $$ = new CompoundAssign ( - Binary.Operator.ExclusiveOr, (Expression) $1, (Expression) $3, l); + Binary.Operator.ExclusiveOr, (Expression) $1, (Expression) $3); } ; @@ -3016,29 +3459,29 @@ class_declaration CLASS member_name { MemberName name = MakeName ((MemberName) $5); - bool partial = (bool) $3; int mod_flags = (int) $2; - if (partial) { + if ($3 != null) { ClassPart part = PartialContainer.CreatePart ( - current_namespace, current_container, name, mod_flags, - (Attributes) $1, Kind.Class, lexer.Location); + current_namespace, current_class, name, mod_flags, + (Attributes) $1, Kind.Class, (Location) $3); current_container = part.PartialContainer; current_class = part; } else { if ((mod_flags & Modifiers.STATIC) != 0) { current_class = new StaticClass ( - current_namespace, current_container, name, - mod_flags, (Attributes) $1, lexer.Location); + current_namespace, current_class, name, + mod_flags, (Attributes) $1); } else { current_class = new Class ( - current_namespace, current_container, name, - mod_flags, (Attributes) $1, lexer.Location); + current_namespace, current_class, name, + mod_flags, (Attributes) $1); } + current_container.AddClassOrStruct (current_class); current_container = current_class; - RootContext.Tree.RecordDecl (name.GetName (true), current_class); + RootContext.Tree.RecordDecl (current_namespace.NS, name, current_class); } } opt_class_base @@ -3052,23 +3495,27 @@ class_declaration current_class.Bases = (ArrayList) $7; } - current_class.Register (); + if (RootContext.Documentation != null) { + current_class.DocComment = Lexer.consume_doc_comment (); + Lexer.doc_state = XmlCommentState.Allowed; + } + } + class_body + { + if (RootContext.Documentation != null) + Lexer.doc_state = XmlCommentState.Allowed; } - class_body opt_semicolon { - $$ = current_class; - - current_container = current_container.Parent; - current_class = current_container; + $$ = pop_current_class (); } ; opt_partial : /* empty */ - { $$ = (bool) false; } + { $$ = null; } | PARTIAL - { $$ = (bool) true; } + { $$ = $1; } // location ; opt_modifiers @@ -3085,7 +3532,7 @@ modifiers if ((m1 & m2) != 0) { Location l = lexer.Location; - Report.Error (1004, l, "Duplicate modifier: `" + Modifiers.Name (m2) + "'"); + Report.Error (1004, l, "Duplicate `{0}' modifier", Modifiers.Name (m2)); } $$ = (int) (m1 | m2); } @@ -3134,11 +3581,10 @@ block : OPEN_BRACE { if (current_block == null){ - current_block = new ToplevelBlock ((ToplevelBlock) top_current_block, current_local_parameters, lexer.Location); + current_block = new ToplevelBlock ((ToplevelBlock) top_current_block, current_local_parameters, (Location) $1); top_current_block = current_block; } else { - current_block = new Block (current_block, current_local_parameters, - lexer.Location, Location.Null); + current_block = new Block (current_block, (Location) $1, Location.Null); } } opt_statement_list CLOSE_BRACE @@ -3146,7 +3592,7 @@ block while (current_block.Implicit) current_block = current_block.Parent; $$ = current_block; - current_block.SetEndLocation (lexer.Location); + current_block.SetEndLocation ((Location) $4); current_block = current_block.Parent; if (current_block == null) top_current_block = null; @@ -3198,12 +3644,12 @@ embedded_statement : valid_declaration_statement | declaration_statement { - Report.Error (1023, lexer.Location, "An embedded statement may not be a declaration."); + Report.Error (1023, GetLocation ($1), "An embedded statement may not be a declaration or labeled statement"); $$ = null; } | labeled_statement { - Report.Error (1023, lexer.Location, "An embedded statement may not be a labeled statement."); + Report.Error (1023, GetLocation ($1), "An embedded statement may not be a declaration or labeled statement"); $$ = null; } ; @@ -3218,9 +3664,10 @@ empty_statement labeled_statement : IDENTIFIER COLON { - LabeledStatement labeled = new LabeledStatement ((string) $1, lexer.Location); + LocatedToken lt = (LocatedToken) $1; + LabeledStatement labeled = new LabeledStatement (lt.Value, lt.Location); - if (current_block.AddLabel ((string) $1, labeled, lexer.Location)) + if (current_block.AddLabel (lt.Value, labeled, lt.Location)) current_block.AddStatement (labeled); } statement @@ -3231,8 +3678,9 @@ declaration_statement { if ($1 != null){ DictionaryEntry de = (DictionaryEntry) $1; + Expression e = (Expression) de.Key; - $$ = declare_local_variables ((Expression) de.Key, (ArrayList) de.Value, lexer.Location); + $$ = declare_local_variables (e, (ArrayList) de.Value, e.Location); } } @@ -3272,8 +3720,8 @@ local_variable_type // Blah i; Expression expr = (Expression) $1; - if (!(expr is SimpleName || expr is MemberAccess || expr is ComposedCast)) { - Error_ExpectingTypeName (lexer.Location, expr); + if (!(expr is SimpleName || expr is MemberAccess || expr is ComposedCast || expr is QualifiedAliasMember)) { + Error_ExpectingTypeName (expr); $$ = null; } else { // @@ -3284,7 +3732,7 @@ local_variable_type if ((string) $2 == "") $$ = $1; else - $$ = new ComposedCast ((Expression) $1, (string) $2, lexer.Location); + $$ = new ComposedCast ((Expression) $1, (string) $2); } } | builtin_types opt_rank_specifier @@ -3300,26 +3748,25 @@ local_variable_pointer_type : primary_expression STAR { Expression expr = (Expression) $1; - Location l = lexer.Location; - if (!(expr is SimpleName || expr is MemberAccess || expr is ComposedCast)) { - Error_ExpectingTypeName (l, expr); + if (!(expr is SimpleName || expr is MemberAccess || expr is ComposedCast || expr is QualifiedAliasMember)) { + Error_ExpectingTypeName (expr); $$ = null; } else - $$ = new ComposedCast ((Expression) $1, "*", l); + $$ = new ComposedCast ((Expression) $1, "*"); } | builtin_types STAR { - $$ = new ComposedCast ((Expression) $1, "*", lexer.Location);; + $$ = new ComposedCast ((Expression) $1, "*"); } | VOID STAR { - $$ = new ComposedCast (TypeManager.system_void_expr, "*", lexer.Location);; + $$ = new ComposedCast (TypeManager.system_void_expr, "*", (Location) $1); } | local_variable_pointer_type STAR { - $$ = new ComposedCast ((Expression) $1, "*", lexer.Location); + $$ = new ComposedCast ((Expression) $1, "*"); } ; @@ -3332,18 +3779,18 @@ local_variable_declaration $$ = null; } | local_variable_pointer_type opt_rank_specifier variable_declarators - { + { if ($1 != null){ Expression t; if ((string) $2 == "") t = (Expression) $1; else - t = new ComposedCast ((Expression) $1, (string) $2, lexer.Location); + t = new ComposedCast ((Expression) $1, (string) $2); $$ = new DictionaryEntry (t, $3); } else $$ = null; - } + } ; local_constant_declaration @@ -3368,15 +3815,15 @@ expression_statement // because statement_expression is used for example in for_statement // statement_expression - : invocation_expression { $$ = new StatementExpression ((ExpressionStatement) $1, lexer.Location); } - | object_creation_expression { $$ = new StatementExpression ((ExpressionStatement) $1, lexer.Location); } - | assignment_expression { $$ = new StatementExpression ((ExpressionStatement) $1, lexer.Location); } - | post_increment_expression { $$ = new StatementExpression ((ExpressionStatement) $1, lexer.Location); } - | post_decrement_expression { $$ = new StatementExpression ((ExpressionStatement) $1, lexer.Location); } - | pre_increment_expression { $$ = new StatementExpression ((ExpressionStatement) $1, lexer.Location); } - | pre_decrement_expression { $$ = new StatementExpression ((ExpressionStatement) $1, lexer.Location); } + : invocation_expression { $$ = new StatementExpression ((ExpressionStatement) $1); } + | object_creation_expression { $$ = new StatementExpression ((ExpressionStatement) $1); } + | assignment_expression { $$ = new StatementExpression ((ExpressionStatement) $1); } + | post_increment_expression { $$ = new StatementExpression ((ExpressionStatement) $1); } + | post_decrement_expression { $$ = new StatementExpression ((ExpressionStatement) $1); } + | pre_increment_expression { $$ = new StatementExpression ((ExpressionStatement) $1); } + | pre_decrement_expression { $$ = new StatementExpression ((ExpressionStatement) $1); } | error { - Report.Error (1002, lexer.Location, "Expecting `;'"); + Report.Error (1002, GetLocation ($1), "Expecting `;'"); $$ = null; } ; @@ -3392,52 +3839,46 @@ selection_statement ; if_statement - : if_statement_open if_statement_rest - { - $$ = $2; - } - ; - -if_statement_open - : IF OPEN_PARENS - { - oob_stack.Push (lexer.Location); - } - ; - -if_statement_rest - : boolean_expression CLOSE_PARENS + : IF OPEN_PARENS boolean_expression CLOSE_PARENS embedded_statement { - Location l = (Location) oob_stack.Pop (); + Location l = (Location) $1; - $$ = new If ((Expression) $1, (Statement) $3, l); + $$ = new If ((Expression) $3, (Statement) $5, l); if (RootContext.WarningLevel >= 3){ - if ($3 == EmptyStatement.Value) - Report.Warning (642, lexer.Location, "Possible mistaken empty statement"); + // FIXME: location for warning should be loc property of $5. + if ($5 == EmptyStatement.Value) + Report.Warning (642, l, "Possible mistaken empty statement"); } } - | boolean_expression CLOSE_PARENS + | IF OPEN_PARENS boolean_expression CLOSE_PARENS embedded_statement ELSE embedded_statement { - Location l = (Location) oob_stack.Pop (); + Location l = (Location) $1; + + $$ = new If ((Expression) $3, (Statement) $5, (Statement) $7, l); - $$ = new If ((Expression) $1, (Statement) $3, (Statement) $5, l); + if (RootContext.WarningLevel >= 3){ + // FIXME: location for warning should be loc property of $5 and $7. + if ($5 == EmptyStatement.Value) + Report.Warning (642, l, "Possible mistaken empty statement"); + if ($7 == EmptyStatement.Value) + Report.Warning (642, l, "Possible mistaken empty statement"); + } } ; switch_statement - : SWITCH OPEN_PARENS + : SWITCH OPEN_PARENS { - oob_stack.Push (lexer.Location); switch_stack.Push (current_block); } expression CLOSE_PARENS switch_block { - $$ = new Switch ((Expression) $4, (ArrayList) $6, (Location) oob_stack.Pop ()); + $$ = new Switch ((Expression) $4, (ArrayList) $6, (Location) $1); current_block = (Block) switch_stack.Pop (); } ; @@ -3509,11 +3950,11 @@ switch_labels ; switch_label - : CASE constant_expression COLON { $$ = new SwitchLabel ((Expression) $2, lexer.Location); } - | DEFAULT COLON { $$ = new SwitchLabel (null, lexer.Location); } + : CASE constant_expression COLON { $$ = new SwitchLabel ((Expression) $2, (Location) $1); } + | DEFAULT COLON { $$ = new SwitchLabel (null, (Location) $1); } | error { Report.Error ( - 1523, lexer.Location, + 1523, GetLocation ($1), "The keyword case or default must precede code in switch block"); } ; @@ -3526,32 +3967,20 @@ iteration_statement ; while_statement - : WHILE OPEN_PARENS - { - oob_stack.Push (lexer.Location); - } - boolean_expression CLOSE_PARENS embedded_statement - { - Location l = (Location) oob_stack.Pop (); - $$ = new While ((Expression) $4, (Statement) $6, l); - - if (RootContext.WarningLevel >= 3){ - if ($6 == EmptyStatement.Value) - Report.Warning (642, lexer.Location, "Possible mistaken empty statement"); - } - } + : WHILE OPEN_PARENS boolean_expression CLOSE_PARENS embedded_statement + { + Location l = (Location) $1; + $$ = new While ((Expression) $3, (Statement) $5, l); + } ; do_statement : DO embedded_statement - WHILE OPEN_PARENS { - oob_stack.Push (lexer.Location); - } - boolean_expression CLOSE_PARENS SEMICOLON + WHILE OPEN_PARENS boolean_expression CLOSE_PARENS SEMICOLON { - Location l = (Location) oob_stack.Pop (); + Location l = (Location) $1; - $$ = new Do ((Statement) $2, (Expression) $6, l); + $$ = new Do ((Statement) $2, (Expression) $5, l); } ; @@ -3572,8 +4001,7 @@ for_statement LocalInfo vi; - vi = current_block.AddVariable ( - type, decl.identifier, current_local_parameters, decl.Location); + vi = current_block.AddVariable (type, decl.identifier, decl.Location); if (vi == null) continue; @@ -3594,26 +4022,24 @@ for_statement if (expr != null) { Assign a = new Assign (var, expr, decl.Location); - assign_block.AddStatement (new StatementExpression (a, lexer.Location)); + assign_block.AddStatement (new StatementExpression (a)); } } - $3 = null; - } - oob_stack.Push (lexer.Location); + // Note: the $$ below refers to the value of this code block, not of the LHS non-terminal. + // This can be referred to as $5 below. + $$ = null; + } else { + $$ = $3; + } } opt_for_condition SEMICOLON opt_for_iterator CLOSE_PARENS embedded_statement { - Location l = (Location) oob_stack.Pop (); + Location l = (Location) $1; - For f = new For ((Statement) $3, (Expression) $6, (Statement) $8, (Statement) $10, l); - - if (RootContext.WarningLevel >= 3){ - if ($10 == EmptyStatement.Value) - Report.Warning (642, lexer.Location, "Possible mistaken empty statement"); - } + For f = new For ((Statement) $5, (Expression) $6, (Statement) $8, (Statement) $10, l); current_block.AddStatement (f); while (current_block.Implicit) @@ -3667,50 +4093,47 @@ statement_expression_list foreach_statement : FOREACH OPEN_PARENS type IN expression CLOSE_PARENS - { - Report.Error (230, lexer.Location, "Type and identifier are both required in a foreach statement"); - $$ = null; - } - | FOREACH OPEN_PARENS type IDENTIFIER IN { - oob_stack.Push (lexer.Location); + Report.Error (230, (Location) $1, "Type and identifier are both required in a foreach statement"); + $$ = null; } + | FOREACH OPEN_PARENS type IDENTIFIER IN expression CLOSE_PARENS { - oob_stack.Push (current_block); - Block foreach_block = new Block (current_block); - LocalVariableReference v = null; - Location l = lexer.Location; + current_block = foreach_block; + + LocatedToken lt = (LocatedToken) $4; + Location l = lt.Location; LocalInfo vi; - vi = foreach_block.AddVariable ((Expression) $3, (string) $4, current_local_parameters, l); + vi = foreach_block.AddVariable ((Expression) $3, lt.Value, l); if (vi != null) { - vi.ReadOnly = true; + vi.SetReadOnlyContext (LocalInfo.ReadOnlyContext.Foreach); // Get a writable reference to this read-only variable. - v = new LocalVariableReference (foreach_block, (string) $4, l, vi, false); + // + // Note that the $$ here refers to the value of _this_ code block, + // not the value of the LHS non-terminal. This can be referred to as $8 below. + $$ = new LocalVariableReference (foreach_block, lt.Value, l, vi, false); + } else { + $$ = null; } - current_block = foreach_block; - - oob_stack.Push (v); - oob_stack.Push (current_block); } embedded_statement { - Block foreach_block = (Block) oob_stack.Pop (); - LocalVariableReference v = (LocalVariableReference) oob_stack.Pop (); - Block prev_block = (Block) oob_stack.Pop (); - Location l = (Location) oob_stack.Pop (); - - current_block = prev_block; + LocalVariableReference v = (LocalVariableReference) $8; + Location l = (Location) $1; if (v != null) { - Foreach f = new Foreach ((Expression) $3, v, (Expression) $7, (Statement) $10, l); - foreach_block.AddStatement (f); + Foreach f = new Foreach ((Expression) $3, v, (Expression) $6, (Statement) $9, l); + current_block.AddStatement (f); } - $$ = foreach_block; + while (current_block.Implicit) + current_block = current_block.Parent; + $$ = current_block; + current_block = current_block.Parent; } ; @@ -3726,83 +4149,91 @@ jump_statement break_statement : BREAK SEMICOLON { - $$ = new Break (lexer.Location); + $$ = new Break ((Location) $1); } ; continue_statement : CONTINUE SEMICOLON { - $$ = new Continue (lexer.Location); + $$ = new Continue ((Location) $1); } ; goto_statement : GOTO IDENTIFIER SEMICOLON { - $$ = new Goto (current_block, (string) $2, lexer.Location); + LocatedToken lt = (LocatedToken) $2; + $$ = new Goto (lt.Value, lt.Location); } | GOTO CASE constant_expression SEMICOLON { - $$ = new GotoCase ((Expression) $3, lexer.Location); + $$ = new GotoCase ((Expression) $3, (Location) $1); } | GOTO DEFAULT SEMICOLON { - $$ = new GotoDefault (lexer.Location); + $$ = new GotoDefault ((Location) $1); } ; return_statement : RETURN opt_expression SEMICOLON { - $$ = new Return ((Expression) $2, lexer.Location); + $$ = new Return ((Expression) $2, (Location) $1); } ; throw_statement : THROW opt_expression SEMICOLON { - $$ = new Throw ((Expression) $2, lexer.Location); + $$ = new Throw ((Expression) $2, (Location) $1); } ; yield_statement : IDENTIFIER RETURN expression SEMICOLON { - string s = (string) $1; + LocatedToken lt = (LocatedToken) $1; + string s = lt.Value; if (s != "yield"){ - Report.Error (1003, lexer.Location, "; expected"); + Report.Error (1003, lt.Location, "; expected"); $$ = null; } if (RootContext.Version == LanguageVersion.ISO_1){ - Report.FeatureIsNotStandardized (lexer.Location, "yield statement"); + Report.FeatureIsNotStandardized (lt.Location, "yield statement"); $$ = null; } if (iterator_container == null){ - Report.Error (204, lexer.Location, "yield statement can only be used within a method, operator or property"); + Report.Error (204, lt.Location, "yield statement can only be used within a method, operator or property"); $$ = null; } else { iterator_container.SetYields (); - $$ = new Yield ((Expression) $3, lexer.Location); + $$ = new Yield ((Expression) $3, lt.Location); } } + | IDENTIFIER RETURN SEMICOLON + { + Report.Error (1627, (Location) $2, "Expression expected after yield return"); + $$ = null; + } | IDENTIFIER BREAK SEMICOLON { - string s = (string) $1; + LocatedToken lt = (LocatedToken) $1; + string s = lt.Value; if (s != "yield"){ - Report.Error (1003, lexer.Location, "; expected"); + Report.Error (1003, lt.Location, "; expected"); $$ = null; } if (RootContext.Version == LanguageVersion.ISO_1){ - Report.FeatureIsNotStandardized (lexer.Location, "yield statement"); + Report.FeatureIsNotStandardized (lt.Location, "yield statement"); $$ = null; } if (iterator_container == null){ - Report.Error (204, lexer.Location, "yield statement can only be used within a method, operator or property"); + Report.Error (204, lt.Location, "yield statement can only be used within a method, operator or property"); $$ = null; } else { iterator_container.SetYields (); - $$ = new YieldBreak (lexer.Location); + $$ = new YieldBreak (lt.Location); } } ; @@ -3814,7 +4245,7 @@ opt_expression try_statement : TRY block catch_clauses - { + { Catch g = null; ArrayList c = (ArrayList)$3; @@ -3822,7 +4253,7 @@ try_statement Catch cc = (Catch) c [i]; if (cc.IsGeneral) { if (i != c.Count - 1) - Report.Error (1017, cc.loc, "Empty catch block must be the last in a series of catch blocks"); + Report.Error (1017, cc.loc, "Try statement already has an empty catch block"); g = cc; c.RemoveAt (i); i--; @@ -3833,7 +4264,7 @@ try_statement // and g contains the general one. $$ = new Try ((Block) $2, c, g, null, ((Block) $2).loc); - } + } | TRY block opt_catch_clauses FINALLY block { Catch g = null; @@ -3853,7 +4284,8 @@ try_statement } | TRY block error { - Report.Error (1524, lexer.Location, "Expected catch or finally"); + Report.Error (1524, (Location) $1, "Expected catch or finally"); + $$ = null; } ; @@ -3886,48 +4318,43 @@ opt_identifier catch_clause : CATCH opt_catch_args - { + { Expression type = null; - string id = null; if ($2 != null) { DictionaryEntry cc = (DictionaryEntry) $2; type = (Expression) cc.Key; - id = (string) cc.Value; + LocatedToken lt = (LocatedToken) cc.Value; - if (id != null){ + if (lt != null){ ArrayList one = new ArrayList (4); - Location loc = lexer.Location; - one.Add (new VariableDeclaration (id, null, loc)); + one.Add (new VariableDeclaration (lt, null)); - $1 = current_block; current_block = new Block (current_block); - Block b = declare_local_variables (type, one, loc); + Block b = declare_local_variables (type, one, lt.Location); current_block = b; } } - } block { + } block { Expression type = null; string id = null; if ($2 != null){ DictionaryEntry cc = (DictionaryEntry) $2; type = (Expression) cc.Key; - id = (string) cc.Value; + LocatedToken lt = (LocatedToken) cc.Value; - if ($1 != null){ - // - // FIXME: I can change this for an assignment. - // - while (current_block != (Block) $1) + if (lt != null){ + id = lt.Value; + while (current_block.Implicit) current_block = current_block.Parent; + current_block = current_block.Parent; } } - - $$ = new Catch (type, id , (Block) $4, ((Block) $4).loc); - } + $$ = new Catch (type, id, (Block) $4, ((Block) $4).loc); + } ; opt_catch_args @@ -3937,11 +4364,12 @@ opt_catch_args catch_args : OPEN_PARENS type opt_identifier CLOSE_PARENS - { + { $$ = new DictionaryEntry ($2, $3); - } + } ; + checked_statement : CHECKED block { @@ -3958,24 +4386,21 @@ unchecked_statement unsafe_statement : UNSAFE - { - if (!RootContext.Unsafe){ - Report.Error (227, lexer.Location, - "Unsafe code can only be used if --unsafe is used"); - } - } block { + { + RootContext.CheckUnsafeOption ((Location) $1); + } block { $$ = new Unsafe ((Block) $3); - } + } ; fixed_statement : FIXED OPEN_PARENS type fixed_pointer_declarators - CLOSE_PARENS + CLOSE_PARENS { ArrayList list = (ArrayList) $4; Expression type = (Expression) $3; - Location l = lexer.Location; + Location l = (Location) $1; int top = list.Count; Block assign_block = new Block (current_block); @@ -3985,29 +4410,22 @@ fixed_statement Pair p = (Pair) list [i]; LocalInfo v; - v = current_block.AddVariable (type, (string) p.First,current_local_parameters, l); + v = current_block.AddVariable (type, (string) p.First, l); if (v == null) continue; - v.ReadOnly = true; + v.SetReadOnlyContext (LocalInfo.ReadOnlyContext.Fixed); v.Pinned = true; p.First = v; list [i] = p; } - - oob_stack.Push (l); } embedded_statement { - Location l = (Location) oob_stack.Pop (); + Location l = (Location) $1; Fixed f = new Fixed ((Expression) $3, (ArrayList) $4, (Statement) $7, l); - if (RootContext.WarningLevel >= 3){ - if ($7 == EmptyStatement.Value) - Report.Warning (642, lexer.Location, "Possible mistaken empty statement"); - } - current_block.AddStatement (f); while (current_block.Implicit) current_block = current_block.Parent; @@ -4034,12 +4452,14 @@ fixed_pointer_declarators fixed_pointer_declarator : IDENTIFIER ASSIGN expression - { - $$ = new Pair ($1, $3); + { + LocatedToken lt = (LocatedToken) $1; + // FIXME: keep location + $$ = new Pair (lt.Value, $3); } | IDENTIFIER { - Report.Error (210, lexer.Location, "You must provide an initializer in a fixed or using statement declaration"); + Report.Error (210, ((LocatedToken) $1).Location, "You must provide an initializer in a fixed or using statement declaration"); $$ = null; } ; @@ -4051,21 +4471,19 @@ lock_statement } embedded_statement { - $$ = new Lock ((Expression) $3, (Statement) $6, lexer.Location); + $$ = new Lock ((Expression) $3, (Statement) $6, (Location) $1); } ; using_statement - : USING OPEN_PARENS resource_acquisition CLOSE_PARENS + : USING OPEN_PARENS resource_acquisition CLOSE_PARENS { Block assign_block = new Block (current_block); current_block = assign_block; - oob_stack.Push (lexer.Location); - if ($3 is DictionaryEntry){ DictionaryEntry de = (DictionaryEntry) $3; - Location l = lexer.Location; + Location l = (Location) $1; Expression type = (Expression) de.Key; ArrayList var_declarators = (ArrayList) de.Value; @@ -4074,12 +4492,10 @@ using_statement foreach (VariableDeclaration decl in var_declarators){ - LocalInfo vi = current_block.AddVariable ( - type, decl.identifier, - current_local_parameters, decl.Location); + LocalInfo vi = current_block.AddVariable (type, decl.identifier, decl.Location); if (vi == null) continue; - vi.ReadOnly = true; + vi.SetReadOnlyContext (LocalInfo.ReadOnlyContext.Using); Expression expr; if (decl.expression_or_array_initializer is Expression){ @@ -4104,14 +4520,19 @@ using_statement vars.Add (new DictionaryEntry (var, expr)); // Assign a = new Assign (var, expr, decl.Location); - // assign_block.AddStatement (new StatementExpression (a, lexer.Location)); + // assign_block.AddStatement (new StatementExpression (a)); } - $3 = new DictionaryEntry (type, vars); + + // Note: the $$ here refers to the value of this code block and not of the LHS non-terminal. + // It can be referred to as $5 below. + $$ = new DictionaryEntry (type, vars); + } else { + $$ = $3; } } embedded_statement { - Using u = new Using ($3, (Statement) $6, (Location) oob_stack.Pop ()); + Using u = new Using ($5, (Statement) $6, (Location) $1); current_block.AddStatement (u); while (current_block.Implicit) current_block = current_block.Parent; @@ -4135,38 +4556,21 @@ public class VariableDeclaration { public object expression_or_array_initializer; public Location Location; public Attributes OptAttributes; + public string DocComment; - public VariableDeclaration (string id, object eoai, Location l, Attributes opt_attrs) + public VariableDeclaration (LocatedToken lt, object eoai, Attributes opt_attrs) { - this.identifier = id; + this.identifier = lt.Value; this.expression_or_array_initializer = eoai; - this.Location = l; + this.Location = lt.Location; this.OptAttributes = opt_attrs; } - public VariableDeclaration (string id, object eoai, Location l) : this (id, eoai, l, null) + public VariableDeclaration (LocatedToken lt, object eoai) : this (lt, eoai, null) { } } -/// -/// Used to pass around interface property information -/// -public class InterfaceAccessorInfo { - - public readonly Accessor Get, Set; - - public InterfaceAccessorInfo (bool has_get, bool has_set, - Attributes get_attrs, Attributes set_attrs, Location get_loc, Location set_loc) - { - if (has_get) - Get = new Accessor (null, 0, get_attrs, get_loc); - if (has_set) - Set = new Accessor (null, 0, set_attrs, set_loc); - } -} - - // // A class used to hold info about an indexer declarator // @@ -4174,13 +4578,15 @@ public class IndexerDeclaration { public Expression type; public MemberName interface_type; public Parameters param_list; + public Location location; public IndexerDeclaration (Expression type, MemberName interface_type, - Parameters param_list) + Parameters param_list, Location loc) { this.type = type; this.interface_type = interface_type; this.param_list = param_list; + this.location = loc; } } @@ -4227,15 +4633,32 @@ public class OperatorDeclaration { } -void Error_ExpectingTypeName (Location l, Expression expr) +void Error_ExpectingTypeName (Expression expr) { if (expr is Invocation){ - Report.Error (1002, l, "; expected"); + Report.Error (1002, expr.Location, "Expecting `;'"); } else { - Report.Error (-1, l, "Invalid Type definition"); + Report.Error (-1, expr.Location, "Invalid Type definition"); } } +TypeContainer pop_current_class () +{ + TypeContainer retval = current_class; + + current_class = current_class.Parent; + current_container = current_container.Parent; + + if (current_class != current_container) { + if (!(current_class is ClassPart) || + ((ClassPart) current_class).PartialContainer != current_container) + throw new InternalErrorException (); + } else if (current_container is ClassPart) + current_container = ((ClassPart) current_class).PartialContainer; + + return retval; +} + // // Given the @class_name name, it creates a fully qualified name // based on the containing declaration space @@ -4243,11 +4666,11 @@ void Error_ExpectingTypeName (Location l, Expression expr) MemberName MakeName (MemberName class_name) { - string ns = current_namespace.FullName; + Namespace ns = current_namespace.NS; if (current_container.Name == ""){ - if (ns != "") - return new MemberName (new MemberName (ns), class_name); + if (ns.Name != "") + return new MemberName (ns.MemberName, class_name); else return class_name; } else { @@ -4282,7 +4705,7 @@ Block declare_local_variables (Expression type, ArrayList variable_declarators, foreach (VariableDeclaration decl in variable_declarators){ - if (implicit_block.AddVariable (type, decl.identifier, current_local_parameters, decl.Location) != null) { + if (implicit_block.AddVariable (type, decl.identifier, decl.Location) != null) { if (decl.expression_or_array_initializer != null){ if (inits == null) inits = new ArrayList (4); @@ -4312,7 +4735,7 @@ Block declare_local_variables (Expression type, ArrayList variable_declarators, assign = new Assign (var, expr, decl.Location); - implicit_block.AddStatement (new StatementExpression (assign, lexer.Location)); + implicit_block.AddStatement (new StatementExpression (assign)); } return implicit_block; @@ -4328,14 +4751,13 @@ Block declare_local_constants (Expression type, ArrayList declarators) implicit_block = current_block; foreach (VariableDeclaration decl in declarators){ - implicit_block.AddConstant (type, decl.identifier, (Expression) decl.expression_or_array_initializer, - current_local_parameters, decl.Location); + implicit_block.AddConstant (type, decl.identifier, (Expression) decl.expression_or_array_initializer, decl.Location); } return implicit_block; } -void CheckAttributeTarget (string a) +void CheckAttributeTarget (string a, Location l) { switch (a) { @@ -4343,14 +4765,13 @@ void CheckAttributeTarget (string a) return; default : - Location l = lexer.Location; Report.Error (658, l, "`" + a + "' is an invalid attribute target"); break; } } -void CheckUnaryOperator (Operator.OpType op) +void CheckUnaryOperator (Operator.OpType op, Location l) { switch (op) { @@ -4366,14 +4787,13 @@ void CheckUnaryOperator (Operator.OpType op) break; default : - Location l = lexer.Location; Report.Error (1019, l, "Overloadable unary operator expected"); break; } } -void CheckBinaryOperator (Operator.OpType op) +void CheckBinaryOperator (Operator.OpType op, Location l) { switch (op) { @@ -4396,7 +4816,6 @@ void CheckBinaryOperator (Operator.OpType op) break; default : - Location l = lexer.Location; Report.Error (1020, l, "Overloadable binary operator expected"); break; } @@ -4408,11 +4827,6 @@ void syntax_error (Location l, string msg) Report.Error (1003, l, "Syntax error, " + msg); } -void output (string s) -{ - Console.WriteLine (s); -} - void note (string s) { // Used to put annotations @@ -4432,6 +4846,8 @@ public CSharpParser (SeekableStreamReader reader, SourceFile file, ArrayList def this.name = file.Name; this.file = file; current_container = RootContext.Tree.Types; + // TODO: Make RootContext.Tree.Types a PartialContainer. + current_class = current_container; current_container.NamespaceEntry = current_namespace; oob_stack = new Stack (); switch_stack = new Stack (); @@ -4442,35 +4858,58 @@ public CSharpParser (SeekableStreamReader reader, SourceFile file, ArrayList def public void parse () { try { - if (yacc_verbose_flag) + if (yacc_verbose_flag > 1) yyparse (lexer, new yydebug.yyDebugSimple ()); else yyparse (lexer); Tokenizer tokenizer = lexer as Tokenizer; - tokenizer.cleanup (); + tokenizer.cleanup (); } catch (Exception e){ // // Removed for production use, use parser verbose to get the output. // // Console.WriteLine (e); Report.Error (-25, lexer.Location, "Parsing error"); - if (Driver.parser_verbose) + if (yacc_verbose_flag > 0) Console.WriteLine (e); } + + RootContext.Tree.Types.NamespaceEntry = null; } -void CheckToken (int error, int yyToken, string msg) +void CheckToken (int error, int yyToken, string msg, Location loc) { if (yyToken >= Token.FIRST_KEYWORD && yyToken <= Token.LAST_KEYWORD){ - Report.Error (error, lexer.Location, String.Format ("{0}: `{1}' is a keyword", msg, yyNames [yyToken].ToLower ())); + Report.Error (error, loc, String.Format ("{0}: `{1}' is a keyword", msg, yyNames [yyToken].ToLower ())); return; } - Report.Error (error, lexer.Location, msg); + Report.Error (error, loc, msg); +} + +void CheckIdentifierToken (int yyToken, Location loc) +{ + CheckToken (1041, yyToken, "Identifier expected", loc); +} + +string ConsumeStoredComment () +{ + string s = tmpComment; + tmpComment = null; + Lexer.doc_state = XmlCommentState.Allowed; + return s; } -void CheckIdentifierToken (int yyToken) +Location GetLocation (object obj) { - CheckToken (1041, yyToken, "Identifier expected"); + if (obj is MemberCore) + return ((MemberCore) obj).Location; + if (obj is MemberName) + return ((MemberName) obj).Location; + if (obj is LocatedToken) + return ((LocatedToken) obj).Location; + if (obj is Location) + return (Location) obj; + return lexer.Location; } /* end end end */