- public static Sequence rewritingSequence(Object tag, Element[] e, boolean[] drops, HashSet<Sequence> and, HashSet<Sequence> not) {
- return new RewritingSequence(tag, e, drops, and, not); }
+ public static Sequence create(Object head, Element[] e, boolean[] drop, boolean foster) {
+ return foster
+ ? new Unwrap(e, head, drop)
+ : new RewritingSequence(head, e, drop);
+ }
+
+ /** return a new sequence identical to this one, but with a positive conjunct <tt>s</tt> */
+ public Sequence and(Sequence s) {
+ if (s.in_a_union)
+ throw new RuntimeException("you may not use a sequence as a conjunct if it belongs to a Union");
+ Sequence ret = dup();
+ ret.needs.add(s);
+ s.needed_or_hated=true;
+ return ret;
+ }
+
+ /** return a new sequence identical to this one, but with a negative conjunct <tt>s</tt> */
+ public Sequence andnot(Sequence s) {
+ if (s.in_a_union)
+ throw new RuntimeException("you may not use a sequence as a conjunct if it belongs to a Union");
+ Sequence ret = dup();
+ ret.hates.add(s);
+ s.needed_or_hated=true;
+ return ret;
+ }
+
+ /** return a new sequence identical to this one, but with a follow-set restricted to <tt>a</tt> */
+ public Sequence followedBy(Atom a) { Sequence ret = dup(); ret.follow = a; return ret; }