samples/visitor/11-cleanversion/src-api3.0/org/apidesign/visitor/Language.java
author Jaroslav Tulach <jtulach@netbeans.org>
Sat, 14 Jun 2008 09:59:01 +0200
changeset 173 db68b5a2636f
parent 172 bb543d116467
child 174 3f3e772ccd52
permissions -rw-r--r--
Wrapper around Real is OK
     1 package org.apidesign.visitor;
     2 
     3 public final class Language {
     4 
     5     private Language() {
     6     }
     7 
     8     public static abstract class Expression {
     9 
    10         Expression() {
    11         }
    12 
    13         public abstract void visit(Visitor v);
    14     }
    15 
    16     public static final class Plus extends Expression {
    17 
    18         private final Expression first;
    19         private final Expression second;
    20 
    21         public Plus(Expression first, Expression second) {
    22             this.first = first;
    23             this.second = second;
    24         }
    25 
    26         public Expression getFirst() {
    27             return first;
    28         }
    29 
    30         public Expression getSecond() {
    31             return second;
    32         }
    33 
    34         @Override
    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);
    40             } else {
    41                 v.visitUnknown(this);
    42             }
    43         }
    44     }
    45 
    46     public static final class Number extends Expression {
    47 
    48         private final int value;
    49 
    50         public Number(int value) {
    51             this.value = value;
    52         }
    53 
    54         public int getValue() {
    55             return value;
    56         }
    57 
    58         @Override
    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);
    65             } else {
    66                 v.visitUnknown(this);
    67             }
    68         }
    69     }
    70     /** @since 2.0 */
    71     public static final class Minus extends Expression {
    72         private final Expression first;
    73         private final Expression second;
    74         
    75         public Minus(Expression first, Expression second) {
    76             this.first = first;
    77             this.second = second;
    78         }
    79         public Expression getFirst() { return first; }
    80         public Expression getSecond() { return second; }
    81         
    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);
    87             } else {
    88                 v.visitUnknown(this);
    89             }
    90         }
    91     }
    92     // BEGIN: visitor.nonmonotonic.real
    93     /** @since 3.0 */
    94     public static final class Real extends Expression {
    95         private final double value;
    96         public Real(double value) {
    97             this.value = value;
    98         }
    99         public double getValue() {
   100             return value;
   101         }
   102         public void visit(Visitor v)
   103         // FINISH: visitor.nonmonotonic.real
   104         {
   105         }
   106     }
   107 
   108     
   109     public interface Visitor {
   110         public void visitUnknown(Expression e);
   111     }
   112     public interface Visitor1_0 extends Visitor {
   113         public void visitPlus(Plus s);
   114         public void visitNumber(Number n);
   115     }
   116     /** @since 2.0 */
   117     public interface Visitor2_0 extends Visitor {
   118         public void visitMinus(Minus s);
   119     }
   120     // BEGIN: visitor.nonmonotonic.visitor
   121     /** @since 3.0 */
   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);
   126     }
   127     // END: visitor.nonmonotonic.visitor
   128 }