Each rule is composed of a Filter, to choose which parts the rule applies to,
and a Rule, to specify the parameters these parts must conform to. Both the
Filter and the Rule will be the same data structure: let's call it a Range,
to choose a word at random.
A Range:
1. Can be composed of other ranges, by AND, OR and NOT operators, or
2. Is composed of:
o A textual attribute name that makes sense for the given components
o An operator: <, <=, ==, >=, >, %, "matches", "is present" (unary)
o An integer value for the integral operators
o A string value for the "matches" operator
The string value would support the wildcards ? and * for single- and multi-
character matching.