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) { }
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; }