|
|
@@ -38,9 +38,24 @@ public partial class Rule
|
|
|
throw new Exception("Rule should always match");
|
|
|
}
|
|
|
|
|
|
+ public IEnumerable<RuleResultRange> Apply(PartRange p)
|
|
|
+ {
|
|
|
+ var range = p;
|
|
|
+ foreach (var item in _items)
|
|
|
+ {
|
|
|
+ var result = item.Apply(range).ToList();
|
|
|
+ yield return result.First();
|
|
|
+ if (result.Count > 1)
|
|
|
+ {
|
|
|
+ range = result.Last().Part;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
private interface IRuleItem
|
|
|
{
|
|
|
string? Apply(Part p);
|
|
|
+ IEnumerable<RuleResultRange> Apply(PartRange p);
|
|
|
}
|
|
|
|
|
|
private class Item : IRuleItem
|
|
|
@@ -72,6 +87,35 @@ public partial class Rule
|
|
|
|
|
|
return null;
|
|
|
}
|
|
|
+
|
|
|
+ public IEnumerable<RuleResultRange> Apply(PartRange p)
|
|
|
+ {
|
|
|
+ var range = p.Get(_property);
|
|
|
+
|
|
|
+ if (_op == "<")
|
|
|
+ {
|
|
|
+ yield return new RuleResultRange(
|
|
|
+ p.Update(_property, range.LessThan(_value)),
|
|
|
+ _next
|
|
|
+ );
|
|
|
+ yield return new RuleResultRange(
|
|
|
+ p.Update(_property, range.GreaterThan(_value - 1)),
|
|
|
+ null
|
|
|
+ );
|
|
|
+ }
|
|
|
+
|
|
|
+ if (_op == ">")
|
|
|
+ {
|
|
|
+ yield return new RuleResultRange(
|
|
|
+ p.Update(_property, range.GreaterThan(_value)),
|
|
|
+ _next
|
|
|
+ );
|
|
|
+ yield return new RuleResultRange(
|
|
|
+ p.Update(_property, range.LessThan(_value + 1)),
|
|
|
+ null
|
|
|
+ );
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
public override string ToString()
|
|
|
{
|
|
|
@@ -93,6 +137,11 @@ public partial class Rule
|
|
|
return _next;
|
|
|
}
|
|
|
|
|
|
+ public IEnumerable<RuleResultRange> Apply(PartRange p)
|
|
|
+ {
|
|
|
+ yield return new RuleResultRange(p, _next);
|
|
|
+ }
|
|
|
+
|
|
|
public override string ToString()
|
|
|
{
|
|
|
return $"Terminal<{_next}>";
|