Esempio n. 1
0
        public RuleSelector(IObservable <dynamic> parsers, IObservable <Grammar> grammars)
        {
            var entrypoints = parsers
                              .Zip(grammars, (parser, grammar) => new { parser, grammar })
                              .Select(p =>
            {
                var list = new List <ParserEntrypoint>();

                if (p.grammar != null)
                {
                    var rules = PublicRuleFinder.Find(p.grammar);

                    if (rules.StartRule != null)
                    {
                        list.Add(new StartRuleEntrypoint(p.parser, rules.StartRule));
                    }

                    list.AddRange(rules.PublicRules.Select(rule => new PublicRuleEntrypoint(p.parser, rule)));
                    list.AddRange(rules.ExportedRules.Select(rule => new ExportedRuleEntrypoint(p.parser, rule)));
                }

                return(list);
            });

            this.SelectedEntrypoints = this.WhenAny(x => x.SelectedEntrypoint, selectedEntrypoint => selectedEntrypoint.GetValue());

            var intentDetector = Observable.CombineLatest(
                entrypoints,
                this.SelectedEntrypoints.StartWith(default(ParserEntrypoint)),
                this.SelectedEntrypoints.Where(e => e != null).StartWith(default(ParserEntrypoint)),
                (list, current, intent) => new { list, current, intent });

            this.disposable = new CompositeDisposable(
                entrypoints.BindTo(this, x => x.Entrypoints),
                intentDetector.Subscribe(tuple =>
            {
                if (tuple.current == null && tuple.list.Count > 0)
                {
                    ParserEntrypoint intended = null;
                    if (tuple.intent != null)
                    {
                        intended = tuple.list.Where(e => ParserEntrypointEqualityComparer.Instance.Equals(e, tuple.intent)).FirstOrDefault();
                    }

                    intended = intended ?? tuple.list.FirstOrDefault();

                    if (intended != null)
                    {
                        this.SelectedEntrypoint = intended;
                    }
                }
            }));
        }
Esempio n. 2
0
 public ExportedRuleEntrypoint(object parser, Rule rule)
     : base("Exported." + PublicRuleFinder.GetPublicName(rule), rule)
 {
     this.parser = parser;
 }
Esempio n. 3
0
 public PublicRuleEntrypoint(object parser, Rule rule)
     : base("Parse" + PublicRuleFinder.GetPublicName(rule), rule)
 {
     this.parser     = parser;
     this.methodInfo = parser?.GetType().GetMethod(this.Name);
 }