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();
        }
        Dictionary<char, NamedCharacter> LiteralsCollection; // literals collection

        /// <summary>
        /// Translate ABNF grammar to ANTLR grammar
        /// </summary>
        /// <param name="input">TextReader which reads the ABNF grammar</param>
        /// <param name="output">TextWriter which writes the ANTLR grammar</param>
        public void Translate(TextReader input, TextWriter writer, bool performDirectTranslation)
        {
            // force single threaded operation
            lock (SyncLock)
            {
                this.LiteralsCollection = new Dictionary<char, NamedCharacter>();

                // open input stream
                var stream = new Antlr.Runtime.ANTLRReaderStream(input);

                // create lexer
                var lexer = new AbnfAstLexer(stream);

                // get token stream from input stream
                var tokens = new CommonTokenStream(lexer);

                // create parser
                var parser = new AbnfAstParser(tokens);

                // parse token stream
                var results = parser.start();

                if (parser.RecognitionExceptions.Count > 0 || lexer.RecognitionExceptions.Count > 0)
                {
                    var message =
                        AntlrHelper.GetErrorMessages(parser.RecognitionExceptions)
                        + AntlrHelper.GetErrorMessages(lexer.RecognitionExceptions)
                        ;

                    throw new TranslationException(message, parser.RecognitionExceptions, lexer.RecognitionExceptions);
                }

                // get parse tree
                var tree = results.Tree;

                // Use simplified named characters for indirect translation
                var lookup = new NamedCharacterLookupSimple();

                // enable this line to use Unicode named characters for indirect translation
                // var lookup = new NamedCharacterLookupUnicode();

                var ruleStatistics = new RuleStatistics();
                var statisticsVisitor = new TreeVisitor_GatherRuleStatistics(ruleStatistics);
                statisticsVisitor.Visit(tree);

                // output translated grammar
                if (performDirectTranslation)
                {
                    OutputDirectTranslation(writer, tokens, tree, lookup, ruleStatistics);
                }
                else
                {
                    OutputIndirectTranslation(writer, tokens, tree, lookup, ruleStatistics);
                }
            }
        }
        void OutputIndirectTranslation(TextWriter writer, CommonTokenStream tokens, CommonTree tree, INamedCharacterLookup lookup, RuleStatistics ruleStatistics)
        {
            // gather distinct literals
            var distinctCharacters = new Dictionary<char, NamedCharacter>();
            var literalVisitor = new TreeVisitor_GatherDistinctCharacters(distinctCharacters, lookup, ruleStatistics);
            literalVisitor.Visit(tree);

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

            // append literal rules to output
            OutputLiteralRules(distinctCharacters, writer, lookup);
        }
 void OutputDirectTranslation(TextWriter writer, CommonTokenStream tokens, CommonTree tree, INamedCharacterLookup lookup, RuleStatistics ruleStatistics)
 {
     // output ANTLR translation
     var outputVisitor = new TreeVisitor_OutputTranslation_Direct(tokens, writer, lookup, ruleStatistics);
     outputVisitor.Visit(tree);
 }
 public TreeVisitor_OutputTranslation_Direct(ITokenStream tokens, System.IO.TextWriter writer, INamedCharacterLookup lookup, RuleStatistics ruleStatistics)
     : base(tokens, writer, lookup, ruleStatistics)
 {
 }
Exemplo n.º 7
0
 public TreeVisitor_OutputTranslation_Indirect(ITokenStream tokens, System.IO.TextWriter writer, INamedCharacterLookup lookup, RuleStatistics ruleStatistics, Dictionary <char, NamedCharacter> distinctCharacters)
     : base(tokens, writer, lookup, ruleStatistics)
 {
     _distinctCharacters = distinctCharacters;
 }