/* La classe astratta Expr definisce parse tree per le espressioni. Le sottoclassi concrete si riferiscono ai tipi particolari di espressioni. In questa versione gli identificatori vengono posti in una symbol table. */ abstract class Expr { public abstract int calcola(); } class PiuExpr extends Expr { private Expr sx, dx; public PiuExpr(Expr sx, Expr dx) { this.sx = sx; this.dx = dx; } public int calcola() { return sx.calcola() + dx.calcola(); } public String toString() { return sx.toString() + " " + dx.toString() + " +"; } } class MenoExpr extends Expr { private Expr sx, dx; public MenoExpr(Expr sx, Expr dx) { this.sx = sx; this.dx = dx; } public int calcola() { return sx.calcola() - dx.calcola(); } public String toString() { return sx.toString() + " " + dx.toString() + " -"; } } class PerExpr extends Expr { private Expr sx, dx; public PerExpr(Expr sx, Expr dx) { this.sx = sx; this.dx = dx; } public int calcola() { return sx.calcola() * dx.calcola(); } public String toString() { return sx.toString() + " " + dx.toString() + " *"; } } class DivisoExpr extends Expr { private Expr sx, dx; public DivisoExpr(Expr sx, Expr dx) { this.sx = sx; this.dx = dx; } public int calcola() { return sx.calcola() / dx.calcola(); } public String toString() { return sx.toString() + " " + dx.toString() + " /"; } } class UnMenoExpr extends Expr { private Expr e; public UnMenoExpr(Expr e) { this.e = e; } public int calcola() { return -e.calcola(); } public String toString() { return e.toString() + "-"; } } class UnPiuExpr extends Expr { private Expr e; public UnPiuExpr(Expr e) { this.e = e; } public int calcola() { return e.calcola(); } public String toString() { return e.toString() + "+"; } } class NumExpr extends Expr { private Integer num; public NumExpr(Integer num) { this.num = num; } public int calcola() { return num.intValue(); } public String toString() { return num.toString(); } } class IdExpr extends Expr { private Descrittore descrittore; public IdExpr(Descrittore d) { descrittore = d; } public int calcola() { return descrittore.getValore(); } public String toString() { return descrittore.getIdentificatore(); } }