S → E eof |
E → E + E
E → E - E
E → E * E
E → E / E
E → int E → ( E ) |
E → let id = E in E
E → id |
S → E eof |
E → P E → E + P E → E - P |
P → F P → P * F P → P / F |
F → int F → ( E ) |
private
aux champs et méthodes de la class Instit
.Token
,
Lexer
et Instit
en un
package de nom expr.Token.LET
, Token.EQ
,
Token.IN
et Token.ID
.
class A { void f() { System.out.println("Je suis f de A") ; } void g() { f() ; } } |
class B extends A { void h() { g() ; } public static void main (String [] argv) { B b = new B () ; b.h() ; } } |
class B extends A { void f() { System.out.println("Je suis f de B") ; } public static void main (String [] argv) { B b = new B () ; b.g() ; } } |
class B extends A { void f() { System.out.println("Je suis f de B") ; } void h() { g() ; } public static void main (String [] argv) { A a = new B () ; a.g() ; a.h() ; B b = a ; b.g() ; b.h() ; } } |
class List { private String var ; private int val ; private List next ; List (String var, int val, List next) { this.var = var ; this.val = val ; this.next = next ; } } |
int
) associée à une
variable (type String
) par une méthode assoc.
List
ne sont plus
privés, montrer que la terminaison de assoc n'est plus garantie.
interface
de Java (voir la PC 1)
interface Env { void add(String v, int i) ; // Ajouter la liaison v → i. int get(String v) ; // Renvoie la valeur associée à v. } |
Env
. Comment sera nécessairement
représenté l'environnement vide ?
abstract class Expr { abstract int eval(Env e) ; } |
Expr
? À quoi
peut elle bien servir ? Quand nous sommes nous déjà servi d'une classe
abstraite ?Mul
, Div
,
etc. et munies de
constructeurs raisonnables. Écrire la méthode
parseP qui
cette fois renvoie l'arbre de syntaxe abstraite correspondant à
l'entrée analysée.Int
, Id
et
Let
comme des classes héritant de Expr
.
On leur donnera une méthode
toString dont on précisera si elle est une extension ou une
redéfinition.
On s'attachera à bien détailller leur
méthode eval après avoir examiné le cas de
let x = 1 in (let x = x+x in x+x) + x.Expr
, mais on choisit de définir
une classe intermédiaire :
abstract class Binop extends Expr { Expr arg1, arg2 ; Binop(Expr arg1, Expr arg2) { this.arg1 = arg1 ; this.arg2 = arg2 ; } abstract String getOp() ; public String toString() { return getOp() + "(" + arg1 + ", " + arg2 + ")" ; } } |
Add
et Sub
. Comment
justifier la classe intermédiaire Binop
?Ce document a été traduit de LATEX par HEVEA et HACHA.