/* ======================================================== */
/* == POD 98-99 --                                          */
/* -------------------------------------------------------- */
/* == Des expressions arithmetiques                         */
/* On definit une hierarchie de classes pour les            */
/* expressions arithmetiques.                               */
/* On voudra que les expressions soient persistantes        */
/* ======================================================== */

import java.io.Serializable;

/** 
    La classe abstraite
    Implemente 'Serializable' pour rendre ses instances
    persistantes.
*/
abstract class Arith implements Serializable 
{ 
    // Methode d'evaluation
    abstract public int eval ();
    // Redefinition : no comment
    abstract public String toString ();
}

/**
   Les constantes entieres
*/
class Entier extends Arith 
{

    // Valeur de l'entier
    private int val ;

    // Constructeur
    public Entier (int i) { val=i; }

    // Evaluation
    public int eval () { return val; }
    // No comment
    public String toString() { return String.valueOf(val); }
}

/**
   Une classe abstraite pour les expressions binaires
*/
abstract class BinExp extends Arith 
{
    // Les deux operandes
    protected Arith op1,op2;
    // Un symbole pour l'operateur
    protected String oper;

    // No comment
    public String toString () 
    { return "(" + op1.toString() + oper + op2.toString() + ")"; }
}

/**
   L'addition
*/
class Plus extends BinExp 
{
    // Constructeur
    public Plus(Arith e1,Arith e2) { op1=e1; op2=e2; oper="+"; }
     
    // Evaluation
    public int eval() { return (op1.eval() + op2.eval()); }
}

/**
   La multiplication
*/
class Times extends BinExp 
{
    // Constructeur
    public Times(Arith e1,Arith e2) { op1=e1; op2=e2; oper="*"; }
     
    // Evaluation
    public int eval() { return (op1.eval() * op2.eval()); }
}

/* etc ... */

