/// <summary>
        /// Parses a constructor.
        /// </summary>
        /// <param name="memberName">Member name.</param>
        /// <param name="access">Member accessibility.</param>
        /// <param name="memberAttributes">Member attributes.</param>
        /// <returns>Constructor code element.</returns>
        private ConstructorElement ParseConstructor(string memberName, CodeAccess access, MemberModifiers memberAttributes)
        {
            ConstructorElement constructor = new ConstructorElement();
            constructor.Name = memberName;
            constructor.Access = access;
            constructor.MemberModifiers = memberAttributes;

            constructor.Parameters = this.ParseParameters();

            EatWhiteSpace();

            List<ICommentElement> extraComments = new List<ICommentElement>();
            extraComments.AddRange(ParseComments());

            EatWhiteSpace();

            bool hasReference = TryReadChar(CSharpSymbol.TypeImplements);
            if (hasReference)
            {
                EatWhiteSpace();

                extraComments.AddRange(ParseComments());

                StringBuilder referenceBuilder = new StringBuilder(DefaultWordLength);

                EatWhiteSpace();
                referenceBuilder.Append(CaptureWord());

                EatWhiteSpace();
                string referenceParams =
                    ParseNestedText(CSharpSymbol.BeginParameterList, CSharpSymbol.EndParameterList, true, true);
                referenceBuilder.Append(CSharpSymbol.BeginParameterList);
                referenceBuilder.Append(referenceParams);
                referenceBuilder.Append(CSharpSymbol.EndParameterList);

                constructor.Reference = referenceBuilder.ToString();
            }

            constructor.BodyText = this.ParseBlock(true, constructor);

            foreach (ICommentElement comment in extraComments)
            {
                constructor.AddHeaderComment(comment);
            }

            return constructor;
        }