예제 #1
0
 private void RuleSpecsChanged(object sender, NotifyCollectionChangedEventArgs e)
 {
     if (e.OldStartingIndex > -1)
     {
         PatternNode <TData, TOffset> startNode = _pattern.Children.ElementAt(e.OldStartingIndex);
         foreach (Pattern <TData, TOffset> node in startNode.GetNodes().Take(e.OldItems.Count).Cast <Pattern <TData, TOffset> >().ToArray())
         {
             _ruleIds.Remove(node.Name);
             node.Remove();
         }
     }
     if (e.NewStartingIndex > -1)
     {
         PatternNode <TData, TOffset> startNode = e.NewStartingIndex == 0 ? _pattern.Children.Begin : _pattern.Children.ElementAt(e.NewStartingIndex - 1);
         foreach (IPatternRuleSpec <TData, TOffset> rs in e.NewItems)
         {
             IPatternRuleSpec <TData, TOffset> ruleSpec = rs;
             string id = "rule" + _curRuleId++;
             _ruleIds[id] = ruleSpec;
             var subpattern = new Pattern <TData, TOffset>(id, ruleSpec.Pattern.Children.DeepClone())
             {
                 Acceptable = match => ruleSpec.IsApplicable(match.Input) && ruleSpec.Pattern.Acceptable(match)
             };
             startNode.AddAfter(subpattern);
             startNode = subpattern;
         }
     }
 }
예제 #2
0
 public PatternRule(SpanFactory <TOffset> spanFactory, IPatternRuleSpec <TData, TOffset> ruleSpec,
                    MatcherSettings <TOffset> matcherSettings)
 {
     _spanFactory = spanFactory;
     _ruleSpec    = ruleSpec;
     _matcher     = new Matcher <TData, TOffset>(spanFactory, _ruleSpec.Pattern, matcherSettings);
 }
예제 #3
0
        public TData ApplyRhs(PatternRule <TData, TOffset> rule, Match <TData, TOffset> match)
        {
            IPatternRuleSpec <TData, TOffset> ruleSpec = _ruleIds[match.PatternPath.First()];
            var newMatch = new Match <TData, TOffset>(match.Matcher, match.Span, match.Input, match.GroupCaptures, match.PatternPath.Skip(1).ToArray(),
                                                      match.VariableBindings, match.NextAnnotation);

            return(ruleSpec.ApplyRhs(rule, newMatch));
        }
예제 #4
0
 public MultiplePatternRule(SpanFactory <TOffset> spanFactory, IPatternRuleSpec <TData, TOffset> ruleSpec)
     : base(spanFactory, ruleSpec)
 {
 }
예제 #5
0
 public MultiplePatternRule(SpanFactory <TOffset> spanFactory, IPatternRuleSpec <TData, TOffset> ruleSpec, MatcherSettings <TOffset> matcherSettings)
     : base(spanFactory, ruleSpec, matcherSettings)
 {
 }
예제 #6
0
 public SimultaneousPatternRule(SpanFactory <TOffset> spanFactory, IPatternRuleSpec <TData, TOffset> ruleSpec)
     : base(spanFactory, ruleSpec)
 {
 }
예제 #7
0
 public PatternRule(SpanFactory <TOffset> spanFactory, IPatternRuleSpec <TData, TOffset> ruleSpec)
     : this(spanFactory, ruleSpec, new MatcherSettings <TOffset>())
 {
 }
예제 #8
0
		public MultiplePatternRule(IPatternRuleSpec<TData, TOffset> ruleSpec)
			: base(ruleSpec)
		{
		}
예제 #9
0
		public MultiplePatternRule(IPatternRuleSpec<TData, TOffset> ruleSpec, MatcherSettings<TOffset> matcherSettings)
			: base(ruleSpec, matcherSettings)
		{
		}
예제 #10
0
 public PatternRule(IPatternRuleSpec <TData, TOffset> ruleSpec, MatcherSettings <TOffset> matcherSettings)
 {
     _ruleSpec = ruleSpec;
     _matcher  = new Matcher <TData, TOffset>(_ruleSpec.Pattern, matcherSettings);
 }
예제 #11
0
 public PatternRule(IPatternRuleSpec <TData, TOffset> ruleSpec)
     : this(ruleSpec, new MatcherSettings <TOffset>())
 {
 }
예제 #12
0
 public IterativePatternRule(SpanFactory <TOffset> spanFactory, IPatternRuleSpec <TData, TOffset> ruleSpec)
     : base(spanFactory, ruleSpec)
 {
 }