open Mp9common let rubric_version = "1.0" let rubric_title = "CS421 Fall 2012 MP9" (************************************************************************** * You can add new test cases by adding new elements to the following lists * Format is: * TESTARG(, , , , ..., ) * * is the number of argument that the function being tested takes. **************************************************************************) let parse s = Solution.main Micromllex2.token (Lexing.from_string s) let parse_stu s = Student.main Micromllex.token (Lexing.from_string s) let parse_fail s = try Some(parse s) with Parsing.Parse_error -> None let parse_fail_stu s = try Some(parse_stu s) with Parsing.Parse_error -> None (* Test cases should go in this list. * The first element of the pair is the weight of the case, * and the second is the string to be given to the parser. *) (* This list is for regular problems *) let rubric = [ (* 3pts *) TEST1ARG_TWOFUN(1, parse, parse_stu, "(* Q1 *) val x = \"hi\";"); TEST1ARG_TWOFUN(1, parse, parse_stu, " val x = true val x = 3 val x = 3.45;"); TEST1ARG_TWOFUN(1, parse, parse_stu, " val x = nil val x = ();"); (* 3pts *) TEST1ARG_TWOFUN(1, parse, parse_stu, "(* Q2 *) fst;"); TEST1ARG_TWOFUN(1, parse, parse_stu, " snd 1;"); TEST1ARG_TWOFUN(1, parse, parse_stu, " snd (tl (hd (~~ 1)));"); (* 3pts *) TEST1ARG_TWOFUN(1, parse, parse_stu, "(* Q3 *) val x = (3);"); TEST1ARG_TWOFUN(1, parse, parse_stu, " ((3));"); TEST1ARG_TWOFUN(1, parse, parse_stu, " ((2 + 3) * (4 / 5));"); (* 5pts *) TEST1ARG_TWOFUN(1, parse, parse_stu, "(* Q4 *) (3, 9);"); TEST1ARG_TWOFUN(1, parse, parse_stu, " ((2, 3), (2, true));"); TEST1ARG_TWOFUN(1, parse, parse_stu, " (((3), ((2))));"); TEST1ARG_TWOFUN(2, parse, parse_stu, " (1, \"hi\", (true, false), 4.0);"); (* 8pts *) TEST1ARG_TWOFUN(1, parse, parse_stu, "(* Q5 *) let val x = 3 in x end;"); TEST1ARG_TWOFUN(1, parse, parse_stu, " val x = let val x = let val y = true in 3 end in 4 end;"); TEST1ARG_TWOFUN(1, parse, parse_stu, " val x = let val x = 3 in let val y = 4 in 5 end end;"); TEST1ARG_TWOFUN(1, parse, parse_stu, " (\"hi\"; 3);"); TEST1ARG_TWOFUN(1, parse_fail, parse_fail_stu, " (\"hi\"; true , 5);"); TEST1ARG_TWOFUN(1, parse_fail, parse_fail_stu, " let val x = 3; 4 in 5 end;"); TEST1ARG_TWOFUN(2, parse, parse_stu, " val x = let val x = 3 in (let val y = 4 in 5; 6; 7 end ; true; false) end;"); (* 5pts *) TEST1ARG_TWOFUN(1, parse, parse_stu, "(* Q6 *) val x = [1, 2, 3];"); TEST1ARG_TWOFUN(1, parse, parse_stu, " [];"); TEST1ARG_TWOFUN(1, parse, parse_stu, " [false];"); TEST1ARG_TWOFUN(1, parse, parse_stu, " [[1, 2], (fn x => x), [[]]];"); TEST1ARG_TWOFUN(1, parse_fail, parse_fail_stu, " [1; 3];"); (* 5pts *) TEST1ARG_TWOFUN(1, parse, parse_stu, "(* Q7 *) true orelse false;"); TEST1ARG_TWOFUN(1, parse, parse_stu, " true andalso (false orelse 2) andalso 5;"); TEST1ARG_TWOFUN(1, parse, parse_stu, " true orelse true andalso x;"); TEST1ARG_TWOFUN(2, parse, parse_stu, " true andalso false andalso true andalso false orelse true orelse false orelse true;"); (* 12pts *) TEST1ARG_TWOFUN(1, parse, parse_stu, "(* Q8 *) \"a\" < \"b\";"); TEST1ARG_TWOFUN(1, parse, parse_stu, " 3 > 4;"); TEST1ARG_TWOFUN(1, parse, parse_stu, " 3 >= 4;"); TEST1ARG_TWOFUN(1, parse, parse_stu, " 3 <= 4;"); TEST1ARG_TWOFUN(1, parse, parse_stu, " 3 <> 4;"); TEST1ARG_TWOFUN(1, parse, parse_stu, " 3 = 4;"); TEST1ARG_TWOFUN(2, parse, parse_stu, " 3 = 2 = 4;"); TEST1ARG_TWOFUN(2, parse, parse_stu, " 3 = 2 <> 1 > 2 = 6 > 7 < 8;"); TEST1ARG_TWOFUN(2, parse, parse_stu, " true orelse 3 > 4 andalso 4 < 5 < 6 + 2;"); (* 10pts *) TEST1ARG_TWOFUN(2, parse, parse_stu, "(* Q9 *) 3 :: 2 :: 1 :: nil;"); TEST1ARG_TWOFUN(1, parse, parse_stu, " 3 :: 2;"); TEST1ARG_TWOFUN(1, parse, parse_stu, " 3 :: [];"); TEST1ARG_TWOFUN(1, parse, parse_stu, " nil :: (nil :: nil) :: nil;"); TEST1ARG_TWOFUN(3, parse, parse_stu, " 3 :: 5 :: (2.0, 4) :: [1,3];"); TEST1ARG_TWOFUN(2, parse, parse_stu, " 4 + 3.0 :: (2 > 5);"); (* 12pts *) TEST1ARG_TWOFUN(1, parse, parse_stu, "(* Q10 *) 3 + 4 * 2;"); TEST1ARG_TWOFUN(1, parse, parse_stu, " 3 - 4 - 2 * 9 > 10 andalso true;"); TEST1ARG_TWOFUN(1, parse, parse_stu, " 3 - 2 - 1 + 4 + 5 + 6;"); TEST1ARG_TWOFUN(1, parse, parse_stu, " 3 *. 2.0 -. 1.6 *. 4 /. 2.0 +. 4.13 ;"); TEST1ARG_TWOFUN(1, parse, parse_stu, " 3 * 2 - 4 * 5 + 3 * 10 + 32;"); TEST1ARG_TWOFUN(1, parse, parse_stu, " \"hi\" ^ \"gh\" ^ \"er\";"); TEST1ARG_TWOFUN(1, parse, parse_stu, " 3 / 4 * 5.1 /. 6 +. (3.3 -. 2) *. false;"); TEST1ARG_TWOFUN(1, parse, parse_stu, " ( 3 + (1 - 7) , 3 *. (2.0 -. 1.6));"); TEST1ARG_TWOFUN(2, parse, parse_stu, " val x = 3+2 < 3+5;"); TEST1ARG_TWOFUN(2, parse, parse_stu, " 3 >= 4 andalso 3 * false > 2.2 orelse 4 *. f;"); (* 10pts *) TEST1ARG_TWOFUN(1, parse, parse_stu, "(* Q11 *) hd nil;"); TEST1ARG_TWOFUN(1, parse, parse_stu, " hd(tl (3::2::[]));"); TEST1ARG_TWOFUN(2, parse, parse_stu, " hd tl (3::2::[]);"); TEST1ARG_TWOFUN(1, parse, parse_stu, " (fn x => x) 3;"); TEST1ARG_TWOFUN(1, parse, parse_stu, " 1 raise 2;"); TEST1ARG_TWOFUN(2, parse, parse_stu, " 2 > 3 andalso 4 < 5;"); TEST1ARG_TWOFUN(2, parse, parse_stu, " ~~ hd tl tl [1,2,3];"); (* 5pts *) TEST1ARG_TWOFUN(1, parse, parse_stu, "(* Q12 *) op +;"); TEST1ARG_TWOFUN(2, parse, parse_stu, " op >=;"); TEST1ARG_TWOFUN(1, parse_fail, parse_fail_stu, " op ~;"); TEST1ARG_TWOFUN(1, parse_fail, parse_fail_stu, " op 2;"); (* 20pts *) TEST1ARG_TWOFUN(1, parse, parse_stu, "(* Q13 *) fn x => if x then 3 else raise 4;"); TEST1ARG_TWOFUN(1, parse, parse_stu, " if true then 1 else 0 + 2;"); TEST1ARG_TWOFUN(2, parse, parse_stu, " 2 * if true then 1 else 0 + raise 2;"); TEST1ARG_TWOFUN(1, parse, parse_stu, " (fn x => ()) 2;"); TEST1ARG_TWOFUN(1, parse, parse_stu, " raise 3;"); TEST1ARG_TWOFUN(1, parse, parse_stu, " val x = fn x => 1;"); TEST1ARG_TWOFUN(1, parse, parse_stu, " val x = fn x => fn y => fn z => 2;"); TEST1ARG_TWOFUN(1, parse, parse_stu, " val x = if true then 2 else 3;"); TEST1ARG_TWOFUN(1, parse, parse_stu, " val x = if false then fn x => 3 else 4;"); TEST1ARG_TWOFUN(1, parse, parse_stu, " val x = fn x => if true then 2 else 3;"); TEST1ARG_TWOFUN(1, parse, parse_stu, " val rec x a = fn a => fn b => fn a => a b;"); TEST1ARG_TWOFUN(2, parse, parse_stu, " raise ~ hd tl [1,2];"); TEST1ARG_TWOFUN(3, parse, parse_stu, " 3 + 4 raise f 4;"); TEST1ARG_TWOFUN(3, parse, parse_stu, " val x = if true then fn y => 33 else fn x => raise if 10 then 11 else 22;"); (* 2pts *) TEST1ARG_TWOFUN(1, parse, parse_stu, "(* Q14 *) val _ = \"hi\";"); TEST1ARG_TWOFUN(1, parse, parse_stu, " let val _ = true in 5 end;"); (* 3pts *) TEST1ARG_TWOFUN(1, parse, parse_stu, "(* Q15 *) local val x = 2 in val y = x + 3 end;"); TEST1ARG_TWOFUN(1, parse, parse_stu, " local val x = 2 in local val x = 2 in val y = x + 3 end end;"); TEST1ARG_TWOFUN(1, parse, parse_stu, " local local val x = 2 in val y = x + 3 end in val y = x + 3 end;"); (* 10pts *) TEST1ARG_TWOFUN(1, parse, parse_stu, "(* Q16 *) val rec f g = g 5;"); TEST1ARG_TWOFUN(1, parse, parse_stu, " val rec f x = 1;"); TEST1ARG_TWOFUN(1, parse, parse_stu, " val rec f a b c d e f = a + b + c + d + e + f;"); TEST1ARG_TWOFUN(2, parse, parse_stu, " val rec f a a a a = fn x => x + a;"); TEST1ARG_TWOFUN(1, parse_fail, parse_fail_stu, " val rec _ = 1;"); TEST1ARG_TWOFUN(2, parse, parse_stu, " val rec f x = (fn y => 2 + y) 2;"); TEST1ARG_TWOFUN(2, parse, parse_stu, " val rec f a a a a = (((fn x => fn y => fn z => x + y + z +x + a) 2 ) 3) 4;"); (* 15pts *) TEST1ARG_TWOFUN(1, parse, parse_stu, "(* Q17 *) fun f x a b c d a b c d = fn y => fn f => f x;"); TEST1ARG_TWOFUN(1, parse, parse_stu, " fun f x = x;"); TEST1ARG_TWOFUN(2, parse, parse_stu, " fun f x y z x = x;"); TEST1ARG_TWOFUN(3, parse, parse_stu, " fun f x = fn g => fn x => fn g => fn a => fn f => fn b => fn h => fn b => (f g) b;"); TEST1ARG_TWOFUN(2, parse, parse_stu, " fun f x = (fn y => if y then true else g y);"); TEST1ARG_TWOFUN(2, parse_fail, parse_fail_stu, " fun f 2 = g x;"); TEST1ARG_TWOFUN(2, parse_fail, parse_fail_stu, " fun f = g x;"); TEST1ARG_TWOFUN(2, parse_fail, parse_fail_stu, " fun f x = (fn y => if y then true else g y) false;"); (* 131 total *) ] (* This list is for extra credit problems *) let extra_rubric = [ (* 10pts *) TEST1ARG_TWOFUN(1, parse, parse_stu, "(* Q18 *) \"hi\" handle 1 => \"one\" | 2 => \"two\";"); TEST1ARG_TWOFUN(1, parse, parse_stu, " true handle 4 => false | _ => true;"); TEST1ARG_TWOFUN(1, parse, parse_stu, " true handle 4 => false | _ => true | _ => 10;"); TEST1ARG_TWOFUN(1, parse, parse_stu, " fn x => 4 handle 4 => 4;"); TEST1ARG_TWOFUN(1, parse, parse_stu, " if true then 2 else 3 handle 3 => 4;"); TEST1ARG_TWOFUN(1, parse, parse_stu, " \"hi\" handle 1 => \"one\" | 2 => \"hello\" handle 3 => \"three\" | 4 => \"four\";"); TEST1ARG_TWOFUN(1, parse, parse_stu, " true handle 4 => false | _ => true | 5 => 2 + if true then false else true;"); TEST1ARG_TWOFUN(1, parse, parse_stu, " 5 ; \"hi\" handle 3 => 5 ; 6 | 7 => \"b\";"); TEST1ARG_TWOFUN(2, parse, parse_stu, " 1 + 1 handle 4 => 3 * 2 | 1 => raise 2;"); ]