public TreeVisitor_GatherDistinctCharacters(IDictionary <char, NamedCharacter> literals, INamedCharacterLookup lookup)
        {
            _distinctCharacters = literals;
            _lookup             = lookup;

            CommonConstructor();
        }
        int _nestedRepetitionCount = 0;                     // keep track of nested repetitions (for preserving whitespace)

        public TreeVisitor_OutputTranslation(ITokenStream tokens, System.IO.TextWriter writer, INamedCharacterLookup lookup)
        {
            _tokens = tokens;
            _writer = writer;
            _lookup = lookup;

            CommonConstructor();
        }
        public TreeVisitor_GatherDistinctCharacters(IDictionary <char, NamedCharacter> literals, INamedCharacterLookup lookup, RuleStatistics ruleStatistics)
        {
            _distinctCharacters = literals;
            _lookup             = lookup;
            _ruleStatistics     = ruleStatistics;

            Reset();
        }
        int _nestedRepetitionCount = 0;                    // keep track of nested repetitions (for preserving whitespace)

        public TreeVisitor_OutputTranslation(ITokenStream tokens, System.IO.TextWriter writer, INamedCharacterLookup lookup, RuleStatistics ruleStatistics)
        {
            _tokens         = tokens;
            _writer         = writer;
            _lookup         = lookup;
            _ruleStatistics = ruleStatistics;

            Reset();
        }
 public TreeVisitor_OutputTranslation_Indirect(ITokenStream tokens, System.IO.TextWriter writer, Dictionary <char, NamedCharacter> distinctCharacters, INamedCharacterLookup lookup)
     : base(tokens, writer, lookup)
 {
     _distinctCharacters = distinctCharacters;
 }
        void OutputLiteralRules(IDictionary<char, NamedCharacter> literals, TextWriter writer, INamedCharacterLookup lookup)
        {
            var knownValues = 
                literals.Values
                .Where(x => lookup.IsKnownCharacter(x.Character))
                .OrderBy(x => x.Character)
                .Select(x => x);

            var unknownValues = 
                literals.Values
                .Where(x => !(lookup.IsKnownCharacter(x.Character)))
                .OrderBy(x => x.Character)
                .Select(x => x);

            if (literals.Count > 0)
            {
                writer.WriteLine("");
                writer.WriteLine(@"//////////////////////////////////////////////////////////////////////////");
                writer.WriteLine(@"// Lexer rules generated for each distinct character in original grammar");
                writer.WriteLine(@"// per http://www.unicode.org/charts/PDF/U0000.pdf");
                writer.WriteLine(@"//////////////////////////////////////////////////////////////////////////");
                writer.WriteLine("");
            }

            // output known (named) literals first
            foreach (var value in knownValues)
            {
                writer.Write(value.Name);
                writer.Write(" : ");

                writer.Write("'");

                var character = value.Character;

                if (character == '\'')
                {
                    writer.Write(@"\'");
                }
                else if (character == '\\')
                {
                    writer.Write(@"\\");
                }
                else if (character < 32)
                {
                    writer.Write(@"\u");
                    writer.Write(((int)character).ToString("X4"));
                }
                else
                {
                    writer.Write(character);
                }

                writer.Write("'");

                writer.WriteLine(";");
            }

            // output unknown literals
            foreach (var value in unknownValues)
            {
                writer.Write(value.Name);
                writer.Write(" : ");

                int number = value.Character;

                writer.Write(@"'\u");
                writer.Write(number.ToString("X4"));
                writer.Write("'");

                writer.WriteLine(";");
            }
        }
        void OutputIndirectTranslation(TextWriter writer, CommonTokenStream tokens, CommonTree tree, INamedCharacterLookup lookup)
        {
            // gather distinct literals
            var distinctCharacters = new Dictionary<char, NamedCharacter>();
            var literalVisitor = new TreeVisitor_GatherDistinctCharacters(distinctCharacters, lookup);
            literalVisitor.Visit(tree);

            // output ANTLR translation (substitute rules for character literals)
            var outputVisitor = new TreeVisitor_OutputTranslation_Indirect(tokens, writer, distinctCharacters, lookup);
            outputVisitor.Visit(tree);

            // append literal rules to output
            OutputLiteralRules(distinctCharacters, writer, lookup);
        }
 void OutputDirectTranslation(TextWriter writer, CommonTokenStream tokens, CommonTree tree, INamedCharacterLookup lookup)
 {
     // output ANTLR translation
     var outputVisitor = new TreeVisitor_OutputTranslation_Direct(tokens, writer, lookup);
     outputVisitor.Visit(tree);
 }
        void OutputLiteralRules(IDictionary<char, NamedCharacter> literals, TextWriter writer, INamedCharacterLookup lookup)
        {
            var knownValues = 
                literals.Values
                .Where(x => lookup.IsKnownCharacter(x.Character))
                .OrderBy(x => x.Character)
                .Select(x => x);

            var unknownValues = 
                literals.Values
                .Where(x => !(lookup.IsKnownCharacter(x.Character)))
                .OrderBy(x => x.Character)
                .Select(x => x);

            if (literals.Count > 0)
            {
                writer.WriteLine("");
                writer.WriteLine("");
                writer.WriteLine(@"////////////////////////////////////////////////////////////////////////////////////////////");
                writer.WriteLine(@"// Lexer rules generated for each distinct character in original grammar");
                writer.WriteLine(@"// " + lookup.Description);
                writer.WriteLine(@"////////////////////////////////////////////////////////////////////////////////////////////");
                writer.WriteLine("");
            }

            // output known (named) literals first
            foreach (var value in knownValues)
            {
                writer.Write(value.Name);
                writer.Write(" : ");

                writer.Write("'");

                var character = value.Character;

                writer.Write(AntlrHelper.CharEscape(character));

                writer.Write("'");

                writer.WriteLine(";");
            }

            // output unknown literals
            foreach (var value in unknownValues)
            {
                writer.Write(value.Name);
                writer.Write(" : ");

                int number = value.Character;

                writer.Write(@"'\u");
                writer.Write(number.ToString("X4"));
                writer.Write("'");

                writer.WriteLine(";");
            }
        }
 public TreeVisitor_OutputTranslation_Direct(ITokenStream tokens, System.IO.TextWriter writer, INamedCharacterLookup lookup, RuleStatistics ruleStatistics)
     : base(tokens, writer, lookup, ruleStatistics)
 {
 }