@Override public Node visit(Sequence node) { // Node result = new Sequence( node.a.accept(this), node.b); Node result = Sequence.getInstance( new SequenceChild(node.sequenceChild.a.accept(this), node.sequenceChild.b)); // Dc(AB) = Dc(A)B if A does not contain the empty string if (!node.sequenceChild.a.accept(nullable)) { return result; // Dc(AB) = Dc(A)B | Dc(B) if A contains the empty string } else { /* return new Or( result, // Dc(AB) node.sequenceChild.b.accept(this) // Dc(B) ); */ return Or.getInstance( new OrChild( result, // Dc(AB) node.sequenceChild.b.accept(this)) // Dc(B) ); } }
@Override public Node visit(OrChild node) { // Dc(A | B) = Dc(A) | Dc(B) // return new Or(node.a.accept(this), node.b.accept(this)); return Or.getInstance(new OrChild(node.a.accept(this), node.b.accept(this))); }