// --- SPECIAL-NAMES PARAGRAPH ---
        public override void EnterSpecialNamesParagraph(CodeElementsParser.SpecialNamesParagraphContext context)
        {
            var paragraph = new SpecialNamesParagraph();

            if(context.upsiSwitchNameClause() != null && context.upsiSwitchNameClause().Length > 0)
            {
                foreach (var upsiSwitchNameContext in context.upsiSwitchNameClause())
                {
                    var upsiSwitchName = CobolWordsBuilder.CreateUPSISwitchName(upsiSwitchNameContext.upsiSwitchName());
                    if (upsiSwitchNameContext.mnemonicForUPSISwitchNameDefinition() != null)
                    {
                        var mnemonicForUPSISwitchName = CobolWordsBuilder.CreateMnemonicForUPSISwitchNameDefinition(
                            upsiSwitchNameContext.mnemonicForUPSISwitchNameDefinition());
                        if(paragraph.MnemonicsForUPSISwitchNames == null)
                        {
                            paragraph.MnemonicsForUPSISwitchNames = new Dictionary<SymbolDefinition, ExternalName>();
                        }
                        paragraph.MnemonicsForUPSISwitchNames.Add(mnemonicForUPSISwitchName, upsiSwitchName);
                    }
                    if(upsiSwitchNameContext.conditionNamesForUPSISwitch() != null)
                    {
                        if (paragraph.ConditionNamesForUPSISwitchStatus == null)
                        {
                            paragraph.ConditionNamesForUPSISwitchStatus = new Dictionary<SymbolDefinition, Tuple<ExternalName, UPSISwitchStatus>>();
                        }
                        if (upsiSwitchNameContext.conditionNamesForUPSISwitch().offConditionNameForUPSISwitch() != null)
                        {
                            var conditionForUPSISwitchName = CobolWordsBuilder.CreateConditionForUPSISwitchNameDefinition(
                                upsiSwitchNameContext.conditionNamesForUPSISwitch().offConditionNameForUPSISwitch().conditionForUPSISwitchNameDefinition());
                            paragraph.ConditionNamesForUPSISwitchStatus.Add(conditionForUPSISwitchName,
                                new Tuple<ExternalName, UPSISwitchStatus>(upsiSwitchName, UPSISwitchStatus.Off));
                        }
                        if (upsiSwitchNameContext.conditionNamesForUPSISwitch().onConditionNameForUPSISwitch() != null)
                        {
                            var conditionForUPSISwitchName = CobolWordsBuilder.CreateConditionForUPSISwitchNameDefinition(
                                upsiSwitchNameContext.conditionNamesForUPSISwitch().onConditionNameForUPSISwitch().conditionForUPSISwitchNameDefinition());
                            paragraph.ConditionNamesForUPSISwitchStatus.Add(conditionForUPSISwitchName,
                                new Tuple<ExternalName, UPSISwitchStatus>(upsiSwitchName, UPSISwitchStatus.On));
                        }
                    }
                }

            }
            if (context.environmentNameClause() != null && context.environmentNameClause().Length > 0)
            {
                if(paragraph.MnemonicsForEnvironmentNames == null)
                {
                    paragraph.MnemonicsForEnvironmentNames = new Dictionary<SymbolDefinition, ExternalName>();
                }
                foreach(var environmentNameContext in context.environmentNameClause())
                {
                    var environmentName = CobolWordsBuilder.CreateEnvironmentName(
                        environmentNameContext.environmentName());
                    var mnemonicForEnvironmentName = CobolWordsBuilder.CreateMnemonicForEnvironmentNameDefinition(
                        environmentNameContext.mnemonicForEnvironmentNameDefinition());
                    paragraph.MnemonicsForEnvironmentNames.Add(mnemonicForEnvironmentName, environmentName);
                }
            }
            if (context.alphabetClause() != null && context.alphabetClause().Length > 0)
            {
                if(paragraph.AlphabetNames == null)
                {
                    paragraph.AlphabetNames = new Dictionary<SymbolDefinition, CollatingSequence>();
                }
                foreach(var alphabetContext in context.alphabetClause())
                {
                    var alphabetName = CobolWordsBuilder.CreateAlphabetNameDefinition(alphabetContext.alphabetNameDefinition());
                    if(alphabetContext.intrinsicAlphabetNameReference() != null)
                    {
                        var intrinsicCollatingSequence = new InstrinsicCollatingSequence();
                        intrinsicCollatingSequence.IntrinsicAlphabetName = CobolWordsBuilder.CreateIntrinsicAlphabetNameReference(
                            alphabetContext.intrinsicAlphabetNameReference());
                        paragraph.AlphabetNames.Add(alphabetName, intrinsicCollatingSequence);
                    }
                    else if(alphabetContext.userDefinedCollatingSequence() != null && alphabetContext.userDefinedCollatingSequence().Length > 0)
                    {
                        var userDefinedCollatingSequence = new UserDefinedCollatingSequence();
                        userDefinedCollatingSequence.CharacterSets = new CharacterSetInCollatingSequence[alphabetContext.userDefinedCollatingSequence().Length];
                        for (int i = 0; i < alphabetContext.userDefinedCollatingSequence().Length; i++)
                        {
                            var userDefinedCSContext = alphabetContext.userDefinedCollatingSequence()[i];
                            if (userDefinedCSContext.charactersInCollatingSequence() != null)
                            {
                                var charsInCSContext = userDefinedCSContext.charactersInCollatingSequence();
                                var characters = CreateCharactersInCollatingSequence(charsInCSContext);
                                userDefinedCollatingSequence.CharacterSets[i] = characters;
                            }
                            else if (userDefinedCSContext.charactersRange() != null)
                            {
                                var charactersRangeContext = userDefinedCSContext.charactersRange();
                                CharactersRangeInCollatingSequence charactersRange = CreateCharactersRange(charactersRangeContext);
                                userDefinedCollatingSequence.CharacterSets[i] = charactersRange;
                            }
                            else if (userDefinedCSContext.charactersEqualSet() != null)
                            {
                                var charactersEqualSetContext = userDefinedCSContext.charactersEqualSet();
                                var charactersEqualSet = new CharactersEqualSetInCollatingSequence();
                                charactersEqualSet.EqualCharacters = new CharacterInCollatingSequence[charactersEqualSetContext.characterInCollatingSequence().Length];
                                for (int j = 0; j < charactersEqualSetContext.characterInCollatingSequence().Length; j++)
                                {
                                    var characterInCSContext = charactersEqualSetContext.characterInCollatingSequence()[j];
                                    charactersEqualSet.EqualCharacters[j] = CreateCharacterInCollatingSequence(characterInCSContext);
                                }
                                userDefinedCollatingSequence.CharacterSets[i] = charactersEqualSet;
                            }
                        }
                        paragraph.AlphabetNames.Add(alphabetName, userDefinedCollatingSequence);
                    }
                }
            }
            if (context.symbolicCharactersClause() != null && context.symbolicCharactersClause().Length > 0)
            {
                if(paragraph.SymbolicCharacters == null)
                {
                    paragraph.SymbolicCharacters = new Dictionary<SymbolDefinition, Tuple<IntegerValue, SymbolReference>>();
                }
                foreach(var symbolicCharactersContext in context.symbolicCharactersClause())
                {
                    SymbolReference alphabetName = null;
                    if (symbolicCharactersContext.alphabetNameReference() != null)
                    {
                        alphabetName = CobolWordsBuilder.CreateAlphabetNameReference(symbolicCharactersContext.alphabetNameReference());
                    }
                    foreach(var symbolicCharOPContext in symbolicCharactersContext.symbolicCharactersOrdinalPositions())
                    {
                        for (int i = 0; i < Math.Min(symbolicCharOPContext.symbolicCharacterDefinition().Length, symbolicCharOPContext.ordinalPositionInCollatingSequence().Length); i++)
                        {
                            var symbolicCharacter = CobolWordsBuilder.CreateSymbolicCharacterDefinition(symbolicCharOPContext.symbolicCharacterDefinition()[i]);
                            var ordinalPosition = CobolWordsBuilder.CreateIntegerValue(symbolicCharOPContext.ordinalPositionInCollatingSequence()[i].integerValue());
                            paragraph.SymbolicCharacters.Add(symbolicCharacter,
                                new Tuple<IntegerValue, SymbolReference>(ordinalPosition, alphabetName));
                        }
                    }
                }
            }
            if (context.classClause() != null && context.classClause().Length > 0)
            {
                if(paragraph.CharsetClassNames == null)
                {
                    paragraph.CharsetClassNames = new Dictionary<SymbolDefinition, UserDefinedCollatingSequence>();
                }
                foreach(var classContext in context.classClause())
                {
                    var characterClassName = CobolWordsBuilder.CreateCharacterClassNameDefinition(classContext.characterClassNameDefinition());
                    var userDefinedCharacterClass = new UserDefinedCollatingSequence();
                    userDefinedCharacterClass.CharacterSets = new CharacterSetInCollatingSequence[classContext.userDefinedCharacterClass().Length];
                    for (int i = 0; i < classContext.userDefinedCharacterClass().Length; i++)
                    {
                        var userDefinedCCContext = classContext.userDefinedCharacterClass()[i];
                        if (userDefinedCCContext.charactersInCollatingSequence() != null)
                        {
                            userDefinedCharacterClass.CharacterSets[i] = CreateCharactersInCollatingSequence(
                                userDefinedCCContext.charactersInCollatingSequence());
                        }
                        else if (userDefinedCCContext.charactersRange() != null)
                        {
                            userDefinedCharacterClass.CharacterSets[i] = CreateCharactersRange(
                                userDefinedCCContext.charactersRange());
                        }
                    }
                    paragraph.CharsetClassNames.Add(characterClassName, userDefinedCharacterClass);
                }
            }
            if (context.currencySignClause() != null && context.currencySignClause().Length > 0)
            {
                if(paragraph.CurrencySymbols == null)
                {
                    paragraph.CurrencySymbols = new Dictionary<AlphanumericValue, CharacterValue>();
                }
                foreach (var currencySignContext in context.currencySignClause())
                {
                    var currencySign = CobolWordsBuilder.CreateAlphanumericValue(currencySignContext.alphanumericValue1());
                    CharacterValue characterValue = null;
                    if (currencySignContext.characterValue1() != null)
                    {
                        characterValue = CobolWordsBuilder.CreateCharacterValue(currencySignContext.characterValue1());
                    }
                    paragraph.CurrencySymbols.Add(currencySign, characterValue);
                }
            }
            if (context.decimalPointClause() != null && context.decimalPointClause().Length > 0)
            {
                var decimalPointContext = context.decimalPointClause()[0];
                if (decimalPointContext.COMMA() != null)
                {
                    paragraph.DecimalPointIsComma = new SyntaxProperty<bool>(true,
                        ParseTreeUtils.GetFirstToken(decimalPointContext.COMMA()));
                }
            }
            if (context.xmlSchemaClause() != null && context.xmlSchemaClause().Length > 0)
            {
                if(paragraph.XmlSchemaNames == null)
                {
                    paragraph.XmlSchemaNames = new Dictionary<SymbolDefinition, ExternalName>();
                }
                foreach (var xmlSchemaContext in context.xmlSchemaClause())
                {
                    var xmlSchemName = CobolWordsBuilder.CreateXmlSchemaNameDefinition(xmlSchemaContext.xmlSchemaNameDefinition());
                    var assignmentName = CobolWordsBuilder.CreateAssignmentName(xmlSchemaContext.assignmentName());
                    paragraph.XmlSchemaNames.Add(xmlSchemName, assignmentName);
                }
            }

            Context = context;
            CodeElement = paragraph;
        }