package visiteur;

/*
 * En plus de ce qui est demandé dans l'énoncé, on gère les priorité des
 * opérateurs de sorte à ne pas mettre de parenthèse superflue.
 */

@Exercice(4)
public class DisplayVisitor extends AbstractVisitor {

	int priority=0;
	
	public void visit(Addition e) {
		int p=priority;
		if(p>0)
			System.out.print('(');
		priority=0;
		e.getLChild().accept(this);
		System.out.print('+');
		priority=1;
		e.getRChild().accept(this);
		if(p>0)
			System.out.print(')');
	}

	public void visit(Substraction e) {
		int p=priority;
		if(p>0)
			System.out.print('(');
		priority=0;
		e.getLChild().accept(this);
		System.out.print('-');
		priority=1;
		e.getRChild().accept(this);
		if(p>0)
			System.out.print(')');
	}

	public void visit(Division e) {
		int p=priority;
		if(p>1)
			System.out.print('(');
		priority=1;
		e.getLChild().accept(this);
		System.out.print('/');
		priority=2;
		e.getRChild().accept(this);
		if(p>1)
			System.out.print(')');
	}

	public void visit(Multiplication e) {
		int p=priority;
		if(p>1)
			System.out.print('(');
		priority=1;
		e.getLChild().accept(this);
		System.out.print('*');
		priority=2;
		e.getRChild().accept(this);
		if(p>1)
			System.out.print(')');
	}

	public void visit(Value e) {
		System.out.print(e.getValue());
	}

	public void visit(Variable e) {
		System.out.print(e.getValue());
	}

}
