changeLog.txtthat identifies each class that you created or modified for this assignment, along with a short note describing the modifications. For example, your file might include:
Recall that the
Output statement from HW2 consists of the word
output followed by a single expression. Displaying multiple values requires either concatenating the values together (which is somewhat tedious) or using separate
Output statements (which breaks the values across separate lines). You are to modify the
Output statement so that instead of taking a single expression, it takes a sequence of expressions enclosed in parentheses. The new grammar rule for
Output statements, replacing the rule from HW2, is:
Note that parentheses are now required, even if there is only one expression to be displayed. Also, it is valid to have no expressions between the parentheses, resulting in a blank line being displayed. For example:
SAMPLE CODE (output in red) >>> x = 5 >>> output ( x ) 5 >>> output ( ) >>> output ( "x=" x "incr=" ( x + 1 ) ) "x=" 5 "incr=" 6
Currently, all of the variables in a SILLY program are in the same, global scope. You are to modify the control statements (
Repeat) so that they define new scopes for variables. That is, statements inside an
Repeat statement are considered to be inside a new, nested scope in which local variables can be declared. A
VarDeclaration statement, which declares one or more local variables in the current scope, is defined as follows:
Note that parentheses appear only if there is more than one variable being declared in the same
VarDeclaration statement. For example:
SAMPLE CODE (output in red) >>> x = 6 >>> repeat 4 var x x = "Dolly" output ( "Hello" x ) end "Hello" "Dolly" "Hello" "Dolly" "Hello" "Dolly" "Hello" "Dolly" >>> output ( x ) 6 >>> word1 = "global1" >>> word2 = "global2" >>> word3 = "global3" >>> if ( word1 =/= word2 ) var ( word2 word3 ) word2 = "middle2" word3 = "middle3" if true var word3 word3 = "inner3" output ( word1 word2 word3 ) end output ( word1 word2 word3 ) end "global1" "middle2" "inner3" "global1" "middle2" "middle3" >>> output ( word1 word2 word3 ) "global1" "global2" "global3"
To implement nested scopes, you will need to modify the
MemorySpace class so that a stack of activation records is maintained (as opposed to a single, global activation record). New methods should be added to the
MemorySpace class for beginning a new scope (i.e., pushing a new activation record on the stack) and ending the current scope (i.e., popping the current activation record off the stack). These methods should be called to begin and end the nested scopes when executing a control statement.
lookupVariable methods in
MemorySpace will also need to be modified so that they properly access variable values from the stack.
Finally, you will need to implement the
varDeclaration statement, which declares one or more variables within the current scope (i.e., puts entries for those variables in the current activation record). Note: attempting to declare a variable that already exists in a given scope (e.g., declaring it twice) should result in a runtime error.