On reprend le programme de calcul d'expressions arithmétiques préfixées du cours. Soient les programmes suivants :
Fichier : Essai2.java
import java.applet.*;
import java.awt.*;
import java.awt.event.*;
public class Essai2 extends java.applet.Applet {
TextField ligne = new TextField ("Votre expression") ;
String res = "Debut" ;
ActionListener RC = new ActionListener() {
public void actionPerformed(ActionEvent e) {
if (e.getSource() == ligne) agir(ligne.getText());
}
};
public void init () {
add (new Label (" Une expression en notation prefixee S.V.P."));
add (ligne) ;
}
void agir (String lu) {
LectExpAr lec = new LectExpAr (lu) ;
ExpAr ex = lec.lpf() ;
res = ex.scp() + " = " + ex.eval() ;
repaint();
}
public void paint (Graphics g) {
g.drawString(res, 50, 100) ;
}
}
Fichier : LectExpAr.java
public class LectExpAr {
char [] buflu ; // la chaine qui sera lue (ya pas de streams en Java !=)
int indlu ; // index parcourant la chaine lue
public LectExpAr (String lu) {buflu = lu.toCharArray() ; indlu = 0;}
ExpAr lpf () { // le moteur r\'ecursif
char carlu = buflu[indlu] ;
indlu++ ;
switch (carlu)
{case '+' : return new Add(lpf(), lpf());
case '*' : return new Mult (lpf(), lpf());
/* sinon c'est une constante */
default : return new Cte((int) carlu - (int) '0') ;
}
}
}
abstract class ExpAr { // classe abstraite racine de l'arbre d'heritage
abstract int eval () ;
abstract String scp () ;
}
class Cte extends ExpAr { // premiere sous-classe concrete
int val ;
Cte (int v) {val = v ;}
int eval () { return val ;}
String scp () {return (new Integer(val)).toString() ;}
}
abstract class Bin extends ExpAr {
ExpAr og, od ;
abstract int oper (int g , int d) ;
abstract String cop () ;
int eval () {return oper (og.eval(), od.eval()) ;}
String scp () {return ("("+ og.scp() + cop() + od.scp() +")") ; }
void init (ExpAr g, ExpAr d) {og = g ;od = d ;}
}
class Add extends Bin {
Add (ExpAr g, ExpAr d) {init (g, d) ;}
int oper (int g, int d) {return (g+d) ;}
String cop () {return ("+") ;}
}
class Mult extends Bin {
Mult (ExpAr g, ExpAr d) {init (g, d) ;}
int oper (int g, int d) {return (g*d) ;}
String cop () {return ("*") ;}
}
*+34+56 dans le champ entrée?
/+34-33?
Env contenant un champs tableau d'ExpAr.
Puis on modifie la
classe abstraite EpxAr et les classes dérivées pour que la méthode
eval prenne un argument de la classe Env.
C00 contient +3C11 et la case
C11 l'expression
*C005.
ExpAr.