diff --git a/stdlib/Ostap.expr b/stdlib/Ostap.expr index 77558cea9..ececc4438 100644 --- a/stdlib/Ostap.expr +++ b/stdlib/Ostap.expr @@ -11,7 +11,11 @@ public fun initOstap () { hct := emptyMemo () } -fun memo (f) { +public fun cleanupOstap () { + initOstap () +} + +public fun memo (f) { local t; f := lookupMemo (hct, f); @@ -148,7 +152,7 @@ public fun observe (name, f) { } } -public fun createResult () { +fun createResult () { local errors = ref ({}), line = ref (0), col = ref (0), @@ -192,10 +196,26 @@ public fun createResult () { [k, get] } -public fun k (acc) { +fun k (acc) { acc [0] } -public fun result (acc) { +fun result (acc) { acc [1] () } + +public fun parse (p, m) { + local acc = createResult (); + + p (acc.k) (m); + + acc.result +} + +public fun parseString (p, s) { + local acc = createResult (); + + p (acc.k) (initMatcher (s)); + + acc.result +} \ No newline at end of file diff --git a/stdlib/regression/orig/test10.log b/stdlib/regression/orig/test10.log new file mode 100644 index 000000000..149d3b197 --- /dev/null +++ b/stdlib/regression/orig/test10.log @@ -0,0 +1,2 @@ +Parsing "aaa" with many ... Succ ({"a", "a", "a"}) +Parsing "ab" with bad_alter ... Succ ("ab") diff --git a/stdlib/regression/test10.expr b/stdlib/regression/test10.expr new file mode 100644 index 000000000..7e46a77fd --- /dev/null +++ b/stdlib/regression/test10.expr @@ -0,0 +1,19 @@ +import Ostap; +import List; +import Fun; + +fun many (a) { + memo ( + fun (k) { + empty @ lift({}) + | many (a) |> fun (as) {a @ fun (x) {as +++ singleton (x)}} $ k + } + ) +} + +local a = token ("a"), b = token ("b"); +local bad_alter = a | a |> fun (x) {b @ fun (y) {x ++ y}}; + +initOstap (); +printf ("Parsing ""aaa"" with many ... %s\n", parseString (many (a) |> bypass (eof), "aaa").string); +printf ("Parsing ""ab"" with bad_alter ... %s\n", parseString (bad_alter |> bypass (eof), "ab").string) \ No newline at end of file