Esempio n. 1
0
 public Lexer(AmbiguityResolverEnum ambiguityResolver, Func <T> nil,
              Dictionary <Regex, Action <ILexerArg <T> > > handlers)
 {
     _ambiguityResolver = ambiguityResolver;
     _nil      = nil;
     _handlers = handlers;
 }
Esempio n. 2
0
        public LexerBuilderHandlers(AmbiguityResolverEnum ambiguityResolver, Func <T> nil)
        {
            _ambiguityResolver = ambiguityResolver;

            _nil
                = nil;

            _handlers = new Dictionary <Regex, Action <ILexerArg <T> > >();
        }
Esempio n. 3
0
        private static KeyValuePair <Regex, Action <ILexerArg <T> > > ResolveHandler(
            AmbiguityResolverEnum ambiguityResolverEnum, string buffer, char next, T lastToken,
            // ReSharper disable once ParameterTypeCanBeEnumerable.Local
            List <KeyValuePair <Regex, Action <ILexerArg <T> > > > handlers)
        {
            switch (ambiguityResolverEnum)
            {
            case AmbiguityResolverEnum.FirstMatch:
                return(handlers.First());

            case AmbiguityResolverEnum.LastMatch:
                return(handlers.Last());

            case AmbiguityResolverEnum.LongestMatch:
                var handlerAny = handlers
                                 .Select(x => new
                {
                    Handler = x,
                    Factory = ProbeFactory.New <string>()
                })
                                 .Select(x => new
                {
                    // ReSharper disable once AccessToModifiedClosure
                    x.Factory, x.Handler, Arg = new LexerArg <T>(buffer, next, lastToken,
                                                                 // Test should not be able to stop the parser
                                                                 () => { },
                                                                 (a, b) => x.Factory.Instance.SetValue(a),
                                                                 _ => { },
                                                                 _ => { }
                                                                 )
                })
                                 .Select(x =>
                {
                    var result = new
                    {
                        x.Factory,
                        x.Handler,
                        x.Arg,
                        Probe = x.Factory.Build()
                    };

                    result.Handler.Value(x.Arg);

                    return(result);
                })
                                 .Select(x =>
                {
                    var result = new
                    {
                        x.Probe,
                        x.Handler
                    };

                    x.Probe.Trigger();

                    return(result);
                })
                                 .Where(x => x.Probe.Resolved)
                                 .OrderBy(x => x.Probe.Value.Length)
                                 .LastOrDefault();

                return(handlerAny?.Handler ?? ResolveHandler(AmbiguityResolverEnum.FirstMatch, buffer, next,
                                                             lastToken, handlers));

            default:
                throw new ArgumentOutOfRangeException();
            }
        }
Esempio n. 4
0
 public LexerBuilderWithNilNode(AmbiguityResolverEnum ambiguityResolver)
 {
     _ambiguityResolver = ambiguityResolver;
 }
Esempio n. 5
0
 public ILexerBuilderWithNilNode <T> WithAmbiguityResolverEnum(AmbiguityResolverEnum ambiguityResolver)
 {
     return(new LexerBuilderWithNilNode <T>(ambiguityResolver));
 }