X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mcs%2Fmcs%2Fcs-parser.jay;h=5880df29440d1fc80d14ef9dad4e5bdd7ba5ed81;hb=29f95a7d2392761ca8aa5a0d45f598241b40f947;hp=65c21814b8701c131a11ecc09788340589da51cf;hpb=e7397842a126ded6b70c55b0b17801b12bd3b7cd;p=mono.git diff --git a/mcs/mcs/cs-parser.jay b/mcs/mcs/cs-parser.jay old mode 100755 new mode 100644 index 65c21814b87..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 @@ -25,12 +26,11 @@ using System; namespace Mono.CSharp { using System.Collections; - using Mono.Languages; /// /// The C# Parser /// - public class CSharpParser : GenericParser { + public class CSharpParser { NamespaceEntry current_namespace; TypeContainer current_container; TypeContainer current_class; @@ -41,14 +41,8 @@ namespace Mono.CSharp /// Current block is used to add statements as we find /// them. /// - Block current_block; + Block current_block, top_current_block; - /// - /// If true, creates a toplevel block in the block production - /// This is flagged by the delegate creation - /// - bool create_toplevel_block; - /// /// This is used by the unary_expression code to resolve /// a name against a parameter. @@ -79,17 +73,31 @@ namespace Mono.CSharp /// Stack switch_stack; + static public int yacc_verbose_flag; + + // Name of the file we are parsing + public string name; + /// /// 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 @@ -218,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 "<<" @@ -285,7 +294,13 @@ compilation_unit opt_EOF : /* empty */ + { + Lexer.check_incorrect_doc_comment (); + } | EOF + { + Lexer.check_incorrect_doc_comment (); + } ; outer_declarations @@ -305,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, (Expression) $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); } ; @@ -333,19 +357,15 @@ using_namespace_directive // namespace_declaration : opt_attributes NAMESPACE namespace_or_type_name - { + { + MemberName name = (MemberName) $3; + if ($1 != null) { - Report.Error(1518, Lexer.Location, "Attributes cannot be applied to namespaces." - + " Expected class, delegate, enum, interface, or struct"); - } - - if (current_namespace.Parent != null && $3 is MemberAccess) { - // Cannot use qualified namespace names in nested namespace declarations - Report.Error (134, lexer.Location, "Cannot use qualified namespace names in nested namespace declarations"); + Report.Error(1671, name.Location, "A namespace declaration cannot have modifiers or attributes"); } current_namespace = new NamespaceEntry ( - current_namespace, file, $3.ToString (), lexer.Location); + current_namespace, file, name.GetName (), name.Location); } namespace_body opt_semicolon { @@ -364,16 +384,18 @@ opt_comma ; namespace_name - : namespace_or_type_name { $$ = ($1).ToString (); } + : 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 @@ -394,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; } @@ -421,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"); } ; @@ -439,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"); // } ; @@ -472,24 +482,31 @@ opt_attributes attribute_sections : attribute_section - { + { ArrayList sect = (ArrayList) $1; if (global_attrs_enabled) { 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); } current_attr_target = null; - } + } | attribute_sections attribute_section { Attributes attrs = $1 as Attributes; @@ -541,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"; } @@ -567,21 +585,26 @@ attribute_list ; attribute - : attribute_name - { - $$ = lexer.Location; - } - opt_attribute_arguments + : attribute_name opt_attribute_arguments { + MemberName mname = (MemberName) $1; + 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, (string) ($1).ToString (), (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, (string) ($1).ToString (), (ArrayList) $3, (Location) $2); + $$ = new Attribute (current_attr_target, left_expr, identifier, arguments, mname.Location, lexer.IsEscapedIdentifier (mname.Location)); } ; attribute_name - : type_name { /* reserved attribute name or identifier: 17.4 */ } + : namespace_or_type_name { /* reserved attribute name or identifier: 17.4 */ } ; opt_attribute_arguments @@ -661,13 +684,19 @@ named_argument_list $$ = args; } + | named_argument_list COMMA expression + { + Report.Error (1016, ((Expression) $3).Location, "Named attribute argument expected"); + $$ = null; + } ; named_argument : IDENTIFIER ASSIGN expression { + // FIXME: keep location $$ = new DictionaryEntry ( - (string) $1, + ((LocatedToken) $1).Value, new Argument ((Expression) $3, Argument.AType.Expression)); } ; @@ -705,25 +734,24 @@ struct_declaration : opt_attributes opt_modifiers opt_partial - STRUCT IDENTIFIER + STRUCT member_name { - string name = MakeName ((string) $5); - bool partial = (bool) $3; - - if (partial) { + MemberName name = MakeName ((MemberName) $5); + 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, current_class); + RootContext.Tree.RecordDecl (current_namespace.NS, name, current_class); } } opt_class_base @@ -731,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 @@ -786,14 +821,23 @@ constant_declaration constant_declarators SEMICOLON { + int modflags = (int) $2; 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); + continue; + } Const c = new Const ( current_class, (Expression) $4, (string) constant.identifier, - (Expression) constant.expression_or_array_initializer, (int) $2, + (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); } } @@ -819,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; } ; @@ -840,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); } ; @@ -862,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 @@ -876,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; } ; @@ -895,39 +993,32 @@ 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, (Location) $1, "A stackalloc expression requires [] after type"); + $$ = null; } ; 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 = (Block) $3; + method.Block = (ToplevelBlock) $3; current_container.AddMethod (method); current_local_parameters = null; iterator_container = null; + + if (RootContext.Documentation != null) + Lexer.doc_state = XmlCommentState.Allowed; } ; @@ -940,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; @@ -953,45 +1044,57 @@ opt_error_modifier method_header : opt_attributes opt_modifiers - type - member_name + type namespace_or_type_name OPEN_PARENS opt_formal_parameter_list CLOSE_PARENS { + MemberName name = (MemberName) $4; + Method method = new Method (current_class, (Expression) $3, (int) $2, - false, (string) $4, (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 opt_modifiers - VOID - member_name + VOID namespace_or_type_name OPEN_PARENS opt_formal_parameter_list CLOSE_PARENS { + MemberName name = (MemberName) $4; + Method method = new Method (current_class, TypeManager.system_void_expr, - (int) $2, false, (string) $4, (Parameters) $6, - (Attributes) $1, lexer.Location); + (int) $2, false, name, (Parameters) $6, + (Attributes) $1); current_local_parameters = (Parameters) $6; + + if (RootContext.Documentation != null) + method.DocComment = Lexer.consume_doc_comment (); + $$ = method; } | opt_attributes opt_modifiers type - modifiers member_name OPEN_PARENS opt_formal_parameter_list CLOSE_PARENS + 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) $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, (string) $5, (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; } ; @@ -1013,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 { @@ -1022,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 { @@ -1031,15 +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 + { + 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, (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); } ; @@ -1066,15 +1180,43 @@ 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 + { + 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 + opt_parameter_modifier + type + IDENTIFIER + ASSIGN + constant_expression + { + LocatedToken lt = (LocatedToken) $4; + Report.Error (241, lt.Location, "Default parameter specifiers are not permitted"); + $$ = null; + } ; opt_parameter_modifier @@ -1090,79 +1232,95 @@ 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, (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; } ; -member_name - : namespace_or_type_name { $$ = ($1).ToString (); } - ; - property_declaration : opt_attributes opt_modifiers - type member_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; - prop = new Property (current_class, (Expression) $3, (int) $2, false, - (string) $4, (Attributes) $1, get_block, set_block, loc); - if (SimpleIteratorContainer.Simple.Yields) - prop.SetYields (); + MemberName name = (MemberName) $4; + + 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 GET + : opt_attributes opt_modifiers GET { // If this is not the case, then current_local_parameters has already // been set in indexer_declaration @@ -1171,27 +1329,45 @@ get_accessor_declaration else current_local_parameters = indexer_parameters; lexer.PropertyParsing = false; + + iterator_container = SimpleIteratorContainer.GetSimple (); } accessor_body { - $$ = new Accessor ((Block) $4, (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; } ; set_accessor_declaration - : opt_attributes SET + : opt_attributes opt_modifiers SET { 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; @@ -1204,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 ((Block) $4, (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; } ; @@ -1226,43 +1420,47 @@ interface_declaration : opt_attributes opt_modifiers opt_partial - INTERFACE IDENTIFIER + INTERFACE member_name { - string name = MakeName ((string) $5); - bool partial = (bool) $3; + MemberName name = MakeName ((MemberName) $5); - 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, 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)); } ; @@ -1285,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"); } ; @@ -1314,27 +1589,30 @@ 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; } ; interface_method_declaration - : opt_attributes opt_new type IDENTIFIER + : opt_attributes opt_new type namespace_or_type_name OPEN_PARENS opt_formal_parameter_list CLOSE_PARENS SEMICOLON { $$ = new Method (current_class, (Expression) $3, (int) $2, true, - (string) $4, (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 IDENTIFIER + | 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 { - $$ = new Method (current_class, TypeManager.system_void_expr, (int) $2, - true, (string) $4, (Parameters) $6, (Attributes) $1, - lexer.Location); + $$ = new Method (current_class, (Expression) $3, (int) $2, true, + (MemberName) $4, (Parameters) $6, (Attributes) $1); + + Report.Error (531, lexer.Location, "`{0}': interface members cannot have a definition", + ((Method)$$).GetSignatureForError ()); } ; @@ -1344,49 +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; + } + + 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; + } - $$ = new Property (current_class, (Expression) $3, (int) $2, true, - (string) $4, (Attributes) $1, pinfo.Get, pinfo.Set, - lexer.Location); + 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 { - $$ = new EventField (current_class, (Expression) $4, (int) $2, true, (string) $5, null, - (Attributes) $1, lexer.Location); + LocatedToken lt = (LocatedToken) $5; + $$ = new EventField (current_class, (Expression) $4, (int) $2, true, + 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; } ; @@ -1396,15 +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, TypeContainer.DefaultIndexerName, (int) $2, true, - (Parameters) $6, (Attributes) $1, info.Get, info.Set, - lexer.Location); + Pair pair = (Pair) $10; + i = new Indexer (current_class, (Expression) $3, + new MemberName (TypeContainer.DefaultIndexerName, (Location) $4), + (int) $2, true, (Parameters) $6, (Attributes) $1, + (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; } ; @@ -1415,18 +1766,26 @@ 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), - (Block) $5, (Attributes) $1, 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 (); @@ -1446,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; @@ -1457,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]; + + Expression typeL = (Expression) $5; + Expression typeR = (Expression) $8; - Parameter [] pars = new Parameter [2]; + 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); - pars [0] = new Parameter ((Expression) $5, (string) $6, Parameter.Modifier.NONE, null); - pars [1] = new Parameter ((Expression) $8, (string) $9, Parameter.Modifier.NONE, null); + current_local_parameters = new Parameters (pars, null); - current_local_parameters = new Parameters (pars, null, lexer.Location); + 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 @@ -1518,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"); } ; @@ -1555,59 +1961,66 @@ constructor_declaration constructor_body { Constructor c = (Constructor) $3; - c.Block = (Block) $4; + c.Block = (ToplevelBlock) $4; 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); } } else { // We let another layer check the validity of the constructor. - Console.WriteLine ("{0} and {1}", c.Name, current_container.Basename); + //Console.WriteLine ("{0} and {1}", c.Name, current_container.Basename); } 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); } ; @@ -1624,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; } ; @@ -1643,14 +2056,22 @@ opt_finalizer ; destructor_declaration - : opt_attributes opt_finalizer TILDE IDENTIFIER OPEN_PARENS CLOSE_PARENS block + : opt_attributes opt_finalizer TILDE { - 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"); + if (RootContext.Documentation != null) { + tmpComment = Lexer.consume_doc_comment (); + Lexer.doc_state = XmlCommentState.NotAllowed; + } + } + IDENTIFIER OPEN_PARENS CLOSE_PARENS block + { + 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") @@ -1658,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 = (Block) $7; + d.Block = (ToplevelBlock) $8; current_container.AddMethod (d); } } @@ -1683,22 +2098,28 @@ event_declaration { foreach (VariableDeclaration var in (ArrayList) $5) { - Event e = new EventField (current_class, (Expression) $4, (int) $2, false, var.identifier, - var.expression_or_array_initializer, - (Attributes) $1, lexer.Location); + 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); current_container.AddEvent (e); - + + if (RootContext.Documentation != null) { + e.DocComment = Lexer.consume_doc_comment (); + Lexer.doc_state = XmlCommentState.Allowed; + } } } | opt_attributes opt_modifiers - EVENT type member_name + EVENT type namespace_or_type_name OPEN_BRACE { implicit_value_parameter_type = (Expression) $4; lexer.EventParsing = true; - oob_stack.Push (lexer.Location); } event_accessor_declarations { @@ -1706,43 +2127,61 @@ 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; - - Event e = new EventProperty (current_class, (Expression) $4, (int) $2, false, (string) $5, - null, (Attributes) $1, (Accessor) pair.First, (Accessor) pair.Second, - loc); - - current_container.AddEvent (e); - implicit_value_parameter_type = null; + 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; + } + + current_container.AddEvent (e); + implicit_value_parameter_type = null; + } } } - | opt_attributes opt_modifiers EVENT type member_name OPEN_PARENS opt_formal_parameter_list CLOSE_PARENS block { - string mn = (string) $5; + | opt_attributes opt_modifiers EVENT type namespace_or_type_name error { + MemberName mn = (MemberName) $5; - if (mn.IndexOf ('.') != -1) - Report.Error (71, lexer.Location, "Explicit implementation of events requires property syntax"); + if (mn.Left != null) + 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, GetLocation ($1), "An add or remove accessor expected"); + $$ = null; + } + | { $$ = null; } ; add_accessor_declaration @@ -1751,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 ((Block) $4, (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; } ; @@ -1775,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 ((Block) $4, (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; @@ -1805,35 +2252,40 @@ 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; - string name = decl.interface_type; - if (name != null) - name += "."; - name += TypeContainer.DefaultIndexerName; + + MemberName name; + if (decl.interface_type != null) + name = new MemberName (decl.interface_type, TypeContainer.DefaultIndexerName, loc); + else + 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 (); - // Note that there is no equivalent of CheckDef for this case - // We shall handle this in semantic analysis - current_container.AddIndexer (indexer); current_local_parameters = null; @@ -1848,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 { @@ -1861,36 +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, (Location) $4); + + if (RootContext.Documentation != null) { + tmpComment = Lexer.consume_doc_comment (); + Lexer.doc_state = XmlCommentState.Allowed; } - $$ = new IndexerDeclaration ((Expression) $1, $2.ToString (), pars); } ; 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 + } - string full_name = MakeName ((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); } current_container.AddEnum (e); - RootContext.Tree.RecordDecl (full_name, e); + RootContext.Tree.RecordDecl (current_namespace.NS, name, e); + $$ = e; } ; @@ -1901,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; } ; @@ -1933,63 +2427,74 @@ 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; } ; delegate_declaration : opt_attributes opt_modifiers - DELEGATE type - IDENTIFIER OPEN_PARENS - opt_formal_parameter_list - CLOSE_PARENS + DELEGATE type member_name + OPEN_PARENS opt_formal_parameter_list CLOSE_PARENS SEMICOLON { - Location l = lexer.Location; - string name = MakeName ((string) $5); - Delegate del = new Delegate (current_namespace, current_container, (Expression) $4, - (int) $2, name, (Parameters) $7, (Attributes) $1, l); + MemberName name = MakeName ((MemberName) $5); + 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, del); - } - | opt_attributes - opt_modifiers - DELEGATE VOID - IDENTIFIER OPEN_PARENS - opt_formal_parameter_list - CLOSE_PARENS - SEMICOLON - { - Location l = lexer.Location; - string name = MakeName ((string) $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, del); - } + RootContext.Tree.RecordDecl (current_namespace.NS, name, del); + $$ = del; + } ; -type_name - : namespace_or_type_name +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 { + LocatedToken lt = (LocatedToken) $3; + $$ = new MemberName ((MemberName) $1, lt.Value); + } ; -namespace_or_type_name - : IDENTIFIER { $$ = new SimpleName ((string) $1, lexer.Location);} - | namespace_or_type_name DOT IDENTIFIER { - $$ = new MemberAccess ((Expression) $1, (string) $3, lexer.Location); +member_name + : IDENTIFIER { + LocatedToken lt = (LocatedToken) $1; + $$ = new MemberName (lt.Value, lt.Location); } ; @@ -2000,11 +2505,10 @@ namespace_or_type_name * gets rid of a shift/reduce couple */ type - : type_name { /* class_type */ - /* - This does interfaces, delegates, struct_types, class_types, - parent classes, and more! 4.2 - */ + : namespace_or_type_name + { + MemberName name = (MemberName) $1; + $$ = name.GetTypeExpression (); } | builtin_types | array_type @@ -2020,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); } ; @@ -2032,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, "*"); } // @@ -2053,7 +2557,7 @@ non_expression_type // | multiplicative_expression STAR { - $$ = new ComposedCast ((Expression) $1, "*", lexer.Location); + $$ = new ComposedCast ((Expression) $1, "*"); } ; @@ -2101,14 +2605,10 @@ integral_type | VOID { $$ = TypeManager.system_void_expr; } ; -interface_type - : type_name - ; - array_type : type rank_specifiers { - $$ = new ComposedCast ((Expression) $1, (string) $2, lexer.Location); + $$ = new ComposedCast ((Expression) $1, (string) $2); } ; @@ -2121,7 +2621,17 @@ primary_expression // 7.5.1: Literals } - | IDENTIFIER { $$ = new SimpleName ((string) $1, lexer.Location); } + | member_name + { + 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 | invocation_expression @@ -2143,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 @@ -2159,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 @@ -2204,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); } ; @@ -2224,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); } ; @@ -2261,7 +2780,8 @@ argument_list $$ = list; } | argument_list error { - CheckToken (1026, yyToken, ", or ) expected"); + CheckToken (1026, yyToken, "Expected `,' or `)'", GetLocation ($2)); + $$ = null; } ; @@ -2270,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); } @@ -2284,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); } ; @@ -2300,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 { @@ -2313,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); } } ; @@ -2345,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, "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; } ; @@ -2368,7 +2896,7 @@ post_increment_expression : primary_expression OP_INC { $$ = new UnaryMutator (UnaryMutator.Mode.PostIncrement, - (Expression) $1, lexer.Location); + (Expression) $1, (Location) $2); } ; @@ -2376,7 +2904,7 @@ post_decrement_expression : primary_expression OP_DEC { $$ = new UnaryMutator (UnaryMutator.Mode.PostDecrement, - (Expression) $1, lexer.Location); + (Expression) $1, (Location) $2); } ; @@ -2388,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); } ; @@ -2397,15 +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, (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; } ; @@ -2497,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); } ; @@ -2529,35 +3063,45 @@ 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; - create_toplevel_block = true; - } block { - if (true){ - Report.Error (-213, lexer.Location, "Anonymous methods are not supported in this branch"); + + // Force the next block to be created as a ToplevelBlock + oob_stack.Push (current_block); + oob_stack.Push (top_current_block); + current_block = null; + } + 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 (loc, "anonymous methods"); $$ = null; - } else { - create_toplevel_block = false; - if (RootContext.Version == LanguageVersion.ISO_1){ - Report.FeatureIsNotStandardized (lexer.Location, "anonymous methods"); - $$ = null; - } else - $$ = new AnonymousMethod ((Parameters) $2, (Block) $4, lexer.Location); - current_local_parameters = (Parameters) oob_stack.Pop (); + } else { + ToplevelBlock anon_block = (ToplevelBlock) $4; + + anon_block.Parent = current_block; + $$ = new AnonymousMethod ((Parameters) $2, (ToplevelBlock) top_current_block, + anon_block, loc); } + current_local_parameters = (Parameters) oob_stack.Pop (); } ; opt_anonymous_method_signature - : /* empty */ { $$ = Parameters.EmptyReadOnlyParameters; } + : /* empty */ { $$ = null; } | anonymous_method_signature ; @@ -2570,13 +3114,13 @@ 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); } } ; opt_anonymous_method_parameter_list - : /* empty */ { $$ = null; } + : /* empty */ { $$ = null; } | anonymous_method_parameter_list { $$ = $1; } ; @@ -2597,7 +3141,12 @@ anonymous_method_parameter_list anonymous_method_parameter : opt_parameter_modifier type IDENTIFIER { - $$ = new Parameter ((Expression) $2, (string) $2, (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 (1670, ((LocatedToken) $3).Location, "The `params' modifier is not allowed in anonymous method declaration"); + $$ = null; } ; @@ -2605,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 ; @@ -2617,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); } ; @@ -2629,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); } ; @@ -2641,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); } ; @@ -2671,7 +3221,7 @@ pre_increment_expression : OP_INC prefixed_unary_expression { $$ = new UnaryMutator (UnaryMutator.Mode.PreIncrement, - (Expression) $2, lexer.Location); + (Expression) $2, (Location) $1); } ; @@ -2679,7 +3229,7 @@ pre_decrement_expression : OP_DEC prefixed_unary_expression { $$ = new UnaryMutator (UnaryMutator.Mode.PreDecrement, - (Expression) $2, lexer.Location); + (Expression) $2, (Location) $1); } ; @@ -2688,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); } ; @@ -2707,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); } ; @@ -2721,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); } ; @@ -2735,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); } ; @@ -2767,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); } ; @@ -2781,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); } ; @@ -2790,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); } ; @@ -2799,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); } ; @@ -2808,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); } ; @@ -2817,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); } ; @@ -2825,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); } ; @@ -2926,29 +3456,32 @@ class_declaration : opt_attributes opt_modifiers opt_partial - CLASS IDENTIFIER + CLASS member_name { - string name = MakeName ((string) $5); - bool partial = (bool) $3; + MemberName name = MakeName ((MemberName) $5); 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_class = new StaticClass ( + 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_class = new Class ( + current_namespace, current_class, name, + mod_flags, (Attributes) $1); } + + current_container.AddClassOrStruct (current_class); current_container = current_class; - RootContext.Tree.RecordDecl (name, current_class); + RootContext.Tree.RecordDecl (current_namespace.NS, name, current_class); } } opt_class_base @@ -2962,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 @@ -2995,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); } @@ -3043,11 +3580,11 @@ class_base block : OPEN_BRACE { - if (current_block == null || create_toplevel_block){ - current_block = new ToplevelBlock (current_local_parameters, lexer.Location); + if (current_block == null){ + 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 @@ -3055,8 +3592,10 @@ 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; } ; @@ -3105,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; } ; @@ -3125,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 @@ -3138,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); } } @@ -3179,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 { // @@ -3191,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 @@ -3207,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, "*"); } ; @@ -3239,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 @@ -3275,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; } ; @@ -3299,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 (); } ; @@ -3416,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"); } ; @@ -3433,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); } ; @@ -3479,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; @@ -3501,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 (); - - For f = new For ((Statement) $3, (Expression) $6, (Statement) $8, (Statement) $10, l); + Location l = (Location) $1; - 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) @@ -3573,46 +4092,48 @@ statement_expression_list ; foreach_statement - : FOREACH OPEN_PARENS type IDENTIFIER IN + : FOREACH OPEN_PARENS type IN expression CLOSE_PARENS { - 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; } ; @@ -3628,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); } } ; @@ -3716,22 +4245,26 @@ opt_expression try_statement : TRY block catch_clauses - { + { Catch g = null; - ArrayList s = new ArrayList (4); - foreach (Catch cc in (ArrayList) $3) { - if (cc.IsGeneral) + ArrayList c = (ArrayList)$3; + for (int i = 0; i < c.Count; ++i) { + Catch cc = (Catch) c [i]; + if (cc.IsGeneral) { + if (i != c.Count - 1) + Report.Error (1017, cc.loc, "Try statement already has an empty catch block"); g = cc; - else - s.Add (cc); + c.RemoveAt (i); + i--; + } } // Now s contains the list of specific catch clauses // and g contains the general one. - $$ = new Try ((Block) $2, s, g, null, lexer.Location); - } + $$ = new Try ((Block) $2, c, g, null, ((Block) $2).loc); + } | TRY block opt_catch_clauses FINALLY block { Catch g = null; @@ -3747,11 +4280,12 @@ try_statement } } - $$ = new Try ((Block) $2, s, g, (Block) $5, lexer.Location); + $$ = new Try ((Block) $2, s, g, (Block) $5, ((Block) $2).loc); } | TRY block error { - Report.Error (1524, lexer.Location, "Expected catch or finally"); + Report.Error (1524, (Location) $1, "Expected catch or finally"); + $$ = null; } ; @@ -3784,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, lexer.Location); - } + $$ = new Catch (type, id, (Block) $4, ((Block) $4).loc); + } ; opt_catch_args @@ -3835,11 +4364,12 @@ opt_catch_args catch_args : OPEN_PARENS type opt_identifier CLOSE_PARENS - { + { $$ = new DictionaryEntry ($2, $3); - } + } ; + checked_statement : CHECKED block { @@ -3856,51 +4386,51 @@ 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 { - Block assign_block = new Block (current_block, Block.Flags.Implicit); 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); + current_block = assign_block; + for (int i = 0; i < top; i++){ 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; } - current_block.AddStatement (assign_block); - current_block = assign_block; - oob_stack.Push (assign_block); - oob_stack.Push (l); } embedded_statement { - Location l = (Location) oob_stack.Pop (); - oob_stack.Pop (); + Location l = (Location) $1; - $$ = new Fixed ((Expression) $3, (ArrayList) $4, (Statement) $7, l); + Fixed f = new Fixed ((Expression) $3, (ArrayList) $4, (Statement) $7, l); + + current_block.AddStatement (f); + while (current_block.Implicit) + current_block = current_block.Parent; + $$ = current_block; + current_block = current_block.Parent; } ; @@ -3922,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; } ; @@ -3939,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; @@ -3962,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){ @@ -3992,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; @@ -4023,51 +4556,37 @@ 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, get_attrs, get_loc); - if (has_set) - Set = new Accessor (null, set_attrs, set_loc); - } -} - - // // A class used to hold info about an indexer declarator // public class IndexerDeclaration { public Expression type; - public string interface_type; + public MemberName interface_type; public Parameters param_list; + public Location location; - public IndexerDeclaration (Expression type, string interface_type, Parameters param_list) + public IndexerDeclaration (Expression type, MemberName interface_type, + Parameters param_list, Location loc) { this.type = type; this.interface_type = interface_type; this.param_list = param_list; + this.location = loc; } } @@ -4114,32 +4633,49 @@ 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 // -string -MakeName (string class_name) +MemberName +MakeName (MemberName class_name) { - string ns = current_namespace.FullName; - string container_name = current_container.Name; + Namespace ns = current_namespace.NS; - if (container_name == ""){ - if (ns != "") - return ns + "." + class_name; + if (current_container.Name == ""){ + if (ns.Name != "") + return new MemberName (ns.MemberName, class_name); else return class_name; - } else - return container_name + "." + class_name; + } else { + return new MemberName (current_container.MemberName, class_name); + } } Block declare_local_variables (Expression type, ArrayList variable_declarators, Location loc) @@ -4169,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); @@ -4199,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; @@ -4215,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) { @@ -4230,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) { @@ -4253,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) { @@ -4283,7 +4816,6 @@ void CheckBinaryOperator (Operator.OpType op) break; default : - Location l = lexer.Location; Report.Error (1020, l, "Overloadable binary operator expected"); break; } @@ -4295,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 @@ -4319,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 (); @@ -4326,38 +4855,61 @@ public CSharpParser (SeekableStreamReader reader, SourceFile file, ArrayList def lexer = new Tokenizer (reader, file, defines); } -public override void parse () +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){ - // Please do not remove this, it is used during debugging - // of the grammar + // + // Removed for production use, use parser verbose to get the output. // - Console.WriteLine (e); + // 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 */