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