Esempio n. 1
0
 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);
Esempio n. 2
0
 private static bool IsPathDelimiterNext(PathLexerContext context)
 {
     return(IsPathDelimiterMattching(new PathLexerContext
     {
         StartPosition = context.EndPosition,
         EndPosition = context.EndPosition + 1,
         InputString = context.InputString
     }));
 }
Esempio n. 3
0
        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));
            }
        }
Esempio n. 4
0
 public static bool IsRootDirectoryMattching(PathLexerContext context)
 {
     return(context.StartPosition == 0 &&
            AreEqual(SimpleFileSystemEnvironment.RootPath, context));
 }
Esempio n. 5
0
 private static bool IsValidSubdirectory(PathLexerContext context)
 {
     return(SimpleFileSystemEnvironment.IsValidSubdirectory(context.InputString.Skip(context.StartPosition).Take(context.GetSymbolsCount())));
 }
Esempio n. 6
0
 private static bool AreEqual(string pattern, PathLexerContext context)
 {
     return(pattern.Length == context.GetSymbolsCount() &&
            Enumerable.SequenceEqual(pattern, context.InputString.Skip(context.StartPosition).Take(context.GetSymbolsCount())));
 }
Esempio n. 7
0
 public static bool IsParentDirectoryMattching(PathLexerContext context)
 {
     return(AreEqual(SimpleFileSystemEnvironment.ParentDirectoryAlias, context));
 }
Esempio n. 8
0
 public static bool IsSubdirectoryMattching(PathLexerContext context)
 {
     return
         ((context.EndPosition == context.InputString.Length && IsValidSubdirectory(context)) ||
          (context.EndPosition != context.InputString.Length && IsPathDelimiterNext(context) && IsValidSubdirectory(context)));
 }
Esempio n. 9
0
 public static bool IsPathDelimiterMattching(PathLexerContext context)
 {
     return(!IsRootDirectoryMattching(context) &&
            context.GetSymbolsCount() == 1 &&
            context.InputString[context.StartPosition] == SimpleFileSystemEnvironment.PathDelimiter);
 }
Esempio n. 10
0
 public bool IsMatched(PathLexerContext context) => _matching(context);