abstract class Component
{
abstract void print();
}
class Constant extends Component
{
public int number;
public Constant(int arg)
{
number = arg;
}
public void print()
{
System.out.print(number);
}
}
class Variable extends Component
{
public char var;
public Variable(char arg)
{
var = arg;
}
public void print()
{
System.out.print(var);
}
}
class Operator extends Component
{
public char op;
public Operator(char arg)
{
op = arg;
}
public void print()
{
System.out.print(op);
}
}
class BinaryExpression extends Component
{
Component[] components = new Component[3];
BinaryExpression(Component arg1, Operator op, Component arg2)
{
components[0] = arg1;
components[1] = op;
components[2] = arg2;
}
public void print()
{
if ( components != null )
{
System.out.print("(");
for ( int k = 0; k < components.length; k++ )
{
components[k].print();
}
System.out.print(")");
}
}
}
public class Test
{
public static void main(String args[])
{
Component[] arg = new Component[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].print();
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].print();
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].print();
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].print();
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
*/
Attachment: image/jpeg
Attachment: image/jpeg
Attachment: image/jpeg
Attachment: image/jpeg
abstract 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
*/