1 package org.apidesign.visitor;
3 public final class Language {
8 public static abstract class Expression {
13 public abstract void visit(Visitor v);
16 public static final class Plus extends Expression {
18 private final Expression first;
19 private final Expression second;
21 public Plus(Expression first, Expression second) {
26 public Expression getFirst() {
30 public Expression getSecond() {
35 public void visit(Visitor v) {
36 if (v instanceof Visitor1_0) {
37 ((Visitor1_0) v).visitPlus(this);
38 } else if (v instanceof Visitor3_0) {
39 ((Visitor3_0) v).visitPlus(this);
46 public static final class Number extends Expression {
48 private final int value;
50 public Number(int value) {
54 public int getValue() {
59 public void visit(Visitor v) {
60 if (v instanceof Visitor1_0) {
61 ((Visitor1_0) v).visitNumber(this);
62 } else if (v instanceof Visitor3_0) {
63 Real wrapper = new Real(getValue());
64 ((Visitor3_0) v).visitReal(wrapper);
71 public static final class Minus extends Expression {
72 private final Expression first;
73 private final Expression second;
75 public Minus(Expression first, Expression second) {
79 public Expression getFirst() { return first; }
80 public Expression getSecond() { return second; }
82 public void visit(Visitor v) {
83 if (v instanceof Visitor2_0) {
84 ((Visitor2_0)v).visitMinus(this);
85 } else if (v instanceof Visitor3_0) {
86 ((Visitor3_0)v).visitMinus(this);
92 // BEGIN: visitor.nonmonotonic.real
94 public static final class Real extends Expression {
95 private final double value;
96 public Real(double value) {
99 public double getValue() {
102 public void visit(Visitor v)
103 // FINISH: visitor.nonmonotonic.real
109 public interface Visitor {
110 public void visitUnknown(Expression e);
112 public interface Visitor1_0 extends Visitor {
113 public void visitPlus(Plus s);
114 public void visitNumber(Number n);
117 public interface Visitor2_0 extends Visitor {
118 public void visitMinus(Minus s);
120 // BEGIN: visitor.nonmonotonic.visitor
122 public interface Visitor3_0 extends Visitor {
123 public void visitPlus(Plus s);
124 public void visitMinus(Minus s);
125 public void visitReal(Real r);
127 // END: visitor.nonmonotonic.visitor