samples/visitor/11-cleanversion/src-api3.0/org/apidesign/visitor/Language.java
author Jaroslav Tulach <jtulach@netbeans.org>
Sat, 14 Jun 2008 09:58:56 +0200
changeset 171 2496512220b7
parent 170 206cdfeefeec
child 172 bb543d116467
permissions -rw-r--r--
Need to copy the code also to 3.0 version
     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 {
    39                 v.visitUnknown(this);
    40             }
    41         }
    42     }
    43 
    44     public static final class Number extends Expression {
    45 
    46         private final int value;
    47 
    48         public Number(int value) {
    49             this.value = value;
    50         }
    51 
    52         public int getValue() {
    53             return value;
    54         }
    55 
    56         @Override
    57         public void visit(Visitor v) {
    58             if (v instanceof Visitor1_0) {
    59                 ((Visitor1_0) v).visitNumber(this);
    60             } else {
    61                 v.visitUnknown(this);
    62             }
    63         }
    64     }
    65     /** @since 2.0 */
    66     public static final class Minus extends Expression {
    67         private final Expression first;
    68         private final Expression second;
    69         
    70         public Minus(Expression first, Expression second) {
    71             this.first = first;
    72             this.second = second;
    73         }
    74         public Expression getFirst() { return first; }
    75         public Expression getSecond() { return second; }
    76         
    77         public void visit(Visitor v) { 
    78             if (v instanceof Visitor2_0) {
    79                 ((Visitor2_0)v).visitMinus(this);
    80             } else {
    81                 v.visitUnknown(this);
    82             }
    83         }
    84     }
    85     // BEGIN: visitor.nonmonotonic.real
    86     /** @since 3.0 */
    87     public final class Real extends Expression {
    88         private final double value;
    89         public Real(double value) {
    90             this.value = value;
    91         }
    92         public double getValue() {
    93             return value;
    94         }
    95         public void visit(Visitor v)
    96         // FINISH: visitor.nonmonotonic.real
    97         {
    98         }
    99     }
   100 
   101     
   102     public interface Visitor {
   103         public void visitUnknown(Expression e);
   104     }
   105     public interface Visitor1_0 extends Visitor {
   106         public void visitPlus(Plus s);
   107         public void visitNumber(Number n);
   108     }
   109     /** @since 2.0 */
   110     public interface Visitor2_0 extends Visitor {
   111         public void visitMinus(Minus s);
   112     }
   113     // BEGIN: visitor.nonmonotonic.visitor
   114     /** @since 3.0 */
   115     public interface Visitor3_0 extends Visitor {
   116         public void visitPlus(Plus s);
   117         public void visitMinus(Minus s);
   118         public void visitReal(Number n);
   119     }
   120     // END: visitor.nonmonotonic.visitor
   121 }