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
.