module GLL.Combinators.Test.Interface where
import Control.Monad
import Data.Char (ord)
import Data.List (sort, nub)
import Data.IORef
import GLL.Combinators.Interface
import GLL.Parseable.Char ()
main :: IO ()
main = do
IORef Integer
count <- Integer -> IO (IORef Integer)
forall a. a -> IO (IORef a)
newIORef Integer
1
let test :: Maybe (MemoRef a) -> [Char] -> s t a -> t ([t], [a]) -> IO ()
test Maybe (MemoRef a)
mref [Char]
name s t a
p t ([t], [a])
arg_pairs = do
Integer
i <- IORef Integer -> IO Integer
forall a. IORef a -> IO a
readIORef IORef Integer
count
IORef Integer -> (Integer -> Integer) -> IO ()
forall a. IORef a -> (a -> a) -> IO ()
modifyIORef IORef Integer
count Integer -> Integer
forall a. Enum a => a -> a
succ
IORef Char
subcount <- Char -> IO (IORef Char)
forall a. a -> IO (IORef a)
newIORef Char
'a'
[Char] -> IO ()
putStrLn ([Char]
">> testing " [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ Integer -> [Char]
forall a. Show a => a -> [Char]
show Integer
i [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ [Char]
" (" [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ [Char]
name [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ [Char]
")")
t ([t], [a]) -> (([t], [a]) -> IO ()) -> IO ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
t a -> (a -> m b) -> m ()
forM_ t ([t], [a])
arg_pairs ((([t], [a]) -> IO ()) -> IO ()) -> (([t], [a]) -> IO ()) -> IO ()
forall a b. (a -> b) -> a -> b
$ \([t]
str,[a]
res) -> do
case Maybe (MemoRef a)
mref of
Maybe (MemoRef a)
Nothing -> () -> IO ()
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return ()
Just MemoRef a
ref -> MemoRef a -> IO ()
forall a. MemoRef a -> IO ()
memClear MemoRef a
ref
Char
j <- IORef Char -> IO Char
forall a. IORef a -> IO a
readIORef IORef Char
subcount
IORef Char -> (Char -> Char) -> IO ()
forall a. IORef a -> (a -> a) -> IO ()
modifyIORef IORef Char
subcount Char -> Char
forall a. Enum a => a -> a
succ
let parse_res :: [a]
parse_res = ParseOptions -> CombinatorOptions -> s t a -> [t] -> [a]
forall t (s :: * -> * -> *) a.
(Show t, Parseable t, IsSymbExpr s) =>
ParseOptions -> CombinatorOptions -> s t a -> [t] -> [a]
parseWithParseOptions [ParseOption
noSelectTest] [CombinatorOption
useMemoisation] s t a
p [t]
str
norm :: (Eq a, Ord a) => [a] -> [a]
norm :: forall a. (Eq a, Ord a) => [a] -> [a]
norm = Int -> [a] -> [a]
forall a. Int -> [a] -> [a]
take Int
100 ([a] -> [a]) -> ([a] -> [a]) -> [a] -> [a]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [a] -> [a]
forall a. Ord a => [a] -> [a]
sort ([a] -> [a]) -> ([a] -> [a]) -> [a] -> [a]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [a] -> [a]
forall a. Eq a => [a] -> [a]
nub
norm_p_res :: [a]
norm_p_res = [a] -> [a]
forall a. (Eq a, Ord a) => [a] -> [a]
norm [a]
parse_res
b :: Bool
b = [a]
norm_p_res [a] -> [a] -> Bool
forall a. Eq a => a -> a -> Bool
== [a] -> [a]
forall a. (Eq a, Ord a) => [a] -> [a]
norm [a]
res
[Char] -> IO ()
putStrLn ([Char]
" >> " [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ [Char
j,Char
')',Char
' '] [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ Bool -> [Char]
forall a. Show a => a -> [Char]
show Bool
b)
Bool -> IO () -> IO ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
unless Bool
b ([Char] -> IO ()
putStrLn ([Char]
" >> " [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ [a] -> [Char]
forall a. Show a => a -> [Char]
show [a]
norm_p_res))
Maybe (MemoRef Any)
-> [Char] -> AltExpr Char Integer -> [([Char], [Integer])] -> IO ()
forall {t :: * -> *} {a} {t} {s :: * -> * -> *} {a}.
(Foldable t, Show a, Parseable t, IsSymbExpr s, Ord a) =>
Maybe (MemoRef a) -> [Char] -> s t a -> t ([t], [a]) -> IO ()
test Maybe (MemoRef Any)
forall a. Maybe a
Nothing [Char]
"eps1" (Integer -> AltExpr Char Integer
forall t a. (Show t, Ord t) => a -> AltExpr t a
satisfy Integer
0) [([Char]
"", [Integer
0])]
Maybe (MemoRef Any)
-> [Char] -> AltExpr Char Integer -> [([Char], [Integer])] -> IO ()
forall {t :: * -> *} {a} {t} {s :: * -> * -> *} {a}.
(Foldable t, Show a, Parseable t, IsSymbExpr s, Ord a) =>
Maybe (MemoRef a) -> [Char] -> s t a -> t ([t], [a]) -> IO ()
test Maybe (MemoRef Any)
forall a. Maybe a
Nothing [Char]
"eps2" (Integer -> AltExpr Char Integer
forall t a. (Show t, Ord t) => a -> AltExpr t a
satisfy Integer
0) [([Char]
"", [Integer
0]), ([Char]
"111", [])]
Maybe (MemoRef Any)
-> [Char] -> SymbExpr Char Char -> [([Char], [Char])] -> IO ()
forall {t :: * -> *} {a} {t} {s :: * -> * -> *} {a}.
(Foldable t, Show a, Parseable t, IsSymbExpr s, Ord a) =>
Maybe (MemoRef a) -> [Char] -> s t a -> t ([t], [a]) -> IO ()
test Maybe (MemoRef Any)
forall a. Maybe a
Nothing [Char]
"single" (Char -> SymbExpr Char Char
char Char
'a') [([Char]
"a", [Char
'a'])
,([Char]
"abc", [])]
Maybe (MemoRef Any)
-> [Char] -> AltExpr Char Integer -> [([Char], [Integer])] -> IO ()
forall {t :: * -> *} {a} {t} {s :: * -> * -> *} {a}.
(Foldable t, Show a, Parseable t, IsSymbExpr s, Ord a) =>
Maybe (MemoRef a) -> [Char] -> s t a -> t ([t], [a]) -> IO ()
test Maybe (MemoRef Any)
forall a. Maybe a
Nothing [Char]
"semfun1" (Integer
1 Integer -> SymbExpr Char Char -> AltExpr Char Integer
forall t (s :: * -> * -> *) b a.
(Show t, Ord t, IsSymbExpr s) =>
b -> s t a -> AltExpr t b
<$$ Char -> SymbExpr Char Char
char Char
'a') [([Char]
"a", [Integer
1])]
Maybe (MemoRef Any)
-> [Char] -> AltExpr Char [Char] -> [([Char], [[Char]])] -> IO ()
forall {t :: * -> *} {a} {t} {s :: * -> * -> *} {a}.
(Foldable t, Show a, Parseable t, IsSymbExpr s, Ord a) =>
Maybe (MemoRef a) -> [Char] -> s t a -> t ([t], [a]) -> IO ()
test Maybe (MemoRef Any)
forall a. Maybe a
Nothing [Char]
"<**>" ((\Char
b -> [Char
'1',Char
b]) (Char -> [Char])
-> SymbExpr Char Char -> AltExpr Char (Char -> [Char])
forall t (s :: * -> * -> *) b a.
(Show t, Ord t, IsSymbExpr s) =>
b -> s t a -> AltExpr t b
<$$ Char -> SymbExpr Char Char
char Char
'a' AltExpr Char (Char -> [Char])
-> SymbExpr Char Char -> AltExpr Char [Char]
forall t (i :: * -> * -> *) (s :: * -> * -> *) a b.
(Show t, Ord t, IsAltExpr i, IsSymbExpr s) =>
i t (a -> b) -> s t a -> AltExpr t b
<**> Char -> SymbExpr Char Char
char Char
'b')
[([Char]
"ab", [[Char]
"1b"])
,([Char]
"b", [])]
Maybe (MemoRef Any)
-> [Char] -> OO [] AltExpr Char Int -> [([Char], [Int])] -> IO ()
forall {t :: * -> *} {a} {t} {s :: * -> * -> *} {a}.
(Foldable t, Show a, Parseable t, IsSymbExpr s, Ord a) =>
Maybe (MemoRef a) -> [Char] -> s t a -> t ([t], [a]) -> IO ()
test Maybe (MemoRef Any)
forall a. Maybe a
Nothing [Char]
"<||>" (Char -> Int
ord (Char -> Int) -> SymbExpr Char Char -> AltExpr Char (Char -> Int)
forall t (s :: * -> * -> *) b a.
(Show t, Ord t, IsSymbExpr s) =>
b -> s t a -> AltExpr t b
<$$ Char -> SymbExpr Char Char
char Char
'a' AltExpr Char (Char -> Int)
-> SymbExpr Char Char -> AltExpr Char Int
forall t (i :: * -> * -> *) (s :: * -> * -> *) a b.
(Show t, Ord t, IsAltExpr i, IsSymbExpr s) =>
i t (a -> b) -> s t a -> AltExpr t b
<**> Char -> SymbExpr Char Char
char Char
'b' AltExpr Char Int -> AltExpr Char Int -> OO [] AltExpr Char Int
forall t (i :: * -> * -> *) (b :: * -> * -> *) a.
(Show t, Ord t, IsAltExpr i, HasAlts b) =>
i t a -> b t a -> AltExprs t a
<||> Char -> Int
ord (Char -> Int) -> SymbExpr Char Char -> AltExpr Char Int
forall t (s :: * -> * -> *) a b.
(Show t, Ord t, IsSymbExpr s) =>
(a -> b) -> s t a -> AltExpr t b
<$$> Char -> SymbExpr Char Char
char Char
'c')
[([Char]
"a", []), ([Char]
"ab", [Int
98]), ([Char]
"c", [Int
99]), ([Char]
"cab", [])]
let pX :: SymbExpr Char Int
pX = [Char]
"X" [Char] -> AltExpr Char Int -> SymbExpr Char Int
forall t (b :: * -> * -> *) a.
(Show t, Ord t, HasAlts b) =>
[Char] -> b t a -> SymbExpr t a
<:=> Char -> Int
ord (Char -> Int) -> SymbExpr Char Char -> AltExpr Char Int
forall t (s :: * -> * -> *) a b.
(Show t, Ord t, IsSymbExpr s) =>
(a -> b) -> s t a -> AltExpr t b
<$$> Char -> SymbExpr Char Char
char Char
'a' AltExpr Char Int -> SymbExpr Char Char -> AltExpr Char Int
forall t (i :: * -> * -> *) (s :: * -> * -> *) a b.
(Show t, Ord t, IsAltExpr i, IsSymbExpr s) =>
i t a -> s t b -> AltExpr t a
<** Char -> SymbExpr Char Char
char Char
'b'
Maybe (MemoRef Any)
-> [Char] -> SymbExpr Char Int -> [([Char], [Int])] -> IO ()
forall {t :: * -> *} {a} {t} {s :: * -> * -> *} {a}.
(Foldable t, Show a, Parseable t, IsSymbExpr s, Ord a) =>
Maybe (MemoRef a) -> [Char] -> s t a -> t ([t], [a]) -> IO ()
test Maybe (MemoRef Any)
forall a. Maybe a
Nothing [Char]
"<:=>" SymbExpr Char Int
pX [([Char]
"ab",[Int
97]),([Char]
"a",[])]
let pX :: SymbExpr Char Int
pX = [Char]
"X" [Char] -> AltExpr Char Int -> SymbExpr Char Int
forall t (b :: * -> * -> *) a.
(Show t, Ord t, HasAlts b) =>
[Char] -> b t a -> SymbExpr t a
<::=> Char -> Int
ord (Char -> Int) -> SymbExpr Char Char -> AltExpr Char Int
forall t (s :: * -> * -> *) a b.
(Show t, Ord t, IsSymbExpr s) =>
(a -> b) -> s t a -> AltExpr t b
<$$> Char -> SymbExpr Char Char
char Char
'a' AltExpr Char Int -> SymbExpr Char Char -> AltExpr Char Int
forall t (i :: * -> * -> *) (s :: * -> * -> *) a b.
(Show t, Ord t, IsAltExpr i, IsSymbExpr s) =>
i t a -> s t b -> AltExpr t a
<** Char -> SymbExpr Char Char
char Char
'b'
Maybe (MemoRef Any)
-> [Char] -> SymbExpr Char Int -> [([Char], [Int])] -> IO ()
forall {t :: * -> *} {a} {t} {s :: * -> * -> *} {a}.
(Foldable t, Show a, Parseable t, IsSymbExpr s, Ord a) =>
Maybe (MemoRef a) -> [Char] -> s t a -> t ([t], [a]) -> IO ()
test Maybe (MemoRef Any)
forall a. Maybe a
Nothing [Char]
"<::=>" SymbExpr Char Int
pX [([Char]
"ab",[Int
97]),([Char]
"a",[])]
let pX :: SymbExpr Char [Char]
pX = [Char]
"X" [Char] -> AltExpr Char [Char] -> SymbExpr Char [Char]
forall t (b :: * -> * -> *) a.
(Show t, Ord t, HasAlts b) =>
[Char] -> b t a -> SymbExpr t a
<:=> (Char -> [Char] -> [Char]) -> [Char] -> Char -> [Char]
forall a b c. (a -> b -> c) -> b -> a -> c
flip (:) ([Char] -> Char -> [Char])
-> SymbExpr Char [Char] -> AltExpr Char (Char -> [Char])
forall t (s :: * -> * -> *) a b.
(Show t, Ord t, IsSymbExpr s) =>
(a -> b) -> s t a -> AltExpr t b
<$$> SymbExpr Char [Char]
pY AltExpr Char (Char -> [Char])
-> SymbExpr Char Char -> AltExpr Char [Char]
forall t (i :: * -> * -> *) (s :: * -> * -> *) a b.
(Show t, Ord t, IsAltExpr i, IsSymbExpr s) =>
i t (a -> b) -> s t a -> AltExpr t b
<**> Char -> SymbExpr Char Char
char Char
'a'
pY :: SymbExpr Char [Char]
pY = [Char]
"Y" [Char] -> AltExpr Char [Char] -> SymbExpr Char [Char]
forall t (b :: * -> * -> *) a.
(Show t, Ord t, HasAlts b) =>
[Char] -> b t a -> SymbExpr t a
<:=> (\Char
x Char
y -> [Char
x,Char
y]) (Char -> Char -> [Char])
-> SymbExpr Char Char -> AltExpr Char (Char -> [Char])
forall t (s :: * -> * -> *) a b.
(Show t, Ord t, IsSymbExpr s) =>
(a -> b) -> s t a -> AltExpr t b
<$$> Char -> SymbExpr Char Char
char Char
'b' AltExpr Char (Char -> [Char])
-> SymbExpr Char Char -> AltExpr Char [Char]
forall t (i :: * -> * -> *) (s :: * -> * -> *) a b.
(Show t, Ord t, IsAltExpr i, IsSymbExpr s) =>
i t (a -> b) -> s t a -> AltExpr t b
<**> Char -> SymbExpr Char Char
char Char
'c'
Maybe (MemoRef Any)
-> [Char] -> SymbExpr Char [Char] -> [([Char], [[Char]])] -> IO ()
forall {t :: * -> *} {a} {t} {s :: * -> * -> *} {a}.
(Foldable t, Show a, Parseable t, IsSymbExpr s, Ord a) =>
Maybe (MemoRef a) -> [Char] -> s t a -> t ([t], [a]) -> IO ()
test Maybe (MemoRef Any)
forall a. Maybe a
Nothing [Char]
"<::=> 2" SymbExpr Char [Char]
pX [([Char]
"bca", [[Char]
"abc"]), ([Char]
"cba", [])]
let pX :: SymbExpr Char Char
pX = [Char]
"X" [Char] -> AltExpr Char Char -> SymbExpr Char Char
forall t (b :: * -> * -> *) a.
(Show t, Ord t, HasAlts b) =>
[Char] -> b t a -> SymbExpr t a
<::=> SymbExpr Char Char
pY SymbExpr Char Char -> SymbExpr Char Char -> AltExpr Char Char
forall t (i :: * -> * -> *) (s :: * -> * -> *) a b.
(Show t, Ord t, IsAltExpr i, IsSymbExpr s) =>
i t a -> s t b -> AltExpr t a
<** Char -> SymbExpr Char Char
char Char
'c'
pY :: SymbExpr Char Char
pY = [Char]
"Y" [Char] -> OO [] AltExpr Char Char -> SymbExpr Char Char
forall t (b :: * -> * -> *) a.
(Show t, Ord t, HasAlts b) =>
[Char] -> b t a -> SymbExpr t a
<::=> Char -> SymbExpr Char Char
char Char
'a' SymbExpr Char Char -> SymbExpr Char Char -> OO [] AltExpr Char Char
forall t (i :: * -> * -> *) (b :: * -> * -> *) a.
(Show t, Ord t, IsAltExpr i, HasAlts b) =>
i t a -> b t a -> AltExprs t a
<||> Char -> SymbExpr Char Char
char Char
'b'
Maybe (MemoRef Any)
-> [Char] -> SymbExpr Char Char -> [([Char], [Char])] -> IO ()
forall {t :: * -> *} {a} {t} {s :: * -> * -> *} {a}.
(Foldable t, Show a, Parseable t, IsSymbExpr s, Ord a) =>
Maybe (MemoRef a) -> [Char] -> s t a -> t ([t], [a]) -> IO ()
test Maybe (MemoRef Any)
forall a. Maybe a
Nothing [Char]
"<::=> <||>" SymbExpr Char Char
pX [([Char]
"ac", [Char]
"a"), ([Char]
"bc", [Char]
"b")]
let pX :: BNF Char Int
pX :: SymbExpr Char Int
pX = [Char]
"X" [Char] -> OO [] AltExpr Char Int -> SymbExpr Char Int
forall t (b :: * -> * -> *) a.
(Show t, Ord t, HasAlts b) =>
[Char] -> b t a -> SymbExpr t a
<::=> (Int -> Int -> Int
forall a. Num a => a -> a -> a
+Int
1) (Int -> Int) -> SymbExpr Char Char -> AltExpr Char (Int -> Int)
forall t (s :: * -> * -> *) b a.
(Show t, Ord t, IsSymbExpr s) =>
b -> s t a -> AltExpr t b
<$$ Char -> SymbExpr Char Char
char Char
'a' AltExpr Char (Int -> Int) -> SymbExpr Char Int -> AltExpr Char Int
forall t (i :: * -> * -> *) (s :: * -> * -> *) a b.
(Show t, Ord t, IsAltExpr i, IsSymbExpr s) =>
i t (a -> b) -> s t a -> AltExpr t b
<**> SymbExpr Char Int
pX AltExpr Char Int -> AltExpr Char Int -> OO [] AltExpr Char Int
forall t (i :: * -> * -> *) (b :: * -> * -> *) a.
(Show t, Ord t, IsAltExpr i, HasAlts b) =>
i t a -> b t a -> AltExprs t a
<||> Int -> AltExpr Char Int
forall t a. (Show t, Ord t) => a -> AltExpr t a
satisfy Int
0
Maybe (MemoRef Any)
-> [Char] -> SymbExpr Char Int -> [([Char], [Int])] -> IO ()
forall {t :: * -> *} {a} {t} {s :: * -> * -> *} {a}.
(Foldable t, Show a, Parseable t, IsSymbExpr s, Ord a) =>
Maybe (MemoRef a) -> [Char] -> s t a -> t ([t], [a]) -> IO ()
test Maybe (MemoRef Any)
forall a. Maybe a
Nothing [Char]
"rec1" SymbExpr Char Int
pX [([Char]
"", [Int
0]), ([Char]
"aa",[Int
2]), (Int -> Char -> [Char]
forall a. Int -> a -> [a]
replicate Int
42 Char
'a', [Int
42]), ([Char]
"bbb", [])]
let pX :: SymbExpr Char (Maybe Char)
pX = [Char]
"X" [Char] -> AltExpr Char (Maybe Char) -> SymbExpr Char (Maybe Char)
forall t (b :: * -> * -> *) a.
(Show t, Ord t, HasAlts b) =>
[Char] -> b t a -> SymbExpr t a
<::=> Maybe Char -> Maybe Char
forall a. a -> a
id (Maybe Char -> Maybe Char)
-> SymbExpr Char Char -> AltExpr Char (Maybe Char -> Maybe Char)
forall t (s :: * -> * -> *) b a.
(Show t, Ord t, IsSymbExpr s) =>
b -> s t a -> AltExpr t b
<$$ Char -> SymbExpr Char Char
char Char
'a' AltExpr Char (Maybe Char -> Maybe Char)
-> SymbExpr Char Char -> AltExpr Char (Maybe Char -> Maybe Char)
forall t (i :: * -> * -> *) (s :: * -> * -> *) a b.
(Show t, Ord t, IsAltExpr i, IsSymbExpr s) =>
i t a -> s t b -> AltExpr t a
<** Char -> SymbExpr Char Char
char Char
'b' AltExpr Char (Maybe Char -> Maybe Char)
-> SymbExpr Char (Maybe Char) -> AltExpr Char (Maybe Char)
forall t (i :: * -> * -> *) (s :: * -> * -> *) a b.
(Show t, Ord t, IsAltExpr i, IsSymbExpr s) =>
i t (a -> b) -> s t a -> AltExpr t b
<**> SymbExpr Char Char -> SymbExpr Char (Maybe Char)
forall t (s :: * -> * -> *) a.
(Show t, Ord t, IsSymbExpr s) =>
s t a -> SymbExpr t (Maybe a)
optional (Char -> SymbExpr Char Char
char Char
'z')
Maybe (MemoRef Any)
-> [Char]
-> SymbExpr Char (Maybe Char)
-> [([Char], [Maybe Char])]
-> IO ()
forall {t :: * -> *} {a} {t} {s :: * -> * -> *} {a}.
(Foldable t, Show a, Parseable t, IsSymbExpr s, Ord a) =>
Maybe (MemoRef a) -> [Char] -> s t a -> t ([t], [a]) -> IO ()
test Maybe (MemoRef Any)
forall a. Maybe a
Nothing [Char]
"optional" SymbExpr Char (Maybe Char)
pX [([Char]
"abz", [Char -> Maybe Char
forall a. a -> Maybe a
Just Char
'z']), ([Char]
"abab", []), ([Char]
"ab", [Maybe Char
forall a. Maybe a
Nothing])]
let pX :: SymbExpr Char Char
pX = [Char]
"X" [Char] -> OO [] AltExpr Char Char -> SymbExpr Char Char
forall t (b :: * -> * -> *) a.
(Show t, Ord t, HasAlts b) =>
[Char] -> b t a -> SymbExpr t a
<::=> (Char -> SymbExpr Char Char
char Char
'a' SymbExpr Char Char -> SymbExpr Char Char -> OO [] AltExpr Char Char
forall t (i :: * -> * -> *) (b :: * -> * -> *) a.
(Show t, Ord t, IsAltExpr i, HasAlts b) =>
i t a -> b t a -> AltExprs t a
<||> Char -> SymbExpr Char Char
char Char
'b')
Maybe (MemoRef Any)
-> [Char] -> AltExpr Char Char -> [([Char], [Char])] -> IO ()
forall {t :: * -> *} {a} {t} {s :: * -> * -> *} {a}.
(Foldable t, Show a, Parseable t, IsSymbExpr s, Ord a) =>
Maybe (MemoRef a) -> [Char] -> s t a -> t ([t], [a]) -> IO ()
test Maybe (MemoRef Any)
forall a. Maybe a
Nothing [Char]
"<||> optional" (SymbExpr Char Char
pX SymbExpr Char Char
-> SymbExpr Char (Maybe Char) -> AltExpr Char Char
forall t (i :: * -> * -> *) (s :: * -> * -> *) a b.
(Show t, Ord t, IsAltExpr i, IsSymbExpr s) =>
i t a -> s t b -> AltExpr t a
<** SymbExpr Char Char -> SymbExpr Char (Maybe Char)
forall t (s :: * -> * -> *) a.
(Show t, Ord t, IsSymbExpr s) =>
s t a -> SymbExpr t (Maybe a)
optional (Char -> SymbExpr Char Char
char Char
'z'))
[([Char]
"az", [Char]
"a"), ([Char]
"bz", [Char]
"b"), ([Char]
"z", []), ([Char]
"b", [Char]
"b"), ([Char]
"a", [Char]
"a")]
let pX :: BNF Char Int
pX :: SymbExpr Char Int
pX = [Char]
"X" [Char] -> OO [] AltExpr Char Int -> SymbExpr Char Int
forall t (b :: * -> * -> *) a.
(Show t, Ord t, HasAlts b) =>
[Char] -> b t a -> SymbExpr t a
<::=> (Int
1 Int -> SymbExpr Char (Maybe Char) -> AltExpr Char Int
forall t (s :: * -> * -> *) b a.
(Show t, Ord t, IsSymbExpr s) =>
b -> s t a -> AltExpr t b
<$$ SymbExpr Char Char -> SymbExpr Char (Maybe Char)
forall t (s :: * -> * -> *) a.
(Show t, Ord t, IsSymbExpr s) =>
s t a -> SymbExpr t (Maybe a)
optional (Char -> SymbExpr Char Char
char Char
'a') AltExpr Char Int -> AltExpr Char Int -> OO [] AltExpr Char Int
forall t (i :: * -> * -> *) (b :: * -> * -> *) a.
(Show t, Ord t, IsAltExpr i, HasAlts b) =>
i t a -> b t a -> AltExprs t a
<||> Int
2 Int -> SymbExpr Char (Maybe Char) -> AltExpr Char Int
forall t (s :: * -> * -> *) b a.
(Show t, Ord t, IsSymbExpr s) =>
b -> s t a -> AltExpr t b
<$$ SymbExpr Char Char -> SymbExpr Char (Maybe Char)
forall t (s :: * -> * -> *) a.
(Show t, Ord t, IsSymbExpr s) =>
s t a -> SymbExpr t (Maybe a)
optional (Char -> SymbExpr Char Char
char Char
'b'))
Maybe (MemoRef Any)
-> [Char] -> AltExpr Char Int -> [([Char], [Int])] -> IO ()
forall {t :: * -> *} {a} {t} {s :: * -> * -> *} {a}.
(Foldable t, Show a, Parseable t, IsSymbExpr s, Ord a) =>
Maybe (MemoRef a) -> [Char] -> s t a -> t ([t], [a]) -> IO ()
test Maybe (MemoRef Any)
forall a. Maybe a
Nothing [Char]
"optional-ambig" (SymbExpr Char Int
pX SymbExpr Char Int -> SymbExpr Char (Maybe Char) -> AltExpr Char Int
forall t (i :: * -> * -> *) (s :: * -> * -> *) a b.
(Show t, Ord t, IsAltExpr i, IsSymbExpr s) =>
i t a -> s t b -> AltExpr t a
<** SymbExpr Char Char -> SymbExpr Char (Maybe Char)
forall t (s :: * -> * -> *) a.
(Show t, Ord t, IsSymbExpr s) =>
s t a -> SymbExpr t (Maybe a)
optional (Char -> SymbExpr Char Char
char Char
'z'))
[([Char]
"az", [Int
1]), ([Char]
"bz", [Int
2]), ([Char]
"z", [Int
1,Int
2]), ([Char]
"b", [Int
2]), ([Char]
"a", [Int
1])]
let pX :: SymbExpr Char Char
pX = [Char]
"X" [Char] -> AltExpr Char Char -> SymbExpr Char Char
forall t (b :: * -> * -> *) a.
(Show t, Ord t, HasAlts b) =>
[Char] -> b t a -> SymbExpr t a
<::=> Char -> Char
forall a. a -> a
id (Char -> Char) -> SymbExpr Char Char -> AltExpr Char (Char -> Char)
forall t (s :: * -> * -> *) b a.
(Show t, Ord t, IsSymbExpr s) =>
b -> s t a -> AltExpr t b
<$$ Char -> SymbExpr Char Char
char Char
'a' AltExpr Char (Char -> Char)
-> OO [] AltExpr Char Char -> AltExpr Char Char
forall t (i :: * -> * -> *) (s :: * -> * -> *) a b.
(Show t, Ord t, IsAltExpr i, IsSymbExpr s) =>
i t (a -> b) -> s t a -> AltExpr t b
<**> (Char -> SymbExpr Char Char
char Char
'b' SymbExpr Char Char -> SymbExpr Char Char -> OO [] AltExpr Char Char
forall t (i :: * -> * -> *) (b :: * -> * -> *) a.
(Show t, Ord t, IsAltExpr i, HasAlts b) =>
i t a -> b t a -> AltExprs t a
<||> Char -> SymbExpr Char Char
char Char
'c')
Maybe (MemoRef Any)
-> [Char] -> SymbExpr Char Char -> [([Char], [Char])] -> IO ()
forall {t :: * -> *} {a} {t} {s :: * -> * -> *} {a}.
(Foldable t, Show a, Parseable t, IsSymbExpr s, Ord a) =>
Maybe (MemoRef a) -> [Char] -> s t a -> t ([t], [a]) -> IO ()
test Maybe (MemoRef Any)
forall a. Maybe a
Nothing [Char]
"inline choice (1)" SymbExpr Char Char
pX
[([Char]
"ab", [Char]
"b"), ([Char]
"ac", [Char]
"c"), ([Char]
"a", []), ([Char]
"b", [])]
let pX :: SymbExpr Char Int
pX = [Char]
"X" [Char] -> AltExpr Char Int -> SymbExpr Char Int
forall t (b :: * -> * -> *) a.
(Show t, Ord t, HasAlts b) =>
[Char] -> b t a -> SymbExpr t a
<::=> [Char] -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length ([Char] -> Int) -> SymbExpr Char [Char] -> AltExpr Char Int
forall t (s :: * -> * -> *) a b.
(Show t, Ord t, IsSymbExpr s) =>
(a -> b) -> s t a -> AltExpr t b
<$$> SymbExpr Char Char -> SymbExpr Char [Char]
forall t (s :: * -> * -> *) a.
(Show t, Ord t, IsSymbExpr s) =>
s t a -> SymbExpr t [a]
multiple (Char -> SymbExpr Char Char
char Char
'1')
Maybe (MemoRef Any)
-> [Char] -> SymbExpr Char Int -> [([Char], [Int])] -> IO ()
forall {t :: * -> *} {a} {t} {s :: * -> * -> *} {a}.
(Foldable t, Show a, Parseable t, IsSymbExpr s, Ord a) =>
Maybe (MemoRef a) -> [Char] -> s t a -> t ([t], [a]) -> IO ()
test Maybe (MemoRef Any)
forall a. Maybe a
Nothing [Char]
"multiple" SymbExpr Char Int
pX [([Char]
"", [Int
0]), ([Char]
"11", [Int
2]), (Int -> Char -> [Char]
forall a. Int -> a -> [a]
replicate Int
12 Char
'1', [Int
12])]
let pX :: SymbExpr Char Int
pX = [Char]
"X" [Char] -> AltExpr Char Int -> SymbExpr Char Int
forall t (b :: * -> * -> *) a.
(Show t, Ord t, HasAlts b) =>
[Char] -> b t a -> SymbExpr t a
<::=> [Char] -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length ([Char] -> Int) -> SymbExpr Char [Char] -> AltExpr Char Int
forall t (s :: * -> * -> *) a b.
(Show t, Ord t, IsSymbExpr s) =>
(a -> b) -> s t a -> AltExpr t b
<$$> SymbExpr Char Char -> SymbExpr Char [Char]
forall t (s :: * -> * -> *) a.
(Show t, Ord t, IsSymbExpr s) =>
s t a -> SymbExpr t [a]
multiple1 (Char -> SymbExpr Char Char
char Char
'1')
Maybe (MemoRef Any)
-> [Char] -> SymbExpr Char Int -> [([Char], [Int])] -> IO ()
forall {t :: * -> *} {a} {t} {s :: * -> * -> *} {a}.
(Foldable t, Show a, Parseable t, IsSymbExpr s, Ord a) =>
Maybe (MemoRef a) -> [Char] -> s t a -> t ([t], [a]) -> IO ()
test Maybe (MemoRef Any)
forall a. Maybe a
Nothing [Char]
"multiple1" SymbExpr Char Int
pX [([Char]
"", []), ([Char]
"11", [Int
2]), (Int -> Char -> [Char]
forall a. Int -> a -> [a]
replicate Int
12 Char
'1', [Int
12])]
let pX :: BNF Char Int
pX :: SymbExpr Char Int
pX = [Char]
"X" [Char] -> OO [] AltExpr Char Int -> SymbExpr Char Int
forall t (b :: * -> * -> *) a.
(Show t, Ord t, HasAlts b) =>
[Char] -> b t a -> SymbExpr t a
<::=> Int
1 Int -> SymbExpr Char [Char] -> AltExpr Char Int
forall t (s :: * -> * -> *) b a.
(Show t, Ord t, IsSymbExpr s) =>
b -> s t a -> AltExpr t b
<$$ SymbExpr Char Char -> SymbExpr Char [Char]
forall t (s :: * -> * -> *) a.
(Show t, Ord t, IsSymbExpr s) =>
s t a -> SymbExpr t [a]
multiple (Char -> SymbExpr Char Char
char Char
'a') AltExpr Char Int -> AltExpr Char Int -> OO [] AltExpr Char Int
forall t (i :: * -> * -> *) (b :: * -> * -> *) a.
(Show t, Ord t, IsAltExpr i, HasAlts b) =>
i t a -> b t a -> AltExprs t a
<||> Int
2 Int -> SymbExpr Char [Char] -> AltExpr Char Int
forall t (s :: * -> * -> *) b a.
(Show t, Ord t, IsSymbExpr s) =>
b -> s t a -> AltExpr t b
<$$ SymbExpr Char Char -> SymbExpr Char [Char]
forall t (s :: * -> * -> *) a.
(Show t, Ord t, IsSymbExpr s) =>
s t a -> SymbExpr t [a]
multiple (Char -> SymbExpr Char Char
char Char
'b')
Maybe (MemoRef Any)
-> [Char] -> AltExpr Char Int -> [([Char], [Int])] -> IO ()
forall {t :: * -> *} {a} {t} {s :: * -> * -> *} {a}.
(Foldable t, Show a, Parseable t, IsSymbExpr s, Ord a) =>
Maybe (MemoRef a) -> [Char] -> s t a -> t ([t], [a]) -> IO ()
test Maybe (MemoRef Any)
forall a. Maybe a
Nothing [Char]
"(multiple <||> multiple) <**> optional" (SymbExpr Char Int
pX SymbExpr Char Int -> SymbExpr Char (Maybe Char) -> AltExpr Char Int
forall t (i :: * -> * -> *) (s :: * -> * -> *) a b.
(Show t, Ord t, IsAltExpr i, IsSymbExpr s) =>
i t a -> s t b -> AltExpr t a
<** SymbExpr Char Char -> SymbExpr Char (Maybe Char)
forall t (s :: * -> * -> *) a.
(Show t, Ord t, IsSymbExpr s) =>
s t a -> SymbExpr t (Maybe a)
optional (Char -> SymbExpr Char Char
char Char
'z'))
[([Char]
"az", [Int
1]), ([Char]
"bz", [Int
2]), ([Char]
"z", [Int
1,Int
2])
,([Char]
"", [Int
1,Int
2]), ([Char]
"b", [Int
2]), ([Char]
"a", [Int
1])]
let pX :: SymbExpr Char Int
pX = [Char]
"X" [Char] -> AltExpr Char Int -> SymbExpr Char Int
forall t (b :: * -> * -> *) a.
(Show t, Ord t, HasAlts b) =>
[Char] -> b t a -> SymbExpr t a
<::=> SymbExpr Char Int
pY SymbExpr Char Int -> SymbExpr Char (Maybe Char) -> AltExpr Char Int
forall t (i :: * -> * -> *) (s :: * -> * -> *) a b.
(Show t, Ord t, IsAltExpr i, IsSymbExpr s) =>
i t a -> s t b -> AltExpr t a
<** SymbExpr Char Char -> SymbExpr Char (Maybe Char)
forall t (s :: * -> * -> *) a.
(Show t, Ord t, IsSymbExpr s) =>
s t a -> SymbExpr t (Maybe a)
optional (Char -> SymbExpr Char Char
char Char
'z')
where pY :: SymbExpr Char Int
pY = [Char]
"Y" [Char] -> OO [] AltExpr Char Int -> SymbExpr Char Int
forall t (b :: * -> * -> *) a.
(Show t, Ord t, HasAlts b) =>
[Char] -> b t a -> SymbExpr t a
<::=> [Char] -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length ([Char] -> Int) -> SymbExpr Char [Char] -> AltExpr Char Int
forall t (s :: * -> * -> *) a b.
(Show t, Ord t, IsSymbExpr s) =>
(a -> b) -> s t a -> AltExpr t b
<$$> SymbExpr Char Char -> SymbExpr Char [Char]
forall t (s :: * -> * -> *) a.
(Show t, Ord t, IsSymbExpr s) =>
s t a -> SymbExpr t [a]
multiple (Char -> SymbExpr Char Char
char Char
'a')
AltExpr Char Int -> AltExpr Char Int -> OO [] AltExpr Char Int
forall t (i :: * -> * -> *) (b :: * -> * -> *) a.
(Show t, Ord t, IsAltExpr i, HasAlts b) =>
i t a -> b t a -> AltExprs t a
<||> [Char] -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length ([Char] -> Int) -> SymbExpr Char [Char] -> AltExpr Char Int
forall t (s :: * -> * -> *) a b.
(Show t, Ord t, IsSymbExpr s) =>
(a -> b) -> s t a -> AltExpr t b
<$$> SymbExpr Char Char -> SymbExpr Char [Char]
forall t (s :: * -> * -> *) a.
(Show t, Ord t, IsSymbExpr s) =>
s t a -> SymbExpr t [a]
multiple1 (Char -> SymbExpr Char Char
char Char
'b') AltExpr Char Int -> SymbExpr Char Char -> AltExpr Char Int
forall t (i :: * -> * -> *) (s :: * -> * -> *) a b.
(Show t, Ord t, IsAltExpr i, IsSymbExpr s) =>
i t a -> s t b -> AltExpr t a
<** Char -> SymbExpr Char Char
char Char
'e'
Maybe (MemoRef Any)
-> [Char] -> SymbExpr Char Int -> [([Char], [Int])] -> IO ()
forall {t :: * -> *} {a} {t} {s :: * -> * -> *} {a}.
(Foldable t, Show a, Parseable t, IsSymbExpr s, Ord a) =>
Maybe (MemoRef a) -> [Char] -> s t a -> t ([t], [a]) -> IO ()
test Maybe (MemoRef Any)
forall a. Maybe a
Nothing [Char]
"multiple & multiple1 & optional"
SymbExpr Char Int
pX [([Char]
"aaaz", [Int
3]), ([Char]
"bbbez", [Int
3]), ([Char]
"ez", []), ([Char]
"z", [Int
0])
,([Char]
"aa", [Int
2]), ([Char]
"bbe", [Int
2])
]
let pX :: AltExprs Char Int
pX :: OO [] AltExpr Char Int
pX = Int
1 Int -> SymbExpr Char Char -> AltExpr Char Int
forall t (s :: * -> * -> *) b a.
(Show t, Ord t, IsSymbExpr s) =>
b -> s t a -> AltExpr t b
<$$ Char -> SymbExpr Char Char
char Char
'1' AltExpr Char Int -> AltExpr Char Int -> OO [] AltExpr Char Int
forall t (i :: * -> * -> *) (b :: * -> * -> *) a.
(Show t, Ord t, IsAltExpr i, HasAlts b) =>
i t a -> b t a -> AltExprs t a
<||> Int -> AltExpr Char Int
forall t a. (Show t, Ord t) => a -> AltExpr t a
satisfy Int
0
Maybe (MemoRef Any)
-> [Char] -> SymbExpr Char [Int] -> [([Char], [[Int]])] -> IO ()
forall {t :: * -> *} {a} {t} {s :: * -> * -> *} {a}.
(Foldable t, Show a, Parseable t, IsSymbExpr s, Ord a) =>
Maybe (MemoRef a) -> [Char] -> s t a -> t ([t], [a]) -> IO ()
test Maybe (MemoRef Any)
forall a. Maybe a
Nothing [Char]
"multiple (nullable arg)"
(OO [] AltExpr Char Int -> SymbExpr Char [Int]
forall t (s :: * -> * -> *) a.
(Show t, Ord t, IsSymbExpr s) =>
s t a -> SymbExpr t [a]
multiple OO [] AltExpr Char Int
pX) [([Char]
"11", [[Int
1,Int
1]]), ([Char]
"",[[]]), ([Char]
"e", [])]
let pX :: AltExpr Char [Char]
pX = [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
(++) ([Char] -> [Char] -> [Char])
-> OO [] AltExpr Char [Char] -> AltExpr Char ([Char] -> [Char])
forall t (s :: * -> * -> *) a b.
(Show t, Ord t, IsSymbExpr s) =>
(a -> b) -> s t a -> AltExpr t b
<$$> OO [] AltExpr Char [Char]
pA AltExpr Char ([Char] -> [Char])
-> OO [] AltExpr Char [Char] -> AltExpr Char [Char]
forall t (i :: * -> * -> *) (s :: * -> * -> *) a b.
(Show t, Ord t, IsAltExpr i, IsSymbExpr s) =>
i t (a -> b) -> s t a -> AltExpr t b
<**> OO [] AltExpr Char [Char]
pB
pA :: OO [] AltExpr Char [Char]
pA = [Char]
"a" [Char] -> SymbExpr Char Char -> AltExpr Char [Char]
forall t (s :: * -> * -> *) b a.
(Show t, Ord t, IsSymbExpr s) =>
b -> s t a -> AltExpr t b
<$$ Char -> SymbExpr Char Char
char Char
'a' AltExpr Char [Char]
-> AltExpr Char [Char] -> OO [] AltExpr Char [Char]
forall t (i :: * -> * -> *) (b :: * -> * -> *) a.
(Show t, Ord t, IsAltExpr i, HasAlts b) =>
i t a -> b t a -> AltExprs t a
<||> [Char]
"aa" [Char] -> SymbExpr Char Char -> AltExpr Char [Char]
forall t (s :: * -> * -> *) b a.
(Show t, Ord t, IsSymbExpr s) =>
b -> s t a -> AltExpr t b
<$$ Char -> SymbExpr Char Char
char Char
'a' AltExpr Char [Char] -> SymbExpr Char Char -> AltExpr Char [Char]
forall t (i :: * -> * -> *) (s :: * -> * -> *) a b.
(Show t, Ord t, IsAltExpr i, IsSymbExpr s) =>
i t a -> s t b -> AltExpr t a
<** Char -> SymbExpr Char Char
char Char
'a'
pB :: OO [] AltExpr Char [Char]
pB = [Char]
"b" [Char] -> SymbExpr Char Char -> AltExpr Char [Char]
forall t (s :: * -> * -> *) b a.
(Show t, Ord t, IsSymbExpr s) =>
b -> s t a -> AltExpr t b
<$$ Char -> SymbExpr Char Char
char Char
'a' AltExpr Char [Char]
-> AltExpr Char [Char] -> OO [] AltExpr Char [Char]
forall t (i :: * -> * -> *) (b :: * -> * -> *) a.
(Show t, Ord t, IsAltExpr i, HasAlts b) =>
i t a -> b t a -> AltExprs t a
<||> [Char]
"bb" [Char] -> SymbExpr Char Char -> AltExpr Char [Char]
forall t (s :: * -> * -> *) b a.
(Show t, Ord t, IsSymbExpr s) =>
b -> s t a -> AltExpr t b
<$$ Char -> SymbExpr Char Char
char Char
'a' AltExpr Char [Char] -> SymbExpr Char Char -> AltExpr Char [Char]
forall t (i :: * -> * -> *) (s :: * -> * -> *) a b.
(Show t, Ord t, IsAltExpr i, IsSymbExpr s) =>
i t a -> s t b -> AltExpr t a
<** Char -> SymbExpr Char Char
char Char
'a'
Maybe (MemoRef Any)
-> [Char] -> AltExpr Char [Char] -> [([Char], [[Char]])] -> IO ()
forall {t :: * -> *} {a} {t} {s :: * -> * -> *} {a}.
(Foldable t, Show a, Parseable t, IsSymbExpr s, Ord a) =>
Maybe (MemoRef a) -> [Char] -> s t a -> t ([t], [a]) -> IO ()
test Maybe (MemoRef Any)
forall a. Maybe a
Nothing [Char]
"aaa" AltExpr Char [Char]
pX [([Char]
"aaa", [[Char]
"aab", [Char]
"abb"])
,([Char]
"aa", [[Char]
"ab"])]
let pX :: AltExpr Char [Int]
pX = (\Int
x Int
y -> [Int
x,Int
y]) (Int -> Int -> [Int])
-> SymbExpr Char Char -> AltExpr Char (Int -> Int -> [Int])
forall t (s :: * -> * -> *) b a.
(Show t, Ord t, IsSymbExpr s) =>
b -> s t a -> AltExpr t b
<$$ Char -> SymbExpr Char Char
char Char
'a' AltExpr Char (Int -> Int -> [Int])
-> OO [] AltExpr Char Int -> AltExpr Char (Int -> [Int])
forall t (i :: * -> * -> *) (s :: * -> * -> *) a b.
(Show t, Ord t, IsAltExpr i, IsSymbExpr s) =>
i t (a -> b) -> s t a -> AltExpr t b
<**> OO [] AltExpr Char Int
pL AltExpr Char (Int -> [Int])
-> OO [] AltExpr Char Int -> AltExpr Char [Int]
forall t (i :: * -> * -> *) (s :: * -> * -> *) a b.
(Show t, Ord t, IsAltExpr i, IsSymbExpr s) =>
i t (a -> b) -> s t a -> AltExpr t b
<**> OO [] AltExpr Char Int
pL AltExpr Char [Int] -> SymbExpr Char Char -> AltExpr Char [Int]
forall t (i :: * -> * -> *) (s :: * -> * -> *) a b.
(Show t, Ord t, IsAltExpr i, IsSymbExpr s) =>
i t a -> s t b -> AltExpr t a
<** Char -> SymbExpr Char Char
char Char
'e'
pL :: AltExprs Char Int
pL :: OO [] AltExpr Char Int
pL = Int
1 Int -> SymbExpr Char Char -> AltExpr Char Int
forall t (s :: * -> * -> *) b a.
(Show t, Ord t, IsSymbExpr s) =>
b -> s t a -> AltExpr t b
<$$ Char -> SymbExpr Char Char
char Char
'b'
AltExpr Char Int
-> OO [] AltExpr Char Int -> OO [] AltExpr Char Int
forall t (i :: * -> * -> *) (b :: * -> * -> *) a.
(Show t, Ord t, IsAltExpr i, HasAlts b) =>
i t a -> b t a -> AltExprs t a
<||> Int
2 Int -> SymbExpr Char Char -> AltExpr Char Int
forall t (s :: * -> * -> *) b a.
(Show t, Ord t, IsSymbExpr s) =>
b -> s t a -> AltExpr t b
<$$ Char -> SymbExpr Char Char
char Char
'b' AltExpr Char Int -> SymbExpr Char Char -> AltExpr Char Int
forall t (i :: * -> * -> *) (s :: * -> * -> *) a b.
(Show t, Ord t, IsAltExpr i, IsSymbExpr s) =>
i t a -> s t b -> AltExpr t a
<** Char -> SymbExpr Char Char
char Char
'c'
AltExpr Char Int
-> OO [] AltExpr Char Int -> OO [] AltExpr Char Int
forall t (i :: * -> * -> *) (b :: * -> * -> *) a.
(Show t, Ord t, IsAltExpr i, HasAlts b) =>
i t a -> b t a -> AltExprs t a
<||> Int
3 Int -> SymbExpr Char Char -> AltExpr Char Int
forall t (s :: * -> * -> *) b a.
(Show t, Ord t, IsSymbExpr s) =>
b -> s t a -> AltExpr t b
<$$ Char -> SymbExpr Char Char
char Char
'c' AltExpr Char Int -> SymbExpr Char Char -> AltExpr Char Int
forall t (i :: * -> * -> *) (s :: * -> * -> *) a b.
(Show t, Ord t, IsAltExpr i, IsSymbExpr s) =>
i t a -> s t b -> AltExpr t a
<** Char -> SymbExpr Char Char
char Char
'd'
AltExpr Char Int -> AltExpr Char Int -> OO [] AltExpr Char Int
forall t (i :: * -> * -> *) (b :: * -> * -> *) a.
(Show t, Ord t, IsAltExpr i, HasAlts b) =>
i t a -> b t a -> AltExprs t a
<||> Int
4 Int -> SymbExpr Char Char -> AltExpr Char Int
forall t (s :: * -> * -> *) b a.
(Show t, Ord t, IsSymbExpr s) =>
b -> s t a -> AltExpr t b
<$$ Char -> SymbExpr Char Char
char Char
'd'
Maybe (MemoRef Any)
-> [Char] -> AltExpr Char [Int] -> [([Char], [[Int]])] -> IO ()
forall {t :: * -> *} {a} {t} {s :: * -> * -> *} {a}.
(Foldable t, Show a, Parseable t, IsSymbExpr s, Ord a) =>
Maybe (MemoRef a) -> [Char] -> s t a -> t ([t], [a]) -> IO ()
test Maybe (MemoRef Any)
forall a. Maybe a
Nothing [Char]
"longambig" AltExpr Char [Int]
pX [([Char]
"abcde", [[Int
1,Int
3],[Int
2,Int
4]]), ([Char]
"abcdd", [])]
let pX :: BNF Char Int
pX :: SymbExpr Char Int
pX = [Char]
"X" [Char] -> OO [] AltExpr Char Int -> SymbExpr Char Int
forall t (b :: * -> * -> *) a.
(Show t, Ord t, HasAlts b) =>
[Char] -> b t a -> SymbExpr t a
<::=> (Int
1 Int -> SymbExpr Char [Char] -> AltExpr Char Int
forall t (s :: * -> * -> *) b a.
(Show t, Ord t, IsSymbExpr s) =>
b -> s t a -> AltExpr t b
<$$ SymbExpr Char Char -> SymbExpr Char [Char]
forall t (s :: * -> * -> *) a.
(Show t, Ord t, IsSymbExpr s) =>
s t a -> SymbExpr t [a]
multiple1 (Char -> SymbExpr Char Char
char Char
'a') AltExpr Char Int -> AltExpr Char Int -> OO [] AltExpr Char Int
forall t (i :: * -> * -> *) (b :: * -> * -> *) a.
(Show t, Ord t, IsAltExpr i, HasAlts b) =>
i t a -> b t a -> AltExprs t a
<||> Int
2 Int -> SymbExpr Char [Char] -> AltExpr Char Int
forall t (s :: * -> * -> *) b a.
(Show t, Ord t, IsSymbExpr s) =>
b -> s t a -> AltExpr t b
<$$ SymbExpr Char Char -> SymbExpr Char [Char]
forall t (s :: * -> * -> *) a.
(Show t, Ord t, IsSymbExpr s) =>
s t a -> SymbExpr t [a]
multiple (Char -> SymbExpr Char Char
char Char
'b'))
pY :: SymbExpr Char Int
pY = [Char]
"Y" [Char] -> OO [] AltExpr Char Int -> SymbExpr Char Int
forall t (b :: * -> * -> *) a.
(Show t, Ord t, HasAlts b) =>
[Char] -> b t a -> SymbExpr t a
<::=> Int -> Int -> Int
forall a. Num a => a -> a -> a
(+) (Int -> Int -> Int)
-> SymbExpr Char Int -> AltExpr Char (Int -> Int)
forall t (s :: * -> * -> *) a b.
(Show t, Ord t, IsSymbExpr s) =>
(a -> b) -> s t a -> AltExpr t b
<$$> SymbExpr Char Int
pX AltExpr Char (Int -> Int) -> SymbExpr Char Int -> AltExpr Char Int
forall t (i :: * -> * -> *) (s :: * -> * -> *) a b.
(Show t, Ord t, IsAltExpr i, IsSymbExpr s) =>
i t (a -> b) -> s t a -> AltExpr t b
<**> SymbExpr Char Int
pY
AltExpr Char Int -> AltExpr Char Int -> OO [] AltExpr Char Int
forall t (i :: * -> * -> *) (b :: * -> * -> *) a.
(Show t, Ord t, IsAltExpr i, HasAlts b) =>
i t a -> b t a -> AltExprs t a
<||> Int -> AltExpr Char Int
forall t a. (Show t, Ord t) => a -> AltExpr t a
satisfy Int
0
Maybe (MemoRef Any)
-> [Char] -> SymbExpr Char Int -> [([Char], [Int])] -> IO ()
forall {t :: * -> *} {a} {t} {s :: * -> * -> *} {a}.
(Foldable t, Show a, Parseable t, IsSymbExpr s, Ord a) =>
Maybe (MemoRef a) -> [Char] -> s t a -> t ([t], [a]) -> IO ()
test Maybe (MemoRef Any)
forall a. Maybe a
Nothing [Char]
"multiple1 & multiple & recursion + ambiguities" SymbExpr Char Int
pY
[([Char]
"ab", [Int
3]),([Char]
"aa", [Int
1,Int
2]), (Int -> Char -> [Char]
forall a. Int -> a -> [a]
replicate Int
10 Char
'a', [Int
1..Int
10])]
let pX :: BNF Char Int
pX :: SymbExpr Char Int
pX = [Char]
"X" [Char] -> OO [] AltExpr Char Int -> SymbExpr Char Int
forall t (b :: * -> * -> *) a.
(Show t, Ord t, HasAlts b) =>
[Char] -> b t a -> SymbExpr t a
<::=> Int
1 Int -> SymbExpr Char Char -> AltExpr Char Int
forall t (s :: * -> * -> *) b a.
(Show t, Ord t, IsSymbExpr s) =>
b -> s t a -> AltExpr t b
<$$ Char -> SymbExpr Char Char
char Char
'a' AltExpr Char Int -> AltExpr Char Int -> OO [] AltExpr Char Int
forall t (i :: * -> * -> *) (b :: * -> * -> *) a.
(Show t, Ord t, IsAltExpr i, HasAlts b) =>
i t a -> b t a -> AltExprs t a
<||> Int -> AltExpr Char Int
forall t a. (Show t, Ord t) => a -> AltExpr t a
satisfy Int
0
pY :: SymbExpr Char Int
pY = [Char]
"Y" [Char] -> AltExpr Char Int -> SymbExpr Char Int
forall t (b :: * -> * -> *) a.
(Show t, Ord t, HasAlts b) =>
[Char] -> b t a -> SymbExpr t a
<::=> Int -> Int -> Int
forall a. Num a => a -> a -> a
(+) (Int -> Int -> Int)
-> SymbExpr Char Int -> AltExpr Char (Int -> Int)
forall t (s :: * -> * -> *) a b.
(Show t, Ord t, IsSymbExpr s) =>
(a -> b) -> s t a -> AltExpr t b
<$$> SymbExpr Char Int
pX AltExpr Char (Int -> Int) -> SymbExpr Char Int -> AltExpr Char Int
forall t (i :: * -> * -> *) (s :: * -> * -> *) a b.
(Show t, Ord t, IsAltExpr i, IsSymbExpr s) =>
i t (a -> b) -> s t a -> AltExpr t b
<**> SymbExpr Char Int
pY
Maybe (MemoRef Any)
-> [Char] -> SymbExpr Char Int -> [([Char], [Int])] -> IO ()
forall {t :: * -> *} {a} {t} {s :: * -> * -> *} {a}.
(Foldable t, Show a, Parseable t, IsSymbExpr s, Ord a) =>
Maybe (MemoRef a) -> [Char] -> s t a -> t ([t], [a]) -> IO ()
test Maybe (MemoRef Any)
forall a. Maybe a
Nothing [Char]
"no parse infinite rec?" SymbExpr Char Int
pY
[([Char]
"a", [])]
let pS :: BNF Char Int
pS :: SymbExpr Char Int
pS = [Char]
"S" [Char] -> OO [] AltExpr Char Int -> SymbExpr Char Int
forall t (b :: * -> * -> *) a.
(Show t, Ord t, HasAlts b) =>
[Char] -> b t a -> SymbExpr t a
<::=> ((\Int
x Int
y -> Int
xInt -> Int -> Int
forall a. Num a => a -> a -> a
+Int
yInt -> Int -> Int
forall a. Num a => a -> a -> a
+Int
1) (Int -> Int -> Int)
-> SymbExpr Char Char -> AltExpr Char (Int -> Int -> Int)
forall t (s :: * -> * -> *) b a.
(Show t, Ord t, IsSymbExpr s) =>
b -> s t a -> AltExpr t b
<$$ Char -> SymbExpr Char Char
char Char
'1' AltExpr Char (Int -> Int -> Int)
-> SymbExpr Char Int -> AltExpr Char (Int -> Int)
forall t (i :: * -> * -> *) (s :: * -> * -> *) a b.
(Show t, Ord t, IsAltExpr i, IsSymbExpr s) =>
i t (a -> b) -> s t a -> AltExpr t b
<**> SymbExpr Char Int
pS AltExpr Char (Int -> Int) -> SymbExpr Char Int -> AltExpr Char Int
forall t (i :: * -> * -> *) (s :: * -> * -> *) a b.
(Show t, Ord t, IsAltExpr i, IsSymbExpr s) =>
i t (a -> b) -> s t a -> AltExpr t b
<**> SymbExpr Char Int
pS) AltExpr Char Int -> AltExpr Char Int -> OO [] AltExpr Char Int
forall t (i :: * -> * -> *) (b :: * -> * -> *) a.
(Show t, Ord t, IsAltExpr i, HasAlts b) =>
i t a -> b t a -> AltExprs t a
<||> Int -> AltExpr Char Int
forall t a. (Show t, Ord t) => a -> AltExpr t a
satisfy Int
0
Maybe (MemoRef Any)
-> [Char] -> SymbExpr Char Int -> [([Char], [Int])] -> IO ()
forall {t :: * -> *} {a} {t} {s :: * -> * -> *} {a}.
(Foldable t, Show a, Parseable t, IsSymbExpr s, Ord a) =>
Maybe (MemoRef a) -> [Char] -> s t a -> t ([t], [a]) -> IO ()
test Maybe (MemoRef Any)
forall a. Maybe a
Nothing [Char]
"aho_S" SymbExpr Char Int
pS [([Char]
"", [Int
0]), ([Char]
"1", [Int
1]), (Int -> Char -> [Char]
forall a. Int -> a -> [a]
replicate Int
5 Char
'1', [Int
5])]
let pS :: SymbExpr Char [Char]
pS = [Char]
"S" [Char] -> OO [] AltExpr Char [Char] -> SymbExpr Char [Char]
forall t (b :: * -> * -> *) a.
(Show t, Ord t, HasAlts b) =>
[Char] -> b t a -> SymbExpr t a
<::=> ((\[Char]
x [Char]
y -> Char
'1'Char -> [Char] -> [Char]
forall a. a -> [a] -> [a]
:[Char]
x[Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++[Char]
y) ([Char] -> [Char] -> [Char])
-> SymbExpr Char Char -> AltExpr Char ([Char] -> [Char] -> [Char])
forall t (s :: * -> * -> *) b a.
(Show t, Ord t, IsSymbExpr s) =>
b -> s t a -> AltExpr t b
<$$ Char -> SymbExpr Char Char
char Char
'1' AltExpr Char ([Char] -> [Char] -> [Char])
-> SymbExpr Char [Char] -> AltExpr Char ([Char] -> [Char])
forall t (i :: * -> * -> *) (s :: * -> * -> *) a b.
(Show t, Ord t, IsAltExpr i, IsSymbExpr s) =>
i t (a -> b) -> s t a -> AltExpr t b
<**> SymbExpr Char [Char]
pS AltExpr Char ([Char] -> [Char])
-> SymbExpr Char [Char] -> AltExpr Char [Char]
forall t (i :: * -> * -> *) (s :: * -> * -> *) a b.
(Show t, Ord t, IsAltExpr i, IsSymbExpr s) =>
i t (a -> b) -> s t a -> AltExpr t b
<**> SymbExpr Char [Char]
pS) AltExpr Char [Char]
-> AltExpr Char [Char] -> OO [] AltExpr Char [Char]
forall t (i :: * -> * -> *) (b :: * -> * -> *) a.
(Show t, Ord t, IsAltExpr i, HasAlts b) =>
i t a -> b t a -> AltExprs t a
<||> [Char] -> AltExpr Char [Char]
forall t a. (Show t, Ord t) => a -> AltExpr t a
satisfy [Char]
"0"
Maybe (MemoRef Any)
-> [Char] -> SymbExpr Char [Char] -> [([Char], [[Char]])] -> IO ()
forall {t :: * -> *} {a} {t} {s :: * -> * -> *} {a}.
(Foldable t, Show a, Parseable t, IsSymbExpr s, Ord a) =>
Maybe (MemoRef a) -> [Char] -> s t a -> t ([t], [a]) -> IO ()
test Maybe (MemoRef Any)
forall a. Maybe a
Nothing [Char]
"aho_S" SymbExpr Char [Char]
pS [([Char]
"", [[Char]
"0"]), ([Char]
"1", [[Char]
"100"]), ([Char]
"11", [[Char]
"10100", [Char]
"11000"])
,(Int -> Char -> [Char]
forall a. Int -> a -> [a]
replicate Int
5 Char
'1', [[Char]]
aho_S_5)]
let pE :: BNF Char Int
pE :: SymbExpr Char Int
pE = [Char]
"E" [Char] -> OO [] AltExpr Char Int -> SymbExpr Char Int
forall t (b :: * -> * -> *) a.
(Show t, Ord t, HasAlts b) =>
[Char] -> b t a -> SymbExpr t a
<::=> (\Int
x Int
y Int
z -> Int
xInt -> Int -> Int
forall a. Num a => a -> a -> a
+Int
yInt -> Int -> Int
forall a. Num a => a -> a -> a
+Int
z) (Int -> Int -> Int -> Int)
-> SymbExpr Char Int -> AltExpr Char (Int -> Int -> Int)
forall t (s :: * -> * -> *) a b.
(Show t, Ord t, IsSymbExpr s) =>
(a -> b) -> s t a -> AltExpr t b
<$$> SymbExpr Char Int
pE AltExpr Char (Int -> Int -> Int)
-> SymbExpr Char Int -> AltExpr Char (Int -> Int)
forall t (i :: * -> * -> *) (s :: * -> * -> *) a b.
(Show t, Ord t, IsAltExpr i, IsSymbExpr s) =>
i t (a -> b) -> s t a -> AltExpr t b
<**> SymbExpr Char Int
pE AltExpr Char (Int -> Int) -> SymbExpr Char Int -> AltExpr Char Int
forall t (i :: * -> * -> *) (s :: * -> * -> *) a b.
(Show t, Ord t, IsAltExpr i, IsSymbExpr s) =>
i t (a -> b) -> s t a -> AltExpr t b
<**> SymbExpr Char Int
pE
AltExpr Char Int
-> OO [] AltExpr Char Int -> OO [] AltExpr Char Int
forall t (i :: * -> * -> *) (b :: * -> * -> *) a.
(Show t, Ord t, IsAltExpr i, HasAlts b) =>
i t a -> b t a -> AltExprs t a
<||> Int
1 Int -> SymbExpr Char Char -> AltExpr Char Int
forall t (s :: * -> * -> *) b a.
(Show t, Ord t, IsSymbExpr s) =>
b -> s t a -> AltExpr t b
<$$ Char -> SymbExpr Char Char
char Char
'1'
AltExpr Char Int -> AltExpr Char Int -> OO [] AltExpr Char Int
forall t (i :: * -> * -> *) (b :: * -> * -> *) a.
(Show t, Ord t, IsAltExpr i, HasAlts b) =>
i t a -> b t a -> AltExprs t a
<||> Int -> AltExpr Char Int
forall t a. (Show t, Ord t) => a -> AltExpr t a
satisfy Int
0
Maybe (MemoRef Any)
-> [Char] -> SymbExpr Char Int -> [([Char], [Int])] -> IO ()
forall {t :: * -> *} {a} {t} {s :: * -> * -> *} {a}.
(Foldable t, Show a, Parseable t, IsSymbExpr s, Ord a) =>
Maybe (MemoRef a) -> [Char] -> s t a -> t ([t], [a]) -> IO ()
test Maybe (MemoRef Any)
forall a. Maybe a
Nothing [Char]
"EEE" SymbExpr Char Int
pE [([Char]
"", [Int
0]), ([Char]
"1", [Int
1]), ([Char]
"11", [Int
2])
,(Int -> Char -> [Char]
forall a. Int -> a -> [a]
replicate Int
5 Char
'1', [Int
5]), ([Char]
"112", [])]
let pE :: SymbExpr Char [Char]
pE = [Char]
"E" [Char] -> OO [] AltExpr Char [Char] -> SymbExpr Char [Char]
forall t (b :: * -> * -> *) a.
(Show t, Ord t, HasAlts b) =>
[Char] -> b t a -> SymbExpr t a
<::=> (\[Char]
x [Char]
y [Char]
z -> [Char]
x[Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++[Char]
y[Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++[Char]
z) ([Char] -> [Char] -> [Char] -> [Char])
-> SymbExpr Char [Char]
-> AltExpr Char ([Char] -> [Char] -> [Char])
forall t (s :: * -> * -> *) a b.
(Show t, Ord t, IsSymbExpr s) =>
(a -> b) -> s t a -> AltExpr t b
<$$> SymbExpr Char [Char]
pE AltExpr Char ([Char] -> [Char] -> [Char])
-> SymbExpr Char [Char] -> AltExpr Char ([Char] -> [Char])
forall t (i :: * -> * -> *) (s :: * -> * -> *) a b.
(Show t, Ord t, IsAltExpr i, IsSymbExpr s) =>
i t (a -> b) -> s t a -> AltExpr t b
<**> SymbExpr Char [Char]
pE AltExpr Char ([Char] -> [Char])
-> SymbExpr Char [Char] -> AltExpr Char [Char]
forall t (i :: * -> * -> *) (s :: * -> * -> *) a b.
(Show t, Ord t, IsAltExpr i, IsSymbExpr s) =>
i t (a -> b) -> s t a -> AltExpr t b
<**> SymbExpr Char [Char]
pE
AltExpr Char [Char]
-> OO [] AltExpr Char [Char] -> OO [] AltExpr Char [Char]
forall t (i :: * -> * -> *) (b :: * -> * -> *) a.
(Show t, Ord t, IsAltExpr i, HasAlts b) =>
i t a -> b t a -> AltExprs t a
<||> [Char]
"1" [Char] -> SymbExpr Char Char -> AltExpr Char [Char]
forall t (s :: * -> * -> *) b a.
(Show t, Ord t, IsSymbExpr s) =>
b -> s t a -> AltExpr t b
<$$ Char -> SymbExpr Char Char
char Char
'1'
AltExpr Char [Char]
-> AltExpr Char [Char] -> OO [] AltExpr Char [Char]
forall t (i :: * -> * -> *) (b :: * -> * -> *) a.
(Show t, Ord t, IsAltExpr i, HasAlts b) =>
i t a -> b t a -> AltExprs t a
<||> [Char] -> AltExpr Char [Char]
forall t a. (Show t, Ord t) => a -> AltExpr t a
satisfy [Char]
"0"
Maybe (MemoRef Any)
-> [Char] -> SymbExpr Char [Char] -> [([Char], [[Char]])] -> IO ()
forall {t :: * -> *} {a} {t} {s :: * -> * -> *} {a}.
(Foldable t, Show a, Parseable t, IsSymbExpr s, Ord a) =>
Maybe (MemoRef a) -> [Char] -> s t a -> t ([t], [a]) -> IO ()
test Maybe (MemoRef Any)
forall a. Maybe a
Nothing [Char]
"EEE ambig" SymbExpr Char [Char]
pE [([Char]
"", [[Char]
"0"]), ([Char]
"1", [[Char]
"1"])
,([Char]
"11", [[Char]
"110", [Char]
"011", [Char]
"101"]), ([Char]
"111", [[Char]]
_EEE_3)]
let pX :: BNF Char Int
pX :: SymbExpr Char Int
pX = [Char]
"X" [Char] -> OO [] AltExpr Char Int -> SymbExpr Char Int
forall t (b :: * -> * -> *) a.
(Show t, Ord t, HasAlts b) =>
[Char] -> b t a -> SymbExpr t a
<::=> Int -> (Char -> Int) -> Maybe Char -> Int
forall b a. b -> (a -> b) -> Maybe a -> b
maybe Int
0 (Int -> Char -> Int
forall a b. a -> b -> a
const Int
1) (Maybe Char -> Int)
-> SymbExpr Char (Maybe Char) -> AltExpr Char Int
forall t (s :: * -> * -> *) a b.
(Show t, Ord t, IsSymbExpr s) =>
(a -> b) -> s t a -> AltExpr t b
<$$> SymbExpr Char Char -> SymbExpr Char (Maybe Char)
forall t (s :: * -> * -> *) a.
(Show t, Ord t, IsSymbExpr s) =>
s t a -> SymbExpr t (Maybe a)
optional (Char -> SymbExpr Char Char
char Char
'z')
AltExpr Char Int -> AltExpr Char Int -> OO [] AltExpr Char Int
forall t (i :: * -> * -> *) (b :: * -> * -> *) a.
(Show t, Ord t, IsAltExpr i, HasAlts b) =>
i t a -> b t a -> AltExprs t a
<||> (Int -> Int -> Int
forall a. Num a => a -> a -> a
+Int
1) (Int -> Int) -> SymbExpr Char Int -> AltExpr Char Int
forall t (s :: * -> * -> *) a b.
(Show t, Ord t, IsSymbExpr s) =>
(a -> b) -> s t a -> AltExpr t b
<$$> SymbExpr Char Int
pX AltExpr Char Int -> SymbExpr Char Char -> AltExpr Char Int
forall t (i :: * -> * -> *) (s :: * -> * -> *) a b.
(Show t, Ord t, IsAltExpr i, IsSymbExpr s) =>
i t a -> s t b -> AltExpr t a
<** Char -> SymbExpr Char Char
char Char
'1'
Maybe (MemoRef Any)
-> [Char] -> SymbExpr Char Int -> [([Char], [Int])] -> IO ()
forall {t :: * -> *} {a} {t} {s :: * -> * -> *} {a}.
(Foldable t, Show a, Parseable t, IsSymbExpr s, Ord a) =>
Maybe (MemoRef a) -> [Char] -> s t a -> t ([t], [a]) -> IO ()
test Maybe (MemoRef Any)
forall a. Maybe a
Nothing [Char]
"simple left-recursion" SymbExpr Char Int
pX [([Char]
"", [Int
0]), ([Char]
"z11", [Int
3]), ([Char]
"z", [Int
1])
,(Int -> Char -> [Char]
forall a. Int -> a -> [a]
replicate Int
100 Char
'1', [Int
100])]
let pX :: BNF Char Int
pX :: SymbExpr Char Int
pX = [Char]
"X" [Char] -> OO [] AltExpr Char Int -> SymbExpr Char Int
forall t (b :: * -> * -> *) a.
(Show t, Ord t, HasAlts b) =>
[Char] -> b t a -> SymbExpr t a
<::=> Int -> AltExpr Char Int
forall t a. (Show t, Ord t) => a -> AltExpr t a
satisfy Int
0
AltExpr Char Int -> AltExpr Char Int -> OO [] AltExpr Char Int
forall t (i :: * -> * -> *) (b :: * -> * -> *) a.
(Show t, Ord t, IsAltExpr i, HasAlts b) =>
i t a -> b t a -> AltExprs t a
<||> (Int -> Int -> Int
forall a. Num a => a -> a -> a
+Int
1) (Int -> Int) -> AltExpr Char Int -> AltExpr Char (Int -> Int)
forall t (s :: * -> * -> *) b a.
(Show t, Ord t, IsSymbExpr s) =>
b -> s t a -> AltExpr t b
<$$ AltExpr Char Int
pB AltExpr Char (Int -> Int) -> SymbExpr Char Int -> AltExpr Char Int
forall t (i :: * -> * -> *) (s :: * -> * -> *) a b.
(Show t, Ord t, IsAltExpr i, IsSymbExpr s) =>
i t (a -> b) -> s t a -> AltExpr t b
<**> SymbExpr Char Int
pX AltExpr Char Int -> SymbExpr Char Char -> AltExpr Char Int
forall t (i :: * -> * -> *) (s :: * -> * -> *) a b.
(Show t, Ord t, IsAltExpr i, IsSymbExpr s) =>
i t a -> s t b -> AltExpr t a
<** Char -> SymbExpr Char Char
char Char
'1'
pB :: AltExpr Char Int
pB :: AltExpr Char Int
pB = Int -> (Char -> Int) -> Maybe Char -> Int
forall b a. b -> (a -> b) -> Maybe a -> b
maybe Int
0 (Int -> Char -> Int
forall a b. a -> b -> a
const Int
0) (Maybe Char -> Int)
-> SymbExpr Char (Maybe Char) -> AltExpr Char Int
forall t (s :: * -> * -> *) a b.
(Show t, Ord t, IsSymbExpr s) =>
(a -> b) -> s t a -> AltExpr t b
<$$> SymbExpr Char Char -> SymbExpr Char (Maybe Char)
forall t (s :: * -> * -> *) a.
(Show t, Ord t, IsSymbExpr s) =>
s t a -> SymbExpr t (Maybe a)
optional (Char -> SymbExpr Char Char
char Char
'z')
Maybe (MemoRef Any)
-> [Char] -> SymbExpr Char Int -> [([Char], [Int])] -> IO ()
forall {t :: * -> *} {a} {t} {s :: * -> * -> *} {a}.
(Foldable t, Show a, Parseable t, IsSymbExpr s, Ord a) =>
Maybe (MemoRef a) -> [Char] -> s t a -> t ([t], [a]) -> IO ()
test Maybe (MemoRef Any)
forall a. Maybe a
Nothing [Char]
"hidden left-recursion" SymbExpr Char Int
pX
[([Char]
"", [Int
0]), ([Char]
"zz11", [Int
2]), ([Char]
"z11", [Int
2]), ([Char]
"11", [Int
2])
,(Int -> Char -> [Char]
forall a. Int -> a -> [a]
replicate Int
100 Char
'1', [Int
100])]
let pX :: SymbExpr Char Int
pX = [Char]
"X" [Char] -> AltExpr Char Int -> SymbExpr Char Int
forall t (b :: * -> * -> *) a.
(Show t, Ord t, HasAlts b) =>
[Char] -> b t a -> SymbExpr t a
<::=> Int -> Int -> Int
forall a. Num a => a -> a -> a
(+) (Int -> Int -> Int)
-> SymbExpr Char Int -> AltExpr Char (Int -> Int)
forall t (s :: * -> * -> *) a b.
(Show t, Ord t, IsSymbExpr s) =>
(a -> b) -> s t a -> AltExpr t b
<$$> SymbExpr Char Int
pY AltExpr Char (Int -> Int)
-> OO [] AltExpr Char Int -> AltExpr Char Int
forall t (i :: * -> * -> *) (s :: * -> * -> *) a b.
(Show t, Ord t, IsAltExpr i, IsSymbExpr s) =>
i t (a -> b) -> s t a -> AltExpr t b
<**> OO [] AltExpr Char Int
pA
pA :: AltExprs Char Int
pA :: OO [] AltExpr Char Int
pA = Int
1 Int -> SymbExpr Char Char -> AltExpr Char Int
forall t (s :: * -> * -> *) b a.
(Show t, Ord t, IsSymbExpr s) =>
b -> s t a -> AltExpr t b
<$$ Char -> SymbExpr Char Char
char Char
'a' AltExpr Char Int -> SymbExpr Char Char -> AltExpr Char Int
forall t (i :: * -> * -> *) (s :: * -> * -> *) a b.
(Show t, Ord t, IsAltExpr i, IsSymbExpr s) =>
i t a -> s t b -> AltExpr t a
<** Char -> SymbExpr Char Char
char Char
'b' AltExpr Char Int -> AltExpr Char Int -> OO [] AltExpr Char Int
forall t (i :: * -> * -> *) (b :: * -> * -> *) a.
(Show t, Ord t, IsAltExpr i, HasAlts b) =>
i t a -> b t a -> AltExprs t a
<||> Int -> AltExpr Char Int
forall t a. (Show t, Ord t) => a -> AltExpr t a
satisfy Int
0
pY :: SymbExpr Char Int
pY = [Char]
"Y" [Char] -> OO [] AltExpr Char Int -> SymbExpr Char Int
forall t (b :: * -> * -> *) a.
(Show t, Ord t, HasAlts b) =>
[Char] -> b t a -> SymbExpr t a
<::=> Int -> AltExpr Char Int
forall t a. (Show t, Ord t) => a -> AltExpr t a
satisfy Int
0 AltExpr Char Int -> SymbExpr Char Int -> OO [] AltExpr Char Int
forall t (i :: * -> * -> *) (b :: * -> * -> *) a.
(Show t, Ord t, IsAltExpr i, HasAlts b) =>
i t a -> b t a -> AltExprs t a
<||> SymbExpr Char Int
pX
Maybe (MemoRef Any)
-> [Char] -> SymbExpr Char Int -> [([Char], [Int])] -> IO ()
forall {t :: * -> *} {a} {t} {s :: * -> * -> *} {a}.
(Foldable t, Show a, Parseable t, IsSymbExpr s, Ord a) =>
Maybe (MemoRef a) -> [Char] -> s t a -> t ([t], [a]) -> IO ()
test Maybe (MemoRef Any)
forall a. Maybe a
Nothing [Char]
"hidden left-recursion + infinite derivations" SymbExpr Char Int
pX
[([Char]
"", [Int
0]), ([Char]
"ab", [Int
1]), ([Char]
"ababab", [Int
3])]
[Char] -> IO ()
putStrLn [Char]
"Tests that use memoisation"
let tab :: MemoRef a
tab = MemoRef a
forall a. MemoRef a
newMemoTable
pX :: BNF Char Int
pX :: SymbExpr Char Int
pX = [Char]
"X" [Char] -> OO [] AltExpr Char Int -> SymbExpr Char Int
forall t (b :: * -> * -> *) a.
(Show t, Ord t, HasAlts b) =>
[Char] -> b t a -> SymbExpr t a
<::=> (Int
1 Int -> SymbExpr Char [Char] -> AltExpr Char Int
forall t (s :: * -> * -> *) b a.
(Show t, Ord t, IsSymbExpr s) =>
b -> s t a -> AltExpr t b
<$$ SymbExpr Char Char -> SymbExpr Char [Char]
forall t (s :: * -> * -> *) a.
(Show t, Ord t, IsSymbExpr s) =>
s t a -> SymbExpr t [a]
multiple1 (Char -> SymbExpr Char Char
char Char
'a') AltExpr Char Int -> AltExpr Char Int -> OO [] AltExpr Char Int
forall t (i :: * -> * -> *) (b :: * -> * -> *) a.
(Show t, Ord t, IsAltExpr i, HasAlts b) =>
i t a -> b t a -> AltExprs t a
<||> Int
2 Int -> SymbExpr Char [Char] -> AltExpr Char Int
forall t (s :: * -> * -> *) b a.
(Show t, Ord t, IsSymbExpr s) =>
b -> s t a -> AltExpr t b
<$$ SymbExpr Char Char -> SymbExpr Char [Char]
forall t (s :: * -> * -> *) a.
(Show t, Ord t, IsSymbExpr s) =>
s t a -> SymbExpr t [a]
multiple (Char -> SymbExpr Char Char
char Char
'b'))
pY :: SymbExpr Char Int
pY = MemoRef [Int] -> SymbExpr Char Int -> SymbExpr Char Int
forall t (s :: * -> * -> *) a.
(Ord t, Show t, IsSymbExpr s) =>
MemoRef [a] -> s t a -> SymbExpr t a
memo MemoRef [Int]
forall a. MemoRef a
tab ([Char]
"Y" [Char] -> OO [] AltExpr Char Int -> SymbExpr Char Int
forall t (b :: * -> * -> *) a.
(Show t, Ord t, HasAlts b) =>
[Char] -> b t a -> SymbExpr t a
<::=> Int -> Int -> Int
forall a. Num a => a -> a -> a
(+) (Int -> Int -> Int)
-> SymbExpr Char Int -> AltExpr Char (Int -> Int)
forall t (s :: * -> * -> *) a b.
(Show t, Ord t, IsSymbExpr s) =>
(a -> b) -> s t a -> AltExpr t b
<$$> SymbExpr Char Int
pX AltExpr Char (Int -> Int) -> SymbExpr Char Int -> AltExpr Char Int
forall t (i :: * -> * -> *) (s :: * -> * -> *) a b.
(Show t, Ord t, IsAltExpr i, IsSymbExpr s) =>
i t (a -> b) -> s t a -> AltExpr t b
<**> SymbExpr Char Int
pY
AltExpr Char Int -> AltExpr Char Int -> OO [] AltExpr Char Int
forall t (i :: * -> * -> *) (b :: * -> * -> *) a.
(Show t, Ord t, IsAltExpr i, HasAlts b) =>
i t a -> b t a -> AltExprs t a
<||> Int -> AltExpr Char Int
forall t a. (Show t, Ord t) => a -> AltExpr t a
satisfy Int
0)
Maybe (MemoRef Any)
-> [Char] -> SymbExpr Char Int -> [([Char], [Int])] -> IO ()
forall {t :: * -> *} {a} {t} {s :: * -> * -> *} {a}.
(Foldable t, Show a, Parseable t, IsSymbExpr s, Ord a) =>
Maybe (MemoRef a) -> [Char] -> s t a -> t ([t], [a]) -> IO ()
test (MemoRef Any -> Maybe (MemoRef Any)
forall a. a -> Maybe a
Just MemoRef Any
forall a. MemoRef a
tab) [Char]
"multiple1 & multiple & recursion + ambiguities" SymbExpr Char Int
pY
[([Char]
"ab", [Int
3]),([Char]
"aa", [Int
1,Int
2]), (Int -> Char -> [Char]
forall a. Int -> a -> [a]
replicate Int
10 Char
'a', [Int
1..Int
10])]
let tab :: MemoRef a
tab = MemoRef a
forall a. MemoRef a
newMemoTable
pX :: BNF Char Int
pX :: SymbExpr Char Int
pX = [Char]
"X" [Char] -> OO [] AltExpr Char Int -> SymbExpr Char Int
forall t (b :: * -> * -> *) a.
(Show t, Ord t, HasAlts b) =>
[Char] -> b t a -> SymbExpr t a
<::=> Int
1 Int -> SymbExpr Char Char -> AltExpr Char Int
forall t (s :: * -> * -> *) b a.
(Show t, Ord t, IsSymbExpr s) =>
b -> s t a -> AltExpr t b
<$$ Char -> SymbExpr Char Char
char Char
'a' AltExpr Char Int -> AltExpr Char Int -> OO [] AltExpr Char Int
forall t (i :: * -> * -> *) (b :: * -> * -> *) a.
(Show t, Ord t, IsAltExpr i, HasAlts b) =>
i t a -> b t a -> AltExprs t a
<||> Int -> AltExpr Char Int
forall t a. (Show t, Ord t) => a -> AltExpr t a
satisfy Int
0
pY :: SymbExpr Char Int
pY = MemoRef [Int] -> SymbExpr Char Int -> SymbExpr Char Int
forall t (s :: * -> * -> *) a.
(Ord t, Show t, IsSymbExpr s) =>
MemoRef [a] -> s t a -> SymbExpr t a
memo MemoRef [Int]
forall a. MemoRef a
tab ([Char]
"Y" [Char] -> AltExpr Char Int -> SymbExpr Char Int
forall t (b :: * -> * -> *) a.
(Show t, Ord t, HasAlts b) =>
[Char] -> b t a -> SymbExpr t a
<::=> Int -> Int -> Int
forall a. Num a => a -> a -> a
(+) (Int -> Int -> Int)
-> SymbExpr Char Int -> AltExpr Char (Int -> Int)
forall t (s :: * -> * -> *) a b.
(Show t, Ord t, IsSymbExpr s) =>
(a -> b) -> s t a -> AltExpr t b
<$$> SymbExpr Char Int
pX AltExpr Char (Int -> Int) -> SymbExpr Char Int -> AltExpr Char Int
forall t (i :: * -> * -> *) (s :: * -> * -> *) a b.
(Show t, Ord t, IsAltExpr i, IsSymbExpr s) =>
i t (a -> b) -> s t a -> AltExpr t b
<**> SymbExpr Char Int
pY)
Maybe (MemoRef Any)
-> [Char] -> SymbExpr Char Int -> [([Char], [Int])] -> IO ()
forall {t :: * -> *} {a} {t} {s :: * -> * -> *} {a}.
(Foldable t, Show a, Parseable t, IsSymbExpr s, Ord a) =>
Maybe (MemoRef a) -> [Char] -> s t a -> t ([t], [a]) -> IO ()
test (MemoRef Any -> Maybe (MemoRef Any)
forall a. a -> Maybe a
Just MemoRef Any
forall a. MemoRef a
tab) [Char]
"no parse infinite rec?" SymbExpr Char Int
pY
[([Char]
"a", [])]
let tab :: MemoRef a
tab = MemoRef a
forall a. MemoRef a
newMemoTable
pE :: BNF Char Int
pE :: SymbExpr Char Int
pE = MemoRef [Int] -> SymbExpr Char Int -> SymbExpr Char Int
forall t (s :: * -> * -> *) a.
(Ord t, Show t, IsSymbExpr s) =>
MemoRef [a] -> s t a -> SymbExpr t a
memo MemoRef [Int]
forall a. MemoRef a
tab ([Char]
"E" [Char] -> OO [] AltExpr Char Int -> SymbExpr Char Int
forall t (b :: * -> * -> *) a.
(Show t, Ord t, HasAlts b) =>
[Char] -> b t a -> SymbExpr t a
<::=> (\Int
x Int
y Int
z -> Int
xInt -> Int -> Int
forall a. Num a => a -> a -> a
+Int
yInt -> Int -> Int
forall a. Num a => a -> a -> a
+Int
z) (Int -> Int -> Int -> Int)
-> SymbExpr Char Int -> AltExpr Char (Int -> Int -> Int)
forall t (s :: * -> * -> *) a b.
(Show t, Ord t, IsSymbExpr s) =>
(a -> b) -> s t a -> AltExpr t b
<$$> SymbExpr Char Int
pE AltExpr Char (Int -> Int -> Int)
-> SymbExpr Char Int -> AltExpr Char (Int -> Int)
forall t (i :: * -> * -> *) (s :: * -> * -> *) a b.
(Show t, Ord t, IsAltExpr i, IsSymbExpr s) =>
i t (a -> b) -> s t a -> AltExpr t b
<**> SymbExpr Char Int
pE AltExpr Char (Int -> Int) -> SymbExpr Char Int -> AltExpr Char Int
forall t (i :: * -> * -> *) (s :: * -> * -> *) a b.
(Show t, Ord t, IsAltExpr i, IsSymbExpr s) =>
i t (a -> b) -> s t a -> AltExpr t b
<**> SymbExpr Char Int
pE
AltExpr Char Int
-> OO [] AltExpr Char Int -> OO [] AltExpr Char Int
forall t (i :: * -> * -> *) (b :: * -> * -> *) a.
(Show t, Ord t, IsAltExpr i, HasAlts b) =>
i t a -> b t a -> AltExprs t a
<||> Int
1 Int -> SymbExpr Char Char -> AltExpr Char Int
forall t (s :: * -> * -> *) b a.
(Show t, Ord t, IsSymbExpr s) =>
b -> s t a -> AltExpr t b
<$$ Char -> SymbExpr Char Char
char Char
'1'
AltExpr Char Int -> AltExpr Char Int -> OO [] AltExpr Char Int
forall t (i :: * -> * -> *) (b :: * -> * -> *) a.
(Show t, Ord t, IsAltExpr i, HasAlts b) =>
i t a -> b t a -> AltExprs t a
<||> Int -> AltExpr Char Int
forall t a. (Show t, Ord t) => a -> AltExpr t a
satisfy Int
0)
Maybe (MemoRef Any)
-> [Char] -> SymbExpr Char Int -> [([Char], [Int])] -> IO ()
forall {t :: * -> *} {a} {t} {s :: * -> * -> *} {a}.
(Foldable t, Show a, Parseable t, IsSymbExpr s, Ord a) =>
Maybe (MemoRef a) -> [Char] -> s t a -> t ([t], [a]) -> IO ()
test (MemoRef Any -> Maybe (MemoRef Any)
forall a. a -> Maybe a
Just MemoRef Any
forall a. MemoRef a
tab) [Char]
"EEE" SymbExpr Char Int
pE [([Char]
"", [Int
0]), ([Char]
"1", [Int
1]), ([Char]
"11", [Int
2])
,(Int -> Char -> [Char]
forall a. Int -> a -> [a]
replicate Int
5 Char
'1', [Int
5]), ([Char]
"112", [])]
let tab :: MemoRef a
tab = MemoRef a
forall a. MemoRef a
newMemoTable
pX :: SymbExpr Char Int
pX = [Char]
"X" [Char] -> AltExpr Char Int -> SymbExpr Char Int
forall t (b :: * -> * -> *) a.
(Show t, Ord t, HasAlts b) =>
[Char] -> b t a -> SymbExpr t a
<::=> Int -> Int -> Int
forall a. Num a => a -> a -> a
(+) (Int -> Int -> Int)
-> SymbExpr Char Int -> AltExpr Char (Int -> Int)
forall t (s :: * -> * -> *) a b.
(Show t, Ord t, IsSymbExpr s) =>
(a -> b) -> s t a -> AltExpr t b
<$$> SymbExpr Char Int
pY AltExpr Char (Int -> Int)
-> OO [] AltExpr Char Int -> AltExpr Char Int
forall t (i :: * -> * -> *) (s :: * -> * -> *) a b.
(Show t, Ord t, IsAltExpr i, IsSymbExpr s) =>
i t (a -> b) -> s t a -> AltExpr t b
<**> OO [] AltExpr Char Int
pA
pA :: AltExprs Char Int
pA :: OO [] AltExpr Char Int
pA = Int
1 Int -> SymbExpr Char Char -> AltExpr Char Int
forall t (s :: * -> * -> *) b a.
(Show t, Ord t, IsSymbExpr s) =>
b -> s t a -> AltExpr t b
<$$ Char -> SymbExpr Char Char
char Char
'a' AltExpr Char Int -> SymbExpr Char Char -> AltExpr Char Int
forall t (i :: * -> * -> *) (s :: * -> * -> *) a b.
(Show t, Ord t, IsAltExpr i, IsSymbExpr s) =>
i t a -> s t b -> AltExpr t a
<** Char -> SymbExpr Char Char
char Char
'b' AltExpr Char Int -> AltExpr Char Int -> OO [] AltExpr Char Int
forall t (i :: * -> * -> *) (b :: * -> * -> *) a.
(Show t, Ord t, IsAltExpr i, HasAlts b) =>
i t a -> b t a -> AltExprs t a
<||> Int -> AltExpr Char Int
forall t a. (Show t, Ord t) => a -> AltExpr t a
satisfy Int
0
pY :: SymbExpr Char Int
pY = MemoRef [Int] -> SymbExpr Char Int -> SymbExpr Char Int
forall t (s :: * -> * -> *) a.
(Ord t, Show t, IsSymbExpr s) =>
MemoRef [a] -> s t a -> SymbExpr t a
memo MemoRef [Int]
forall a. MemoRef a
tab ([Char]
"Y" [Char] -> OO [] AltExpr Char Int -> SymbExpr Char Int
forall t (b :: * -> * -> *) a.
(Show t, Ord t, HasAlts b) =>
[Char] -> b t a -> SymbExpr t a
<::=> Int -> AltExpr Char Int
forall t a. (Show t, Ord t) => a -> AltExpr t a
satisfy Int
0 AltExpr Char Int -> SymbExpr Char Int -> OO [] AltExpr Char Int
forall t (i :: * -> * -> *) (b :: * -> * -> *) a.
(Show t, Ord t, IsAltExpr i, HasAlts b) =>
i t a -> b t a -> AltExprs t a
<||> SymbExpr Char Int
pX)
Maybe (MemoRef Any)
-> [Char] -> SymbExpr Char Int -> [([Char], [Int])] -> IO ()
forall {t :: * -> *} {a} {t} {s :: * -> * -> *} {a}.
(Foldable t, Show a, Parseable t, IsSymbExpr s, Ord a) =>
Maybe (MemoRef a) -> [Char] -> s t a -> t ([t], [a]) -> IO ()
test (MemoRef Any -> Maybe (MemoRef Any)
forall a. a -> Maybe a
Just MemoRef Any
forall a. MemoRef a
tab) [Char]
"hidden left-recursion + infinite derivations" SymbExpr Char Int
pX
[([Char]
"", [Int
0]), ([Char]
"ab", [Int
1]), ([Char]
"ababab", [Int
3])]
[Char] -> IO ()
putStrLn [Char]
"Testing ambiguity reduction combinators"
let pX :: AltExpr Char [Char]
pX = [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
(++) ([Char] -> [Char] -> [Char])
-> OO [] AltExpr Char [Char] -> AltExpr Char ([Char] -> [Char])
forall t (s :: * -> * -> *) a b.
(Show t, Ord t, IsSymbExpr s) =>
(a -> b) -> s t a -> AltExpr t b
<$$> OO [] AltExpr Char [Char]
pA AltExpr Char ([Char] -> [Char])
-> OO [] AltExpr Char [Char] -> AltExpr Char [Char]
forall t (i :: * -> * -> *) (s :: * -> * -> *) a b.
(Show t, Ord t, IsAltExpr i, IsSymbExpr s) =>
i t (a -> b) -> s t a -> AltExpr t b
<**>>> OO [] AltExpr Char [Char]
pB
pA :: OO [] AltExpr Char [Char]
pA = [Char]
"a" [Char] -> SymbExpr Char Char -> AltExpr Char [Char]
forall t (s :: * -> * -> *) b a.
(Show t, Ord t, IsSymbExpr s) =>
b -> s t a -> AltExpr t b
<$$ Char -> SymbExpr Char Char
char Char
'a' AltExpr Char [Char]
-> AltExpr Char [Char] -> OO [] AltExpr Char [Char]
forall t (i :: * -> * -> *) (b :: * -> * -> *) a.
(Show t, Ord t, IsAltExpr i, HasAlts b) =>
i t a -> b t a -> AltExprs t a
<||> [Char]
"aa" [Char] -> SymbExpr Char Char -> AltExpr Char [Char]
forall t (s :: * -> * -> *) b a.
(Show t, Ord t, IsSymbExpr s) =>
b -> s t a -> AltExpr t b
<$$ Char -> SymbExpr Char Char
char Char
'a' AltExpr Char [Char] -> SymbExpr Char Char -> AltExpr Char [Char]
forall t (i :: * -> * -> *) (s :: * -> * -> *) a b.
(Show t, Ord t, IsAltExpr i, IsSymbExpr s) =>
i t a -> s t b -> AltExpr t a
<** Char -> SymbExpr Char Char
char Char
'a'
pB :: OO [] AltExpr Char [Char]
pB = [Char]
"b" [Char] -> SymbExpr Char Char -> AltExpr Char [Char]
forall t (s :: * -> * -> *) b a.
(Show t, Ord t, IsSymbExpr s) =>
b -> s t a -> AltExpr t b
<$$ Char -> SymbExpr Char Char
char Char
'a' AltExpr Char [Char]
-> AltExpr Char [Char] -> OO [] AltExpr Char [Char]
forall t (i :: * -> * -> *) (b :: * -> * -> *) a.
(Show t, Ord t, IsAltExpr i, HasAlts b) =>
i t a -> b t a -> AltExprs t a
<||> [Char]
"bb" [Char] -> SymbExpr Char Char -> AltExpr Char [Char]
forall t (s :: * -> * -> *) b a.
(Show t, Ord t, IsSymbExpr s) =>
b -> s t a -> AltExpr t b
<$$ Char -> SymbExpr Char Char
char Char
'a' AltExpr Char [Char] -> SymbExpr Char Char -> AltExpr Char [Char]
forall t (i :: * -> * -> *) (s :: * -> * -> *) a b.
(Show t, Ord t, IsAltExpr i, IsSymbExpr s) =>
i t a -> s t b -> AltExpr t a
<** Char -> SymbExpr Char Char
char Char
'a'
Maybe (MemoRef Any)
-> [Char] -> AltExpr Char [Char] -> [([Char], [[Char]])] -> IO ()
forall {t :: * -> *} {a} {t} {s :: * -> * -> *} {a}.
(Foldable t, Show a, Parseable t, IsSymbExpr s, Ord a) =>
Maybe (MemoRef a) -> [Char] -> s t a -> t ([t], [a]) -> IO ()
test Maybe (MemoRef Any)
forall a. Maybe a
Nothing [Char]
"A<A" AltExpr Char [Char]
pX [([Char]
"aaa", [[Char]
"aab"]),([Char]
"aa", [[Char]
"ab"])]
let pX :: AltExpr Char [Char]
pX = [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
(++) ([Char] -> [Char] -> [Char])
-> OO [] AltExpr Char [Char] -> AltExpr Char ([Char] -> [Char])
forall t (s :: * -> * -> *) a b.
(Show t, Ord t, IsSymbExpr s) =>
(a -> b) -> s t a -> AltExpr t b
<$$> OO [] AltExpr Char [Char]
pA AltExpr Char ([Char] -> [Char])
-> OO [] AltExpr Char [Char] -> AltExpr Char [Char]
forall t (i :: * -> * -> *) (s :: * -> * -> *) a b.
(Show t, Ord t, IsAltExpr i, IsSymbExpr s) =>
i t (a -> b) -> s t a -> AltExpr t b
<<<**> OO [] AltExpr Char [Char]
pB
pA :: OO [] AltExpr Char [Char]
pA = [Char]
"a" [Char] -> SymbExpr Char Char -> AltExpr Char [Char]
forall t (s :: * -> * -> *) b a.
(Show t, Ord t, IsSymbExpr s) =>
b -> s t a -> AltExpr t b
<$$ Char -> SymbExpr Char Char
char Char
'a' AltExpr Char [Char]
-> AltExpr Char [Char] -> OO [] AltExpr Char [Char]
forall t (i :: * -> * -> *) (b :: * -> * -> *) a.
(Show t, Ord t, IsAltExpr i, HasAlts b) =>
i t a -> b t a -> AltExprs t a
<||> [Char]
"aa" [Char] -> SymbExpr Char Char -> AltExpr Char [Char]
forall t (s :: * -> * -> *) b a.
(Show t, Ord t, IsSymbExpr s) =>
b -> s t a -> AltExpr t b
<$$ Char -> SymbExpr Char Char
char Char
'a' AltExpr Char [Char] -> SymbExpr Char Char -> AltExpr Char [Char]
forall t (i :: * -> * -> *) (s :: * -> * -> *) a b.
(Show t, Ord t, IsAltExpr i, IsSymbExpr s) =>
i t a -> s t b -> AltExpr t a
<** Char -> SymbExpr Char Char
char Char
'a'
pB :: OO [] AltExpr Char [Char]
pB = [Char]
"b" [Char] -> SymbExpr Char Char -> AltExpr Char [Char]
forall t (s :: * -> * -> *) b a.
(Show t, Ord t, IsSymbExpr s) =>
b -> s t a -> AltExpr t b
<$$ Char -> SymbExpr Char Char
char Char
'a' AltExpr Char [Char]
-> AltExpr Char [Char] -> OO [] AltExpr Char [Char]
forall t (i :: * -> * -> *) (b :: * -> * -> *) a.
(Show t, Ord t, IsAltExpr i, HasAlts b) =>
i t a -> b t a -> AltExprs t a
<||> [Char]
"bb" [Char] -> SymbExpr Char Char -> AltExpr Char [Char]
forall t (s :: * -> * -> *) b a.
(Show t, Ord t, IsSymbExpr s) =>
b -> s t a -> AltExpr t b
<$$ Char -> SymbExpr Char Char
char Char
'a' AltExpr Char [Char] -> SymbExpr Char Char -> AltExpr Char [Char]
forall t (i :: * -> * -> *) (s :: * -> * -> *) a b.
(Show t, Ord t, IsAltExpr i, IsSymbExpr s) =>
i t a -> s t b -> AltExpr t a
<** Char -> SymbExpr Char Char
char Char
'a'
Maybe (MemoRef Any)
-> [Char] -> AltExpr Char [Char] -> [([Char], [[Char]])] -> IO ()
forall {t :: * -> *} {a} {t} {s :: * -> * -> *} {a}.
(Foldable t, Show a, Parseable t, IsSymbExpr s, Ord a) =>
Maybe (MemoRef a) -> [Char] -> s t a -> t ([t], [a]) -> IO ()
test Maybe (MemoRef Any)
forall a. Maybe a
Nothing [Char]
"A>A" AltExpr Char [Char]
pX [([Char]
"aaa", [[Char]
"abb"]),([Char]
"aa", [[Char]
"ab"])]
let pX :: SymbExpr Char [Int]
pX = [Char]
"X" [Char] -> SymbExpr Char [Int] -> SymbExpr Char [Int]
forall t (b :: * -> * -> *) a.
(Show t, Ord t, HasAlts b) =>
[Char] -> b t a -> SymbExpr t a
<:=> OO [] AltExpr Char Int -> SymbExpr Char [Int]
forall t (s :: * -> * -> *) a.
(Show t, Ord t, IsSymbExpr s) =>
s t a -> SymbExpr t [a]
multiple OO [] AltExpr Char Int
pY
where pY :: AltExprs Char Int
pY :: OO [] AltExpr Char Int
pY = Int
1 Int -> SymbExpr Char Char -> AltExpr Char Int
forall t (s :: * -> * -> *) b a.
(Show t, Ord t, IsSymbExpr s) =>
b -> s t a -> AltExpr t b
<$$ Char -> SymbExpr Char Char
char Char
'1' AltExpr Char Int -> AltExpr Char Int -> OO [] AltExpr Char Int
forall t (i :: * -> * -> *) (b :: * -> * -> *) a.
(Show t, Ord t, IsAltExpr i, HasAlts b) =>
i t a -> b t a -> AltExprs t a
<||> Int
2 Int -> SymbExpr Char Char -> AltExpr Char Int
forall t (s :: * -> * -> *) b a.
(Show t, Ord t, IsSymbExpr s) =>
b -> s t a -> AltExpr t b
<$$ Char -> SymbExpr Char Char
char Char
'1' AltExpr Char Int -> SymbExpr Char Char -> AltExpr Char Int
forall t (i :: * -> * -> *) (s :: * -> * -> *) a b.
(Show t, Ord t, IsAltExpr i, IsSymbExpr s) =>
i t a -> s t b -> AltExpr t a
<** Char -> SymbExpr Char Char
char Char
'1'
Maybe (MemoRef Any)
-> [Char] -> SymbExpr Char [Int] -> [([Char], [[Int]])] -> IO ()
forall {t :: * -> *} {a} {t} {s :: * -> * -> *} {a}.
(Foldable t, Show a, Parseable t, IsSymbExpr s, Ord a) =>
Maybe (MemoRef a) -> [Char] -> s t a -> t ([t], [a]) -> IO ()
test Maybe (MemoRef Any)
forall a. Maybe a
Nothing [Char]
"multiple" SymbExpr Char [Int]
pX
[([Char]
"", [[]]), ([Char]
"1", [[Int
1]]), ([Char]
"11", [[Int
1,Int
1],[Int
2]]), ([Char]
"111", [[Int
1,Int
1,Int
1], [Int
2,Int
1], [Int
1,Int
2]])]
let pX :: SymbExpr Char [Int]
pX = [Char]
"X" [Char] -> SymbExpr Char [Int] -> SymbExpr Char [Int]
forall t (b :: * -> * -> *) a.
(Show t, Ord t, HasAlts b) =>
[Char] -> b t a -> SymbExpr t a
<:=> OO [] AltExpr Char Int -> SymbExpr Char [Int]
forall t (s :: * -> * -> *) a.
(Show t, Ord t, IsSymbExpr s) =>
s t a -> SymbExpr t [a]
some OO [] AltExpr Char Int
pY
where pY :: AltExprs Char Int
pY :: OO [] AltExpr Char Int
pY = Int
1 Int -> SymbExpr Char Char -> AltExpr Char Int
forall t (s :: * -> * -> *) b a.
(Show t, Ord t, IsSymbExpr s) =>
b -> s t a -> AltExpr t b
<$$ Char -> SymbExpr Char Char
char Char
'1' AltExpr Char Int -> AltExpr Char Int -> OO [] AltExpr Char Int
forall t (i :: * -> * -> *) (b :: * -> * -> *) a.
(Show t, Ord t, IsAltExpr i, HasAlts b) =>
i t a -> b t a -> AltExprs t a
<||> Int
2 Int -> SymbExpr Char Char -> AltExpr Char Int
forall t (s :: * -> * -> *) b a.
(Show t, Ord t, IsSymbExpr s) =>
b -> s t a -> AltExpr t b
<$$ Char -> SymbExpr Char Char
char Char
'1' AltExpr Char Int -> SymbExpr Char Char -> AltExpr Char Int
forall t (i :: * -> * -> *) (s :: * -> * -> *) a b.
(Show t, Ord t, IsAltExpr i, IsSymbExpr s) =>
i t a -> s t b -> AltExpr t a
<** Char -> SymbExpr Char Char
char Char
'1'
Maybe (MemoRef Any)
-> [Char] -> SymbExpr Char [Int] -> [([Char], [[Int]])] -> IO ()
forall {t :: * -> *} {a} {t} {s :: * -> * -> *} {a}.
(Foldable t, Show a, Parseable t, IsSymbExpr s, Ord a) =>
Maybe (MemoRef a) -> [Char] -> s t a -> t ([t], [a]) -> IO ()
test Maybe (MemoRef Any)
forall a. Maybe a
Nothing [Char]
"some" SymbExpr Char [Int]
pX
[([Char]
"", [[]]), ([Char]
"1", [[Int
1]]), ([Char]
"11", [[Int
2]]), ([Char]
"111", [[Int
2,Int
1]])]
let pX :: SymbExpr Char [Int]
pX = [Char]
"X" [Char] -> SymbExpr Char [Int] -> SymbExpr Char [Int]
forall t (b :: * -> * -> *) a.
(Show t, Ord t, HasAlts b) =>
[Char] -> b t a -> SymbExpr t a
<:=> OO [] AltExpr Char Int -> SymbExpr Char [Int]
forall t (s :: * -> * -> *) a.
(Show t, Ord t, IsSymbExpr s) =>
s t a -> SymbExpr t [a]
many OO [] AltExpr Char Int
pY
where pY :: AltExprs Char Int
pY :: OO [] AltExpr Char Int
pY = Int
1 Int -> SymbExpr Char Char -> AltExpr Char Int
forall t (s :: * -> * -> *) b a.
(Show t, Ord t, IsSymbExpr s) =>
b -> s t a -> AltExpr t b
<$$ Char -> SymbExpr Char Char
char Char
'1' AltExpr Char Int -> AltExpr Char Int -> OO [] AltExpr Char Int
forall t (i :: * -> * -> *) (b :: * -> * -> *) a.
(Show t, Ord t, IsAltExpr i, HasAlts b) =>
i t a -> b t a -> AltExprs t a
<||> Int
2 Int -> SymbExpr Char Char -> AltExpr Char Int
forall t (s :: * -> * -> *) b a.
(Show t, Ord t, IsSymbExpr s) =>
b -> s t a -> AltExpr t b
<$$ Char -> SymbExpr Char Char
char Char
'1' AltExpr Char Int -> SymbExpr Char Char -> AltExpr Char Int
forall t (i :: * -> * -> *) (s :: * -> * -> *) a b.
(Show t, Ord t, IsAltExpr i, IsSymbExpr s) =>
i t a -> s t b -> AltExpr t a
<** Char -> SymbExpr Char Char
char Char
'1'
Maybe (MemoRef Any)
-> [Char] -> SymbExpr Char [Int] -> [([Char], [[Int]])] -> IO ()
forall {t :: * -> *} {a} {t} {s :: * -> * -> *} {a}.
(Foldable t, Show a, Parseable t, IsSymbExpr s, Ord a) =>
Maybe (MemoRef a) -> [Char] -> s t a -> t ([t], [a]) -> IO ()
test Maybe (MemoRef Any)
forall a. Maybe a
Nothing [Char]
"many" SymbExpr Char [Int]
pX
[([Char]
"", [[]]), ([Char]
"1", [[Int
1]]), ([Char]
"11", [[Int
1,Int
1]]), ([Char]
"111", [[Int
1,Int
1,Int
1]])]
let pX :: SymbExpr Char [Char]
pX = [Char]
"X" [Char] -> OO [] AltExpr Char [Char] -> SymbExpr Char [Char]
forall t (b :: * -> * -> *) a.
(Show t, Ord t, HasAlts b) =>
[Char] -> b t a -> SymbExpr t a
<:=> [Char]
"1" [Char] -> SymbExpr Char Char -> AltExpr Char [Char]
forall t (s :: * -> * -> *) b a.
(Show t, Ord t, IsSymbExpr s) =>
b -> s t a -> AltExpr t b
<$$ Char -> SymbExpr Char Char
char Char
'1' AltExpr Char [Char]
-> SymbExpr Char [Char] -> OO [] AltExpr Char [Char]
forall t (i :: * -> * -> *) (b :: * -> * -> *) a.
(Show t, Ord t, IsAltExpr i, HasAlts b) =>
i t a -> b t a -> AltExprs t a
<||> SymbExpr Char Char -> SymbExpr Char Char -> SymbExpr Char [Char]
forall t (s :: * -> * -> *) (s2 :: * -> * -> *) a b.
(Show t, Ord t, IsSymbExpr s, IsSymbExpr s2, IsAltExpr s2) =>
s t a -> s2 t b -> SymbExpr t [a]
multipleSepBy (Char -> SymbExpr Char Char
char Char
'1') (Char -> SymbExpr Char Char
char Char
';')
Maybe (MemoRef Any)
-> [Char] -> SymbExpr Char [Char] -> [([Char], [[Char]])] -> IO ()
forall {t :: * -> *} {a} {t} {s :: * -> * -> *} {a}.
(Foldable t, Show a, Parseable t, IsSymbExpr s, Ord a) =>
Maybe (MemoRef a) -> [Char] -> s t a -> t ([t], [a]) -> IO ()
test Maybe (MemoRef Any)
forall a. Maybe a
Nothing [Char]
"multipleSepBy" SymbExpr Char [Char]
pX
[([Char]
"", [[Char]
""]), ([Char]
"1", [[Char]
"1", [Char]
"1"]), ([Char]
"1;1", [[Char]
"11"])]
let pX :: BNF Char Int
pX :: SymbExpr Char Int
pX = [Char]
"X" [Char] -> OO [] AltExpr Char Int -> SymbExpr Char Int
forall t (b :: * -> * -> *) a.
(Show t, Ord t, HasAlts b) =>
[Char] -> b t a -> SymbExpr t a
<::=> Int
1 Int -> SymbExpr Char Char -> AltExpr Char Int
forall t (s :: * -> * -> *) b a.
(Show t, Ord t, IsSymbExpr s) =>
b -> s t a -> AltExpr t b
<$$ Char -> SymbExpr Char Char
char Char
'1' AltExpr Char Int -> AltExpr Char Int -> OO [] AltExpr Char Int
forall t (i :: * -> * -> *) (b :: * -> * -> *) a.
(Show t, Ord t, IsAltExpr i, HasAlts b) =>
i t a -> b t a -> AltExprs t a
<||> [Int] -> Int
forall a. Num a => [a] -> a
forall (t :: * -> *) a. (Foldable t, Num a) => t a -> a
sum ([Int] -> Int) -> SymbExpr Char [Int] -> AltExpr Char Int
forall t (s :: * -> * -> *) a b.
(Show t, Ord t, IsSymbExpr s) =>
(a -> b) -> s t a -> AltExpr t b
<$$> SymbExpr Char Int -> SymbExpr Char Char -> SymbExpr Char [Int]
forall t (s :: * -> * -> *) (s2 :: * -> * -> *) a b.
(Show t, Ord t, IsSymbExpr s, IsSymbExpr s2, IsAltExpr s2) =>
s t a -> s2 t b -> SymbExpr t [a]
multipleSepBy SymbExpr Char Int
pX (Char -> SymbExpr Char Char
char Char
';')
Maybe (MemoRef Any)
-> [Char] -> SymbExpr Char Int -> [([Char], [Int])] -> IO ()
forall {t :: * -> *} {a} {t} {s :: * -> * -> *} {a}.
(Foldable t, Show a, Parseable t, IsSymbExpr s, Ord a) =>
Maybe (MemoRef a) -> [Char] -> s t a -> t ([t], [a]) -> IO ()
test Maybe (MemoRef Any)
forall a. Maybe a
Nothing [Char]
"multipleSepBy2" SymbExpr Char Int
pX
[([Char]
"", [Int
0]), ([Char]
"1", [Int
1,Int
1]), ([Char]
"1;1", [Int
2]), ([Char]
";1", [Int
1]), ([Char]
";1;1", [Int
2])]
let pX :: SymbExpr Char Int
pX = [Char]
"X" [Char] -> AltExpr Char Int -> SymbExpr Char Int
forall t (b :: * -> * -> *) a.
(Show t, Ord t, HasAlts b) =>
[Char] -> b t a -> SymbExpr t a
<:=> [Char] -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length ([Char] -> Int) -> SymbExpr Char [Char] -> AltExpr Char Int
forall t (s :: * -> * -> *) a b.
(Show t, Ord t, IsSymbExpr s) =>
(a -> b) -> s t a -> AltExpr t b
<$$> SymbExpr Char Char -> SymbExpr Char [Char]
forall t (s :: * -> * -> *) a.
(Show t, Ord t, IsSymbExpr s) =>
s t a -> SymbExpr t [a]
multiple (Char -> SymbExpr Char Char
char Char
'1')
Maybe (MemoRef Any)
-> [Char] -> SymbExpr Char Int -> [([Char], [Int])] -> IO ()
forall {t :: * -> *} {a} {t} {s :: * -> * -> *} {a}.
(Foldable t, Show a, Parseable t, IsSymbExpr s, Ord a) =>
Maybe (MemoRef a) -> [Char] -> s t a -> t ([t], [a]) -> IO ()
test Maybe (MemoRef Any)
forall a. Maybe a
Nothing [Char]
"multiple1" SymbExpr Char Int
pX
[([Char]
"", [Int
0]), ([Char]
"11", [Int
2]), (Int -> Char -> [Char]
forall a. Int -> a -> [a]
replicate Int
10 Char
'1', [Int
10])]
let pX :: SymbExpr Char Int
pX = [Char]
"X" [Char] -> AltExpr Char Int -> SymbExpr Char Int
forall t (b :: * -> * -> *) a.
(Show t, Ord t, HasAlts b) =>
[Char] -> b t a -> SymbExpr t a
<:=> [Char] -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length ([Char] -> Int) -> SymbExpr Char [Char] -> AltExpr Char Int
forall t (s :: * -> * -> *) a b.
(Show t, Ord t, IsSymbExpr s) =>
(a -> b) -> s t a -> AltExpr t b
<$$> SymbExpr Char Char -> SymbExpr Char [Char]
forall t (s :: * -> * -> *) a.
(Show t, Ord t, IsSymbExpr s) =>
s t a -> SymbExpr t [a]
multiple (Char -> SymbExpr Char Char
char Char
'1') AltExpr Char Int -> SymbExpr Char Char -> AltExpr Char Int
forall t (i :: * -> * -> *) (s :: * -> * -> *) a b.
(Show t, Ord t, IsAltExpr i, IsSymbExpr s) =>
i t a -> s t b -> AltExpr t a
<** Char -> SymbExpr Char Char
char Char
'z'
Maybe (MemoRef Any)
-> [Char] -> SymbExpr Char Int -> [([Char], [Int])] -> IO ()
forall {t :: * -> *} {a} {t} {s :: * -> * -> *} {a}.
(Foldable t, Show a, Parseable t, IsSymbExpr s, Ord a) =>
Maybe (MemoRef a) -> [Char] -> s t a -> t ([t], [a]) -> IO ()
test Maybe (MemoRef Any)
forall a. Maybe a
Nothing [Char]
"multiple2" SymbExpr Char Int
pX
[([Char]
"", []), ([Char]
"11z", [Int
2]), (Int -> Char -> [Char]
forall a. Int -> a -> [a]
replicate Int
10 Char
'1' [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ [Char]
"z", [Int
10])]
let pX :: SymbExpr Char Int
pX = [Char]
"X" [Char] -> AltExpr Char Int -> SymbExpr Char Int
forall t (b :: * -> * -> *) a.
(Show t, Ord t, HasAlts b) =>
[Char] -> b t a -> SymbExpr t a
<:=> [()] -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length ([()] -> Int) -> SymbExpr Char [()] -> AltExpr Char Int
forall t (s :: * -> * -> *) a b.
(Show t, Ord t, IsSymbExpr s) =>
(a -> b) -> s t a -> AltExpr t b
<$$> OO [] AltExpr Char () -> SymbExpr Char [()]
forall t (s :: * -> * -> *) a.
(Show t, Ord t, IsSymbExpr s) =>
s t a -> SymbExpr t [a]
multiple OO [] AltExpr Char ()
pEps AltExpr Char Int -> SymbExpr Char Char -> AltExpr Char Int
forall t (i :: * -> * -> *) (s :: * -> * -> *) a b.
(Show t, Ord t, IsAltExpr i, IsSymbExpr s) =>
i t a -> s t b -> AltExpr t a
<** Char -> SymbExpr Char Char
char Char
'z'
where pEps :: OO [] AltExpr Char ()
pEps = () -> AltExpr Char ()
forall t a. (Show t, Ord t) => a -> AltExpr t a
satisfy () AltExpr Char () -> AltExpr Char () -> OO [] AltExpr Char ()
forall t (i :: * -> * -> *) (b :: * -> * -> *) a.
(Show t, Ord t, IsAltExpr i, HasAlts b) =>
i t a -> b t a -> AltExprs t a
<||> () () -> SymbExpr Char Char -> AltExpr Char ()
forall t (s :: * -> * -> *) b a.
(Show t, Ord t, IsSymbExpr s) =>
b -> s t a -> AltExpr t b
<$$ Char -> SymbExpr Char Char
char Char
'1'
Maybe (MemoRef Any)
-> [Char] -> SymbExpr Char Int -> [([Char], [Int])] -> IO ()
forall {t :: * -> *} {a} {t} {s :: * -> * -> *} {a}.
(Foldable t, Show a, Parseable t, IsSymbExpr s, Ord a) =>
Maybe (MemoRef a) -> [Char] -> s t a -> t ([t], [a]) -> IO ()
test Maybe (MemoRef Any)
forall a. Maybe a
Nothing [Char]
"multiple & epsilon" SymbExpr Char Int
pX
[([Char]
"", []), ([Char]
"z", [Int
0])]
let pX :: BNF Char Int
pX :: SymbExpr Char Int
pX = [Char]
"X" [Char] -> OO [] AltExpr Char Int -> SymbExpr Char Int
forall t (b :: * -> * -> *) a.
(Show t, Ord t, HasAlts b) =>
[Char] -> b t a -> SymbExpr t a
<::=> Int
1 Int -> SymbExpr Char Char -> AltExpr Char Int
forall t (s :: * -> * -> *) b a.
(Show t, Ord t, IsSymbExpr s) =>
b -> s t a -> AltExpr t b
<$$ Char -> SymbExpr Char Char
char Char
'1' AltExpr Char Int -> AltExpr Char Int -> OO [] AltExpr Char Int
forall t (i :: * -> * -> *) (b :: * -> * -> *) a.
(Show t, Ord t, IsAltExpr i, HasAlts b) =>
i t a -> b t a -> AltExprs t a
<||> [Int] -> Int
forall a. Num a => [a] -> a
forall (t :: * -> *) a. (Foldable t, Num a) => t a -> a
sum ([Int] -> Int) -> SymbExpr Char [Int] -> AltExpr Char Int
forall t (s :: * -> * -> *) a b.
(Show t, Ord t, IsSymbExpr s) =>
(a -> b) -> s t a -> AltExpr t b
<$$> SymbExpr Char Int -> SymbExpr Char Char -> SymbExpr Char [Int]
forall t (s :: * -> * -> *) (s2 :: * -> * -> *) a b.
(Show t, Ord t, IsSymbExpr s, IsSymbExpr s2, IsAltExpr s2) =>
s t a -> s2 t b -> SymbExpr t [a]
multipleSepBy SymbExpr Char Int
pX (Char -> SymbExpr Char Char
char Char
';')
Maybe (MemoRef Any)
-> [Char] -> SymbExpr Char [Int] -> [([Char], [[Int]])] -> IO ()
forall {t :: * -> *} {a} {t} {s :: * -> * -> *} {a}.
(Foldable t, Show a, Parseable t, IsSymbExpr s, Ord a) =>
Maybe (MemoRef a) -> [Char] -> s t a -> t ([t], [a]) -> IO ()
test Maybe (MemoRef Any)
forall a. Maybe a
Nothing [Char]
"multipleSepBy and multiple" (SymbExpr Char Int -> SymbExpr Char [Int]
forall t (s :: * -> * -> *) a.
(Show t, Ord t, IsSymbExpr s) =>
s t a -> SymbExpr t [a]
multiple SymbExpr Char Int
pX)
[([Char]
"", [[]]), ([Char]
"1", [[Int
1],[Int
1]]), ([Char]
"1;1", [[Int
1,Int
0,Int
1],[Int
1,Int
1],[Int
2]])
,([Char]
";1;1", [[Int
0,Int
1,Int
0,Int
1],[Int
0,Int
1,Int
1], [Int
0,Int
2], [Int
1,Int
0,Int
1], [Int
1,Int
1], [Int
2]])]
let pX :: BNF Char Int -> BNF Char Int
pX :: SymbExpr Char Int -> SymbExpr Char Int
pX SymbExpr Char Int
p = SymbExpr Char Int -> [Char] -> [Char]
forall t (s :: * -> * -> *) a.
(Show t, Ord t, IsSymbExpr s) =>
s t a -> [Char] -> [Char]
mkNt SymbExpr Char Int
p [Char]
"X" [Char] -> OO [] AltExpr Char Int -> SymbExpr Char Int
forall t (b :: * -> * -> *) a.
(Show t, Ord t, HasAlts b) =>
[Char] -> b t a -> SymbExpr t a
<::=> SymbExpr Char Int
p SymbExpr Char Int -> AltExpr Char Int -> OO [] AltExpr Char Int
forall t (i :: * -> * -> *) (b :: * -> * -> *) a.
(Show t, Ord t, IsAltExpr i, HasAlts b) =>
i t a -> b t a -> AltExprs t a
<||> Int -> Int -> Int
forall a. Num a => a -> a -> a
(+) (Int -> Int -> Int)
-> SymbExpr Char Int -> AltExpr Char (Int -> Int)
forall t (s :: * -> * -> *) a b.
(Show t, Ord t, IsSymbExpr s) =>
(a -> b) -> s t a -> AltExpr t b
<$$> SymbExpr Char Int -> SymbExpr Char Int
pX (SymbExpr Char Int
p) AltExpr Char (Int -> Int) -> SymbExpr Char Int -> AltExpr Char Int
forall t (i :: * -> * -> *) (s :: * -> * -> *) a b.
(Show t, Ord t, IsAltExpr i, IsSymbExpr s) =>
i t (a -> b) -> s t a -> AltExpr t b
<**> SymbExpr Char Int
p
Maybe (MemoRef Any)
-> [Char] -> SymbExpr Char Int -> [([Char], [Int])] -> IO ()
forall {t :: * -> *} {a} {t} {s :: * -> * -> *} {a}.
(Foldable t, Show a, Parseable t, IsSymbExpr s, Ord a) =>
Maybe (MemoRef a) -> [Char] -> s t a -> t ([t], [a]) -> IO ()
test Maybe (MemoRef Any)
forall a. Maybe a
Nothing [Char]
"sequence" (SymbExpr Char Int -> SymbExpr Char Int
pX ([Char]
"hash" [Char] -> AltExpr Char Int -> SymbExpr Char Int
forall t (b :: * -> * -> *) a.
(Show t, Ord t, HasAlts b) =>
[Char] -> b t a -> SymbExpr t a
<:=> Int
1 Int -> SymbExpr Char Char -> AltExpr Char Int
forall t (s :: * -> * -> *) b a.
(Show t, Ord t, IsSymbExpr s) =>
b -> s t a -> AltExpr t b
<$$ Char -> SymbExpr Char Char
char Char
'1'))
[([Char]
"1", [Int
1]), ([Char]
"11",[Int
2]),([Char]
"111", [Int
3])
,([Char]
"", []), ([Char]
"21",[]), ([Char]
"1(1)1", [])]
where
aho_S_5 :: [[Char]]
aho_S_5 = [[Char]
"10101010100",[Char]
"10101011000",[Char]
"10101100100",[Char]
"10101101000",[Char]
"10101110000",[Char]
"10110010100",[Char]
"10110011000",[Char]
"10110100100",[Char]
"10110101000",[Char]
"10110110000",[Char]
"10111000100",[Char]
"10111001000",[Char]
"10111010000",[Char]
"10111100000",[Char]
"11001010100",[Char]
"11001011000",[Char]
"11001100100",[Char]
"11001101000",[Char]
"11001110000",[Char]
"11010010100",[Char]
"11010011000",[Char]
"11010100100",[Char]
"11010101000",[Char]
"11010110000",[Char]
"11011000100",[Char]
"11011001000",[Char]
"11011010000",[Char]
"11011100000",[Char]
"11100010100",[Char]
"11100011000",[Char]
"11100100100",[Char]
"11100101000",[Char]
"11100110000",[Char]
"11101000100",[Char]
"11101001000",[Char]
"11101010000",[Char]
"11101100000",[Char]
"11110000100",[Char]
"11110001000",[Char]
"11110010000",[Char]
"11110100000",[Char]
"11111000000"]
_EEE_3 :: [[Char]]
_EEE_3 = [[Char]
"00111",[Char]
"01011",[Char]
"01101",[Char]
"01110",[Char]
"10011",[Char]
"10101",[Char]
"10110",[Char]
"11001",[Char]
"11010",[Char]
"111",[Char]
"11100"]