diff --git a/regression/orig/test072.log b/regression/orig/test072.log new file mode 100644 index 000000000..67af2524c --- /dev/null +++ b/regression/orig/test072.log @@ -0,0 +1,18 @@ +> 9 +55 +8 +34 +7 +21 +6 +13 +5 +8 +4 +5 +3 +3 +2 +2 +1 +1 diff --git a/regression/orig/test073.log b/regression/orig/test073.log new file mode 100644 index 000000000..325578c16 --- /dev/null +++ b/regression/orig/test073.log @@ -0,0 +1,14 @@ +> 7 +5040 +6 +720 +5 +120 +4 +24 +3 +6 +2 +2 +1 +1 diff --git a/regression/orig/test074.log b/regression/orig/test074.log new file mode 100644 index 000000000..884b6b88a --- /dev/null +++ b/regression/orig/test074.log @@ -0,0 +1,36 @@ +> 1 +2 +3 +4 +5 +6 +7 +8 +9 +2 +3 +4 +5 +6 +7 +8 +9 +10 +3 +5 +7 +9 +11 +13 +15 +17 +19 +5 +13 +29 +61 +125 +253 +509 +1021 +2045 diff --git a/regression/orig/test075.log b/regression/orig/test075.log new file mode 100644 index 000000000..923723a8f --- /dev/null +++ b/regression/orig/test075.log @@ -0,0 +1,2 @@ +> 55 +15 diff --git a/regression/orig/test076.log b/regression/orig/test076.log new file mode 100644 index 000000000..439208742 --- /dev/null +++ b/regression/orig/test076.log @@ -0,0 +1,8 @@ +> 10 +20 +30 +40 +0 +1 +2 +3 diff --git a/regression/orig/test077.log b/regression/orig/test077.log new file mode 100644 index 000000000..58b322cfb --- /dev/null +++ b/regression/orig/test077.log @@ -0,0 +1,6 @@ +> 5 +6 +7 +8 +9 +10 diff --git a/regression/orig/test078.log b/regression/orig/test078.log new file mode 100644 index 000000000..9876f9a7e --- /dev/null +++ b/regression/orig/test078.log @@ -0,0 +1,12 @@ +> 1 +2 +3 +4 +1 +2 +3 +4 +3 +4 +1 +2 diff --git a/regression/orig/test079.log b/regression/orig/test079.log new file mode 100644 index 000000000..c41010416 --- /dev/null +++ b/regression/orig/test079.log @@ -0,0 +1,6 @@ +> 1 +1 +1 +1 +0 +0 diff --git a/regression/orig/test080.log b/regression/orig/test080.log new file mode 100644 index 000000000..c3c21fc91 --- /dev/null +++ b/regression/orig/test080.log @@ -0,0 +1,3 @@ +> 0 +100 +300 diff --git a/regression/orig/test081.log b/regression/orig/test081.log new file mode 100644 index 000000000..3484555d5 --- /dev/null +++ b/regression/orig/test081.log @@ -0,0 +1,6 @@ +> 1 +2 +3 +100 +200 +300 diff --git a/regression/orig/test082.log b/regression/orig/test082.log new file mode 100644 index 000000000..b98c3e4e7 --- /dev/null +++ b/regression/orig/test082.log @@ -0,0 +1,17 @@ +> 1 +1 +1 +1 +1 +2 +3 +100 +3 +2 +1 +6 +5 +4 +3 +2 +1 diff --git a/regression/orig/test083.log b/regression/orig/test083.log new file mode 100644 index 000000000..9536400a4 --- /dev/null +++ b/regression/orig/test083.log @@ -0,0 +1,3 @@ +> 7 +7 +28 diff --git a/regression/orig/test084.log b/regression/orig/test084.log new file mode 100644 index 000000000..20b1d6a07 --- /dev/null +++ b/regression/orig/test084.log @@ -0,0 +1,3 @@ +> 55 +310 +310 diff --git a/regression/orig/test085.log b/regression/orig/test085.log new file mode 100644 index 000000000..1da1496d0 --- /dev/null +++ b/regression/orig/test085.log @@ -0,0 +1,8 @@ +> 0 +15 +15 +1 +2 +3 +4 +5 diff --git a/regression/orig/test086.log b/regression/orig/test086.log new file mode 100644 index 000000000..c9c3fcf86 --- /dev/null +++ b/regression/orig/test086.log @@ -0,0 +1,3 @@ +> 1 +2 +3 diff --git a/regression/orig/test087.log b/regression/orig/test087.log new file mode 100644 index 000000000..2f9a3a65b --- /dev/null +++ b/regression/orig/test087.log @@ -0,0 +1,6 @@ +> 1 +0 +1 +0 +1 +1 diff --git a/regression/orig/test088.log b/regression/orig/test088.log new file mode 100644 index 000000000..12decc137 --- /dev/null +++ b/regression/orig/test088.log @@ -0,0 +1,2 @@ +0 +3 diff --git a/regression/orig/test089.log b/regression/orig/test089.log new file mode 100644 index 000000000..c910c5cfb --- /dev/null +++ b/regression/orig/test089.log @@ -0,0 +1 @@ +> > > 8 diff --git a/regression/orig/test090.log b/regression/orig/test090.log new file mode 100644 index 000000000..c03089ce6 --- /dev/null +++ b/regression/orig/test090.log @@ -0,0 +1,3 @@ +> 6 +7 +8 diff --git a/regression/orig/test091.log b/regression/orig/test091.log new file mode 100644 index 000000000..e8398dcb2 --- /dev/null +++ b/regression/orig/test091.log @@ -0,0 +1,9 @@ +> 1 +2 +3 +2 +3 +4 +3 +4 +5 diff --git a/regression/orig/test092.log b/regression/orig/test092.log new file mode 100644 index 000000000..a8d89ee1e --- /dev/null +++ b/regression/orig/test092.log @@ -0,0 +1,5 @@ +> 1 +1 +1 +1 +0 diff --git a/regression/orig/test093.log b/regression/orig/test093.log new file mode 100644 index 000000000..8b665ccc8 --- /dev/null +++ b/regression/orig/test093.log @@ -0,0 +1,2 @@ +> 11 +18 diff --git a/regression/orig/test094.log b/regression/orig/test094.log new file mode 100644 index 000000000..3c41e142a --- /dev/null +++ b/regression/orig/test094.log @@ -0,0 +1,4 @@ +> 5 +7 +12 +-2 diff --git a/regression/orig/test095.log b/regression/orig/test095.log new file mode 100644 index 000000000..3af13cd74 --- /dev/null +++ b/regression/orig/test095.log @@ -0,0 +1 @@ +> 5 diff --git a/regression/orig/test096.log b/regression/orig/test096.log new file mode 100644 index 000000000..a301ff37a --- /dev/null +++ b/regression/orig/test096.log @@ -0,0 +1,2 @@ +> 2 +1 diff --git a/regression/orig/test097.log b/regression/orig/test097.log new file mode 100644 index 000000000..81f75865d --- /dev/null +++ b/regression/orig/test097.log @@ -0,0 +1 @@ +> 35 diff --git a/regression/orig/test098.log b/regression/orig/test098.log new file mode 100644 index 000000000..5037637a6 --- /dev/null +++ b/regression/orig/test098.log @@ -0,0 +1 @@ +> 12 diff --git a/regression/orig/test099.log b/regression/orig/test099.log new file mode 100644 index 000000000..a2a5aca89 --- /dev/null +++ b/regression/orig/test099.log @@ -0,0 +1,3 @@ +> 1 +800 +800 diff --git a/regression/orig/test100.log b/regression/orig/test100.log new file mode 100644 index 000000000..d14b46a2c --- /dev/null +++ b/regression/orig/test100.log @@ -0,0 +1 @@ +> 0 diff --git a/regression/orig/test101.log b/regression/orig/test101.log new file mode 100644 index 000000000..d14b46a2c --- /dev/null +++ b/regression/orig/test101.log @@ -0,0 +1 @@ +> 0 diff --git a/regression/orig/test102.log b/regression/orig/test102.log new file mode 100644 index 000000000..3af13cd74 --- /dev/null +++ b/regression/orig/test102.log @@ -0,0 +1 @@ +> 5 diff --git a/regression/test072.expr b/regression/test072.expr new file mode 100644 index 000000000..6ae7962dc --- /dev/null +++ b/regression/test072.expr @@ -0,0 +1,16 @@ +local n, i; + +fun fib (n) { + if n <= 1 + then 1 + else + (fib (n-1) + fib (n-2)) + fi +} + +n := read (); + +for i := n, i >= 1, i := i-1 do + write (i); + write (fib (i)) +od \ No newline at end of file diff --git a/regression/test072.input b/regression/test072.input new file mode 100644 index 000000000..ec635144f --- /dev/null +++ b/regression/test072.input @@ -0,0 +1 @@ +9 diff --git a/regression/test073.expr b/regression/test073.expr new file mode 100644 index 000000000..0b01ab3d2 --- /dev/null +++ b/regression/test073.expr @@ -0,0 +1,16 @@ +local n, i; + +fun fact (n) { + if n <= 1 + then 1 + else + (n * fact (n-1)) + fi +} + +n := read (); + +for i := n, i >= 1, i := i-1 do + write (i); + write (fact (i)) +od \ No newline at end of file diff --git a/regression/test073.input b/regression/test073.input new file mode 100644 index 000000000..7f8f011eb --- /dev/null +++ b/regression/test073.input @@ -0,0 +1 @@ +7 diff --git a/regression/test074.expr b/regression/test074.expr new file mode 100644 index 000000000..b915d1c5d --- /dev/null +++ b/regression/test074.expr @@ -0,0 +1,16 @@ +local x, m, n; + +fun ack (m, n) { + if m == 0 then (n+1) + elif m > 0 && n == 0 then ack (m-1, 1) + else ack (m-1, ack (m, n-1)) + fi +} + +x := read (); + +for m := 0, m <= 3, m := m+1 do + for n := 0, n <= 8, n := n+1 do + write (ack (m, n)) + od +od \ No newline at end of file diff --git a/regression/test074.input b/regression/test074.input new file mode 100644 index 000000000..573541ac9 --- /dev/null +++ b/regression/test074.input @@ -0,0 +1 @@ +0 diff --git a/regression/test075.expr b/regression/test075.expr new file mode 100644 index 000000000..240edc562 --- /dev/null +++ b/regression/test075.expr @@ -0,0 +1,17 @@ +local x; + +fun test (n, m) { + local i, s; + s := 0; + for i := 0, i <= n, i := i + 1 do + s := s + i; + if s > m then return s fi + od; + + s +} + +x := read (); + +write (test (10, 100)); +write (test (100, 10)) \ No newline at end of file diff --git a/regression/test075.input b/regression/test075.input new file mode 100644 index 000000000..573541ac9 --- /dev/null +++ b/regression/test075.input @@ -0,0 +1 @@ +0 diff --git a/regression/test076.expr b/regression/test076.expr new file mode 100644 index 000000000..f46e0de77 --- /dev/null +++ b/regression/test076.expr @@ -0,0 +1,24 @@ +local n, x, i; + +fun printArray (x) { + local elem; + if x.length == 0 then return fi; + for i:=0, i y + | Cons (h, t) -> Cons (h, append (t, y)) + esac +} + +fun printList (x) { + case x of + Nil -> skip + | Cons (h, t) -> write (h); printList (t) + esac +} + +n := read (); + +x := Cons (1, Cons (2, Nil)); +y := Cons (3, Cons (4, Nil)); + +printList (x); +printList (y); +printList (append (x, y)); +printList (append (y, x)) diff --git a/regression/test078.input b/regression/test078.input new file mode 100644 index 000000000..573541ac9 --- /dev/null +++ b/regression/test078.input @@ -0,0 +1 @@ +0 diff --git a/regression/test079.expr b/regression/test079.expr new file mode 100644 index 000000000..f46029081 --- /dev/null +++ b/regression/test079.expr @@ -0,0 +1,32 @@ +local n, t; + +fun insert (t, x) { + case t of + Leaf -> Node (x, Leaf, Leaf) + | Node (y, l, r) -> if x > y + then Node (y, insert (l, x), r) + else Node (y, l, insert (r, x)) + fi + esac +} + +fun find (t, x) { + case t of + Leaf -> 0 + | Node (y, l, r) -> if x == y then 1 + elif x > y then find (l, x) + else find (r, x) + fi + esac +} + +n := read (); + +t := insert (insert (insert (insert (Leaf, 5), 4), 6), 3); + +write (find (t, 5)); +write (find (t, 4)); +write (find (t, 6)); +write (find (t, 3)); +write (find (t, 2)); +write (find (t, 1)) diff --git a/regression/test079.input b/regression/test079.input new file mode 100644 index 000000000..573541ac9 --- /dev/null +++ b/regression/test079.input @@ -0,0 +1 @@ +0 diff --git a/regression/test080.expr b/regression/test080.expr new file mode 100644 index 000000000..ef266ec4e --- /dev/null +++ b/regression/test080.expr @@ -0,0 +1,14 @@ +local x; + +fun sum (x) { + case x of + Nil -> 0 + | Cons (x, tl) -> (x + sum (tl)) + esac +} + +x := read (); + +write (sum (Nil)); +write (sum (Cons (100, Nil))); +write (sum (Cons (100, Cons (200, Nil)))) \ No newline at end of file diff --git a/regression/test080.input b/regression/test080.input new file mode 100644 index 000000000..573541ac9 --- /dev/null +++ b/regression/test080.input @@ -0,0 +1 @@ +0 diff --git a/regression/test081.expr b/regression/test081.expr new file mode 100644 index 000000000..ca715641c --- /dev/null +++ b/regression/test081.expr @@ -0,0 +1,39 @@ +local x, y, z; + +fun zip (x) { + case x of Pair (x, y) -> + case x of + Nil -> Nil + | Cons (x, xs) -> case y of + Nil -> Nil + | Cons (y, ys) -> Cons (Pair (x, y), zip (Pair (xs, ys))) + esac + esac + esac +} + +fun unzip (x) { + case x of + Nil -> Pair (Nil, Nil) + | Cons (Pair (x, y), tl) -> + case unzip (tl) of + Pair (xs, ys) -> Pair (Cons (x, xs), Cons (y, ys)) + esac + esac +} + +fun printList (l) { + case l of + Nil -> skip + | Cons (x, xs) -> write (x); printList (xs) + esac +} + +z := read (); + +x := Cons (1, Cons (2, Cons (3, Nil))); +y := Cons (100, Cons (200, Cons (300, Nil))); + +case unzip (zip (Pair (x, y))) of + Pair (x, y) -> printList (x); printList (y) +esac \ No newline at end of file diff --git a/regression/test081.input b/regression/test081.input new file mode 100644 index 000000000..573541ac9 --- /dev/null +++ b/regression/test081.input @@ -0,0 +1 @@ +0 diff --git a/regression/test082.expr b/regression/test082.expr new file mode 100644 index 000000000..338ee7cb4 --- /dev/null +++ b/regression/test082.expr @@ -0,0 +1,75 @@ +local n; + +fun collect_ints_acc (v, tail) { + local i; + case v of + a@#unboxed -> Cons (a, tail) + | #string -> tail + | _ -> + for i := 0, i < v.length, i := i + 1 do + tail := collect_ints_acc (v[i], tail) + od; + tail + esac +} + +fun collect_ints (v) { + collect_ints_acc (v, Nil) +} + +fun print_list (l) { + case l of + Nil -> skip + | Cons (n, t) -> write (n); print_list (t) + esac +} + +n := read (); + +case 1 of + 5 -> write (5) +| 4 -> write (4) +| 3 -> write (3) +| 2 -> write (2) +| 1 -> write (1) +| 0 -> write (0) +esac; + +case 1 of + a@5 -> write (a) +| a@4 -> write (a) +| a@3 -> write (a) +| a@2 -> write (a) +| a@1 -> write (a) +| a@0 -> write (a) +esac; + +case A (1, 2, 3) of + A (1, 3, 5) -> write (0) +| A (3, 4, 5) -> write (0) +| A (1, 2, 3) -> write (1) +| A (6, 7, 8) -> write (0) +esac; + +case "abc" of + "def" -> write (0) +| "ab" -> write (0) +| "abc" -> write (1) +| "" -> write (0) +esac; + +case [1, 2, 3] of + [] -> write (0) +| [a, b] -> write (0) +| [a, b, c] -> write (a); write (b); write (c) +| [_, _, _] -> write (0) +esac; + +case [1, 2, 3] of + [] -> write (0) +| [a, b] -> write (0) +| [_, _, _] -> write (100) +| [a, b, c] -> write (a); write (b); write (c) +esac; + +print_list (collect_ints ([1, 2, 3, [4, 5, 6, Cons (1, 2, 3)]])) diff --git a/regression/test082.input b/regression/test082.input new file mode 100644 index 000000000..573541ac9 --- /dev/null +++ b/regression/test082.input @@ -0,0 +1 @@ +0 diff --git a/regression/test083.expr b/regression/test083.expr new file mode 100644 index 000000000..81cd613e3 --- /dev/null +++ b/regression/test083.expr @@ -0,0 +1,12 @@ +local n, y; + +fun test (n, m) { + local i, s; + write (n); + write (m); + n +} + +n := read (); +y := 1 + (2 + (3 + (4 + (5 + (6 + test (7, 7)))))); +write (y) \ No newline at end of file diff --git a/regression/test083.input b/regression/test083.input new file mode 100644 index 000000000..573541ac9 --- /dev/null +++ b/regression/test083.input @@ -0,0 +1 @@ +0 diff --git a/regression/test084.expr b/regression/test084.expr new file mode 100644 index 000000000..cef8c10e2 --- /dev/null +++ b/regression/test084.expr @@ -0,0 +1,23 @@ +local n, y, y2, t; + +fun test (n, m) { + local i, s; + s := 0; + for i := 0, i <= n, i := i + 1 do + s := s + i; + if s > m then s fi + od; + + s +} + +n := read (); +y := ((((((((1 + 1) + (1 + 1)) + ((1 + 1) + (1 + 1))) + (((1 + 1) + (1 + 1)) + ((1 + 1) + (1 + 1)))) + ((((1 + 1) + (1 + 1)) + ((1 + 1) + (1 + 1))) + (((1 + 1) + (1 + 1)) + ((1 + 1) + (1 + 1))))) + (((((1 + 1) + (1 + 1)) + ((1 + 1) + (1 + 1))) + (((1 + 1) + (1 + 1)) + ((1 + 1) + (1 + 1)))) + ((((1 + 1) + (1 + 1)) + ((1 + 1) + (1 + 1))) + (((1 + 1) + (1 + 1)) + ((1 + 1) + (1 + 1)))))) + ((((((1 + 1) + (1 + 1)) + ((1 + 1) + (1 + 1))) + (((1 + 1) + (1 + 1)) + ((1 + 1) + (1 + 1)))) + ((((1 + 1) + (1 + 1)) + ((1 + 1) + (1 + 1))) + (((1 + 1) + (1 + 1)) + ((1 + 1) + (1 + 1))))) + (((((1 + 1) + (1 + 1)) + ((1 + 1) + (1 + 1))) + (((1 + 1) + (1 + 1)) + ((1 + 1) + (1 + 1)))) + ((((1 + 1) + (1 + 1)) + ((1 + 1) + (1 + 1))) + (((1 + 1) + (1 + 1)) + ((1 + 1) + (1 + 1))))))) + (((((((1 + 1) + (1 + 1)) + ((1 + 1) + (1 + 1))) + (((1 + 1) + (1 + 1)) + ((1 + 1) + (1 + 1)))) + ((((1 + 1) + (1 + 1)) + ((1 + 1) + (1 + 1))) + (((1 + 1) + (1 + 1)) + ((1 + 1) + (1 + 1))))) + (((((1 + 1) + (1 + 1)) + ((1 + 1) + (1 + 1))) + (((1 + 1) + (1 + 1)) + ((1 + 1) + (1 + 1)))) + ((((1 + 1) + (1 + 1)) + ((1 + 1) + (1 + 1))) + (((1 + 1) + (1 + 1)) + ((1 + 1) + (1 + 1)))))) + ((((((1 + 1) + (1 + 1)) + ((1 + 1) + (1 + 1))) + (((1 + 1) + (1 + 1)) + ((1 + 1) + (1 + 1)))) + ((((1 + 1) + (1 + 1)) + ((1 + 1) + (1 + 1))) + (((1 + 1) + (1 + 1)) + ((1 + 1) + (1 + 1))))) + (((((1 + 1) + (1 + 1)) + ((1 + 1) + (1 + 1))) + (((1 + 1) + (1 + 1)) + ((1 + 1) + (1 + 1)))) + ((((1 + 1) + (1 + 1)) + ((1 + 1) + (1 + 1))) + (((1 + 1) + (1 + 1)) + ((1 + 1) + (1 + test(10, 100))))))))); + +t := test (10, 100); +y2 := ((((((((1 + 1) + (1 + 1)) + ((1 + 1) + (1 + 1))) + (((1 + 1) + (1 + 1)) + ((1 + 1) + (1 + 1)))) + ((((1 + 1) + (1 + 1)) + ((1 + 1) + (1 + 1))) + (((1 + 1) + (1 + 1)) + ((1 + 1) + (1 + 1))))) + (((((1 + 1) + (1 + 1)) + ((1 + 1) + (1 + 1))) + (((1 + 1) + (1 + 1)) + ((1 + 1) + (1 + 1)))) + ((((1 + 1) + (1 + 1)) + ((1 + 1) + (1 + 1))) + (((1 + 1) + (1 + 1)) + ((1 + 1) + (1 + 1)))))) + ((((((1 + 1) + (1 + 1)) + ((1 + 1) + (1 + 1))) + (((1 + 1) + (1 + 1)) + ((1 + 1) + (1 + 1)))) + ((((1 + 1) + (1 + 1)) + ((1 + 1) + (1 + 1))) + (((1 + 1) + (1 + 1)) + ((1 + 1) + (1 + 1))))) + (((((1 + 1) + (1 + 1)) + ((1 + 1) + (1 + 1))) + (((1 + 1) + (1 + 1)) + ((1 + 1) + (1 + 1)))) + ((((1 + 1) + (1 + 1)) + ((1 + 1) + (1 + 1))) + (((1 + 1) + (1 + 1)) + ((1 + 1) + (1 + 1))))))) + (((((((1 + 1) + (1 + 1)) + ((1 + 1) + (1 + 1))) + (((1 + 1) + (1 + 1)) + ((1 + 1) + (1 + 1)))) + ((((1 + 1) + (1 + 1)) + ((1 + 1) + (1 + 1))) + (((1 + 1) + (1 + 1)) + ((1 + 1) + (1 + 1))))) + (((((1 + 1) + (1 + 1)) + ((1 + 1) + (1 + 1))) + (((1 + 1) + (1 + 1)) + ((1 + 1) + (1 + 1)))) + ((((1 + 1) + (1 + 1)) + ((1 + 1) + (1 + 1))) + (((1 + 1) + (1 + 1)) + ((1 + 1) + (1 + 1)))))) + ((((((1 + 1) + (1 + 1)) + ((1 + 1) + (1 + 1))) + (((1 + 1) + (1 + 1)) + ((1 + 1) + (1 + 1)))) + ((((1 + 1) + (1 + 1)) + ((1 + 1) + (1 + 1))) + (((1 + 1) + (1 + 1)) + ((1 + 1) + (1 + 1))))) + (((((1 + 1) + (1 + 1)) + ((1 + 1) + (1 + 1))) + (((1 + 1) + (1 + 1)) + ((1 + 1) + (1 + 1)))) + ((((1 + 1) + (1 + 1)) + ((1 + 1) + (1 + 1))) + (((1 + 1) + (1 + 1)) + ((1 + 1) + (1 + t)))))))); + +write (t); +write (y2); +write (y) + diff --git a/regression/test084.input b/regression/test084.input new file mode 100644 index 000000000..573541ac9 --- /dev/null +++ b/regression/test084.input @@ -0,0 +1 @@ +0 diff --git a/regression/test085.expr b/regression/test085.expr new file mode 100644 index 000000000..8fd75ed11 --- /dev/null +++ b/regression/test085.expr @@ -0,0 +1,31 @@ +local n; + +fun sum (l) { + case l of + {} -> 0 + | h : t -> (h + sum (t)) + esac +} + +fun print_list (l) { + case l of + {} -> skip + | h : t -> write (h); print_list (t) + esac +} + +fun array_to_list (a) { + local l, i; + l := {}; + for i := a.length, i > 0, i := i-1 do + l := a[i-1] : l + od; + l +} + +n := read (); +write (sum ({})); +write (sum ({1, 2, 3, 4, 5})); +write (sum (1:2:3:4:5:{})); +print_list (array_to_list ([1, 2, 3, 4, 5])) + diff --git a/regression/test085.input b/regression/test085.input new file mode 100644 index 000000000..573541ac9 --- /dev/null +++ b/regression/test085.input @@ -0,0 +1 @@ +0 diff --git a/regression/test086.expr b/regression/test086.expr new file mode 100644 index 000000000..811e66287 --- /dev/null +++ b/regression/test086.expr @@ -0,0 +1,26 @@ +local n; + +fun hd (l) { + case l of + h : _ -> h + esac +} + + +fun tl (l) { + case l of + _ : tl -> tl + esac +} + +fun print_list (l) { + case l of + {} -> skip + | h : t -> write (h); print_list (t) + esac +} + +n := read (); +write ({1, 2, 3}.hd); +print_list ({1, 2, 3}.tl) + diff --git a/regression/test086.input b/regression/test086.input new file mode 100644 index 000000000..573541ac9 --- /dev/null +++ b/regression/test086.input @@ -0,0 +1 @@ +0 diff --git a/regression/test087.expr b/regression/test087.expr new file mode 100644 index 000000000..81c8ee53f --- /dev/null +++ b/regression/test087.expr @@ -0,0 +1,41 @@ +local n; + +infix "===" at "==" (v1, v2) { + local s1, s2, i; + + s1 := v1.string; + s2 := v2.string; + + if s1.length == s2.length + then + for i := 0, i < s1.length, i := i + 1 + do + if s1[i] != s2[i] then return 0 fi + od; + 1 + else 0 + fi +} + +infix "?" before "+" (v, l) { + case l of + {} -> 0 + | h : tl -> if h === v then 1 else (v ? tl) fi + esac +} + +infix "+++" at "+" (l1, l2) { + case l1 of + {} -> l2 + | h : tl -> (h : tl +++ l2) + esac +} + +n := read (); + +write ({1, 2, 3} === {1, 2, 3}); +write ({1, 2, 3} === {1, 2, 4}); +write (1+2 ? {1, 2, 3}); +write (1*3+2 ? {1, 2, 3}); +write (1*3+2 ? {1, 2, 5}); +write (8*4 ? {1, 2, 3} +++ {5, 7, 32, 6}) diff --git a/regression/test087.input b/regression/test087.input new file mode 100644 index 000000000..573541ac9 --- /dev/null +++ b/regression/test087.input @@ -0,0 +1 @@ +0 diff --git a/regression/test088.expr b/regression/test088.expr new file mode 100644 index 000000000..e9c520825 --- /dev/null +++ b/regression/test088.expr @@ -0,0 +1,8 @@ +fun len(l) { + case l of + _ : xs -> len(xs) + 1 + |{} -> 0 + esac +} +write(len({})); +write(len({1, 2, 3})) \ No newline at end of file diff --git a/regression/test088.input b/regression/test088.input new file mode 100644 index 000000000..e69de29bb diff --git a/regression/test089.expr b/regression/test089.expr new file mode 100644 index 000000000..56de3bb5f --- /dev/null +++ b/regression/test089.expr @@ -0,0 +1,8 @@ +fun test (a, b, c) { + local x = a + b, y = b + c; + {local e = x + y; + e + } +} + +write (test (read (), read (), read ())) \ No newline at end of file diff --git a/regression/test089.input b/regression/test089.input new file mode 100644 index 000000000..01e79c32a --- /dev/null +++ b/regression/test089.input @@ -0,0 +1,3 @@ +1 +2 +3 diff --git a/regression/test090.expr b/regression/test090.expr new file mode 100644 index 000000000..42765c6bf --- /dev/null +++ b/regression/test090.expr @@ -0,0 +1,12 @@ +fun a (x) { x + 1} +fun b (x) { x + 2} +fun c (x) { x + 3} + +{ + local funs = [a, b, c]; + local n = read (), i; + + for i := 0, i < 3, i := i+1 do + write (funs[i] (n)) + od +} \ No newline at end of file diff --git a/regression/test090.input b/regression/test090.input new file mode 100644 index 000000000..7ed6ff82d --- /dev/null +++ b/regression/test090.input @@ -0,0 +1 @@ +5 diff --git a/regression/test091.expr b/regression/test091.expr new file mode 100644 index 000000000..c691b90c3 --- /dev/null +++ b/regression/test091.expr @@ -0,0 +1,23 @@ +fun map (f, l) { + case l of + {} -> {} + | h : tl -> (f (h) : map (f, tl)) + esac +} + +fun a (x) { x + 1} +fun b (x) { x + 2} + +fun print_list (x) { + case x of + {} -> skip + | h : tl -> write (h); print_list (tl) + esac +} + +local x = read (); + +print_list ({1, 2, 3}); +print_list (map (a, {1, 2, 3})); +print_list (map (b, {1, 2, 3})) + diff --git a/regression/test091.input b/regression/test091.input new file mode 100644 index 000000000..7ed6ff82d --- /dev/null +++ b/regression/test091.input @@ -0,0 +1 @@ +5 diff --git a/regression/test092.expr b/regression/test092.expr new file mode 100644 index 000000000..261881c89 --- /dev/null +++ b/regression/test092.expr @@ -0,0 +1,19 @@ +fun f (l) { + infix "===" at "==" (a, b) { + a == b + } + + case l of + {} -> 1 + | {_} -> 1 + | a : b : tl -> a === b && f (b : tl) + esac +} + +local x = read (); + +write (f ({})); +write (f ({1})); +write (f ({1, 1})); +write (f ({1, 1, 1})); +write (f ({1, 2, 1})) diff --git a/regression/test092.input b/regression/test092.input new file mode 100644 index 000000000..7ed6ff82d --- /dev/null +++ b/regression/test092.input @@ -0,0 +1 @@ +5 diff --git a/regression/test093.expr b/regression/test093.expr new file mode 100644 index 000000000..88655ea7a --- /dev/null +++ b/regression/test093.expr @@ -0,0 +1,12 @@ +fun plus (x) { + fun f (y) { + x + y + } + + f +} + +local x = read (); + +write (plus(5)(6)); +write (plus(8)(10)) \ No newline at end of file diff --git a/regression/test093.input b/regression/test093.input new file mode 100644 index 000000000..7ed6ff82d --- /dev/null +++ b/regression/test093.input @@ -0,0 +1 @@ +5 diff --git a/regression/test094.expr b/regression/test094.expr new file mode 100644 index 000000000..2c1ff7519 --- /dev/null +++ b/regression/test094.expr @@ -0,0 +1,22 @@ +fun a (x, y) { + local a = x + y, b = x - y; + { + local f = fun () { + write (x); + write (y); + write (a); + write (b) + }; + + a := 100; + b := 200; + x := 800; + y := 1000; + + f + } +} + +local x = read (); + +a (5, 7) () \ No newline at end of file diff --git a/regression/test094.input b/regression/test094.input new file mode 100644 index 000000000..7ed6ff82d --- /dev/null +++ b/regression/test094.input @@ -0,0 +1 @@ +5 diff --git a/regression/test095.expr b/regression/test095.expr new file mode 100644 index 000000000..4e9d3723e --- /dev/null +++ b/regression/test095.expr @@ -0,0 +1,5 @@ +infix "++" at "+" (a, b) { a+b} + +local x = read (); + +write (infix "++" (2, 3)) \ No newline at end of file diff --git a/regression/test095.input b/regression/test095.input new file mode 100644 index 000000000..7ed6ff82d --- /dev/null +++ b/regression/test095.input @@ -0,0 +1 @@ +5 diff --git a/regression/test096.expr b/regression/test096.expr new file mode 100644 index 000000000..31791e95c --- /dev/null +++ b/regression/test096.expr @@ -0,0 +1,23 @@ +fun f () { + local x, l = {}; + fun g () { x} + + x := 1; + l := g : l; + + x := 2; + l := g : l; + + l +} + +fun p (l) { + case l of + {} -> skip + | h : tl -> write (h ()); p (tl) + esac +} + +local x = read (); + +p (f ()) \ No newline at end of file diff --git a/regression/test096.input b/regression/test096.input new file mode 100644 index 000000000..7ed6ff82d --- /dev/null +++ b/regression/test096.input @@ -0,0 +1 @@ +5 diff --git a/regression/test097.expr b/regression/test097.expr new file mode 100644 index 000000000..0b63f8c74 --- /dev/null +++ b/regression/test097.expr @@ -0,0 +1,13 @@ +fun f (a) { + fun g (b) { + fun h (c) { + fun (x) { x + a + b + c} + } + h (b) + } + g (a) +} + +local x = read (); + +write (f(10)(5)) \ No newline at end of file diff --git a/regression/test097.input b/regression/test097.input new file mode 100644 index 000000000..7ed6ff82d --- /dev/null +++ b/regression/test097.input @@ -0,0 +1 @@ +5 diff --git a/regression/test098.expr b/regression/test098.expr new file mode 100644 index 000000000..bb682c860 --- /dev/null +++ b/regression/test098.expr @@ -0,0 +1,7 @@ +infixr "**" before "*" (f, g) { + fun (x) { f (g (x))} +} + +local x = read (); + +write ((fun (x) { x+2} ** fun (x) { x+3})(7)) \ No newline at end of file diff --git a/regression/test098.input b/regression/test098.input new file mode 100644 index 000000000..7ed6ff82d --- /dev/null +++ b/regression/test098.input @@ -0,0 +1 @@ +5 diff --git a/regression/test099.expr b/regression/test099.expr new file mode 100644 index 000000000..3010a19ac --- /dev/null +++ b/regression/test099.expr @@ -0,0 +1,19 @@ +fun lazy (f) { + local flag = 0, value = 0; + + fun () { + if flag + then value + else + value := f (); + flag := 1; + value + fi + } +} + +local l = lazy (fun () {write (1); 800}); +local x = read (); + +write (l ()); +write (l ()) \ No newline at end of file diff --git a/regression/test099.input b/regression/test099.input new file mode 100644 index 000000000..7ed6ff82d --- /dev/null +++ b/regression/test099.input @@ -0,0 +1 @@ +5 diff --git a/regression/test100.expr b/regression/test100.expr new file mode 100644 index 000000000..3e093aaa9 --- /dev/null +++ b/regression/test100.expr @@ -0,0 +1,11 @@ +fun f (x) { + fun inner (y) { + if y == 0 then 0 else inner (y-1) fi + } + + inner (x) +} + +local n = read (); + +write (f (5)) \ No newline at end of file diff --git a/regression/test100.input b/regression/test100.input new file mode 100644 index 000000000..7ed6ff82d --- /dev/null +++ b/regression/test100.input @@ -0,0 +1 @@ +5 diff --git a/regression/test101.expr b/regression/test101.expr new file mode 100644 index 000000000..b5f86797a --- /dev/null +++ b/regression/test101.expr @@ -0,0 +1,15 @@ +fun f (x) { + fun inner1 (y) { + if y == 0 then 0 else inner2 (y-1) fi + } + + fun inner2 (y) { + if y == 0 then 0 else inner1 (y-1) fi + } + + inner1 (x) +} + +local n = read (); + +write (f (5)) \ No newline at end of file diff --git a/regression/test101.input b/regression/test101.input new file mode 100644 index 000000000..7ed6ff82d --- /dev/null +++ b/regression/test101.input @@ -0,0 +1 @@ +5 diff --git a/regression/test102.expr b/regression/test102.expr new file mode 100644 index 000000000..9aa880fed --- /dev/null +++ b/regression/test102.expr @@ -0,0 +1,9 @@ +fun f (x) { + fun g () { x} + fun h () { g} + g +} + +local n = read (); + +write (f(5)()) \ No newline at end of file diff --git a/regression/test102.input b/regression/test102.input new file mode 100644 index 000000000..7ed6ff82d --- /dev/null +++ b/regression/test102.input @@ -0,0 +1 @@ +5 diff --git a/src/Language.ml b/src/Language.ml index 61747f6dc..0c6e58d09 100644 --- a/src/Language.ml +++ b/src/Language.ml @@ -660,7 +660,7 @@ module Expr = | c:(%"true" {Const 1} | %"false" {Const 0}) => {notRef atr} => {ignore atr c} | %"infix" s:STRING => {notRef atr} => {ignore atr (Var (infix_name s))} - | %"fun" "(" args:!(Util.list0)[ostap (LIDENT)] ")" body:basic[def][infix][Weak] => {notRef atr} => {ignore atr (Lambda (args, body))} + | %"fun" "(" args:!(Util.list0)[ostap (LIDENT)] ")" "{" body:scope[def][infix][Weak][parse def] "}"=> {notRef atr} => {ignore atr (Lambda (args, body))} | "[" es:!(Util.list0)[parse def infix Val] "]" => {notRef atr} => {ignore atr (Array es)} | -"{" scope[def][infix][atr][parse def] -"}" | "{" es:!(Util.list0)[parse def infix Val] "}" => {notRef atr} => {ignore atr (match es with @@ -671,20 +671,14 @@ module Expr = | None -> [] | Some args -> args)) } - | x:LIDENT {if notRef atr then Var x else Ref x} + | x:LIDENT {if notRef atr then ignore atr (Var x) else Ref x} | {isVoid atr} => %"skip" {materialize atr Skip} | %"if" e:parse[def][infix][Val] %"then" the:scope[def][infix][atr][parse def] - elif:(%"elif" parse[def][infix][Val] %"then" scope[def][infix][atr][parse def])* + elif:(%"elif" parse[def][infix][Val] %"then" scope[def][infix][atr][parse def])* els:(%"else" scope[def][infix][atr][parse def])? %"fi" {If (e, the, List.fold_right (fun (e, t) elif -> If (e, t, elif)) elif (match els with Some e -> e | _ -> materialize atr Skip))} - (* - | %"if" e:parse[def][infix][Val] %"then" the:scope[def][infix][Void][parse def] - elif:(%"elif" parse[def][infix][Val] %"then" scope[def][infix][atr][parse def])* - => {isVoid atr} => %"fi" - {If (e, the, List.fold_right (fun (e, t) elif -> If (e, t, elif)) elif Skip)} - *) | %"while" e:parse[def][infix][Val] %"do" s:scope[def][infix][Void][parse def] => {isVoid atr} => %"od" {materialize atr (While (e, s))} @@ -842,7 +836,7 @@ module Definition = m:(%"local" {`Local} | %"public" e:(%"external")? {match e with None -> `Public | Some _ -> `PublicExtern} | %"external" {`Extern}) locs:!(Util.list (local_var m infix expr def)) ";" {locs, infix} | - <(m, orig_name, name, infix')> : head[infix] -"(" -args:!(Util.list0 arg) -")" - (body:expr[def][infix'][Expr.Weak (*Void*)] { + ("{" body:expr[def][infix'][Expr.Weak] "}" { match m with | `Extern -> raise (Semantic_error (Printf.sprintf "body for an external function '%s' can not be specified" orig_name)) | _ -> [(name, (m, `Fun (args, body)))], infix' @@ -945,7 +939,7 @@ let eval (_, expr) i = (* Top-level parser *) ostap ( - imports[cmd]: l:$ is:(%"import" !(Util.list (ostap (LIDENT))) -";")* { + imports[cmd]: l:$ is:(%"import" !(Util.list (ostap (UIDENT))) -";")* { let is = "Std" :: List.flatten is in let infix = List.fold_left @@ -973,11 +967,11 @@ ostap ( is, infix }; parse[cmd]: - <(is, infix)> : imports[cmd] <(d, infix')> : definitions[infix] expr:!(Expr.parse definitions infix' Expr.Weak (*Void*))? { + <(is, infix)> : imports[cmd] <(d, infix')> : definitions[infix] expr:!(Expr.parse definitions infix' Expr.Weak)? { (is, Infix.extract_exports infix'), Expr.Scope (d, match expr with None -> Expr.Skip | Some e -> e) }; definitions[infix]: - <(def, infix')> : !(Definition.parse infix Expr.basic definitions) <(defs, infix'')> : definitions[infix'] { + <(def, infix')> : !(Definition.parse infix (*Expr.basic*) (fun def infix atr -> Expr.scope def infix atr (Expr.parse def)) definitions) <(defs, infix'')> : definitions[infix'] { def @ defs, infix'' } | empty {[], infix} diff --git a/src/SM.ml b/src/SM.ml index 2f82258ed..2d42b505e 100644 --- a/src/SM.ml +++ b/src/SM.ml @@ -162,7 +162,7 @@ let rec eval env (((cstack, stack, glob, loc, i, o) as conf) : config) = functio | BEGIN (_, _, locals, _) -> eval env (cstack, stack, glob, {loc with locals = Array.init locals (fun _ -> Value.Empty)}, i, o) prg' | END -> (match cstack with - | (prg', loc')::cstack' -> eval env (cstack', Value.Empty :: stack, glob, loc', i, o) prg' + | (prg', loc')::cstack' -> eval env (cstack', (*Value.Empty ::*) stack, glob, loc', i, o) prg' | [] -> conf )