public Tokenizer(string input) { input = Preprocess(input); reader = new SimpleStringReader(input); while (HasInput()) { if (DiscardWhiteSpace()) { continue; } if (IsCurrentStringStart()) { ReadString(); } else if (IsCurrentSingleCharSymbol()) { ReadSingleChar(); } else { ReadAtom(); } } }
private static IEnumerable <Token> GetTokens(string text) { var rdr = new SimpleStringReader(text); rdr.SkipWhiteSpace(); while (!rdr.Eof) { var ch = rdr.Peek(); if (ch == '-' || ch == '+' || ch == '.' || char.IsDigit(ch)) { var p = rdr.Position; rdr.Consume(); while (char.IsDigit(rdr.Peek())) { rdr.Consume(); } if (ch != '.' && rdr.Peek() == '.') { rdr.Consume(); while (char.IsDigit(rdr.Peek())) { rdr.Consume(); } } ch = rdr.Peek(); if (ch == 'e' || ch == 'E') { rdr.Consume(); ch = rdr.Peek(); if (ch == '-' || ch == '+') { rdr.Consume(); } while (char.IsDigit(rdr.Peek())) { rdr.Consume(); } } yield return(new Token(TokenType.Number, rdr.GetString(p))); } else if (ch == ',') { rdr.Consume(); } else /*if (char.IsLetter(ch))*/ { var p = rdr.Position; rdr.Consume(); yield return(new Token(TokenType.String, rdr.GetString(p))); } /*else * rdr.Consume();*/ rdr.SkipWhiteSpace(); } }
private static char GetUnicode(SimpleStringReader sr, int maxDigits) { int code = 0; for (int cnt = 0; cnt < maxDigits; cnt++) { var digitCode = sr.Peek(); if (digitCode >= (int)'0' && digitCode <= (int)'9') { digitCode = digitCode - (int)'0'; } else if (digitCode >= (int)'a' && digitCode <= (int)'f') { digitCode = digitCode - (int)'a' + 10; } else if (digitCode >= (int)'A' && digitCode <= (int)'F') { digitCode = digitCode - (int)'A' + 10; } else { break; } sr.Read(); code = code * 16 + digitCode; } return((char)code); }
private static string ParseParameterValue(SimpleStringReader sr) { int ch; var nameBuf = new StringBuilder(); while ((ch = sr.Peek()) != -1) { if (ch == ':' || ch == '}') { break; } if (ch == '\\') { // skip the backslash sr.Read(); // append next character nameBuf.Append((char)sr.Read()); continue; } nameBuf.Append((char)ch); sr.Read(); } return(nameBuf.ToString()); }
/// <summary> /// Parses the specified condition string and turns it into /// <see cref="ConditionExpression"/> tree. /// </summary> /// <param name="stringReader">The string reader.</param> /// <param name="configurationItemFactories">Instance of <see cref="ConfigurationItemFactory"/> used to resolve references to condition methods and layout renderers.</param> /// <returns> /// The root of the expression syntax tree which can be used to get the value of the condition in a specified context. /// </returns> internal static ConditionExpression ParseExpression(SimpleStringReader stringReader, ConfigurationItemFactory configurationItemFactories) { var parser = new ConditionParser(stringReader, configurationItemFactories); ConditionExpression expression = parser.ParseExpression(); return(expression); }
/// <summary> /// https://github.com/NLog/NLog/issues/3194 /// </summary> public void DebugView_CurrentState(string input, int position, string expectedDone, char expectedCurrent, string expectedTodo) { var reader = new SimpleStringReader(input); reader.Position = position; Assert.Equal( SimpleStringReader.BuildCurrentState(expectedDone, expectedCurrent, expectedTodo), reader.CurrentState); }
public static void Read(SimpleStringReader reader, IJavascriptMemberExpressionVisitor visitor) { try { new JavascriptMemberExpressionReader(reader, visitor).ReadMemberName(); } catch (Exception error) { throw Errors.FailedToReadJavascriptMemberExpression(error.Message); } }
public static void Read(SimpleStringReader reader, IRangeSubstitutionVisitor visitor) { try { new RangeSubstitutionReader(reader, visitor).Read(); } catch (Exception error) { throw Errors.FailedToReadSubstituion(error.Message); } }
public static void Read(SimpleStringReader reader, IJavascriptMemberExpressionVisitor visitor) { try { new JavascriptMemberExpressionReader(reader, visitor).ReadMemberName(); } catch (Exception error) { throw Errors.FailedToReadJavascriptMemberExpression(error.Message); } }
public static void Read(SimpleStringReader reader, IRangeSubstitutionVisitor visitor) { try { new RangeSubstitutionReader(reader, visitor).Read(); } catch (Exception error) { throw Errors.FailedToReadSubstituion(error.Message); } }
private static string ParseParameterName(SimpleStringReader sr) { int ch; int nestLevel = 0; var nameBuf = new StringBuilder(); while ((ch = sr.Peek()) != -1) { if ((ch == '=' || ch == '}' || ch == ':') && nestLevel == 0) { break; } if (ch == '$') { sr.Read(); nameBuf.Append('$'); if (sr.Peek() == '{') { nameBuf.Append('{'); nestLevel++; sr.Read(); } continue; } if (ch == '}') { nestLevel--; } if (ch == '\\') { sr.Read(); // issue#3193 if (nestLevel != 0) { nameBuf.Append((char)ch); } // append next character nameBuf.Append((char)sr.Read()); continue; } nameBuf.Append((char)ch); sr.Read(); } return(nameBuf.ToString()); }
private static string ParseParameterValue(SimpleStringReader sr) { var simpleValue = sr.ReadUntilMatch(ch => EndOfLayout(ch) || ch == '\\'); if (sr.Peek() == '\\') { var nameBuf = new StringBuilder(); nameBuf.Append(simpleValue); ParseParameterUnicodeValue(sr, nameBuf); return(nameBuf.ToString()); } return(simpleValue); }
private static string ParseLayoutRendererName(SimpleStringReader sr) { int ch; var nameBuf = new StringBuilder(); while ((ch = sr.Peek()) != -1) { if (ch == ':' || ch == '}') { break; } nameBuf.Append((char)ch); sr.Read(); } return(nameBuf.ToString()); }
/// <summary> /// Parse a string containing an HEX representation to a byte-array /// </summary> /// <param name="source">The source string containing HEX characters.</param> /// <returns>The resulting byte-array</returns> /// <remarks> /// <para>The conversion does not care about character casing.</para> /// <para>Any character off the HEX-set is treated as separator.</para> /// <para>The HEX-chars can be even without any separator (i.e. packed), /// however the conversion consider character pairs.</para> /// </remarks> /// <example>Sample behavior of the conversion: /// <code> /// byte[] b = ByteArrayHelpers.FromHex("0 zz@ q1 23 04 567 8! 9 abcdef"); /// /// for (int i = 0; i < b.Length; i++) /// { /// Console.Write(b[i].ToString() + " "); /// } /// Console.WriteLine(); /// /// </code> /// Yields the result: /// <code> /// 0 1 35 4 86 7 8 9 171 205 239 /// </code> /// </example> /// <seealso cref="ToHex"/> public static byte[] FromHex(string source) { if (_tblfromhex == null) { InitFromHexConverter(); } //create a string reader to consume input chars var reader = new SimpleStringReader(source); //create a writer to accumulate the resulting bytes var writer = new ByteArrayWriter(); //consume characters until the end of string int nibble = 0; int digit = 0; int code; while ((code = reader.GetNext()) >= 0) { if (code > 0) { digit = (digit << 8) | (code - 1); nibble++; } else if (nibble > 0) { nibble = 2; } if (nibble == 2) { writer.WriteByte((byte)digit); digit = 0; nibble = 0; } } return(writer.ToByteArray()); }
private JavascriptMemberExpressionReader(SimpleStringReader reader, IJavascriptMemberExpressionVisitor visitor) { this.reader = reader; this.visitor = visitor; }
private RangeSubstitutionReader(SimpleStringReader reader, IRangeSubstitutionVisitor visitor) { this.reader = reader; this.visitor = visitor; }
/// <summary> /// Initializes a new instance of the <see cref="ConditionTokenizer"/> class. /// </summary> /// <param name="stringReader">The string reader.</param> public ConditionTokenizer(SimpleStringReader stringReader) { this.stringReader = stringReader; this.TokenType = ConditionTokenType.BeginningOfInput; this.GetNextToken(); }
/// <summary> /// Initializes a new instance of the <see cref="ConditionParser"/> class. /// </summary> /// <param name="stringReader">The string reader.</param> /// <param name="configurationItemFactory">Instance of <see cref="ConfigurationItemFactory"/> used to resolve references to condition methods and layout renderers.</param> private ConditionParser(SimpleStringReader stringReader, ConfigurationItemFactory configurationItemFactory) { _configurationItemFactory = configurationItemFactory; _tokenizer = new ConditionTokenizer(stringReader); }
internal static LayoutRenderer[] CompileLayout(ConfigurationItemFactory configurationItemFactory, SimpleStringReader sr, bool isNested, out string text) { var result = new List <LayoutRenderer>(); var literalBuf = new StringBuilder(); int ch; var p0 = sr.Position; while ((ch = sr.Peek()) != -1) { if (isNested && (ch == '}' || ch == ':')) { break; } sr.Read(); if (ch == '$' && sr.Peek() == '{') { if (literalBuf.Length > 0) { result.Add(new LiteralLayoutRenderer(literalBuf.ToString())); literalBuf.Length = 0; } var newLayoutRenderer = ParseLayoutRenderer(configurationItemFactory, sr); if (CanBeConvertedToLiteral(newLayoutRenderer)) { newLayoutRenderer = ConvertToLiteral(newLayoutRenderer); } // layout renderer result.Add(newLayoutRenderer); } else { literalBuf.Append((char)ch); } } if (literalBuf.Length > 0) { result.Add(new LiteralLayoutRenderer(literalBuf.ToString())); literalBuf.Length = 0; } var p1 = sr.Position; MergeLiterals(result); text = sr.Substring(p0, p1); return(result.ToArray()); }
private static LayoutRenderer ParseLayoutRenderer(ConfigurationItemFactory configurationItemFactory, SimpleStringReader stringReader, bool?throwConfigExceptions) { int ch = stringReader.Read(); Debug.Assert(ch == '{', "'{' expected in layout specification"); string name = ParseLayoutRendererName(stringReader); var layoutRenderer = GetLayoutRenderer(configurationItemFactory, name, throwConfigExceptions); Dictionary <Type, LayoutRenderer> wrappers = null; List <LayoutRenderer> orderedWrappers = null; ch = stringReader.Read(); while (ch != -1 && ch != '}') { string parameterName = ParseParameterName(stringReader).Trim(); if (stringReader.Peek() == '=') { stringReader.Read(); // skip the '=' PropertyInfo propertyInfo; LayoutRenderer parameterTarget = layoutRenderer; if (!PropertyHelper.TryGetPropertyInfo(layoutRenderer, parameterName, out propertyInfo)) { if (configurationItemFactory.AmbientProperties.TryGetDefinition(parameterName, out var wrapperType)) { wrappers = wrappers ?? new Dictionary <Type, LayoutRenderer>(); orderedWrappers = orderedWrappers ?? new List <LayoutRenderer>(); if (!wrappers.TryGetValue(wrapperType, out var wrapperRenderer)) { wrapperRenderer = configurationItemFactory.AmbientProperties.CreateInstance(parameterName); wrappers[wrapperType] = wrapperRenderer; orderedWrappers.Add(wrapperRenderer); } if (!PropertyHelper.TryGetPropertyInfo(wrapperRenderer, parameterName, out propertyInfo)) { propertyInfo = null; } else { parameterTarget = wrapperRenderer; } } } if (propertyInfo == null) { var value = ParseParameterValue(stringReader); if (!string.IsNullOrEmpty(parameterName) || !StringHelpers.IsNullOrWhiteSpace(value)) { // TODO NLog 5.0 Should throw exception when invalid configuration (Check throwConfigExceptions) InternalLogger.Warn("Skipping unrecognized property '{0}={1}` for ${{{2}}} ({3})", parameterName, value, name, layoutRenderer?.GetType()); } } else { if (typeof(Layout).IsAssignableFrom(propertyInfo.PropertyType)) { LayoutRenderer[] renderers = CompileLayout(configurationItemFactory, stringReader, throwConfigExceptions, true, out var txt); var nestedLayout = new SimpleLayout(renderers, txt, configurationItemFactory); propertyInfo.SetValue(parameterTarget, nestedLayout, null); } else if (typeof(ConditionExpression).IsAssignableFrom(propertyInfo.PropertyType)) { var conditionExpression = ConditionParser.ParseExpression(stringReader, configurationItemFactory); propertyInfo.SetValue(parameterTarget, conditionExpression, null); } else { string value = ParseParameterValue(stringReader); PropertyHelper.SetPropertyFromString(parameterTarget, parameterName, value, configurationItemFactory); } } } else { SetDefaultPropertyValue(configurationItemFactory, layoutRenderer, parameterName); } ch = stringReader.Read(); } if (orderedWrappers != null) { layoutRenderer = ApplyWrappers(configurationItemFactory, layoutRenderer, orderedWrappers); } return(layoutRenderer); }
private static LayoutRenderer ParseLayoutRenderer(ConfigurationItemFactory configurationItemFactory, SimpleStringReader sr) { int ch = sr.Read(); Debug.Assert(ch == '{', "'{' expected in layout specification"); string name = ParseLayoutRendererName(sr); LayoutRenderer lr; try { lr = configurationItemFactory.LayoutRenderers.CreateInstance(name); } catch (Exception ex) { if (LogManager.ThrowConfigExceptions ?? LogManager.ThrowExceptions) { throw; } InternalLogger.Error(ex, "Error parsing layout {0} will be ignored.", name); //replace with emptys lr = new LiteralLayoutRenderer(string.Empty); } var wrappers = new Dictionary <Type, LayoutRenderer>(); var orderedWrappers = new List <LayoutRenderer>(); ch = sr.Read(); while (ch != -1 && ch != '}') { string parameterName = ParseParameterName(sr).Trim(); if (sr.Peek() == '=') { sr.Read(); // skip the '=' PropertyInfo pi; LayoutRenderer parameterTarget = lr; if (!PropertyHelper.TryGetPropertyInfo(lr, parameterName, out pi)) { Type wrapperType; if (configurationItemFactory.AmbientProperties.TryGetDefinition(parameterName, out wrapperType)) { LayoutRenderer wrapperRenderer; if (!wrappers.TryGetValue(wrapperType, out wrapperRenderer)) { wrapperRenderer = configurationItemFactory.AmbientProperties.CreateInstance(parameterName); wrappers[wrapperType] = wrapperRenderer; orderedWrappers.Add(wrapperRenderer); } if (!PropertyHelper.TryGetPropertyInfo(wrapperRenderer, parameterName, out pi)) { pi = null; } else { parameterTarget = wrapperRenderer; } } } if (pi == null) { ParseParameterValue(sr); } else { if (typeof(Layout).IsAssignableFrom(pi.PropertyType)) { var nestedLayout = new SimpleLayout(); string txt; LayoutRenderer[] renderers = CompileLayout(configurationItemFactory, sr, true, out txt); nestedLayout.SetRenderers(renderers, txt); pi.SetValue(parameterTarget, nestedLayout, null); } else if (typeof(ConditionExpression).IsAssignableFrom(pi.PropertyType)) { var conditionExpression = ConditionParser.ParseExpression(sr, configurationItemFactory); pi.SetValue(parameterTarget, conditionExpression, null); } else { string value = ParseParameterValue(sr); PropertyHelper.SetPropertyFromString(parameterTarget, parameterName, value, configurationItemFactory); } } } else { // what we've just read is not a parameterName, but a value // assign it to a default property (denoted by empty string) PropertyInfo pi; if (PropertyHelper.TryGetPropertyInfo(lr, string.Empty, out pi)) { if (typeof(SimpleLayout) == pi.PropertyType) { pi.SetValue(lr, new SimpleLayout(parameterName), null); } else { string value = parameterName; PropertyHelper.SetPropertyFromString(lr, pi.Name, value, configurationItemFactory); } } else { InternalLogger.Warn("{0} has no default property", lr.GetType().FullName); } } ch = sr.Read(); } lr = ApplyWrappers(configurationItemFactory, lr, orderedWrappers); return(lr); }
private static string ParseParameterValue(SimpleStringReader sr) { int ch; var nameBuf = new StringBuilder(); while ((ch = sr.Peek()) != -1) { if (ch == ':' || ch == '}') { break; } // Code in this condition was replaced // to support escape codes e.g. '\r' '\n' '\u003a', // which can not be used directly as they are used as tokens by the parser // All escape codes listed in the following link were included // in addition to "\{", "\}", "\:" which are NLog specific: // https://blogs.msdn.com/b/csharpfaq/archive/2004/03/12/what-character-escape-sequences-are-available.aspx if (ch == '\\') { // skip the backslash sr.Read(); var nextChar = (char)sr.Peek(); switch (nextChar) { case ':': case '{': case '}': case '\'': case '"': case '\\': sr.Read(); nameBuf.Append(nextChar); break; case '0': sr.Read(); nameBuf.Append('\0'); break; case 'a': sr.Read(); nameBuf.Append('\a'); break; case 'b': sr.Read(); nameBuf.Append('\b'); break; case 'f': sr.Read(); nameBuf.Append('\f'); break; case 'n': sr.Read(); nameBuf.Append('\n'); break; case 'r': sr.Read(); nameBuf.Append('\r'); break; case 't': sr.Read(); nameBuf.Append('\t'); break; case 'u': sr.Read(); var uChar = GetUnicode(sr, 4); // 4 digits nameBuf.Append(uChar); break; case 'U': sr.Read(); var UChar = GetUnicode(sr, 8); // 8 digits nameBuf.Append(UChar); break; case 'x': sr.Read(); var xChar = GetUnicode(sr, 4); // 1-4 digits nameBuf.Append(xChar); break; case 'v': sr.Read(); nameBuf.Append('\v'); break; } continue; } nameBuf.Append((char)ch); sr.Read(); } return(nameBuf.ToString()); }
private static LayoutRenderer ParseLayoutRenderer(ConfigurationItemFactory configurationItemFactory, SimpleStringReader stringReader, bool?throwConfigExceptions) { int ch = stringReader.Read(); Debug.Assert(ch == '{', "'{' expected in layout specification"); string name = ParseLayoutRendererName(stringReader); var layoutRenderer = GetLayoutRenderer(configurationItemFactory, name, throwConfigExceptions); var wrappers = new Dictionary <Type, LayoutRenderer>(); var orderedWrappers = new List <LayoutRenderer>(); ch = stringReader.Read(); while (ch != -1 && ch != '}') { string parameterName = ParseParameterName(stringReader).Trim(); if (stringReader.Peek() == '=') { stringReader.Read(); // skip the '=' PropertyInfo propertyInfo; LayoutRenderer parameterTarget = layoutRenderer; if (!PropertyHelper.TryGetPropertyInfo(layoutRenderer, parameterName, out propertyInfo)) { Type wrapperType; if (configurationItemFactory.AmbientProperties.TryGetDefinition(parameterName, out wrapperType)) { LayoutRenderer wrapperRenderer; if (!wrappers.TryGetValue(wrapperType, out wrapperRenderer)) { wrapperRenderer = configurationItemFactory.AmbientProperties.CreateInstance(parameterName); wrappers[wrapperType] = wrapperRenderer; orderedWrappers.Add(wrapperRenderer); } if (!PropertyHelper.TryGetPropertyInfo(wrapperRenderer, parameterName, out propertyInfo)) { propertyInfo = null; } else { parameterTarget = wrapperRenderer; } } } if (propertyInfo == null) { ParseParameterValue(stringReader); } else { if (typeof(Layout).IsAssignableFrom(propertyInfo.PropertyType)) { var nestedLayout = new SimpleLayout(); string txt; LayoutRenderer[] renderers = CompileLayout(configurationItemFactory, stringReader, throwConfigExceptions, true, out txt); nestedLayout.SetRenderers(renderers, txt); propertyInfo.SetValue(parameterTarget, nestedLayout, null); } else if (typeof(ConditionExpression).IsAssignableFrom(propertyInfo.PropertyType)) { var conditionExpression = ConditionParser.ParseExpression(stringReader, configurationItemFactory); propertyInfo.SetValue(parameterTarget, conditionExpression, null); } else { string value = ParseParameterValue(stringReader); PropertyHelper.SetPropertyFromString(parameterTarget, parameterName, value, configurationItemFactory); } } } else { SetDefaultPropertyValue(configurationItemFactory, layoutRenderer, parameterName); } ch = stringReader.Read(); } layoutRenderer = ApplyWrappers(configurationItemFactory, layoutRenderer, orderedWrappers); return(layoutRenderer); }
private static string ParseLayoutRendererName(SimpleStringReader sr) { return(sr.ReadUntilMatch(ch => EndOfLayout(ch))); }
private JavascriptMemberExpressionReader(SimpleStringReader reader, IJavascriptMemberExpressionVisitor visitor) { this.reader = reader; this.visitor = visitor; }
internal static LayoutRenderer[] CompileLayout(ConfigurationItemFactory configurationItemFactory, SimpleStringReader sr, bool?throwConfigExceptions, bool isNested, out string text) { var result = new List <LayoutRenderer>(); var literalBuf = new StringBuilder(); int ch; int p0 = sr.Position; while ((ch = sr.Peek()) != -1) { if (isNested) { //possible escape char `\` if (ch == '\\') { sr.Read(); var nextChar = sr.Peek(); //escape chars if (EndOfLayout(nextChar)) { //read next char and append sr.Read(); literalBuf.Append((char)nextChar); } else { //don't treat \ as escape char and just read it literalBuf.Append('\\'); } continue; } if (EndOfLayout(ch)) { //end of innerlayout. // `}` is when double nested inner layout. // `:` when single nested layout break; } } sr.Read(); //detect `${` (new layout-renderer) if (ch == '$' && sr.Peek() == '{') { //stash already found layout-renderer. AddLiteral(literalBuf, result); LayoutRenderer newLayoutRenderer = ParseLayoutRenderer(configurationItemFactory, sr, throwConfigExceptions); if (CanBeConvertedToLiteral(newLayoutRenderer)) { newLayoutRenderer = ConvertToLiteral(newLayoutRenderer); } // layout renderer result.Add(newLayoutRenderer); } else { literalBuf.Append((char)ch); } } AddLiteral(literalBuf, result); int p1 = sr.Position; MergeLiterals(result); text = sr.Substring(p0, p1); return(result.ToArray()); }
private RangeSubstitutionReader(SimpleStringReader reader, IRangeSubstitutionVisitor visitor) { this.reader = reader; this.visitor = visitor; }