Homework 4
Due on Monday, 19 November at 10:15am sharp (right before the class).
NOTE: It is your responsibility to ask us if any part of the problem formulation is unclear.
Problem 1
Determine for the following program its output with static and dynamic scoping. Explain the difference, if there is any.
object MyClass {
val x = 5
def foo(z: Int): Int = {
x + z
}
def bar(y: Int): Int = {
val x = 1
val z = 2
foo(y)
}
def main() {
val x = 7
println(foo(bar(3)))
}
}
Problem 2
Consider the following grammar:
E ::= E+E E ::= E*E E ::= E=E E ::= Num | true | false
where Num represents integers.
a) Consider the generalized CYK algorithm from
- Lecturecise 11, slide 3
Run the algorithm on input:
1=2*3=true
checking whether it can be parsed. Show the content of the 'chart', that is, the set of triples
, after the algorithm finishes.
b) How many parse trees can you extract from this chart?
c) Write down those parse trees that are correct according to the following types:
+ : Int x Int→Int
* : Int x Int→Int
= : Bool x Bool → Bool
= : Int x Int → Bool
d) Can you modify the CKY algorithm following the ideas from:
- Lecturecise 12, slide 5-8
to introduce a semantic function
that computes only those trees that are correct according to the above types of operators?
e) What does the new algorithm return on the above input?
Problem 3
Consider the following class:
class Rectangle {
var width: Int
var height: Int
var xPos: Int
var yPos: Int
def area: Int = {
if(width > 0 && height > 0)
width * height
else
0
}
def resize(maxSize: Int) {
while(area > maxSize) {
width = width / 2
height = height / 2
}
}
}
a) Determine the environment of this class.
b) By giving the type derivation trees for each method show that this class type checks.
Problem 4
Determine if the following piece of codes type check according to the type rules.
Show all steps and give type derivation trees where applicable.
a) The class Array has a field length in which the length of the array is stored.
def swap(lst: Array[Int], a: Int, b: Int): Array[Int] = {
if (a >= lst.length || b >= lst.length) lst else {
val swap = lst(a)
lst(a) = lst(b)
lst(b) = swap
lst
}
}
b)
Recall that we have the two type rules:
- If
is a declared subclass of
, then 
i) Give the type rule corresponding to new.
ii) Show this code typechecks.
class Shape
class Rectangle(width: Int, length: Int) extends Shape {
def area : Int = width * length
}
class Square(length: Int) extends Rectangle(length,length)
new Square(5).area