David Golombek 6.035 pset #3 TA: Jeremy Brown Problem 1 1a) expr ::= term | term '+' expr { Error if #1.attribs != #3.attribs } | term '*' expr { Error if #1.attribs != #3.attribs } | term '^' expr { Error if #1.attribs != #3.attribs != bool } term ::= int | bool 1bi) true 1bii) PRODUCTION SEMANTIC RULE -------------------------------------------- S ::= E print(E.val) E ::= T E.val = T.val E ::= int + E E_1.val = int.val + (bool->int E_2.val) E ::= int * E E_1.val = int.val * (bool->int E_2.val) E ::= int ^ E E_1.val = (int->bool int.val) XOR (bool->int E_2.val) E ::= bool + E E_1.val = bool.val OR (int->bool E_2.val) E ::= bool * E E_1.val = bool.val AND (int->bool E_2.val) E ::= bool ^ E E_1.val = bool.val XOR (int->bool E_2.val) David Golombek 6.035 pset #3 TA: Jeremy Brown Problem 2 2a) PRODUCTION SEMANTIC RULE -------------------------------------------- expr ::= term '*' term expr.string = if term_1.is_simple then term_1.string else (term_1.string) '*' if term_2.is_simple then term_2.string else (term_2.string) expr.is_simple = false expr ::= term '*' term expr.string = if term_1.is_simple then term_1.string else (term_1.string) '*' if term_2.is_simple then term_2.string else (term_2.string) expr.is_simple = false expr ::= term expr.string = term.string expr.is_simple = term.is_simple term ::= int_constant term.string = int_constant term.is_simple = true term ::= '(' expr ')' term.string = expr.string term.is_simple = expr.is_simple 2b) PRODUCTION SEMANTIC RULE -------------------------------------------- expr ::= term '+' term expr.string = term_1.string '+' term_2.string expr.is_add = true expr ::= term '*' term expr.string = if term_1.is_add then (term_1.string) else term_1.string '*' if term_2.is_add then (term_2.string) else term_2.string expr.is_add = false expr ::= term expr.string = term.string expr.is_add = false term ::= int_constant term.string = int_constant term ::= '(' expr ')' term.string = expr.string David Golombek 6.035 pset #3 TA: Jeremy Brown Problem 3 This problem is broken because there is no chaining on the one_box ::= SYMBOL rule, and thus no place to get the size passed from. David Golombek 6.035 pset #3 TA: Jeremy Brown Problem 4 4a) ---------- --------- | animal | | plant | ---------- --------- / \ / \ ------------- ------------- | carnivore | | herbivore | ------------- ------------- 4b) This is legal, because carnivore inherits from animal, which has a valid locate procedure. Not legal, because plant$nutrition_value is a private method of plant, 4c) c = a; Is not legal because c is a descendent of a and extends it. a = h; This is legal; h (herbivore) is typecast into an animal.