bstract class Visitor
{
public abstract void visitConstant(Constant c);
public abstract void visitOperator(Operator c);
public abstract void visitVariable(Variable c);
public abstract void visitBinaryExpression(BinaryExpression c);

}

class Print extends Visitor
{
public void visitConstant(Constant c) { c.print(); }
public void visitOperator(Operator c) { c.print(); }
public void visitVariable(Variable c) { c.print(); }
public void visitBinaryExpression(BinaryExpression c) { c.print();
}

}

abstract class Element
{
public abstract void accept(Visitor v);
}

class Constant extends Element
{
public int number = 0;

public Constant(int arg)
{
number = arg;
}

public void accept(Visitor v) { v.visitConstant(this); }

public void print()
{
System.out.print(number);
}
}

class Variable extends Element
{

public char var;

public Variable(char arg)
{
var = arg;
}

public void print()
{
System.out.print(var);
}

public void accept(Visitor v) { v.visitVariable(this); }

}

class Operator extends Element
{
public char op;

public Operator(char arg)
{
op = arg;
}

public void print()
{
System.out.print(op);
}

public void accept(Visitor v) { v.visitOperator(this); }

}

class BinaryExpression extends Element
{

Element[] elements = new Element[3];

BinaryExpression(Element arg1, Operator op, Element arg2)
{
elements[0] = arg1;
elements[1] = op;
elements[2] = arg2;
}

public void print()
{
Print visitorPrint = new Print();

if ( elements != null )
{
System.out.print("(");
for ( int k = 0; k < elements.length; k++ )
{
elements[k].accept(visitorPrint);
}
System.out.print(")");

}
}

public void accept(Visitor v) { v.visitBinaryExpression(this); }
}




import java.io.*;

public class Test{

public static void main( String args[] )
{


Print visitorPrint = new Print();

Element[] arg = new Element[11];

//Test 1: 2+3
arg[0] = new Constant(2);
arg[1] = new Operator('+');
arg[2] = new Constant(3);
arg[3] = new BinaryExpression(arg[0], (Operator) arg[1],
arg[2]);

System.out.print("Test1: ");
arg[3].accept(visitorPrint);
System.out.println();

//Test 2: 2-(3*4)
arg[0] = new Constant(2);
arg[1] = new Operator('-');
arg[2] = new Constant(3);
arg[3] = new Operator('*');
arg[4] = new Constant(4);
arg[5] = new BinaryExpression(arg[2], (Operator) arg[3],
arg[4]);
arg[6] = new BinaryExpression(arg[0], (Operator) arg[1],
arg[5]);

System.out.print("Test2: ");
arg[6].accept(visitorPrint);

System.out.println();

//Test 3: x+7
arg[0] = new Variable('x');
arg[1] = new Operator('+');
arg[2] = new Constant(7);
arg[3] = new BinaryExpression(arg[0], (Operator) arg[1],
arg[2]);

System.out.print("Test3: ");
arg[3].accept(visitorPrint);

System.out.println();

//Test4: ((x+(y/2))/((x/3)+y)
arg[0] = new Variable('x');
arg[1] = new Operator('+');
arg[2] = new Variable('y');
arg[3] = new Operator('/');
arg[4] = new Constant(2);
arg[5] = new Constant(3);
// y / 2
arg[6] = new BinaryExpression(arg[2], (Operator) arg[3],
arg[4]);
// x + y/2
arg[7] = new BinaryExpression(arg[0], (Operator) arg[1],
arg[6]);
// x / 3
arg[8] = new BinaryExpression(arg[0], (Operator) arg[3],
arg[5]);
// x/3 + y
arg[9] = new BinaryExpression(arg[8], (Operator) arg[1],
arg[2]);
// x+(y/2) / 
(x/3)+y
arg[10] = new BinaryExpression(arg[7], (Operator) arg[3],
arg[9]);

System.out.print("Test4: ");
arg[10].accept(visitorPrint);

System.out.println();
System.out.println();

}
}


/*
************* RESULTS ************


Test1: (2+3)
Test2: (2-(3*4))
Test3: (x+7)
Test4: ((x+(y/2))/((x/3)+y))

Process completed successfully

*/

Hosted by www.Geocities.ws

1