private PathToken FromContext(string input, PathTokenType type, PathLexerContext tokenContext) => new PathToken( input, input.Substring(tokenContext.StartPosition, tokenContext.EndPosition - tokenContext.StartPosition), type, tokenContext.StartPosition, tokenContext.EndPosition);
private static bool IsPathDelimiterNext(PathLexerContext context) { return(IsPathDelimiterMattching(new PathLexerContext { StartPosition = context.EndPosition, EndPosition = context.EndPosition + 1, InputString = context.InputString })); }
public IEnumerable <PathToken> Tokenize(string input) { var tokenContext = new PathLexerContext { StartPosition = 0, EndPosition = 0, InputString = input }; yield return(FromContext( input, PathTokenType.StartToken, tokenContext)); foreach (var symbol in input ?? string.Empty) { tokenContext.EndPosition += 1; var tokenDefinition = definitions.FirstOrDefault(v => v.IsMatched(tokenContext)); if (tokenDefinition != null) { yield return(FromContext( input, tokenDefinition.Type, tokenContext)); tokenContext.StartPosition = tokenContext.EndPosition; } } if (tokenContext.StartPosition != tokenContext.EndPosition) { yield return(FromContext( input, PathTokenType.InvalidSequence, tokenContext)); } else { yield return(FromContext( input, PathTokenType.EndToken, tokenContext)); } }
public static bool IsRootDirectoryMattching(PathLexerContext context) { return(context.StartPosition == 0 && AreEqual(SimpleFileSystemEnvironment.RootPath, context)); }
private static bool IsValidSubdirectory(PathLexerContext context) { return(SimpleFileSystemEnvironment.IsValidSubdirectory(context.InputString.Skip(context.StartPosition).Take(context.GetSymbolsCount()))); }
private static bool AreEqual(string pattern, PathLexerContext context) { return(pattern.Length == context.GetSymbolsCount() && Enumerable.SequenceEqual(pattern, context.InputString.Skip(context.StartPosition).Take(context.GetSymbolsCount()))); }
public static bool IsParentDirectoryMattching(PathLexerContext context) { return(AreEqual(SimpleFileSystemEnvironment.ParentDirectoryAlias, context)); }
public static bool IsSubdirectoryMattching(PathLexerContext context) { return ((context.EndPosition == context.InputString.Length && IsValidSubdirectory(context)) || (context.EndPosition != context.InputString.Length && IsPathDelimiterNext(context) && IsValidSubdirectory(context))); }
public static bool IsPathDelimiterMattching(PathLexerContext context) { return(!IsRootDirectoryMattching(context) && context.GetSymbolsCount() == 1 && context.InputString[context.StartPosition] == SimpleFileSystemEnvironment.PathDelimiter); }
public bool IsMatched(PathLexerContext context) => _matching(context);