Sedmý domácí úkol

Uvažujte následující strukturu tříd podporující návrhový vzor návštěvník (visitor):

interface ExpressionVisitor {
    void visitNumber(Number n);
    void visitAddition(Addition a);
    void visitSubtraction(Subtraction s);
    void visitUnaryMinus(UnaryMinus u);
}
 
interface Expression {
    void accept(ExpressionVisitor v);
}
 
class Number implements Expression {
    final int num;
 
    Number(int n) { num = n; }
    int getNumber() { return num; }
 
    public void accept(ExpressionVisitor v) {
        v.visitNumber(this);
    }
}
 
class Addition implements Expression {
    final Expression left, right;
 
    Addition(Expression l, Expression r) {
        left = l; right = r;
    }
 
    Expression getLeftSubexpression() {
        return left;
    }
 
    Expression getRightSubexpression() {
        return right;
    }
 
    public void accept(ExpressionVisitor v) {
        v.visitAddition(this);
    }
}
 
class Subtraction implements Expression {
    final Expression left, right;
 
    Subtraction(Expression l, Expression r) {
        left = l; right = r;
    }
 
    Expression getLeftSubexpression() {
        return left;
    }
 
    Expression getRightSubexpression() {
        return right;
    }
 
    public void accept(ExpressionVisitor v) {
        v.visitSubtraction(this);
    }
}
 
class UnaryMinus implements Expression {
    final Expression expr;
 
    UnaryMinus(Expression e) {
        expr = e;
    }
 
    Expression getExpression() { return expr; }
 
    public void accept(ExpressionVisitor v) {
        v.visitUnaryMinus(this);
    }
}

Vaším úkolem je napsat dvě implementace rozhraní ExpressionVisitor. Implementace NumberCounter má vrátit počet uzlů reprezentujících číslo v zadaném výrazu (např. pro výraz (2 + 3) * 2 vrátí 3), implementace PostfixConverter vrátí postfixovou reprezentaci daného stromu. Postfixová reprezentace je reprezentace, ve které operandy předcházejí operátor, např. výraz (2 + 3) * 2 v postfixu vypadá takto: 2 3 + 2 *. Unární mínus zkonvertujte jako odečtení od nuly. Vaše rešení nesmí používat operátor instanceof ani volání Object.getClass. Porušení této podmínky může být interpretováno jako pokus o podvod!

class NumberCounter implements ExpressionVisitor {
    int countNumbers(Expression e) { /* kod */ }
    /* kod */
}
 
class PostfixConverter implements ExpressionVisitor {
    List<Instruction> convert(Expression e)  { /* kod */ }
    /* kod */
}
 
 
interface Instruction {
}
 
class Push implements Instruction {
    final int num;
 
    Push(int n) { num = n; }
}
 
class Plus implements Instruction {
}
 
class Minus implements Instruction {
}

Do repozitáře do souboru homeworks/Homework7.java odevzdávejte jen třídy NumberCounter a PostfixConverter. Termín odevzdání 18. 4. 1:59 ráno (čas podle serveru s repozitáři).

~~DISCUSSION:closed~~

courses/b6b36omo/hw/07/start.txt · Last modified: 2018/10/03 11:13 (external edit)