Search
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!
ExpressionVisitor
NumberCounter
(2 + 3) * 2
PostfixConverter
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).
homeworks/Homework7.java
~~DISCUSSION:closed~~