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.