1 package org.apidesign.visitor;
3 public final class Language {
6 public interface Expression {
7 public abstract void visit(Visitor v);
9 public interface Plus extends Expression {
10 public Expression getFirst();
11 public Expression getSecond();
13 public interface Number extends Expression {
14 public int getValue();
17 public interface Minus extends Expression {
18 public Expression getFirst();
19 public Expression getSecond();
22 // BEGIN: visitor.clientprovider.v3
24 public interface Real extends Expression {
25 public double getValue();
27 public static abstract class Visitor {
32 public static Visitor create(Version30 v) {
37 public interface Version30 {
38 public boolean visitUnknown(Expression e);
39 public void visitPlus(Plus s);
40 public void visitMinus(Minus s);
41 public void visitReal(Real r);
45 public abstract void dispatchReal(Real r);
47 // FINISH: visitor.clientprovider.v3
49 public static Visitor create(Version20 v) {
54 public interface Version20 extends Version10 {
55 public void visitMinus(Minus m);
60 public abstract void dispatchNumber(Number n);
62 public static Visitor create(Version10 v) {
66 public interface Version10 {
67 public boolean visitUnknown(Expression e);
68 public void visitPlus(Plus s);
69 public void visitNumber(Number n);
72 public abstract void dispatchPlus(Plus p);
73 public abstract void dispatchMinus(Minus m);
76 // BEGIN: visitor.clientprovider.dispatch.v3.l1
77 static Visitor create10(final Visitor.Version10 v) {
78 return new Visitor() {
80 public void dispatchPlus(Plus p) {
85 public void dispatchNumber(Number n) {
90 public void dispatchMinus(Minus m) {
91 if (v.visitUnknown(m)) {
92 m.getFirst().visit(this);
93 m.getSecond().visit(this);
98 public void dispatchReal(Real r) {
103 // END: visitor.clientprovider.dispatch.v3.l1
104 // BEGIN: visitor.clientprovider.dispatch.v3.l2
105 static Visitor create20(final Visitor.Version20 v) {
106 return new Visitor() {
108 public void dispatchPlus(Plus p) {
113 public void dispatchNumber(Number n) {
118 public void dispatchMinus(Minus m) {
123 public void dispatchReal(Real r) {
128 // END: visitor.clientprovider.dispatch.v3.l2
129 // BEGIN: visitor.clientprovider.dispatch.v3.l3
130 static Visitor create30(final Visitor.Version30 v) {
131 return new Visitor() {
133 public void dispatchReal(Real r) {
138 public void dispatchNumber(final Number n) {
139 class RealWrapper implements Real {
140 public double getValue() {
143 public void visit(Visitor v) {
147 v.visitReal(new RealWrapper());
151 public void dispatchPlus(Plus p) {
156 public void dispatchMinus(Minus m) {
161 // END: visitor.clientprovider.dispatch.v3.l3