public virtual void EnterCopyCompilerStatementBody(QualifiedTextName qualifiedTextName,
                                                           TypeCobol.Compiler.Scanner.Token suppress, PairTokenListList replacingOperands)
        {
            var  copy   = (CopyDirective)CompilerDirective;
            bool isCopy = copy.COPYToken.TokenType == TokenType.COPY;

            copy.TextName       = GetName(qualifiedTextName.TextName);
            copy.TextNameSymbol = qualifiedTextName.TextName;
            {
#if EUROINFO_RULES
                if (TypeCobolOptions.UseEuroInformationLegacyReplacingSyntax)
                {
                    if (copy.TextName != null)
                    {
                        // Find the list of copy text names variations declared by previous REMARKS compiler directives
                        var variations = CopyTextNameVariations;
                        if (TypeCobolOptions.AutoRemarksEnable &&
                            (variations == null ||
                             !variations.Any(
                                 v =>
                                 string.Equals(v.TextNameWithSuffix, copy.TextName,
                                               StringComparison.InvariantCultureIgnoreCase))))
                        //If it does not exists, create the text variation (AutoRemarks mechanism Issue #440)
                        {
                            variations = new List <RemarksDirective.TextNameVariation>
                            {
                                new RemarksDirective.TextNameVariation(copy.TextName)
                            };

                            CopyTextNameVariations.AddRange(variations);
                        }

                        if (variations != null)
                        {
                            var declaration = variations.Find(d => String.Equals(d.TextNameWithSuffix, copy.TextName,
                                                                                 StringComparison.InvariantCultureIgnoreCase));
                            if (declaration != null && copy.TextName.StartsWith("Y", StringComparison.InvariantCultureIgnoreCase))
                            {
                                // Declaration found and copy name starts with Y => apply the legacy REPLACING semantics to the copy directive
                                copy.RemoveFirst01Level = true;
                                if (declaration.HasSuffix)
                                {
                                    copy.TextName         = declaration.TextName;
                                    copy.InsertSuffixChar = true;
                                    copy.Suffix           = declaration.Suffix;
                                    copy.PreSuffix        = declaration.PreSuffix;
                                }
                            }
                        }
                    }
                }
#endif
            }
            copy.LibraryName       = GetName(qualifiedTextName.LibraryName);
            copy.LibraryNameSymbol = qualifiedTextName.LibraryName;

            copy.Suppress = suppress != null;

            // REPLACING
            if (replacingOperands != null)
            {
                // Data used to build the current replace operation
                Token   comparisonToken           = null;
                Token[] followingComparisonTokens = null;
                Token   replacementToken          = null;
                Token[] replacementTokens         = null;

                foreach (Tuple <List <Token>, List <Token> > copyReplacingOperands in replacingOperands)
                {
                    // Get relevant tokens
                    List <Token> relevantTokens = copyReplacingOperands.Item1;
                    List <Token> replaceTokens  = copyReplacingOperands.Item2;
                    BuildReplaceOperation(copy.ReplaceOperations, ref comparisonToken, ref followingComparisonTokens,
                                          ref replacementToken, ref replacementTokens, false, relevantTokens);

                    BuildReplaceOperation(copy.ReplaceOperations, ref comparisonToken, ref followingComparisonTokens,
                                          ref replacementToken, ref replacementTokens, true, replaceTokens);
                }
            }
        }
        public virtual void EnterReplaceCompilerStatement(Token replaceTokn, Token offToken, PairTokenListList replacingOperands)
        {
            ReplaceDirective replaceDirective = (ReplaceDirective)CompilerDirective;

            if (replacingOperands != null)
            {
                // Data used to build the current replace operation
                Token   comparisonToken           = null;
                Token[] followingComparisonTokens = null;
                Token   replacementToken          = null;
                Token[] replacementTokens         = null;

                foreach (Tuple <List <Token>, List <Token> > copyReplacingOperands in replacingOperands)
                {
                    // Get relevant tokens
                    List <Token> relevantTokens = copyReplacingOperands.Item1;
                    List <Token> replaceTokens  = copyReplacingOperands.Item2;
                    BuildReplaceOperation(replaceDirective.ReplaceOperations, ref comparisonToken, ref followingComparisonTokens,
                                          ref replacementToken, ref replacementTokens, false, relevantTokens);

                    BuildReplaceOperation(replaceDirective.ReplaceOperations, ref comparisonToken, ref followingComparisonTokens,
                                          ref replacementToken, ref replacementTokens, true, replaceTokens);
                }
            }
        }