jtulach@177: package org.apidesign.visitor; jtulach@177: jtulach@177: public final class Language { jtulach@177: private Language() { } jtulach@177: jtulach@177: public interface Expression { jtulach@177: public abstract void visit(Visitor v); jtulach@177: } jtulach@177: public interface Plus extends Expression { jtulach@177: public Expression getFirst(); jtulach@177: public Expression getSecond(); jtulach@177: } jtulach@177: public interface Number extends Expression { jtulach@177: public int getValue(); jtulach@177: } jtulach@177: /** @since 2.0 */ jtulach@177: public interface Minus extends Expression { jtulach@177: public Expression getFirst(); jtulach@177: public Expression getSecond(); jtulach@177: } jtulach@177: jtulach@177: // BEGIN: visitor.clientprovider.v3 jtulach@177: /** @since 3.0 */ jtulach@177: public interface Real extends Expression { jtulach@177: public double getValue(); jtulach@177: } jtulach@177: public static abstract class Visitor { jtulach@177: Visitor() {} jtulach@177: jtulach@177: jtulach@177: /** @since 3.0 */ jtulach@266: public static Visitor create(Version30 v) { jtulach@266: return create30(v); jtulach@177: } jtulach@177: jtulach@177: /** @since 3.0 */ jtulach@266: public interface Version30 { jtulach@177: public boolean visitUnknown(Expression e); jtulach@177: public void visitPlus(Plus s); jtulach@177: public void visitMinus(Minus s); jtulach@177: public void visitReal(Real r); jtulach@177: } jtulach@177: jtulach@177: /** @since 3.0 */ jtulach@177: public abstract void dispatchReal(Real r); jtulach@177: jtulach@177: // FINISH: visitor.clientprovider.v3 jtulach@177: /** @since 2.0 */ jtulach@266: public static Visitor create(Version20 v) { jtulach@266: return create20(v); jtulach@177: } jtulach@177: jtulach@177: /** @since 2.0 */ jtulach@266: public interface Version20 extends Version10 { jtulach@177: public void visitMinus(Minus m); jtulach@177: } jtulach@177: jtulach@177: jtulach@177: /** @since 2.0 */ jtulach@177: public abstract void dispatchNumber(Number n); jtulach@177: jtulach@266: public static Visitor create(Version10 v) { jtulach@266: return create10(v); jtulach@177: } jtulach@177: jtulach@266: public interface Version10 { jtulach@177: public boolean visitUnknown(Expression e); jtulach@177: public void visitPlus(Plus s); jtulach@177: public void visitNumber(Number n); jtulach@177: } jtulach@177: jtulach@177: public abstract void dispatchPlus(Plus p); jtulach@177: public abstract void dispatchMinus(Minus m); jtulach@177: } jtulach@177: jtulach@177: // BEGIN: visitor.clientprovider.dispatch.v3.l1 jtulach@266: static Visitor create10(final Visitor.Version10 v) { jtulach@177: return new Visitor() { jtulach@177: @Override jtulach@177: public void dispatchPlus(Plus p) { jtulach@177: v.visitPlus(p); jtulach@177: } jtulach@177: jtulach@177: @Override jtulach@177: public void dispatchNumber(Number n) { jtulach@177: v.visitNumber(n); jtulach@177: } jtulach@177: jtulach@177: @Override jtulach@177: public void dispatchMinus(Minus m) { jtulach@177: if (v.visitUnknown(m)) { jtulach@177: m.getFirst().visit(this); jtulach@177: m.getSecond().visit(this); jtulach@177: } jtulach@177: } jtulach@177: jtulach@177: @Override jtulach@177: public void dispatchReal(Real r) { jtulach@177: v.visitUnknown(r); jtulach@177: } jtulach@177: }; jtulach@177: } jtulach@177: // END: visitor.clientprovider.dispatch.v3.l1 jtulach@177: // BEGIN: visitor.clientprovider.dispatch.v3.l2 jtulach@266: static Visitor create20(final Visitor.Version20 v) { jtulach@177: return new Visitor() { jtulach@177: @Override jtulach@177: public void dispatchPlus(Plus p) { jtulach@177: v.visitPlus(p); jtulach@177: } jtulach@177: jtulach@177: @Override jtulach@177: public void dispatchNumber(Number n) { jtulach@177: v.visitNumber(n); jtulach@177: } jtulach@177: jtulach@177: @Override jtulach@177: public void dispatchMinus(Minus m) { jtulach@177: v.visitMinus(m); jtulach@177: } jtulach@177: jtulach@177: @Override jtulach@177: public void dispatchReal(Real r) { jtulach@177: v.visitUnknown(r); jtulach@177: } jtulach@177: }; jtulach@177: } jtulach@177: // END: visitor.clientprovider.dispatch.v3.l2 jtulach@177: // BEGIN: visitor.clientprovider.dispatch.v3.l3 jtulach@266: static Visitor create30(final Visitor.Version30 v) { jtulach@177: return new Visitor() { jtulach@177: @Override jtulach@177: public void dispatchReal(Real r) { jtulach@177: v.visitReal(r); jtulach@177: } jtulach@177: jtulach@177: @Override jtulach@177: public void dispatchNumber(final Number n) { jtulach@177: class RealWrapper implements Real { jtulach@177: public double getValue() { jtulach@177: return n.getValue(); jtulach@177: } jtulach@177: public void visit(Visitor v) { jtulach@177: n.visit(v); jtulach@177: } jtulach@177: } jtulach@177: v.visitReal(new RealWrapper()); jtulach@177: } jtulach@177: jtulach@177: @Override jtulach@177: public void dispatchPlus(Plus p) { jtulach@177: v.visitPlus(p); jtulach@177: } jtulach@177: jtulach@177: @Override jtulach@177: public void dispatchMinus(Minus m) { jtulach@177: v.visitMinus(m); jtulach@177: } jtulach@177: }; jtulach@177: } jtulach@177: // END: visitor.clientprovider.dispatch.v3.l3 jtulach@177: }