Homework: Program and Statement renameInstruction


This homework gives you the opportunity to review the earlier class activity and make sure you understand how to refactor a Program/Statement.

  1. Using recursion, complete the body of the following static method.
        /**
         * Refactors the given {@code Statement} by renaming every occurrence of
         * instruction {@code oldName} to {@code newName}. Every other statement is
         * left unmodified.
         *
         * @param s
         *            the {@code Statement}
         * @param oldName
         *            the name of the instruction to be renamed
         * @param newName
         *            the new name of the renamed instruction
         * @updates s
         * @requires [newName is a valid IDENTIFIER]
         * @ensures <pre>
         * s = [#s refactored so that every occurrence of instruction oldName
         *   is replaced by newName]
         * </pre>
         */
        public static void renameInstruction(Statement s, String oldName,
                String newName) {...}
    
  2. Using the method above, complete the body of the following static method.
        /**
         * Refactors the given {@code Program} by renaming instruction
         * {@code oldName}, and every call to it, to {@code newName}. Everything
         * else is left unmodified.
         *
         * @param p
         *            the {@code Program}
         * @param oldName
         *            the name of the instruction to be renamed
         * @param newName
         *            the new name of the renamed instruction
         * @updates p
         * @requires <pre>
         * oldName is in DOMAIN(p.context)  and
         * [newName is a valid IDENTIFIER]  and
         * newName is not in DOMAIN(p.context)
         * </pre>
         * @ensures <pre>
         * p = [#p refactored so that instruction oldName and every call
         *   to it are replaced by newName]
         * </pre>
         */
        public static void renameInstruction(Program p, String oldName,
                String newName) {...}
    
  3. You may hand-draw your answer to this question. Recalling how much we care that you use correct punctuation when you write objects' values, and using the notation of Slides 9-12 in Program, but fully drawing each abstract syntax tree involved, show the value of p at the end of the following code snippet.
     1  Program p = new Program1();
     2  Map<String, Statement> context = p.newContext();
     3  Statement block = p.newBody();
     4  Statement s = block.newInstance();
     5  p.setName("Get-to-Edge-and-Wait-for-Infection");
     6  s.assembleCall("walk");
     7  block.addToBlock(0, s);
     8  s.assembleCall("run");
     9  block.addToBlock(block.lengthOfBlock(), s);
    10  s.assembleWhile(Condition.NEXT_IS_NOT_WALL, block);
    11  block.addToBlock(0, s);
    12  p.swapBody(block);
    13  s.assembleCall("move");
    14  block.addToBlock(0, s);
    15  s.assembleCall("move");
    16  block.addToBlock(block.lengthOfBlock(), s);
    17  context.add("run", block);
    18  s.assembleCall("move");
    19  block = block.newInstance();
    20  block.addToBlock(0, s);
    21  context.add("walk", block);
    22  p.swapContext(context);
    
  4. Consider the occurrence on line 19 of the code snippet above of block = block.newInstance(). What would probably have happened if that statement had been replaced by block.clear()? In other words, what is the difference between the two statements? You may hand-draw a diagram to show the difference. (Hint: which are the only two lines in the code snippet in which the statement executed would introduce an alias to a mutable object? (Hint: all contracts in our components catalog advertise every introduction of an alias to a mutable object.))