{-# LANGUAGE TypeOperators, FlexibleInstances #-}
module GLL.Combinators.Interface (
term_parser, satisfy,
keychar, keyword, int_lit, float_lit, bool_lit, char_lit, string_lit, alt_id_lit, id_lit, token,
char,
(<**>),
(<||>),
(<$$>),
(<:=>),(<::=>),chooses,chooses_prec,
BNF, SymbExpr, AltExpr, AltExprs,
Token(..), Parseable(..), SubsumesToken(..), unlexTokens, unlexToken,
grammarOf, parse, printParseData, evaluatorWithParseData,
parseWithOptions, parseWithParseOptions, printParseDataWithOptions, evaluatorWithParseDataAndOptions, printGrammarData,
CombinatorOptions, CombinatorOption,
GLL.Combinators.Options.maximumErrors, throwErrors,
maximumPivot, maximumPivotAtNt,leftBiased,
fullSPPF, allNodes, packedNodesOnly, strictBinarisation,
GLL.Parser.noSelectTest,
parseWithOptionsAndError, parseWithParseOptionsAndError,
parseResult, parseResultWithOptions,ParseResult(..),
default_lexer,
lexer, lexerEither, LexerSettings(..), emptyLanguage,
mkNt,
(<$$), (**>), (<**),
optional, preferably, reluctantly, optionalWithDef,
multiple, multiple1, multipleSepBy, multipleSepBy1,
multipleSepBy2, within, parens, braces, brackets, angles,
foldr_multiple, foldr_multipleSepBy,
fromOpTable, opTableFromList, OpTable, Assoc(..), Fixity(..),
(<:=), (<::=),(<<<**>), (<**>>>), (<<**>), (<<<**), (**>>>), (<**>>),
longest_match,shortest_match,
many, many1, some, some1,
manySepBy, manySepBy1, manySepBy2,
someSepBy, someSepBy1,someSepBy2,
HasAlts(..), IsSymbExpr(..), IsAltExpr(..),
memo, newMemoTable, memClear, MemoTable, MemoRef, useMemoisation,
) where
import GLL.Combinators.Options
import GLL.Combinators.Visit.Join
import GLL.Combinators.Visit.Sem (emptyAncestors)
import GLL.Combinators.Memoisation
import GLL.Combinators.Lexer
import GLL.Types.Grammar
import GLL.Parser hiding (parse, parseWithOptions)
import qualified GLL.Parser as GLL
import Control.Monad (when)
import GLL.Types.TypeCompose (OO(..))
import Control.Arrow
import qualified Data.Array as A
import qualified Data.Map as M
import qualified Data.Set as S
import Data.Text (pack)
import qualified Data.Text
import Data.IORef
import Data.Time.Clock
import System.IO.Unsafe
parse' :: (Show t, Parseable t, IsSymbExpr s) => ParseOptions ->
PCOptions -> s t a -> [t] -> (Grammar t, ParseResult t, Either String [a])
parse' :: forall t (s :: * -> * -> *) a.
(Show t, Parseable t, IsSymbExpr s) =>
ParseOptions
-> PCOptions
-> s t a
-> [t]
-> (Grammar t, ParseResult t, Either String [a])
parse' ParseOptions
popts PCOptions
opts s t a
p' [t]
input =
let SymbExpr (Nt Nt
start,Grammar_Expr t
vpa2,Sem_Symb t a
vpa3) = SymbExpr t a -> SymbExpr t a
forall t b. (Show t, Ord t) => SymbExpr t b -> SymbExpr t b
forall (a :: * -> * -> *) t b.
(IsSymbExpr a, Show t, Ord t) =>
a t b -> SymbExpr t b
mkRule (String
"__Start" String -> OO [] AltExpr t a -> SymbExpr t a
forall t (b :: * -> * -> *) a.
(Show t, Ord t, HasAlts b) =>
String -> b t a -> SymbExpr t a
<:=> [AltExpr t a] -> OO [] AltExpr t a
forall (f :: * -> *) (j :: * -> * -> *) a b.
f (j a b) -> OO f j a b
OO [a -> a
forall a. a -> a
id (a -> a) -> s t a -> AltExpr t a
forall t (s :: * -> * -> *) a b.
(Show t, Ord t, IsSymbExpr s) =>
(a -> b) -> s t a -> AltExpr t b
<$$> s t a
p'])
rules :: Map Nt [Prod t]
rules = Grammar_Expr t
vpa2 Map Nt [Prod t]
forall k a. Map k a
M.empty
as :: IO [a]
as = Sem_Symb t a
vpa3 PCOptions
opts Ancestors Any
forall t. Ancestors Any
emptyAncestors SPPF t
sppf Input t
arr Int
0 Int
m
grammar :: (Nt, [Prod t])
grammar = (Nt
start, [ Prod t
p | (Nt
_, [Prod t]
alts) <- Map Nt [Prod t] -> [(Nt, [Prod t])]
forall k a. Map k a -> [(k, a)]
M.assocs Map Nt [Prod t]
rules, Prod t
p <- [Prod t]
alts ])
max_err :: Int
max_err = PCOptions -> Int
max_errors PCOptions
opts
parse_res :: ParseResult t
parse_res = ParseOptions -> (Nt, [Prod t]) -> Input t -> ParseResult t
forall t.
Parseable t =>
ParseOptions -> Grammar t -> Input t -> ParseResult t
GLL.parseWithOptionsArray (ParseOptions
poptsParseOptions -> ParseOptions -> ParseOptions
forall a. [a] -> [a] -> [a]
++[Int -> ParseOption
GLL.maximumErrors Int
max_err]) (Nt, [Prod t])
grammar Input t
arr
sppf :: SPPF t
sppf = ParseResult t -> SPPF t
forall t. ParseResult t -> SPPF t
sppf_result ParseResult t
parse_res
arr :: Input t
arr = [t] -> Input t
forall t. Parseable t => [t] -> Input t
mkInput [t]
input
m :: Int
m = [t] -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [t]
input
res_list :: [a]
res_list = IO [a] -> [a]
forall a. IO a -> a
unsafePerformIO IO [a]
as
in ((Nt, [Prod t])
grammar, ParseResult t
parse_res, if ParseResult t -> Bool
forall t. ParseResult t -> Bool
res_success ParseResult t
parse_res Bool -> Bool -> Bool
&& Bool -> Bool
not ([a] -> Bool
forall a. [a] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null [a]
res_list)
then [a] -> Either String [a]
forall a b. b -> Either a b
Right ([a] -> Either String [a]) -> [a] -> Either String [a]
forall a b. (a -> b) -> a -> b
$ [a]
res_list
else String -> Either String [a]
forall a b. a -> Either a b
Left (ParseResult t -> String
forall t. ParseResult t -> String
error_message ParseResult t
parse_res) )
printParseData :: (Parseable t, IsSymbExpr s, Show a) => s t a -> [t] -> IO ()
printParseData :: forall t (s :: * -> * -> *) a.
(Parseable t, IsSymbExpr s, Show a) =>
s t a -> [t] -> IO ()
printParseData = ParseOptions -> CombinatorOptions -> s t a -> [t] -> IO ()
forall t (s :: * -> * -> *) a.
(Parseable t, IsSymbExpr s, Show a) =>
ParseOptions -> CombinatorOptions -> s t a -> [t] -> IO ()
printParseDataWithOptions [] []
printParseDataWithOptions :: (Parseable t, IsSymbExpr s, Show a) => ParseOptions -> CombinatorOptions -> s t a -> [t] -> IO ()
printParseDataWithOptions :: forall t (s :: * -> * -> *) a.
(Parseable t, IsSymbExpr s, Show a) =>
ParseOptions -> CombinatorOptions -> s t a -> [t] -> IO ()
printParseDataWithOptions ParseOptions
popts CombinatorOptions
opts s t a
p' [t]
input =
let SymbExpr (Nt Nt
start,Grammar_Expr t
vpa2,Sem_Symb t a
vpa3) = SymbExpr t a -> SymbExpr t a
forall t b. (Show t, Ord t) => SymbExpr t b -> SymbExpr t b
forall (a :: * -> * -> *) t b.
(IsSymbExpr a, Show t, Ord t) =>
a t b -> SymbExpr t b
mkRule (String
"__Start" String -> OO [] AltExpr t a -> SymbExpr t a
forall t (b :: * -> * -> *) a.
(Show t, Ord t, HasAlts b) =>
String -> b t a -> SymbExpr t a
<:=> [AltExpr t a] -> OO [] AltExpr t a
forall (f :: * -> *) (j :: * -> * -> *) a b.
f (j a b) -> OO f j a b
OO [a -> a
forall a. a -> a
id (a -> a) -> s t a -> AltExpr t a
forall t (s :: * -> * -> *) a b.
(Show t, Ord t, IsSymbExpr s) =>
(a -> b) -> s t a -> AltExpr t b
<$$> s t a
p'])
rules :: Map Nt [Prod t]
rules = Grammar_Expr t
vpa2 Map Nt [Prod t]
forall k a. Map k a
M.empty
grammar :: (Nt, [Prod t])
grammar = (Nt
start, [ Prod t
p | (Nt
_, [Prod t]
alts) <- Map Nt [Prod t] -> [(Nt, [Prod t])]
forall k a. Map k a -> [(k, a)]
M.assocs Map Nt [Prod t]
rules, Prod t
p <- [Prod t]
alts ])
parse_res :: ParseResult t
parse_res = ParseOptions -> (Nt, [Prod t]) -> [t] -> ParseResult t
forall t.
Parseable t =>
ParseOptions -> Grammar t -> [t] -> ParseResult t
GLL.parseWithOptions (ParseOptions
popts ParseOptions -> ParseOptions -> ParseOptions
forall a. [a] -> [a] -> [a]
++ [ParseOption
packedNodesOnly,ParseOption
strictBinarisation]) (Nt, [Prod t])
grammar [t]
input
arr :: Input t
arr = [t] -> Input t
forall t. Parseable t => [t] -> Input t
mkInput [t]
input
(Int
_,Int
m) = Input t -> (Int, Int)
forall i e. Array i e -> (i, i)
A.bounds Input t
arr
in do let (Nt
_,[Prod t]
prods) = (Nt, [Prod t])
grammar
nt_set :: Ancestors Any
nt_set = [Nt] -> Ancestors Any
forall a. Ord a => [a] -> Set a
S.fromList [ Nt
x | Prod Nt
x Symbols t
_ <- [Prod t]
prods ]
String -> IO ()
putStrLn (String -> IO ()) -> String -> IO ()
forall a b. (a -> b) -> a -> b
$ String
"#production: " String -> String -> String
forall a. [a] -> [a] -> [a]
++ Int -> String
forall a. Show a => a -> String
show ([Prod t] -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [Prod t]
prods)
String -> IO ()
putStrLn (String -> IO ()) -> String -> IO ()
forall a b. (a -> b) -> a -> b
$ String
"#nonterminals: " String -> String -> String
forall a. [a] -> [a] -> [a]
++ Int -> String
forall a. Show a => a -> String
show (Ancestors Any -> Int
forall a. Set a -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length Ancestors Any
nt_set)
String -> IO ()
putStrLn (String -> IO ()) -> String -> IO ()
forall a b. (a -> b) -> a -> b
$ String
"largest nonterminal: " String -> String -> String
forall a. [a] -> [a] -> [a]
++ Int -> String
forall a. Show a => a -> String
show (
(Nt -> Int -> Int) -> Int -> Ancestors Any -> Int
forall a b. (a -> b -> b) -> b -> Set a -> b
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr (\Nt
x -> Int -> Int -> Int
forall a. Ord a => a -> a -> a
max (Nt -> Int
Data.Text.length Nt
x)) Int
0 Ancestors Any
nt_set)
UTCTime
startTime <- IO UTCTime
getCurrentTime
String -> IO ()
putStrLn (String -> IO ()) -> String -> IO ()
forall a b. (a -> b) -> a -> b
$ String
"#tokens: " String -> String -> String
forall a. [a] -> [a] -> [a]
++ (Int -> String
forall a. Show a => a -> String
show Int
m)
String -> IO ()
putStrLn (String -> IO ()) -> String -> IO ()
forall a b. (a -> b) -> a -> b
$ String
"#successes: " String -> String -> String
forall a. [a] -> [a] -> [a]
++ (Int -> String
forall a. Show a => a -> String
show (Int -> String) -> Int -> String
forall a b. (a -> b) -> a -> b
$ ParseResult t -> Int
forall t. ParseResult t -> Int
res_successes ParseResult t
parse_res)
UTCTime
endTime <- IO UTCTime
getCurrentTime
String -> IO ()
putStrLn (String -> IO ()) -> String -> IO ()
forall a b. (a -> b) -> a -> b
$ String
"recognition time: " String -> String -> String
forall a. [a] -> [a] -> [a]
++ NominalDiffTime -> String
forall a. Show a => a -> String
show (UTCTime -> UTCTime -> NominalDiffTime
diffUTCTime UTCTime
endTime UTCTime
startTime)
UTCTime
startTime' <- IO UTCTime
getCurrentTime
String -> IO ()
putStrLn (String -> IO ()) -> String -> IO ()
forall a b. (a -> b) -> a -> b
$ String
"#descriptors " String -> String -> String
forall a. [a] -> [a] -> [a]
++ (Int -> String
forall a. Show a => a -> String
show (Int -> String) -> Int -> String
forall a b. (a -> b) -> a -> b
$ ParseResult t -> Int
forall t. ParseResult t -> Int
nr_descriptors ParseResult t
parse_res)
String -> IO ()
putStrLn (String -> IO ()) -> String -> IO ()
forall a b. (a -> b) -> a -> b
$ String
"#EPNs " String -> String -> String
forall a. [a] -> [a] -> [a]
++ (Int -> String
forall a. Show a => a -> String
show (Int -> String) -> Int -> String
forall a b. (a -> b) -> a -> b
$ ParseResult t -> Int
forall t. ParseResult t -> Int
nr_packed_node_attempts ParseResult t
parse_res)
UTCTime
endTime <- IO UTCTime
getCurrentTime
String -> IO ()
putStrLn (String -> IO ()) -> String -> IO ()
forall a b. (a -> b) -> a -> b
$ String
"parse-data time: " String -> String -> String
forall a. [a] -> [a] -> [a]
++ NominalDiffTime -> String
forall a. Show a => a -> String
show (UTCTime -> UTCTime -> NominalDiffTime
diffUTCTime UTCTime
endTime UTCTime
startTime')
String -> IO ()
putStrLn (String -> IO ()) -> String -> IO ()
forall a b. (a -> b) -> a -> b
$ String
"total time: " String -> String -> String
forall a. [a] -> [a] -> [a]
++ NominalDiffTime -> String
forall a. Show a => a -> String
show (UTCTime -> UTCTime -> NominalDiffTime
diffUTCTime UTCTime
endTime UTCTime
startTime)
evaluatorWithParseData :: (Parseable t, IsSymbExpr s, Show a) => s t a -> [t] -> [a]
evaluatorWithParseData :: forall t (s :: * -> * -> *) a.
(Parseable t, IsSymbExpr s, Show a) =>
s t a -> [t] -> [a]
evaluatorWithParseData = ParseOptions -> CombinatorOptions -> s t a -> [t] -> [a]
forall t (s :: * -> * -> *) a.
(Parseable t, IsSymbExpr s, Show a) =>
ParseOptions -> CombinatorOptions -> s t a -> [t] -> [a]
evaluatorWithParseDataAndOptions [] []
evaluatorWithParseDataAndOptions :: (Parseable t, IsSymbExpr s, Show a) => ParseOptions -> CombinatorOptions -> s t a -> [t] -> [a]
evaluatorWithParseDataAndOptions :: forall t (s :: * -> * -> *) a.
(Parseable t, IsSymbExpr s, Show a) =>
ParseOptions -> CombinatorOptions -> s t a -> [t] -> [a]
evaluatorWithParseDataAndOptions ParseOptions
popts CombinatorOptions
opts s t a
p' [t]
input =
let SymbExpr (Nt Nt
start,Grammar_Expr t
vpa2,Sem_Symb t a
vpa3) = SymbExpr t a -> SymbExpr t a
forall t b. (Show t, Ord t) => SymbExpr t b -> SymbExpr t b
forall (a :: * -> * -> *) t b.
(IsSymbExpr a, Show t, Ord t) =>
a t b -> SymbExpr t b
mkRule (String
"__Start" String -> OO [] AltExpr t a -> SymbExpr t a
forall t (b :: * -> * -> *) a.
(Show t, Ord t, HasAlts b) =>
String -> b t a -> SymbExpr t a
<:=> [AltExpr t a] -> OO [] AltExpr t a
forall (f :: * -> *) (j :: * -> * -> *) a b.
f (j a b) -> OO f j a b
OO [a -> a
forall a. a -> a
id (a -> a) -> s t a -> AltExpr t a
forall t (s :: * -> * -> *) a b.
(Show t, Ord t, IsSymbExpr s) =>
(a -> b) -> s t a -> AltExpr t b
<$$> s t a
p'])
rules :: Map Nt [Prod t]
rules = Grammar_Expr t
vpa2 Map Nt [Prod t]
forall k a. Map k a
M.empty
grammar :: (Nt, [Prod t])
grammar = (Nt
start, [ Prod t
p | (Nt
_, [Prod t]
alts) <- Map Nt [Prod t] -> [(Nt, [Prod t])]
forall k a. Map k a -> [(k, a)]
M.assocs Map Nt [Prod t]
rules, Prod t
p <- [Prod t]
alts ])
parse_res :: ParseResult t
parse_res = ParseOptions -> (Nt, [Prod t]) -> [t] -> ParseResult t
forall t.
Parseable t =>
ParseOptions -> Grammar t -> [t] -> ParseResult t
GLL.parseWithOptions (ParseOptions
poptsParseOptions -> ParseOptions -> ParseOptions
forall a. [a] -> [a] -> [a]
++[ParseOption
packedNodesOnly,ParseOption
strictBinarisation]) (Nt, [Prod t])
grammar [t]
input
arr :: Input t
arr = [t] -> Input t
forall t. Parseable t => [t] -> Input t
mkInput [t]
input
(Int
_,Int
m) = Input t -> (Int, Int)
forall i e. Array i e -> (i, i)
A.bounds Input t
arr
in IO [a] -> [a]
forall a. IO a -> a
unsafePerformIO (IO [a] -> [a]) -> IO [a] -> [a]
forall a b. (a -> b) -> a -> b
$ do
let (Nt
_,[Prod t]
prods) = (Nt, [Prod t])
grammar
nt_set :: Ancestors Any
nt_set = [Nt] -> Ancestors Any
forall a. Ord a => [a] -> Set a
S.fromList [ Nt
x | Prod Nt
x Symbols t
_ <- [Prod t]
prods ]
String -> IO ()
putStrLn (String -> IO ()) -> String -> IO ()
forall a b. (a -> b) -> a -> b
$ String
"#production: " String -> String -> String
forall a. [a] -> [a] -> [a]
++ Int -> String
forall a. Show a => a -> String
show ([Prod t] -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [Prod t]
prods)
String -> IO ()
putStrLn (String -> IO ()) -> String -> IO ()
forall a b. (a -> b) -> a -> b
$ String
"#nonterminals: " String -> String -> String
forall a. [a] -> [a] -> [a]
++ Int -> String
forall a. Show a => a -> String
show (Ancestors Any -> Int
forall a. Set a -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length Ancestors Any
nt_set)
String -> IO ()
putStrLn (String -> IO ()) -> String -> IO ()
forall a b. (a -> b) -> a -> b
$ String
"largest nonterminal: " String -> String -> String
forall a. [a] -> [a] -> [a]
++ Int -> String
forall a. Show a => a -> String
show (
(Nt -> Int -> Int) -> Int -> Ancestors Any -> Int
forall a b. (a -> b -> b) -> b -> Set a -> b
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr (\Nt
x -> Int -> Int -> Int
forall a. Ord a => a -> a -> a
max (Nt -> Int
Data.Text.length Nt
x)) Int
0 Ancestors Any
nt_set)
UTCTime
startTime <- IO UTCTime
getCurrentTime
String -> IO ()
putStrLn (String -> IO ()) -> String -> IO ()
forall a b. (a -> b) -> a -> b
$ String
"#tokens: " String -> String -> String
forall a. [a] -> [a] -> [a]
++ (Int -> String
forall a. Show a => a -> String
show Int
m)
String -> IO ()
putStrLn (String -> IO ()) -> String -> IO ()
forall a b. (a -> b) -> a -> b
$ String
"#successes: " String -> String -> String
forall a. [a] -> [a] -> [a]
++ (Int -> String
forall a. Show a => a -> String
show (Int -> String) -> Int -> String
forall a b. (a -> b) -> a -> b
$ ParseResult t -> Int
forall t. ParseResult t -> Int
res_successes ParseResult t
parse_res)
UTCTime
endTime <- IO UTCTime
getCurrentTime
String -> IO ()
putStrLn (String -> IO ()) -> String -> IO ()
forall a b. (a -> b) -> a -> b
$ String
"recognition time: " String -> String -> String
forall a. [a] -> [a] -> [a]
++ NominalDiffTime -> String
forall a. Show a => a -> String
show (UTCTime -> UTCTime -> NominalDiffTime
diffUTCTime UTCTime
endTime UTCTime
startTime)
UTCTime
startTime' <- IO UTCTime
getCurrentTime
String -> IO ()
putStrLn (String -> IO ()) -> String -> IO ()
forall a b. (a -> b) -> a -> b
$ String
"#descriptors " String -> String -> String
forall a. [a] -> [a] -> [a]
++ (Int -> String
forall a. Show a => a -> String
show (Int -> String) -> Int -> String
forall a b. (a -> b) -> a -> b
$ ParseResult t -> Int
forall t. ParseResult t -> Int
nr_descriptors ParseResult t
parse_res)
String -> IO ()
putStrLn (String -> IO ()) -> String -> IO ()
forall a b. (a -> b) -> a -> b
$ String
"#EPNs " String -> String -> String
forall a. [a] -> [a] -> [a]
++ (Int -> String
forall a. Show a => a -> String
show (Int -> String) -> Int -> String
forall a b. (a -> b) -> a -> b
$ ParseResult t -> Int
forall t. ParseResult t -> Int
nr_packed_node_attempts ParseResult t
parse_res)
UTCTime
endTime <- IO UTCTime
getCurrentTime
String -> IO ()
putStrLn (String -> IO ()) -> String -> IO ()
forall a b. (a -> b) -> a -> b
$ String
"parse-data time: " String -> String -> String
forall a. [a] -> [a] -> [a]
++ NominalDiffTime -> String
forall a. Show a => a -> String
show (UTCTime -> UTCTime -> NominalDiffTime
diffUTCTime UTCTime
endTime UTCTime
startTime')
UTCTime
startTime' <- IO UTCTime
getCurrentTime
[a]
as <- Sem_Symb t a
vpa3 (CombinatorOptions -> PCOptions
runOptions CombinatorOptions
opts) Ancestors Any
forall t. Ancestors Any
emptyAncestors (ParseResult t -> SPPF t
forall t. ParseResult t -> SPPF t
sppf_result ParseResult t
parse_res) Input t
arr Int
0 Int
m
Bool -> IO () -> IO ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (Bool -> Bool
not ([a] -> Bool
forall a. [a] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null [a]
as)) (String -> String -> IO ()
writeFile String
"/tmp/derivation" (a -> String
forall a. Show a => a -> String
show ([a] -> a
forall a. HasCallStack => [a] -> a
head [a]
as)))
UTCTime
endTime <- IO UTCTime
getCurrentTime
String -> IO ()
putStrLn (String -> IO ()) -> String -> IO ()
forall a b. (a -> b) -> a -> b
$ String
"semantic phase: " String -> String -> String
forall a. [a] -> [a] -> [a]
++ NominalDiffTime -> String
forall a. Show a => a -> String
show (UTCTime -> UTCTime -> NominalDiffTime
diffUTCTime UTCTime
endTime UTCTime
startTime')
String -> IO ()
putStrLn (String -> IO ()) -> String -> IO ()
forall a b. (a -> b) -> a -> b
$ String
"total time: " String -> String -> String
forall a. [a] -> [a] -> [a]
++ NominalDiffTime -> String
forall a. Show a => a -> String
show (UTCTime -> UTCTime -> NominalDiffTime
diffUTCTime UTCTime
endTime UTCTime
startTime)
[a] -> IO [a]
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return [a]
as
grammarOf :: (Show t, Parseable t, IsSymbExpr s) => s t a -> Grammar t
grammarOf :: forall t (s :: * -> * -> *) a.
(Show t, Parseable t, IsSymbExpr s) =>
s t a -> Grammar t
grammarOf s t a
p = (\(Grammar t
f,ParseResult t
_,Either String [a]
_) -> Grammar t
f) (ParseOptions
-> PCOptions
-> s t a
-> [t]
-> (Grammar t, ParseResult t, Either String [a])
forall t (s :: * -> * -> *) a.
(Show t, Parseable t, IsSymbExpr s) =>
ParseOptions
-> PCOptions
-> s t a
-> [t]
-> (Grammar t, ParseResult t, Either String [a])
parse' ParseOptions
defaultPOpts PCOptions
defaultOptions s t a
p [])
printGrammarData :: (Show t, Parseable t, IsSymbExpr s) => s t a -> IO ()
printGrammarData :: forall t (s :: * -> * -> *) a.
(Show t, Parseable t, IsSymbExpr s) =>
s t a -> IO ()
printGrammarData s t a
p = do
String -> IO ()
putStrLn (String -> IO ()) -> String -> IO ()
forall a b. (a -> b) -> a -> b
$ String
"production: " String -> String -> String
forall a. [a] -> [a] -> [a]
++ Int -> String
forall a. Show a => a -> String
show ([Prod t] -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [Prod t]
prods)
String -> IO ()
putStrLn (String -> IO ()) -> String -> IO ()
forall a b. (a -> b) -> a -> b
$ String
"nonterminals: " String -> String -> String
forall a. [a] -> [a] -> [a]
++ Int -> String
forall a. Show a => a -> String
show (Ancestors Any -> Int
forall a. Set a -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length Ancestors Any
nt_set)
String -> IO ()
putStrLn (String -> IO ()) -> String -> IO ()
forall a b. (a -> b) -> a -> b
$ String
"largest nonterminal: " String -> String -> String
forall a. [a] -> [a] -> [a]
++ Int -> String
forall a. Show a => a -> String
show (
(Nt -> Int -> Int) -> Int -> Ancestors Any -> Int
forall a b. (a -> b -> b) -> b -> Set a -> b
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr (\Nt
x -> Int -> Int -> Int
forall a. Ord a => a -> a -> a
max (Nt -> Int
Data.Text.length Nt
x)) Int
0 Ancestors Any
nt_set)
where (Nt
_,[Prod t]
prods) = s t a -> (Nt, [Prod t])
forall t (s :: * -> * -> *) a.
(Show t, Parseable t, IsSymbExpr s) =>
s t a -> Grammar t
grammarOf s t a
p
nt_set :: Ancestors Any
nt_set = [Nt] -> Ancestors Any
forall a. Ord a => [a] -> Set a
S.fromList [ Nt
x | Prod Nt
x Symbols t
_ <- [Prod t]
prods ]
parse :: (Show t, Parseable t, IsSymbExpr s) => s t a -> [t] -> [a]
parse :: forall t (s :: * -> * -> *) a.
(Show t, Parseable t, IsSymbExpr s) =>
s t a -> [t] -> [a]
parse = CombinatorOptions -> s t a -> [t] -> [a]
forall t (s :: * -> * -> *) a.
(Show t, Parseable t, IsSymbExpr s) =>
CombinatorOptions -> s t a -> [t] -> [a]
parseWithOptions [CombinatorOption
throwErrors]
parseWithOptions :: (Show t, Parseable t, IsSymbExpr s) =>
CombinatorOptions -> s t a -> [t] -> [a]
parseWithOptions :: forall t (s :: * -> * -> *) a.
(Show t, Parseable t, IsSymbExpr s) =>
CombinatorOptions -> s t a -> [t] -> [a]
parseWithOptions CombinatorOptions
opts s t a
p [t]
ts = 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 ParseOptions
defaultPOpts CombinatorOptions
opts s t a
p [t]
ts
parseWithParseOptions :: (Show t, Parseable t, IsSymbExpr s) =>
ParseOptions -> CombinatorOptions -> s t a -> [t] -> [a]
parseWithParseOptions :: forall t (s :: * -> * -> *) a.
(Show t, Parseable t, IsSymbExpr s) =>
ParseOptions -> CombinatorOptions -> s t a -> [t] -> [a]
parseWithParseOptions ParseOptions
pcopts CombinatorOptions
opts s t a
p [t]
ts =
case ParseOptions
-> CombinatorOptions -> s t a -> [t] -> Either String [a]
forall t (s :: * -> * -> *) a.
(Show t, Parseable t, IsSymbExpr s) =>
ParseOptions
-> CombinatorOptions -> s t a -> [t] -> Either String [a]
parseWithParseOptionsAndError ParseOptions
pcopts CombinatorOptions
opts s t a
p [t]
ts of
Left String
str | PCOptions -> Bool
throw_errors PCOptions
opts' -> String -> [a]
forall a. HasCallStack => String -> a
error String
str
| Bool
otherwise -> []
Right [a]
as -> [a]
as
where opts' :: PCOptions
opts' = CombinatorOptions -> PCOptions
runOptions CombinatorOptions
opts
parseWithOptionsAndError :: (Show t, Parseable t, IsSymbExpr s) =>
CombinatorOptions -> s t a -> [t] -> Either String [a]
parseWithOptionsAndError :: forall t (s :: * -> * -> *) a.
(Show t, Parseable t, IsSymbExpr s) =>
CombinatorOptions -> s t a -> [t] -> Either String [a]
parseWithOptionsAndError CombinatorOptions
opts s t a
p = ParseOptions
-> CombinatorOptions -> s t a -> [t] -> Either String [a]
forall t (s :: * -> * -> *) a.
(Show t, Parseable t, IsSymbExpr s) =>
ParseOptions
-> CombinatorOptions -> s t a -> [t] -> Either String [a]
parseWithParseOptionsAndError ParseOptions
defaultPOpts CombinatorOptions
opts s t a
p
parseWithParseOptionsAndError :: (Show t, Parseable t, IsSymbExpr s) =>
ParseOptions -> CombinatorOptions -> s t a -> [t] -> Either String [a]
parseWithParseOptionsAndError :: forall t (s :: * -> * -> *) a.
(Show t, Parseable t, IsSymbExpr s) =>
ParseOptions
-> CombinatorOptions -> s t a -> [t] -> Either String [a]
parseWithParseOptionsAndError ParseOptions
popts CombinatorOptions
opts s t a
p = (\(Grammar t
_,ParseResult t
_,Either String [a]
t) -> Either String [a]
t) ((Grammar t, ParseResult t, Either String [a])
-> Either String [a])
-> ([t] -> (Grammar t, ParseResult t, Either String [a]))
-> [t]
-> Either String [a]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ParseOptions
-> PCOptions
-> s t a
-> [t]
-> (Grammar t, ParseResult t, Either String [a])
forall t (s :: * -> * -> *) a.
(Show t, Parseable t, IsSymbExpr s) =>
ParseOptions
-> PCOptions
-> s t a
-> [t]
-> (Grammar t, ParseResult t, Either String [a])
parse' ParseOptions
defaultPOpts (CombinatorOptions -> PCOptions
runOptions CombinatorOptions
opts) s t a
p
parseResult :: (Show t, Parseable t, IsSymbExpr s) => s t a -> [t] -> ParseResult t
parseResult :: forall t (s :: * -> * -> *) a.
(Show t, Parseable t, IsSymbExpr s) =>
s t a -> [t] -> ParseResult t
parseResult = ParseOptions -> CombinatorOptions -> s t a -> [t] -> ParseResult t
forall t (s :: * -> * -> *) a.
(Show t, Parseable t, IsSymbExpr s) =>
ParseOptions -> CombinatorOptions -> s t a -> [t] -> ParseResult t
parseResultWithOptions [] []
parseResultWithOptions :: (Show t, Parseable t, IsSymbExpr s) =>
ParseOptions -> CombinatorOptions -> s t a -> [t] -> ParseResult t
parseResultWithOptions :: forall t (s :: * -> * -> *) a.
(Show t, Parseable t, IsSymbExpr s) =>
ParseOptions -> CombinatorOptions -> s t a -> [t] -> ParseResult t
parseResultWithOptions ParseOptions
popts CombinatorOptions
opts s t a
p [t]
str =
(\(Grammar t
_,ParseResult t
s,Either String [a]
_) -> ParseResult t
s) ((Grammar t, ParseResult t, Either String [a]) -> ParseResult t)
-> (Grammar t, ParseResult t, Either String [a]) -> ParseResult t
forall a b. (a -> b) -> a -> b
$ ParseOptions
-> PCOptions
-> s t a
-> [t]
-> (Grammar t, ParseResult t, Either String [a])
forall t (s :: * -> * -> *) a.
(Show t, Parseable t, IsSymbExpr s) =>
ParseOptions
-> PCOptions
-> s t a
-> [t]
-> (Grammar t, ParseResult t, Either String [a])
parse' ParseOptions
popts (CombinatorOptions -> PCOptions
runOptions CombinatorOptions
opts) s t a
p [t]
str
defaultPOpts :: ParseOptions
defaultPOpts = [ParseOption
strictBinarisation, ParseOption
packedNodesOnly]
infixl 2 <:=>
(<:=>) :: (Show t, Ord t, HasAlts b) => String -> b t a -> SymbExpr t a
String
x <:=> :: forall t (b :: * -> * -> *) a.
(Show t, Ord t, HasAlts b) =>
String -> b t a -> SymbExpr t a
<:=> b t a
altPs = Bool -> Bool -> String -> b t a -> SymbExpr t a
forall t (b :: * -> * -> *) a.
(Show t, Ord t, HasAlts b) =>
Bool -> Bool -> String -> b t a -> SymbExpr t a
mkNtRule Bool
False Bool
False String
x b t a
altPs
infixl 2 <::=>
(<::=>) :: (Show t, Ord t, HasAlts b) => String -> b t a -> SymbExpr t a
String
x <::=> :: forall t (b :: * -> * -> *) a.
(Show t, Ord t, HasAlts b) =>
String -> b t a -> SymbExpr t a
<::=> b t a
altPs = Bool -> Bool -> String -> b t a -> SymbExpr t a
forall t (b :: * -> * -> *) a.
(Show t, Ord t, HasAlts b) =>
Bool -> Bool -> String -> b t a -> SymbExpr t a
mkNtRule Bool
True Bool
False String
x b t a
altPs
chooses :: (Show t, Ord t, IsAltExpr alt) => String -> [alt t a] -> SymbExpr t a
chooses :: forall t (alt :: * -> * -> *) a.
(Show t, Ord t, IsAltExpr alt) =>
String -> [alt t a] -> SymbExpr t a
chooses String
p [alt t a]
alts | [alt t a] -> Bool
forall a. [a] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null [alt t a]
alts = String -> SymbExpr t a
forall a. HasCallStack => String -> a
error String
"chooses cannot be given an empty list of alternatives"
| Bool
otherwise = String -> OO [] AltExpr t a -> SymbExpr t a
forall t (b :: * -> * -> *) a.
(Show t, Ord t, HasAlts b) =>
String -> b t a -> SymbExpr t a
(<::=>) String
p ([AltExpr t a] -> OO [] AltExpr t a
forall (f :: * -> *) (j :: * -> * -> *) a b.
f (j a b) -> OO f j a b
OO ((alt t a -> AltExpr t a) -> [alt t a] -> [AltExpr t a]
forall a b. (a -> b) -> [a] -> [b]
map alt t a -> AltExpr t a
forall t b. (Show t, Ord t) => alt t b -> AltExpr t b
forall (a :: * -> * -> *) t b.
(IsAltExpr a, Show t, Ord t) =>
a t b -> AltExpr t b
toAlt [alt t a]
alts))
chooses_prec :: (Show t, Ord t, IsAltExpr alt) => String -> [alt t a] -> SymbExpr t a
chooses_prec :: forall t (alt :: * -> * -> *) a.
(Show t, Ord t, IsAltExpr alt) =>
String -> [alt t a] -> SymbExpr t a
chooses_prec String
p [alt t a]
alts | [alt t a] -> Bool
forall a. [a] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null [alt t a]
alts = String -> SymbExpr t a
forall a. HasCallStack => String -> a
error String
"chooses cannot be given an empty list of alternatives"
| Bool
otherwise = String -> OO [] AltExpr t a -> SymbExpr t a
forall t (b :: * -> * -> *) a.
(Show t, Ord t, HasAlts b) =>
String -> b t a -> SymbExpr t a
(<::=) String
p ([AltExpr t a] -> OO [] AltExpr t a
forall (f :: * -> *) (j :: * -> * -> *) a b.
f (j a b) -> OO f j a b
OO ((alt t a -> AltExpr t a) -> [alt t a] -> [AltExpr t a]
forall a b. (a -> b) -> [a] -> [b]
map alt t a -> AltExpr t a
forall t b. (Show t, Ord t) => alt t b -> AltExpr t b
forall (a :: * -> * -> *) t b.
(IsAltExpr a, Show t, Ord t) =>
a t b -> AltExpr t b
toAlt [alt t a]
alts))
infixl 4 <$$>
(<$$>) :: (Show t, Ord t, IsSymbExpr s) => (a -> b) -> s t a -> AltExpr t b
a -> b
f <$$> :: forall t (s :: * -> * -> *) a b.
(Show t, Ord t, IsSymbExpr s) =>
(a -> b) -> s t a -> AltExpr t b
<$$> s t a
p' = (a -> b) -> s t a -> AltExpr t b
forall t (s :: * -> * -> *) a b.
(Show t, Ord t, IsSymbExpr s) =>
(a -> b) -> s t a -> AltExpr t b
join_apply a -> b
f s t a
p'
infixl 4 <**>,<<<**>,<**>>>
(<**>) :: (Show t, Ord t, IsAltExpr i, IsSymbExpr s) =>
i t (a -> b) -> s t a -> AltExpr t b
i t (a -> b)
pl' <**> :: forall t (i :: * -> * -> *) (s :: * -> * -> *) a b.
(Show t, Ord t, IsAltExpr i, IsSymbExpr s) =>
i t (a -> b) -> s t a -> AltExpr t b
<**> s t a
pr' = CombinatorOptions -> i t (a -> b) -> s t a -> AltExpr t b
forall t (i :: * -> * -> *) (s :: * -> * -> *) a b.
(Show t, Ord t, IsAltExpr i, IsSymbExpr s) =>
CombinatorOptions -> i t (a -> b) -> s t a -> AltExpr t b
join_seq [] i t (a -> b)
pl' s t a
pr'
(<**>>>) :: (Show t, Ord t, IsAltExpr i, IsSymbExpr s) =>
i t (a -> b) -> s t a -> AltExpr t b
i t (a -> b)
pl' <**>>> :: forall t (i :: * -> * -> *) (s :: * -> * -> *) a b.
(Show t, Ord t, IsAltExpr i, IsSymbExpr s) =>
i t (a -> b) -> s t a -> AltExpr t b
<**>>> s t a
pr' = CombinatorOptions -> i t (a -> b) -> s t a -> AltExpr t b
forall t (i :: * -> * -> *) (s :: * -> * -> *) a b.
(Show t, Ord t, IsAltExpr i, IsSymbExpr s) =>
CombinatorOptions -> i t (a -> b) -> s t a -> AltExpr t b
join_seq [CombinatorOption
maximumPivot] i t (a -> b)
pl' s t a
pr'
(<<<**>) :: (Show t, Ord t, IsAltExpr i, IsSymbExpr s) =>
i t (a -> b) -> s t a -> AltExpr t b
i t (a -> b)
pl' <<<**> :: forall t (i :: * -> * -> *) (s :: * -> * -> *) a b.
(Show t, Ord t, IsAltExpr i, IsSymbExpr s) =>
i t (a -> b) -> s t a -> AltExpr t b
<<<**> s t a
pr' = CombinatorOptions -> i t (a -> b) -> s t a -> AltExpr t b
forall t (i :: * -> * -> *) (s :: * -> * -> *) a b.
(Show t, Ord t, IsAltExpr i, IsSymbExpr s) =>
CombinatorOptions -> i t (a -> b) -> s t a -> AltExpr t b
join_seq [CombinatorOption
minimumPivot] i t (a -> b)
pl' s t a
pr'
infixr 3 <||>
(<||>) :: (Show t, Ord t, IsAltExpr i, HasAlts b) => i t a -> b t a -> AltExprs t a
i t a
l' <||> :: forall t (i :: * -> * -> *) (b :: * -> * -> *) a.
(Show t, Ord t, IsAltExpr i, HasAlts b) =>
i t a -> b t a -> AltExprs t a
<||> b t a
r' = let l :: AltExpr t a
l = i t a -> AltExpr t a
forall t b. (Show t, Ord t) => i t b -> AltExpr t b
forall (a :: * -> * -> *) t b.
(IsAltExpr a, Show t, Ord t) =>
a t b -> AltExpr t b
toAlt i t a
l'
r :: [AltExpr t a]
r = b t a -> [AltExpr t a]
forall t b. (Show t, Ord t) => b t b -> [AltExpr t b]
forall (a :: * -> * -> *) t b.
(HasAlts a, Show t, Ord t) =>
a t b -> [AltExpr t b]
altsOf b t a
r'
in [AltExpr t a] -> OO [] AltExpr t a
forall (f :: * -> *) (j :: * -> * -> *) a b.
f (j a b) -> OO f j a b
OO (AltExpr t a
l AltExpr t a -> [AltExpr t a] -> [AltExpr t a]
forall a. a -> [a] -> [a]
: [AltExpr t a]
r)
longest_match :: (Show t, Ord t, IsAltExpr alt) => alt t a -> AltExpr t a
longest_match :: forall t (alt :: * -> * -> *) a.
(Show t, Ord t, IsAltExpr alt) =>
alt t a -> AltExpr t a
longest_match alt t a
isalt = ([Symbol t], Grammar_Expr t, Sem_Alt t a) -> AltExpr t a
forall t a.
([Symbol t], Grammar_Expr t, Sem_Alt t a) -> AltExpr t a
AltExpr ([Symbol t]
v1,Grammar_Expr t
v2,\PCOptions
opts -> Sem_Alt t a
v3 (CombinatorOption
maximumPivot PCOptions
opts))
where AltExpr ([Symbol t]
v1,Grammar_Expr t
v2,Sem_Alt t a
v3) = alt t a -> AltExpr t a
forall t b. (Show t, Ord t) => alt t b -> AltExpr t b
forall (a :: * -> * -> *) t b.
(IsAltExpr a, Show t, Ord t) =>
a t b -> AltExpr t b
toAlt alt t a
isalt
shortest_match :: (Show t, Ord t, IsAltExpr alt) => alt t a -> AltExpr t a
shortest_match :: forall t (alt :: * -> * -> *) a.
(Show t, Ord t, IsAltExpr alt) =>
alt t a -> AltExpr t a
shortest_match alt t a
isalt = ([Symbol t], Grammar_Expr t, Sem_Alt t a) -> AltExpr t a
forall t a.
([Symbol t], Grammar_Expr t, Sem_Alt t a) -> AltExpr t a
AltExpr ([Symbol t]
v1,Grammar_Expr t
v2,\PCOptions
opts -> Sem_Alt t a
v3 (CombinatorOption
minimumPivot PCOptions
opts))
where AltExpr ([Symbol t]
v1,Grammar_Expr t
v2,Sem_Alt t a
v3) = alt t a -> AltExpr t a
forall t b. (Show t, Ord t) => alt t b -> AltExpr t b
forall (a :: * -> * -> *) t b.
(IsAltExpr a, Show t, Ord t) =>
a t b -> AltExpr t b
toAlt alt t a
isalt
term_parser :: t -> (t -> a) -> SymbExpr t a
term_parser :: forall t a. t -> (t -> a) -> SymbExpr t a
term_parser t
t t -> a
f = (Symbol t, Grammar_Expr t, Sem_Symb t a) -> SymbExpr t a
forall t a.
(Symbol t, Grammar_Expr t, Sem_Symb t a) -> SymbExpr t a
SymbExpr (t -> Symbol t
forall t. t -> Symbol t
Term t
t, Grammar_Expr t
forall a. a -> a
id,\PCOptions
_ Ancestors Any
_ SPPF t
_ Array Int t
arr Int
l Int
_ -> [a] -> IO [a]
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return [t -> a
f (Array Int t
arr Array Int t -> Int -> t
forall i e. Ix i => Array i e -> i -> e
A.! Int
l)])
char :: Char -> SymbExpr Char Char
char :: Char -> SymbExpr Char Char
char Char
c = Char -> (Char -> Char) -> SymbExpr Char Char
forall t a. t -> (t -> a) -> SymbExpr t a
term_parser Char
c Char -> Char
forall a. a -> a
id
keychar :: SubsumesToken t => Char -> SymbExpr t Char
keychar :: forall t. SubsumesToken t => Char -> SymbExpr t Char
keychar Char
c = t -> (t -> Char) -> SymbExpr t Char
forall t a. t -> (t -> a) -> SymbExpr t a
term_parser (Token -> t
forall a. SubsumesToken a => Token -> a
upcast (Char -> Token
Char Char
c)) (Char -> t -> Char
forall a b. a -> b -> a
const Char
c)
keyword :: SubsumesToken t => String -> SymbExpr t String
keyword :: forall t. SubsumesToken t => String -> SymbExpr t String
keyword String
k = t -> (t -> String) -> SymbExpr t String
forall t a. t -> (t -> a) -> SymbExpr t a
term_parser (Token -> t
forall a. SubsumesToken a => Token -> a
upcast (String -> Token
Keyword String
k)) (String -> t -> String
forall a b. a -> b -> a
const String
k)
int_lit :: SubsumesToken t => SymbExpr t Int
int_lit :: forall t. SubsumesToken t => SymbExpr t Int
int_lit = t -> (t -> Int) -> SymbExpr t Int
forall t a. t -> (t -> a) -> SymbExpr t a
term_parser (Token -> t
forall a. SubsumesToken a => Token -> a
upcast (Maybe Int -> Token
IntLit Maybe Int
forall a. Maybe a
Nothing)) (Maybe Token -> Int
unwrap (Maybe Token -> Int) -> (t -> Maybe Token) -> t -> Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. t -> Maybe Token
forall a. SubsumesToken a => a -> Maybe Token
downcast)
where unwrap :: Maybe Token -> Int
unwrap (Just (IntLit (Just Int
i))) = Int
i
unwrap Maybe Token
_ = String -> Int
forall a. HasCallStack => String -> a
error String
"int_lit: downcast, or token without lexeme"
float_lit :: SubsumesToken t => SymbExpr t Double
float_lit :: forall t. SubsumesToken t => SymbExpr t Double
float_lit = t -> (t -> Double) -> SymbExpr t Double
forall t a. t -> (t -> a) -> SymbExpr t a
term_parser (Token -> t
forall a. SubsumesToken a => Token -> a
upcast (Maybe Double -> Token
FloatLit Maybe Double
forall a. Maybe a
Nothing)) (Maybe Token -> Double
unwrap (Maybe Token -> Double) -> (t -> Maybe Token) -> t -> Double
forall b c a. (b -> c) -> (a -> b) -> a -> c
. t -> Maybe Token
forall a. SubsumesToken a => a -> Maybe Token
downcast)
where unwrap :: Maybe Token -> Double
unwrap (Just (FloatLit (Just Double
i))) = Double
i
unwrap Maybe Token
_ = String -> Double
forall a. HasCallStack => String -> a
error String
"float_lit: downcast, or token without lexeme"
bool_lit :: SubsumesToken t => SymbExpr t Bool
bool_lit :: forall t. SubsumesToken t => SymbExpr t Bool
bool_lit = t -> (t -> Bool) -> SymbExpr t Bool
forall t a. t -> (t -> a) -> SymbExpr t a
term_parser (Token -> t
forall a. SubsumesToken a => Token -> a
upcast (Maybe Bool -> Token
BoolLit Maybe Bool
forall a. Maybe a
Nothing)) (Maybe Token -> Bool
unwrap (Maybe Token -> Bool) -> (t -> Maybe Token) -> t -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. t -> Maybe Token
forall a. SubsumesToken a => a -> Maybe Token
downcast)
where unwrap :: Maybe Token -> Bool
unwrap (Just (BoolLit (Just Bool
b))) = Bool
b
unwrap Maybe Token
_ = String -> Bool
forall a. HasCallStack => String -> a
error String
"bool_lit: downcast, or token without lexeme"
char_lit :: SubsumesToken t => SymbExpr t Char
char_lit :: forall t. SubsumesToken t => SymbExpr t Char
char_lit = t -> (t -> Char) -> SymbExpr t Char
forall t a. t -> (t -> a) -> SymbExpr t a
term_parser (Token -> t
forall a. SubsumesToken a => Token -> a
upcast (Maybe Char -> Token
CharLit Maybe Char
forall a. Maybe a
Nothing)) (Maybe Token -> Char
unwrap (Maybe Token -> Char) -> (t -> Maybe Token) -> t -> Char
forall b c a. (b -> c) -> (a -> b) -> a -> c
. t -> Maybe Token
forall a. SubsumesToken a => a -> Maybe Token
downcast)
where unwrap :: Maybe Token -> Char
unwrap (Just (CharLit (Just Char
s))) = Char
s
unwrap Maybe Token
_ = String -> Char
forall a. HasCallStack => String -> a
error String
"char_lit: downcast, or token without lexeme"
string_lit :: SubsumesToken t => SymbExpr t String
string_lit :: forall t. SubsumesToken t => SymbExpr t String
string_lit = t -> (t -> String) -> SymbExpr t String
forall t a. t -> (t -> a) -> SymbExpr t a
term_parser (Token -> t
forall a. SubsumesToken a => Token -> a
upcast (Maybe String -> Token
StringLit Maybe String
forall a. Maybe a
Nothing)) (Maybe Token -> String
unwrap (Maybe Token -> String) -> (t -> Maybe Token) -> t -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. t -> Maybe Token
forall a. SubsumesToken a => a -> Maybe Token
downcast)
where unwrap :: Maybe Token -> String
unwrap (Just (StringLit (Just String
i))) = String
i
unwrap Maybe Token
_ = String -> String
forall a. HasCallStack => String -> a
error String
"string_lit: downcast, or token without lexeme"
id_lit :: SubsumesToken t => SymbExpr t String
id_lit :: forall t. SubsumesToken t => SymbExpr t String
id_lit = t -> (t -> String) -> SymbExpr t String
forall t a. t -> (t -> a) -> SymbExpr t a
term_parser (Token -> t
forall a. SubsumesToken a => Token -> a
upcast (Maybe String -> Token
IDLit Maybe String
forall a. Maybe a
Nothing)) (Maybe Token -> String
unwrap (Maybe Token -> String) -> (t -> Maybe Token) -> t -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. t -> Maybe Token
forall a. SubsumesToken a => a -> Maybe Token
downcast)
where unwrap :: Maybe Token -> String
unwrap (Just (IDLit (Just String
i))) = String
i
unwrap Maybe Token
_ = String -> String
forall a. HasCallStack => String -> a
error String
"id_lit: downcast, or token without lexeme"
alt_id_lit :: SubsumesToken t => SymbExpr t String
alt_id_lit :: forall t. SubsumesToken t => SymbExpr t String
alt_id_lit = t -> (t -> String) -> SymbExpr t String
forall t a. t -> (t -> a) -> SymbExpr t a
term_parser (Token -> t
forall a. SubsumesToken a => Token -> a
upcast (Maybe String -> Token
AltIDLit Maybe String
forall a. Maybe a
Nothing)) (Maybe Token -> String
unwrap (Maybe Token -> String) -> (t -> Maybe Token) -> t -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. t -> Maybe Token
forall a. SubsumesToken a => a -> Maybe Token
downcast)
where unwrap :: Maybe Token -> String
unwrap (Just (AltIDLit (Just String
i))) = String
i
unwrap Maybe Token
_ = String -> String
forall a. HasCallStack => String -> a
error String
"alt_id_lit: downcast, or token without lexeme"
token :: SubsumesToken t => String -> SymbExpr t String
token :: forall t. SubsumesToken t => String -> SymbExpr t String
token String
name = t -> (t -> String) -> SymbExpr t String
forall t a. t -> (t -> a) -> SymbExpr t a
term_parser (Token -> t
forall a. SubsumesToken a => Token -> a
upcast (String -> Maybe String -> Token
Token String
name Maybe String
forall a. Maybe a
Nothing)) (Maybe Token -> String
unwrap (Maybe Token -> String) -> (t -> Maybe Token) -> t -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. t -> Maybe Token
forall a. SubsumesToken a => a -> Maybe Token
downcast)
where unwrap :: Maybe Token -> String
unwrap (Just (Token String
name' (Just String
i))) | String
name String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
name' = String
i
unwrap Maybe Token
_ = String -> String
forall a. HasCallStack => String -> a
error String
"tokenT: downcast, or token without lexeme"
epsilon :: (Show t, Ord t) => AltExpr t ()
epsilon :: forall t. (Show t, Ord t) => AltExpr t ()
epsilon = ([Symbol t], Grammar_Expr t, Sem_Alt t ()) -> AltExpr t ()
forall t a.
([Symbol t], Grammar_Expr t, Sem_Alt t a) -> AltExpr t a
AltExpr ([], Nt -> [Prod t] -> Grammar_Expr t
forall k a. Ord k => k -> a -> Map k a -> Map k a
M.insert (String -> Nt
pack String
x) [Nt -> [Symbol t] -> Prod t
forall t. Nt -> Symbols t -> Prod t
Prod (String -> Nt
pack String
x) []],\PCOptions
_ (Prod t, Int)
_ Ancestors Any
_ SPPF t
_ Array Int t
_ Int
l Int
r ->
if Int
l Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== Int
r then [(Int, ())] -> IO [(Int, ())]
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return [(Int
l,())] else [(Int, ())] -> IO [(Int, ())]
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return [] )
where x :: String
x = String
"__eps"
satisfy :: (Show t, Ord t ) => a -> AltExpr t a
satisfy :: forall t a. (Show t, Ord t) => a -> AltExpr t a
satisfy a
a = a
a a -> AltExpr t () -> AltExpr t a
forall t (s :: * -> * -> *) b a.
(Show t, Ord t, IsSymbExpr s) =>
b -> s t a -> AltExpr t b
<$$ AltExpr t ()
forall t. (Show t, Ord t) => AltExpr t ()
epsilon
memo :: (Ord t, Show t, IsSymbExpr s) => MemoRef [a] -> s t a -> SymbExpr t a
memo :: forall t (s :: * -> * -> *) a.
(Ord t, Show t, IsSymbExpr s) =>
MemoRef [a] -> s t a -> SymbExpr t a
memo MemoRef [a]
ref s t a
p' = let SymbExpr (Symbol t
sym,Grammar_Expr t
rules,Sem_Symb t a
sem) = s t a -> SymbExpr t a
forall t b. (Show t, Ord t) => s t b -> SymbExpr t b
forall (a :: * -> * -> *) t b.
(IsSymbExpr a, Show t, Ord t) =>
a t b -> SymbExpr t b
toSymb s t a
p'
lhs_sem :: Sem_Symb t a
lhs_sem PCOptions
opts Ancestors Any
ctx SPPF t
sppf Array Int t
arr Int
l Int
r
| Bool -> Bool
not (PCOptions -> Bool
do_memo PCOptions
opts) = Sem_Symb t a
sem PCOptions
opts Ancestors Any
ctx SPPF t
sppf Array Int t
arr Int
l Int
r
| Bool
otherwise = do
MemoTable [a]
tab <- MemoRef [a] -> IO (MemoTable [a])
forall a. IORef a -> IO a
readIORef MemoRef [a]
ref
case (Int, Int) -> MemoTable [a] -> Maybe [a]
forall a. (Int, Int) -> MemoTable a -> Maybe a
memLookup (Int
l,Int
r) MemoTable [a]
tab of
Just [a]
as -> [a] -> IO [a]
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return [a]
as
Maybe [a]
Nothing -> do [a]
as <- Sem_Symb t a
sem PCOptions
opts Ancestors Any
ctx SPPF t
sppf Array Int t
arr Int
l Int
r
MemoRef [a] -> (MemoTable [a] -> MemoTable [a]) -> IO ()
forall a. IORef a -> (a -> a) -> IO ()
modifyIORef MemoRef [a]
ref ((Int, Int) -> [a] -> MemoTable [a] -> MemoTable [a]
forall a. (Int, Int) -> a -> MemoTable a -> MemoTable a
memInsert (Int
l,Int
r) [a]
as)
[a] -> IO [a]
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return [a]
as
in (Symbol t, Grammar_Expr t, Sem_Symb t a) -> SymbExpr t a
forall t a.
(Symbol t, Grammar_Expr t, Sem_Symb t a) -> SymbExpr t a
SymbExpr (Symbol t
sym, Grammar_Expr t
rules, Sem_Symb t a
lhs_sem)
mkNt :: (Show t, Ord t, IsSymbExpr s) => s t a -> String -> String
mkNt :: forall t (s :: * -> * -> *) a.
(Show t, Ord t, IsSymbExpr s) =>
s t a -> String -> String
mkNt s t a
p String
str = let SymbExpr (Symbol t
myx,Grammar_Expr t
_,Sem_Symb t a
_) = s t a -> SymbExpr t a
forall t b. (Show t, Ord t) => s t b -> SymbExpr t b
forall (a :: * -> * -> *) t b.
(IsSymbExpr a, Show t, Ord t) =>
a t b -> SymbExpr t b
mkRule s t a
p
in String
"_(" String -> String -> String
forall a. [a] -> [a] -> [a]
++ Symbol t -> String
forall a. Show a => a -> String
show Symbol t
myx String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
")" String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
str
(.$.) :: (Show t, Ord t, IsAltExpr i) => (a -> b) -> i t a -> AltExpr t b
a -> b
f .$. :: forall t (i :: * -> * -> *) a b.
(Show t, Ord t, IsAltExpr i) =>
(a -> b) -> i t a -> AltExpr t b
.$. i t a
i = let AltExpr ([Symbol t]
s,Grammar_Expr t
r,Sem_Alt t a
sem) = i t a -> AltExpr t a
forall t b. (Show t, Ord t) => i t b -> AltExpr t b
forall (a :: * -> * -> *) t b.
(IsAltExpr a, Show t, Ord t) =>
a t b -> AltExpr t b
toAlt i t a
i
in ([Symbol t], Grammar_Expr t, Sem_Alt t b) -> AltExpr t b
forall t a.
([Symbol t], Grammar_Expr t, Sem_Alt t a) -> AltExpr t a
AltExpr ([Symbol t]
s,Grammar_Expr t
r,\PCOptions
opts (Prod t, Int)
slot Ancestors Any
ctx SPPF t
sppf Array Int t
arr Int
l Int
r ->
do [(Int, a)]
as <- Sem_Alt t a
sem PCOptions
opts (Prod t, Int)
slot Ancestors Any
ctx SPPF t
sppf Array Int t
arr Int
l Int
r
[(Int, b)] -> IO [(Int, b)]
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return ([(Int, b)] -> IO [(Int, b)]) -> [(Int, b)] -> IO [(Int, b)]
forall a b. (a -> b) -> a -> b
$ ((Int, a) -> (Int, b)) -> [(Int, a)] -> [(Int, b)]
forall a b. (a -> b) -> [a] -> [b]
map (Int -> Int
forall a. a -> a
id (Int -> Int) -> (a -> b) -> (Int, a) -> (Int, b)
forall b c b' c'. (b -> c) -> (b' -> c') -> (b, b') -> (c, c')
forall (a :: * -> * -> *) b c b' c'.
Arrow a =>
a b c -> a b' c' -> a (b, b') (c, c')
*** a -> b
f) [(Int, a)]
as )
(<$$) :: (Show t, Ord t, IsSymbExpr s) => b -> s t a -> AltExpr t b
b
f <$$ :: forall t (s :: * -> * -> *) b a.
(Show t, Ord t, IsSymbExpr s) =>
b -> s t a -> AltExpr t b
<$$ s t a
p = b -> a -> b
forall a b. a -> b -> a
const b
f (a -> b) -> s t a -> AltExpr t b
forall t (s :: * -> * -> *) a b.
(Show t, Ord t, IsSymbExpr s) =>
(a -> b) -> s t a -> AltExpr t b
<$$> s t a
p
infixl 4 <$$
infixl 4 **>, <<**>, **>>>
(**>) :: (Show t, Ord t, IsAltExpr i, IsSymbExpr s) => i t a -> s t b -> AltExpr t b
i t a
l **> :: forall t (i :: * -> * -> *) (s :: * -> * -> *) a b.
(Show t, Ord t, IsAltExpr i, IsSymbExpr s) =>
i t a -> s t b -> AltExpr t b
**> s t b
r = (b -> a -> b) -> a -> b -> b
forall a b c. (a -> b -> c) -> b -> a -> c
flip b -> a -> b
forall a b. a -> b -> a
const (a -> b -> b) -> i t a -> AltExpr t (b -> b)
forall t (i :: * -> * -> *) a b.
(Show t, Ord t, IsAltExpr i) =>
(a -> b) -> i t a -> AltExpr t b
.$. i t a
l AltExpr t (b -> b) -> s t b -> AltExpr t b
forall t (i :: * -> * -> *) (s :: * -> * -> *) a b.
(Show t, Ord t, IsAltExpr i, IsSymbExpr s) =>
i t (a -> b) -> s t a -> AltExpr t b
<**> s t b
r
(**>>>) :: (Show t, Ord t, IsAltExpr i, IsSymbExpr s) => i t a -> s t b -> AltExpr t b
i t a
l **>>> :: forall t (i :: * -> * -> *) (s :: * -> * -> *) a b.
(Show t, Ord t, IsAltExpr i, IsSymbExpr s) =>
i t a -> s t b -> AltExpr t b
**>>> s t b
r = (b -> a -> b) -> a -> b -> b
forall a b c. (a -> b -> c) -> b -> a -> c
flip b -> a -> b
forall a b. a -> b -> a
const (a -> b -> b) -> i t a -> AltExpr t (b -> b)
forall t (i :: * -> * -> *) a b.
(Show t, Ord t, IsAltExpr i) =>
(a -> b) -> i t a -> AltExpr t b
.$. i t a
l AltExpr t (b -> b) -> s t b -> AltExpr t b
forall t (i :: * -> * -> *) (s :: * -> * -> *) a b.
(Show t, Ord t, IsAltExpr i, IsSymbExpr s) =>
i t (a -> b) -> s t a -> AltExpr t b
<**>>> s t b
r
(<<**>) :: (Show t, Ord t, IsAltExpr i, IsSymbExpr s) => i t a -> s t b -> AltExpr t b
i t a
l <<**> :: forall t (i :: * -> * -> *) (s :: * -> * -> *) a b.
(Show t, Ord t, IsAltExpr i, IsSymbExpr s) =>
i t a -> s t b -> AltExpr t b
<<**>s t b
r = (b -> a -> b) -> a -> b -> b
forall a b c. (a -> b -> c) -> b -> a -> c
flip b -> a -> b
forall a b. a -> b -> a
const (a -> b -> b) -> i t a -> AltExpr t (b -> b)
forall t (i :: * -> * -> *) a b.
(Show t, Ord t, IsAltExpr i) =>
(a -> b) -> i t a -> AltExpr t b
.$. i t a
l AltExpr t (b -> b) -> s t b -> AltExpr t b
forall t (i :: * -> * -> *) (s :: * -> * -> *) a b.
(Show t, Ord t, IsAltExpr i, IsSymbExpr s) =>
i t (a -> b) -> s t a -> AltExpr t b
<<<**> s t b
r
infixl 4 <**, <<<**, <**>>
(<**) :: (Show t, Ord t, IsAltExpr i, IsSymbExpr s) => i t a -> s t b -> AltExpr t a
i t a
l <** :: forall t (i :: * -> * -> *) (s :: * -> * -> *) a b.
(Show t, Ord t, IsAltExpr i, IsSymbExpr s) =>
i t a -> s t b -> AltExpr t a
<** s t b
r = a -> b -> a
forall a b. a -> b -> a
const (a -> b -> a) -> i t a -> AltExpr t (b -> a)
forall t (i :: * -> * -> *) a b.
(Show t, Ord t, IsAltExpr i) =>
(a -> b) -> i t a -> AltExpr t b
.$. i t a
l AltExpr t (b -> a) -> s t b -> AltExpr t a
forall t (i :: * -> * -> *) (s :: * -> * -> *) a b.
(Show t, Ord t, IsAltExpr i, IsSymbExpr s) =>
i t (a -> b) -> s t a -> AltExpr t b
<**> s t b
r
(<**>>) :: (Show t, Ord t, IsAltExpr i, IsSymbExpr s) => i t a -> s t b -> AltExpr t a
i t a
l <**>> :: forall t (i :: * -> * -> *) (s :: * -> * -> *) a b.
(Show t, Ord t, IsAltExpr i, IsSymbExpr s) =>
i t a -> s t b -> AltExpr t a
<**>> s t b
r = a -> b -> a
forall a b. a -> b -> a
const (a -> b -> a) -> i t a -> AltExpr t (b -> a)
forall t (i :: * -> * -> *) a b.
(Show t, Ord t, IsAltExpr i) =>
(a -> b) -> i t a -> AltExpr t b
.$. i t a
l AltExpr t (b -> a) -> s t b -> AltExpr t a
forall t (i :: * -> * -> *) (s :: * -> * -> *) a b.
(Show t, Ord t, IsAltExpr i, IsSymbExpr s) =>
i t (a -> b) -> s t a -> AltExpr t b
<**>>> s t b
r
(<<<**) :: (Show t, Ord t, IsAltExpr i, IsSymbExpr s) => i t a -> s t b -> AltExpr t a
i t a
l <<<** :: forall t (i :: * -> * -> *) (s :: * -> * -> *) a b.
(Show t, Ord t, IsAltExpr i, IsSymbExpr s) =>
i t a -> s t b -> AltExpr t a
<<<** s t b
r = a -> b -> a
forall a b. a -> b -> a
const (a -> b -> a) -> i t a -> AltExpr t (b -> a)
forall t (i :: * -> * -> *) a b.
(Show t, Ord t, IsAltExpr i) =>
(a -> b) -> i t a -> AltExpr t b
.$. i t a
l AltExpr t (b -> a) -> s t b -> AltExpr t a
forall t (i :: * -> * -> *) (s :: * -> * -> *) a b.
(Show t, Ord t, IsAltExpr i, IsSymbExpr s) =>
i t (a -> b) -> s t a -> AltExpr t b
<<<**> s t b
r
String
x <::= :: String -> b t a -> SymbExpr t a
<::= b t a
altPs = Bool -> Bool -> String -> b t a -> SymbExpr t a
forall t (b :: * -> * -> *) a.
(Show t, Ord t, HasAlts b) =>
Bool -> Bool -> String -> b t a -> SymbExpr t a
mkNtRule Bool
True Bool
True String
x b t a
altPs
infixl 2 <::=
String
x <:= :: String -> b t a -> SymbExpr t a
<:= b t a
altPs = Bool -> Bool -> String -> b t a -> SymbExpr t a
forall t (b :: * -> * -> *) a.
(Show t, Ord t, HasAlts b) =>
Bool -> Bool -> String -> b t a -> SymbExpr t a
mkNtRule Bool
False Bool
True String
x b t a
altPs
infixl 2 <:=
many :: (Show t, Ord t, IsSymbExpr s) => s t a -> SymbExpr t [a]
many :: forall t (s :: * -> * -> *) a.
(Show t, Ord t, IsSymbExpr s) =>
s t a -> SymbExpr t [a]
many = (AltExpr t ([a] -> [a]) -> SymbExpr t [a] -> AltExpr t [a])
-> s t a -> SymbExpr t [a]
forall {i :: * -> * -> *} {t} {t} {s :: * -> * -> *} {a} {a}.
(IsAltExpr i, Show t, Show t, Ord t, Ord t, IsSymbExpr s) =>
(AltExpr t ([a] -> [a]) -> SymbExpr t [a] -> i t [a])
-> s t a -> SymbExpr t [a]
multiple_ AltExpr t ([a] -> [a]) -> SymbExpr t [a] -> AltExpr t [a]
forall t (i :: * -> * -> *) (s :: * -> * -> *) a b.
(Show t, Ord t, IsAltExpr i, IsSymbExpr s) =>
i t (a -> b) -> s t a -> AltExpr t b
(<<<**>)
many1 :: (Show t, Ord t, IsSymbExpr s) => s t a -> SymbExpr t [a]
many1 :: forall t (s :: * -> * -> *) a.
(Show t, Ord t, IsSymbExpr s) =>
s t a -> SymbExpr t [a]
many1 = (AltExpr t ([a] -> [a]) -> SymbExpr t [a] -> AltExpr t [a])
-> s t a -> SymbExpr t [a]
forall {i :: * -> * -> *} {t} {t} {s :: * -> * -> *} {a} {a}.
(HasAlts i, IsAltExpr i, Show t, Show t, Ord t, Ord t,
IsSymbExpr s) =>
(AltExpr t ([a] -> [a]) -> SymbExpr t [a] -> i t [a])
-> s t a -> SymbExpr t [a]
multiple1_ AltExpr t ([a] -> [a]) -> SymbExpr t [a] -> AltExpr t [a]
forall t (i :: * -> * -> *) (s :: * -> * -> *) a b.
(Show t, Ord t, IsAltExpr i, IsSymbExpr s) =>
i t (a -> b) -> s t a -> AltExpr t b
(<<<**>)
some :: (Show t, Ord t, IsSymbExpr s) => s t a -> SymbExpr t [a]
some :: forall t (s :: * -> * -> *) a.
(Show t, Ord t, IsSymbExpr s) =>
s t a -> SymbExpr t [a]
some = (AltExpr t ([a] -> [a]) -> SymbExpr t [a] -> AltExpr t [a])
-> s t a -> SymbExpr t [a]
forall {i :: * -> * -> *} {t} {t} {s :: * -> * -> *} {a} {a}.
(IsAltExpr i, Show t, Show t, Ord t, Ord t, IsSymbExpr s) =>
(AltExpr t ([a] -> [a]) -> SymbExpr t [a] -> i t [a])
-> s t a -> SymbExpr t [a]
multiple_ AltExpr t ([a] -> [a]) -> SymbExpr t [a] -> AltExpr t [a]
forall t (i :: * -> * -> *) (s :: * -> * -> *) a b.
(Show t, Ord t, IsAltExpr i, IsSymbExpr s) =>
i t (a -> b) -> s t a -> AltExpr t b
(<**>>>)
some1 :: (Show t, Ord t, IsSymbExpr s) => s t a -> SymbExpr t [a]
some1 :: forall t (s :: * -> * -> *) a.
(Show t, Ord t, IsSymbExpr s) =>
s t a -> SymbExpr t [a]
some1 = (AltExpr t ([a] -> [a]) -> SymbExpr t [a] -> AltExpr t [a])
-> s t a -> SymbExpr t [a]
forall {i :: * -> * -> *} {t} {t} {s :: * -> * -> *} {a} {a}.
(HasAlts i, IsAltExpr i, Show t, Show t, Ord t, Ord t,
IsSymbExpr s) =>
(AltExpr t ([a] -> [a]) -> SymbExpr t [a] -> i t [a])
-> s t a -> SymbExpr t [a]
multiple1_ AltExpr t ([a] -> [a]) -> SymbExpr t [a] -> AltExpr t [a]
forall t (i :: * -> * -> *) (s :: * -> * -> *) a b.
(Show t, Ord t, IsAltExpr i, IsSymbExpr s) =>
i t (a -> b) -> s t a -> AltExpr t b
(<**>>>)
multiple :: (Show t, Ord t, IsSymbExpr s) => s t a -> SymbExpr t [a]
multiple :: forall t (s :: * -> * -> *) a.
(Show t, Ord t, IsSymbExpr s) =>
s t a -> SymbExpr t [a]
multiple = (AltExpr t ([a] -> [a]) -> SymbExpr t [a] -> AltExpr t [a])
-> s t a -> SymbExpr t [a]
forall {i :: * -> * -> *} {t} {t} {s :: * -> * -> *} {a} {a}.
(IsAltExpr i, Show t, Show t, Ord t, Ord t, IsSymbExpr s) =>
(AltExpr t ([a] -> [a]) -> SymbExpr t [a] -> i t [a])
-> s t a -> SymbExpr t [a]
multiple_ AltExpr t ([a] -> [a]) -> SymbExpr t [a] -> AltExpr t [a]
forall t (i :: * -> * -> *) (s :: * -> * -> *) a b.
(Show t, Ord t, IsAltExpr i, IsSymbExpr s) =>
i t (a -> b) -> s t a -> AltExpr t b
(<**>)
multiple1 :: (Show t, Ord t, IsSymbExpr s) => s t a -> SymbExpr t [a]
multiple1 :: forall t (s :: * -> * -> *) a.
(Show t, Ord t, IsSymbExpr s) =>
s t a -> SymbExpr t [a]
multiple1 = (AltExpr t ([a] -> [a]) -> SymbExpr t [a] -> AltExpr t [a])
-> s t a -> SymbExpr t [a]
forall {i :: * -> * -> *} {t} {t} {s :: * -> * -> *} {a} {a}.
(HasAlts i, IsAltExpr i, Show t, Show t, Ord t, Ord t,
IsSymbExpr s) =>
(AltExpr t ([a] -> [a]) -> SymbExpr t [a] -> i t [a])
-> s t a -> SymbExpr t [a]
multiple1_ AltExpr t ([a] -> [a]) -> SymbExpr t [a] -> AltExpr t [a]
forall t (i :: * -> * -> *) (s :: * -> * -> *) a b.
(Show t, Ord t, IsAltExpr i, IsSymbExpr s) =>
i t (a -> b) -> s t a -> AltExpr t b
(<**>)
multiple_ :: (AltExpr t ([a] -> [a]) -> SymbExpr t [a] -> i t [a])
-> s t a -> SymbExpr t [a]
multiple_ AltExpr t ([a] -> [a]) -> SymbExpr t [a] -> i t [a]
disa s t a
p = let fresh :: String
fresh = s t a -> String -> String
forall t (s :: * -> * -> *) a.
(Show t, Ord t, IsSymbExpr s) =>
s t a -> String -> String
mkNt s t a
p String
"*"
in String
fresh String -> OO [] AltExpr t [a] -> SymbExpr t [a]
forall t (b :: * -> * -> *) a.
(Show t, Ord t, HasAlts b) =>
String -> b t a -> SymbExpr t a
<::=> ((:) (a -> [a] -> [a]) -> s t a -> AltExpr t ([a] -> [a])
forall t (s :: * -> * -> *) a b.
(Show t, Ord t, IsSymbExpr s) =>
(a -> b) -> s t a -> AltExpr t b
<$$> s t a
p) AltExpr t ([a] -> [a]) -> SymbExpr t [a] -> i t [a]
`disa` ((AltExpr t ([a] -> [a]) -> SymbExpr t [a] -> i t [a])
-> s t a -> SymbExpr t [a]
multiple_ AltExpr t ([a] -> [a]) -> SymbExpr t [a] -> i t [a]
disa s t a
p) i t [a] -> AltExpr t [a] -> OO [] AltExpr t [a]
forall t (i :: * -> * -> *) (b :: * -> * -> *) a.
(Show t, Ord t, IsAltExpr i, HasAlts b) =>
i t a -> b t a -> AltExprs t a
<||> [a] -> AltExpr t [a]
forall t a. (Show t, Ord t) => a -> AltExpr t a
satisfy []
multiple1_ :: (AltExpr t ([a] -> [a]) -> SymbExpr t [a] -> i t [a])
-> s t a -> SymbExpr t [a]
multiple1_ AltExpr t ([a] -> [a]) -> SymbExpr t [a] -> i t [a]
disa s t a
p = let fresh :: String
fresh = s t a -> String -> String
forall t (s :: * -> * -> *) a.
(Show t, Ord t, IsSymbExpr s) =>
s t a -> String -> String
mkNt s t a
p String
"+"
in String
fresh String -> i t [a] -> SymbExpr t [a]
forall t (b :: * -> * -> *) a.
(Show t, Ord t, HasAlts b) =>
String -> b t a -> SymbExpr t a
<::=> ((:) (a -> [a] -> [a]) -> s t a -> AltExpr t ([a] -> [a])
forall t (s :: * -> * -> *) a b.
(Show t, Ord t, IsSymbExpr s) =>
(a -> b) -> s t a -> AltExpr t b
<$$> s t a
p) AltExpr t ([a] -> [a]) -> SymbExpr t [a] -> i t [a]
`disa` ((AltExpr t ([a] -> [a]) -> SymbExpr t [a] -> i t [a])
-> s t a -> SymbExpr t [a]
forall {i :: * -> * -> *} {t} {t} {s :: * -> * -> *} {a} {a}.
(IsAltExpr i, Show t, Show t, Ord t, Ord t, IsSymbExpr s) =>
(AltExpr t ([a] -> [a]) -> SymbExpr t [a] -> i t [a])
-> s t a -> SymbExpr t [a]
multiple_ AltExpr t ([a] -> [a]) -> SymbExpr t [a] -> i t [a]
disa s t a
p)
manySepBy :: (Show t, Ord t, IsSymbExpr s, IsSymbExpr s2, IsAltExpr s2) =>
s t a -> s2 t b -> SymbExpr t [a]
manySepBy :: 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]
manySepBy = (AltExpr t a -> SymbExpr t [a])
-> s t a -> s2 t b -> SymbExpr t [a]
forall t (s1 :: * -> * -> *) (s2 :: * -> * -> *) a b.
(Show t, Ord t, IsSymbExpr s1, IsSymbExpr s2, IsAltExpr s2) =>
(AltExpr t a -> SymbExpr t [a])
-> s1 t a -> s2 t b -> SymbExpr t [a]
sepBy AltExpr t a -> SymbExpr t [a]
forall t (s :: * -> * -> *) a.
(Show t, Ord t, IsSymbExpr s) =>
s t a -> SymbExpr t [a]
many
manySepBy1 :: (Show t, Ord t, IsSymbExpr s, IsSymbExpr s2, IsAltExpr s2) =>
s t a -> s2 t b -> SymbExpr t [a]
manySepBy1 :: 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]
manySepBy1 = (AltExpr t a -> SymbExpr t [a])
-> s t a -> s2 t b -> SymbExpr t [a]
forall t (s1 :: * -> * -> *) (s2 :: * -> * -> *) a b.
(Show t, Ord t, IsSymbExpr s1, IsSymbExpr s2, IsAltExpr s2) =>
(AltExpr t a -> SymbExpr t [a])
-> s1 t a -> s2 t b -> SymbExpr t [a]
sepBy1 AltExpr t a -> SymbExpr t [a]
forall t (s :: * -> * -> *) a.
(Show t, Ord t, IsSymbExpr s) =>
s t a -> SymbExpr t [a]
many
someSepBy :: (Show t, Ord t, IsSymbExpr s, IsSymbExpr s2, IsAltExpr s2) =>
s t a -> s2 t b -> SymbExpr t [a]
someSepBy :: 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]
someSepBy = (AltExpr t a -> SymbExpr t [a])
-> s t a -> s2 t b -> SymbExpr t [a]
forall t (s1 :: * -> * -> *) (s2 :: * -> * -> *) a b.
(Show t, Ord t, IsSymbExpr s1, IsSymbExpr s2, IsAltExpr s2) =>
(AltExpr t a -> SymbExpr t [a])
-> s1 t a -> s2 t b -> SymbExpr t [a]
sepBy AltExpr t a -> SymbExpr t [a]
forall t (s :: * -> * -> *) a.
(Show t, Ord t, IsSymbExpr s) =>
s t a -> SymbExpr t [a]
some
someSepBy1 :: (Show t, Ord t, IsSymbExpr s, IsSymbExpr s2, IsAltExpr s2) =>
s t a -> s2 t b -> SymbExpr t [a]
someSepBy1 :: 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]
someSepBy1 = (AltExpr t a -> SymbExpr t [a])
-> s t a -> s2 t b -> SymbExpr t [a]
forall t (s1 :: * -> * -> *) (s2 :: * -> * -> *) a b.
(Show t, Ord t, IsSymbExpr s1, IsSymbExpr s2, IsAltExpr s2) =>
(AltExpr t a -> SymbExpr t [a])
-> s1 t a -> s2 t b -> SymbExpr t [a]
sepBy1 AltExpr t a -> SymbExpr t [a]
forall t (s :: * -> * -> *) a.
(Show t, Ord t, IsSymbExpr s) =>
s t a -> SymbExpr t [a]
some
multipleSepBy :: (Show t, Ord t, IsSymbExpr s, IsSymbExpr s2, IsAltExpr s2) =>
s t a -> s2 t b -> SymbExpr t [a]
multipleSepBy :: 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 = (AltExpr t a -> SymbExpr t [a])
-> s t a -> s2 t b -> SymbExpr t [a]
forall t (s1 :: * -> * -> *) (s2 :: * -> * -> *) a b.
(Show t, Ord t, IsSymbExpr s1, IsSymbExpr s2, IsAltExpr s2) =>
(AltExpr t a -> SymbExpr t [a])
-> s1 t a -> s2 t b -> SymbExpr t [a]
sepBy AltExpr t a -> SymbExpr t [a]
forall t (s :: * -> * -> *) a.
(Show t, Ord t, IsSymbExpr s) =>
s t a -> SymbExpr t [a]
multiple
multipleSepBy1 :: (Show t, Ord t, IsSymbExpr s, IsSymbExpr s2, IsAltExpr s2) =>
s t a -> s2 t b -> SymbExpr t [a]
multipleSepBy1 :: 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]
multipleSepBy1 = (AltExpr t a -> SymbExpr t [a])
-> s t a -> s2 t b -> SymbExpr t [a]
forall t (s1 :: * -> * -> *) (s2 :: * -> * -> *) a b.
(Show t, Ord t, IsSymbExpr s1, IsSymbExpr s2, IsAltExpr s2) =>
(AltExpr t a -> SymbExpr t [a])
-> s1 t a -> s2 t b -> SymbExpr t [a]
sepBy1 AltExpr t a -> SymbExpr t [a]
forall t (s :: * -> * -> *) a.
(Show t, Ord t, IsSymbExpr s) =>
s t a -> SymbExpr t [a]
multiple
sepBy :: (Show t, Ord t, IsSymbExpr s1, IsSymbExpr s2, IsAltExpr s2) =>
(AltExpr t a -> SymbExpr t [a]) -> s1 t a -> s2 t b -> SymbExpr t [a]
sepBy :: forall t (s1 :: * -> * -> *) (s2 :: * -> * -> *) a b.
(Show t, Ord t, IsSymbExpr s1, IsSymbExpr s2, IsAltExpr s2) =>
(AltExpr t a -> SymbExpr t [a])
-> s1 t a -> s2 t b -> SymbExpr t [a]
sepBy AltExpr t a -> SymbExpr t [a]
mult s1 t a
p s2 t b
c = OO [] AltExpr t [a] -> SymbExpr t [a]
forall t b. (Show t, Ord t) => OO [] AltExpr t b -> SymbExpr t b
forall (a :: * -> * -> *) t b.
(IsSymbExpr a, Show t, Ord t) =>
a t b -> SymbExpr t b
mkRule (OO [] AltExpr t [a] -> SymbExpr t [a])
-> OO [] AltExpr t [a] -> SymbExpr t [a]
forall a b. (a -> b) -> a -> b
$ [a] -> AltExpr t [a]
forall t a. (Show t, Ord t) => a -> AltExpr t a
satisfy [] AltExpr t [a] -> AltExpr t [a] -> OO [] AltExpr t [a]
forall t (i :: * -> * -> *) (b :: * -> * -> *) a.
(Show t, Ord t, IsAltExpr i, HasAlts b) =>
i t a -> b t a -> AltExprs t a
<||> (:) (a -> [a] -> [a]) -> s1 t a -> AltExpr t ([a] -> [a])
forall t (s :: * -> * -> *) a b.
(Show t, Ord t, IsSymbExpr s) =>
(a -> b) -> s t a -> AltExpr t b
<$$> s1 t a
p AltExpr t ([a] -> [a]) -> SymbExpr t [a] -> AltExpr t [a]
forall t (i :: * -> * -> *) (s :: * -> * -> *) a b.
(Show t, Ord t, IsAltExpr i, IsSymbExpr s) =>
i t (a -> b) -> s t a -> AltExpr t b
<**> AltExpr t a -> SymbExpr t [a]
mult (s2 t b
c s2 t b -> s1 t a -> AltExpr t a
forall t (i :: * -> * -> *) (s :: * -> * -> *) a b.
(Show t, Ord t, IsAltExpr i, IsSymbExpr s) =>
i t a -> s t b -> AltExpr t b
**> s1 t a
p)
sepBy1 :: (Show t, Ord t, IsSymbExpr s1, IsSymbExpr s2, IsAltExpr s2) =>
(AltExpr t a -> SymbExpr t [a]) -> s1 t a -> s2 t b -> SymbExpr t [a]
sepBy1 :: forall t (s1 :: * -> * -> *) (s2 :: * -> * -> *) a b.
(Show t, Ord t, IsSymbExpr s1, IsSymbExpr s2, IsAltExpr s2) =>
(AltExpr t a -> SymbExpr t [a])
-> s1 t a -> s2 t b -> SymbExpr t [a]
sepBy1 AltExpr t a -> SymbExpr t [a]
mult s1 t a
p s2 t b
c = AltExpr t [a] -> SymbExpr t [a]
forall t b. (Show t, Ord t) => AltExpr t b -> SymbExpr t b
forall (a :: * -> * -> *) t b.
(IsSymbExpr a, Show t, Ord t) =>
a t b -> SymbExpr t b
mkRule (AltExpr t [a] -> SymbExpr t [a])
-> AltExpr t [a] -> SymbExpr t [a]
forall a b. (a -> b) -> a -> b
$ (:) (a -> [a] -> [a]) -> s1 t a -> AltExpr t ([a] -> [a])
forall t (s :: * -> * -> *) a b.
(Show t, Ord t, IsSymbExpr s) =>
(a -> b) -> s t a -> AltExpr t b
<$$> s1 t a
p AltExpr t ([a] -> [a]) -> SymbExpr t [a] -> AltExpr t [a]
forall t (i :: * -> * -> *) (s :: * -> * -> *) a b.
(Show t, Ord t, IsAltExpr i, IsSymbExpr s) =>
i t (a -> b) -> s t a -> AltExpr t b
<**> AltExpr t a -> SymbExpr t [a]
mult (s2 t b
c s2 t b -> s1 t a -> AltExpr t a
forall t (i :: * -> * -> *) (s :: * -> * -> *) a b.
(Show t, Ord t, IsAltExpr i, IsSymbExpr s) =>
i t a -> s t b -> AltExpr t b
**> s1 t a
p)
multipleSepBy2 :: s t a -> s2 t b -> BNF t [a]
multipleSepBy2 s t a
p s2 t b
s = AltExpr t [a] -> BNF t [a]
forall t b. (Show t, Ord t) => AltExpr t b -> SymbExpr t b
forall (a :: * -> * -> *) t b.
(IsSymbExpr a, Show t, Ord t) =>
a t b -> SymbExpr t b
mkRule (AltExpr t [a] -> BNF t [a]) -> AltExpr t [a] -> BNF t [a]
forall a b. (a -> b) -> a -> b
$
(:) (a -> [a] -> [a]) -> s t a -> AltExpr t ([a] -> [a])
forall t (s :: * -> * -> *) a b.
(Show t, Ord t, IsSymbExpr s) =>
(a -> b) -> s t a -> AltExpr t b
<$$> s t a
p AltExpr t ([a] -> [a]) -> s2 t b -> AltExpr t ([a] -> [a])
forall t (i :: * -> * -> *) (s :: * -> * -> *) a b.
(Show t, Ord t, IsAltExpr i, IsSymbExpr s) =>
i t a -> s t b -> AltExpr t a
<** s2 t b
s AltExpr t ([a] -> [a]) -> BNF t [a] -> AltExpr t [a]
forall t (i :: * -> * -> *) (s :: * -> * -> *) a b.
(Show t, Ord t, IsAltExpr i, IsSymbExpr s) =>
i t (a -> b) -> s t a -> AltExpr t b
<**> s t a -> s2 t b -> BNF t [a]
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]
multipleSepBy1 s t a
p s2 t b
s
someSepBy2 :: s t a -> s2 t b -> BNF t [a]
someSepBy2 s t a
p s2 t b
s = AltExpr t [a] -> BNF t [a]
forall t b. (Show t, Ord t) => AltExpr t b -> SymbExpr t b
forall (a :: * -> * -> *) t b.
(IsSymbExpr a, Show t, Ord t) =>
a t b -> SymbExpr t b
mkRule (AltExpr t [a] -> BNF t [a]) -> AltExpr t [a] -> BNF t [a]
forall a b. (a -> b) -> a -> b
$
(:) (a -> [a] -> [a]) -> s t a -> AltExpr t ([a] -> [a])
forall t (s :: * -> * -> *) a b.
(Show t, Ord t, IsSymbExpr s) =>
(a -> b) -> s t a -> AltExpr t b
<$$> s t a
p AltExpr t ([a] -> [a]) -> s2 t b -> AltExpr t ([a] -> [a])
forall t (i :: * -> * -> *) (s :: * -> * -> *) a b.
(Show t, Ord t, IsAltExpr i, IsSymbExpr s) =>
i t a -> s t b -> AltExpr t a
<** s2 t b
s AltExpr t ([a] -> [a]) -> BNF t [a] -> AltExpr t [a]
forall t (i :: * -> * -> *) (s :: * -> * -> *) a b.
(Show t, Ord t, IsAltExpr i, IsSymbExpr s) =>
i t (a -> b) -> s t a -> AltExpr t b
<**> s t a -> s2 t b -> BNF t [a]
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]
someSepBy1 s t a
p s2 t b
s
manySepBy2 :: s t a -> s2 t b -> BNF t [a]
manySepBy2 s t a
p s2 t b
s = AltExpr t [a] -> BNF t [a]
forall t b. (Show t, Ord t) => AltExpr t b -> SymbExpr t b
forall (a :: * -> * -> *) t b.
(IsSymbExpr a, Show t, Ord t) =>
a t b -> SymbExpr t b
mkRule (AltExpr t [a] -> BNF t [a]) -> AltExpr t [a] -> BNF t [a]
forall a b. (a -> b) -> a -> b
$
(:) (a -> [a] -> [a]) -> s t a -> AltExpr t ([a] -> [a])
forall t (s :: * -> * -> *) a b.
(Show t, Ord t, IsSymbExpr s) =>
(a -> b) -> s t a -> AltExpr t b
<$$> s t a
p AltExpr t ([a] -> [a]) -> s2 t b -> AltExpr t ([a] -> [a])
forall t (i :: * -> * -> *) (s :: * -> * -> *) a b.
(Show t, Ord t, IsAltExpr i, IsSymbExpr s) =>
i t a -> s t b -> AltExpr t a
<** s2 t b
s AltExpr t ([a] -> [a]) -> BNF t [a] -> AltExpr t [a]
forall t (i :: * -> * -> *) (s :: * -> * -> *) a b.
(Show t, Ord t, IsAltExpr i, IsSymbExpr s) =>
i t (a -> b) -> s t a -> AltExpr t b
<**> s t a -> s2 t b -> BNF t [a]
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]
manySepBy1 s t a
p s2 t b
s
optional :: (Show t, Ord t, IsSymbExpr s) => s t a -> SymbExpr t (Maybe a)
optional :: forall t (s :: * -> * -> *) a.
(Show t, Ord t, IsSymbExpr s) =>
s t a -> SymbExpr t (Maybe a)
optional s t a
p = String
fresh
String -> OO [] AltExpr t (Maybe a) -> SymbExpr t (Maybe a)
forall t (b :: * -> * -> *) a.
(Show t, Ord t, HasAlts b) =>
String -> b t a -> SymbExpr t a
<:=> a -> Maybe a
forall a. a -> Maybe a
Just (a -> Maybe a) -> s t a -> AltExpr t (Maybe a)
forall t (s :: * -> * -> *) a b.
(Show t, Ord t, IsSymbExpr s) =>
(a -> b) -> s t a -> AltExpr t b
<$$> s t a
p
AltExpr t (Maybe a)
-> AltExpr t (Maybe a) -> OO [] AltExpr t (Maybe a)
forall t (i :: * -> * -> *) (b :: * -> * -> *) a.
(Show t, Ord t, IsAltExpr i, HasAlts b) =>
i t a -> b t a -> AltExprs t a
<||> Maybe a -> AltExpr t (Maybe a)
forall t a. (Show t, Ord t) => a -> AltExpr t a
satisfy Maybe a
forall a. Maybe a
Nothing
where fresh :: String
fresh = s t a -> String -> String
forall t (s :: * -> * -> *) a.
(Show t, Ord t, IsSymbExpr s) =>
s t a -> String -> String
mkNt s t a
p String
"?"
preferably :: (Show t, Ord t, IsSymbExpr s) => s t a -> SymbExpr t (Maybe a)
preferably :: forall t (s :: * -> * -> *) a.
(Show t, Ord t, IsSymbExpr s) =>
s t a -> SymbExpr t (Maybe a)
preferably s t a
p = String
fresh
String -> OO [] AltExpr t (Maybe a) -> SymbExpr t (Maybe a)
forall t (b :: * -> * -> *) a.
(Show t, Ord t, HasAlts b) =>
String -> b t a -> SymbExpr t a
<:= a -> Maybe a
forall a. a -> Maybe a
Just (a -> Maybe a) -> s t a -> AltExpr t (Maybe a)
forall t (s :: * -> * -> *) a b.
(Show t, Ord t, IsSymbExpr s) =>
(a -> b) -> s t a -> AltExpr t b
<$$> s t a
p
AltExpr t (Maybe a)
-> AltExpr t (Maybe a) -> OO [] AltExpr t (Maybe a)
forall t (i :: * -> * -> *) (b :: * -> * -> *) a.
(Show t, Ord t, IsAltExpr i, HasAlts b) =>
i t a -> b t a -> AltExprs t a
<||> Maybe a -> AltExpr t (Maybe a)
forall t a. (Show t, Ord t) => a -> AltExpr t a
satisfy Maybe a
forall a. Maybe a
Nothing
where fresh :: String
fresh = s t a -> String -> String
forall t (s :: * -> * -> *) a.
(Show t, Ord t, IsSymbExpr s) =>
s t a -> String -> String
mkNt s t a
p String
"?"
reluctantly :: (Show t, Ord t, IsSymbExpr s) => s t a -> SymbExpr t (Maybe a)
reluctantly :: forall t (s :: * -> * -> *) a.
(Show t, Ord t, IsSymbExpr s) =>
s t a -> SymbExpr t (Maybe a)
reluctantly s t a
p = String
fresh
String -> OO [] AltExpr t (Maybe a) -> SymbExpr t (Maybe a)
forall t (b :: * -> * -> *) a.
(Show t, Ord t, HasAlts b) =>
String -> b t a -> SymbExpr t a
<:= Maybe a -> AltExpr t (Maybe a)
forall t a. (Show t, Ord t) => a -> AltExpr t a
satisfy Maybe a
forall a. Maybe a
Nothing
AltExpr t (Maybe a)
-> AltExpr t (Maybe a) -> OO [] AltExpr t (Maybe a)
forall t (i :: * -> * -> *) (b :: * -> * -> *) a.
(Show t, Ord t, IsAltExpr i, HasAlts b) =>
i t a -> b t a -> AltExprs t a
<||> a -> Maybe a
forall a. a -> Maybe a
Just (a -> Maybe a) -> s t a -> AltExpr t (Maybe a)
forall t (s :: * -> * -> *) a b.
(Show t, Ord t, IsSymbExpr s) =>
(a -> b) -> s t a -> AltExpr t b
<$$> s t a
p
where fresh :: String
fresh = s t a -> String -> String
forall t (s :: * -> * -> *) a.
(Show t, Ord t, IsSymbExpr s) =>
s t a -> String -> String
mkNt s t a
p String
"?"
optionalWithDef :: (Show t, Ord t, IsSymbExpr s) => s t a -> a -> SymbExpr t a
optionalWithDef :: forall t (s :: * -> * -> *) a.
(Show t, Ord t, IsSymbExpr s) =>
s t a -> a -> SymbExpr t a
optionalWithDef s t a
p a
def = s t a -> String -> String
forall t (s :: * -> * -> *) a.
(Show t, Ord t, IsSymbExpr s) =>
s t a -> String -> String
mkNt s t a
p String
"?" String -> OO [] AltExpr t a -> SymbExpr t a
forall t (b :: * -> * -> *) a.
(Show t, Ord t, HasAlts b) =>
String -> b t a -> SymbExpr t a
<:=> a -> a
forall a. a -> a
id (a -> a) -> s t a -> AltExpr t a
forall t (s :: * -> * -> *) a b.
(Show t, Ord t, IsSymbExpr s) =>
(a -> b) -> s t a -> AltExpr t b
<$$> s t a
p AltExpr t a -> AltExpr t a -> OO [] AltExpr t a
forall t (i :: * -> * -> *) (b :: * -> * -> *) a.
(Show t, Ord t, IsAltExpr i, HasAlts b) =>
i t a -> b t a -> AltExprs t a
<||> a -> AltExpr t a
forall t a. (Show t, Ord t) => a -> AltExpr t a
satisfy a
def
within :: (Show t, Ord t, IsSymbExpr s) => BNF t a -> s t b -> BNF t c -> BNF t b
within :: forall t (s :: * -> * -> *) a b c.
(Show t, Ord t, IsSymbExpr s) =>
BNF t a -> s t b -> BNF t c -> BNF t b
within BNF t a
l s t b
p BNF t c
r = AltExpr t b -> BNF t b
forall t b. (Show t, Ord t) => AltExpr t b -> SymbExpr t b
forall (a :: * -> * -> *) t b.
(IsSymbExpr a, Show t, Ord t) =>
a t b -> SymbExpr t b
mkRule (AltExpr t b -> BNF t b) -> AltExpr t b -> BNF t b
forall a b. (a -> b) -> a -> b
$ BNF t a
l BNF t a -> BNF t b -> AltExpr t b
forall t (i :: * -> * -> *) (s :: * -> * -> *) a b.
(Show t, Ord t, IsAltExpr i, IsSymbExpr s) =>
i t a -> s t b -> AltExpr t b
**> s t b -> BNF t b
forall t b. (Show t, Ord t) => s t b -> SymbExpr t b
forall (a :: * -> * -> *) t b.
(IsSymbExpr a, Show t, Ord t) =>
a t b -> SymbExpr t b
toSymb s t b
p AltExpr t b -> BNF t c -> AltExpr t b
forall t (i :: * -> * -> *) (s :: * -> * -> *) a b.
(Show t, Ord t, IsAltExpr i, IsSymbExpr s) =>
i t a -> s t b -> AltExpr t a
<** BNF t c
r
parens :: s t b -> BNF t b
parens s t b
p = BNF t Char -> s t b -> BNF t Char -> BNF t b
forall t (s :: * -> * -> *) a b c.
(Show t, Ord t, IsSymbExpr s) =>
BNF t a -> s t b -> BNF t c -> BNF t b
within (Char -> BNF t Char
forall t. SubsumesToken t => Char -> SymbExpr t Char
keychar Char
'(') s t b
p (Char -> BNF t Char
forall t. SubsumesToken t => Char -> SymbExpr t Char
keychar Char
')')
braces :: s t b -> BNF t b
braces s t b
p = BNF t Char -> s t b -> BNF t Char -> BNF t b
forall t (s :: * -> * -> *) a b c.
(Show t, Ord t, IsSymbExpr s) =>
BNF t a -> s t b -> BNF t c -> BNF t b
within (Char -> BNF t Char
forall t. SubsumesToken t => Char -> SymbExpr t Char
keychar Char
'{') s t b
p (Char -> BNF t Char
forall t. SubsumesToken t => Char -> SymbExpr t Char
keychar Char
'}')
brackets :: s t b -> BNF t b
brackets s t b
p = BNF t Char -> s t b -> BNF t Char -> BNF t b
forall t (s :: * -> * -> *) a b c.
(Show t, Ord t, IsSymbExpr s) =>
BNF t a -> s t b -> BNF t c -> BNF t b
within (Char -> BNF t Char
forall t. SubsumesToken t => Char -> SymbExpr t Char
keychar Char
'[') s t b
p (Char -> BNF t Char
forall t. SubsumesToken t => Char -> SymbExpr t Char
keychar Char
']')
angles :: s t b -> BNF t b
angles s t b
p = BNF t Char -> s t b -> BNF t Char -> BNF t b
forall t (s :: * -> * -> *) a b c.
(Show t, Ord t, IsSymbExpr s) =>
BNF t a -> s t b -> BNF t c -> BNF t b
within (Char -> BNF t Char
forall t. SubsumesToken t => Char -> SymbExpr t Char
keychar Char
'<') s t b
p (Char -> BNF t Char
forall t. SubsumesToken t => Char -> SymbExpr t Char
keychar Char
'>')
quotes :: s t b -> BNF t b
quotes s t b
p = BNF t Char -> s t b -> BNF t Char -> BNF t b
forall t (s :: * -> * -> *) a b c.
(Show t, Ord t, IsSymbExpr s) =>
BNF t a -> s t b -> BNF t c -> BNF t b
within (Char -> BNF t Char
forall t. SubsumesToken t => Char -> SymbExpr t Char
keychar Char
'\'') s t b
p (Char -> BNF t Char
forall t. SubsumesToken t => Char -> SymbExpr t Char
keychar Char
'\'')
dquotes :: s t b -> BNF t b
dquotes s t b
p = BNF t Char -> s t b -> BNF t Char -> BNF t b
forall t (s :: * -> * -> *) a b c.
(Show t, Ord t, IsSymbExpr s) =>
BNF t a -> s t b -> BNF t c -> BNF t b
within (Char -> BNF t Char
forall t. SubsumesToken t => Char -> SymbExpr t Char
keychar Char
'"') s t b
p (Char -> BNF t Char
forall t. SubsumesToken t => Char -> SymbExpr t Char
keychar Char
'"')
foldr_multiple :: (IsSymbExpr s, Parseable t) => s t (a -> a) -> a -> BNF t a
foldr_multiple :: forall (s :: * -> * -> *) t a.
(IsSymbExpr s, Parseable t) =>
s t (a -> a) -> a -> BNF t a
foldr_multiple s t (a -> a)
comb a
def = s t (a -> a) -> String -> String
forall t (s :: * -> * -> *) a.
(Show t, Ord t, IsSymbExpr s) =>
s t a -> String -> String
mkNt s t (a -> a)
comb String
"-foldr"
String -> OO [] AltExpr t a -> SymbExpr t a
forall t (b :: * -> * -> *) a.
(Show t, Ord t, HasAlts b) =>
String -> b t a -> SymbExpr t a
<::=> a -> AltExpr t a
forall t a. (Show t, Ord t) => a -> AltExpr t a
satisfy a
def
AltExpr t a -> AltExpr t a -> OO [] AltExpr t a
forall t (i :: * -> * -> *) (b :: * -> * -> *) a.
(Show t, Ord t, IsAltExpr i, HasAlts b) =>
i t a -> b t a -> AltExprs t a
<||> (a -> a) -> a -> a
forall a b. (a -> b) -> a -> b
($) ((a -> a) -> a -> a) -> s t (a -> a) -> AltExpr t (a -> a)
forall t (s :: * -> * -> *) a b.
(Show t, Ord t, IsSymbExpr s) =>
(a -> b) -> s t a -> AltExpr t b
<$$> s t (a -> a)
comb AltExpr t (a -> a) -> SymbExpr t a -> AltExpr t a
forall t (i :: * -> * -> *) (s :: * -> * -> *) a b.
(Show t, Ord t, IsAltExpr i, IsSymbExpr s) =>
i t (a -> b) -> s t a -> AltExpr t b
<<<**> s t (a -> a) -> a -> SymbExpr t a
forall (s :: * -> * -> *) t a.
(IsSymbExpr s, Parseable t) =>
s t (a -> a) -> a -> BNF t a
foldr_multiple s t (a -> a)
comb a
def
foldr_multipleSepBy :: (IsSymbExpr s, Parseable t) => s t (a -> a) -> s t b -> a -> BNF t a
foldr_multipleSepBy :: forall (s :: * -> * -> *) t a b.
(IsSymbExpr s, Parseable t) =>
s t (a -> a) -> s t b -> a -> BNF t a
foldr_multipleSepBy s t (a -> a)
comb s t b
sep a
def = s t (a -> a) -> String -> String
forall t (s :: * -> * -> *) a.
(Show t, Ord t, IsSymbExpr s) =>
s t a -> String -> String
mkNt s t (a -> a)
comb String
"-foldr"
String -> OO [] AltExpr t a -> SymbExpr t a
forall t (b :: * -> * -> *) a.
(Show t, Ord t, HasAlts b) =>
String -> b t a -> SymbExpr t a
<::=> a -> AltExpr t a
forall t a. (Show t, Ord t) => a -> AltExpr t a
satisfy a
def
AltExpr t a -> OO [] AltExpr t a -> OO [] AltExpr t a
forall t (i :: * -> * -> *) (b :: * -> * -> *) a.
(Show t, Ord t, IsAltExpr i, HasAlts b) =>
i t a -> b t a -> AltExprs t a
<||> ((a -> a) -> a -> a
forall a b. (a -> b) -> a -> b
$ a
def) ((a -> a) -> a) -> s t (a -> a) -> AltExpr t a
forall t (s :: * -> * -> *) a b.
(Show t, Ord t, IsSymbExpr s) =>
(a -> b) -> s t a -> AltExpr t b
<$$> s t (a -> a)
comb
AltExpr t a -> AltExpr t a -> OO [] AltExpr t a
forall t (i :: * -> * -> *) (b :: * -> * -> *) a.
(Show t, Ord t, IsAltExpr i, HasAlts b) =>
i t a -> b t a -> AltExprs t a
<||> (a -> a) -> a -> a
forall a b. (a -> b) -> a -> b
($) ((a -> a) -> a -> a) -> s t (a -> a) -> AltExpr t (a -> a)
forall t (s :: * -> * -> *) a b.
(Show t, Ord t, IsSymbExpr s) =>
(a -> b) -> s t a -> AltExpr t b
<$$> s t (a -> a)
comb AltExpr t (a -> a) -> s t b -> AltExpr t (a -> a)
forall t (i :: * -> * -> *) (s :: * -> * -> *) a b.
(Show t, Ord t, IsAltExpr i, IsSymbExpr s) =>
i t a -> s t b -> AltExpr t a
<** s t b
sep AltExpr t (a -> a) -> SymbExpr t a -> AltExpr t a
forall t (i :: * -> * -> *) (s :: * -> * -> *) a b.
(Show t, Ord t, IsAltExpr i, IsSymbExpr s) =>
i t (a -> b) -> s t a -> AltExpr t b
<<<**> s t (a -> a) -> s t b -> a -> SymbExpr t a
forall (s :: * -> * -> *) t a b.
(IsSymbExpr s, Parseable t) =>
s t (a -> a) -> s t b -> a -> BNF t a
foldr_multipleSepBy s t (a -> a)
comb s t b
sep a
def
type OpTable e = M.Map Double [(String, Fixity e)]
data Fixity e = Prefix (String -> e -> e) | Infix (e -> String -> e -> e) Assoc
data Assoc = LAssoc | RAssoc | NA
opTableFromList :: [(Double, [(String, Fixity e)])] -> OpTable e
opTableFromList :: forall e. [(Double, [(String, Fixity e)])] -> OpTable e
opTableFromList = [(Double, [(String, Fixity e)])] -> Map Double [(String, Fixity e)]
forall k a. Ord k => [(k, a)] -> Map k a
M.fromList
fromOpTable :: (SubsumesToken t, Parseable t, IsSymbExpr s) => String -> OpTable e -> s t e -> BNF t e
fromOpTable :: forall t (s :: * -> * -> *) e.
(SubsumesToken t, Parseable t, IsSymbExpr s) =>
String -> OpTable e -> s t e -> BNF t e
fromOpTable String
nt OpTable e
ops s t e
rec = String -> [SymbExpr t e] -> SymbExpr t e
forall t (alt :: * -> * -> *) a.
(Show t, Ord t, IsAltExpr alt) =>
String -> [alt t a] -> SymbExpr t a
chooses_prec (String
nt String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
"-infix-prefix-exprs") ([SymbExpr t e] -> SymbExpr t e) -> [SymbExpr t e] -> SymbExpr t e
forall a b. (a -> b) -> a -> b
$
[ Integer -> [(String, Fixity e)] -> SymbExpr t e
forall {a}. Show a => a -> [(String, Fixity e)] -> SymbExpr t e
mkNterm Integer
ix [(String, Fixity e)]
row
| (Integer
ix, [(String, Fixity e)]
row) <- [Integer]
-> [[(String, Fixity e)]] -> [(Integer, [(String, Fixity e)])]
forall a b. [a] -> [b] -> [(a, b)]
zip [Integer
1..] (OpTable e -> [[(String, Fixity e)]]
forall k a. Map k a -> [a]
M.elems OpTable e
ops)
]
where mkNterm :: a -> [(String, Fixity e)] -> SymbExpr t e
mkNterm a
ix [(String, Fixity e)]
ops = String -> [AltExpr t e] -> SymbExpr t e
forall t (alt :: * -> * -> *) a.
(Show t, Ord t, IsAltExpr alt) =>
String -> [alt t a] -> SymbExpr t a
chooses (a -> String
forall a. Show a => a -> String
ntName a
ix) ([AltExpr t e] -> SymbExpr t e) -> [AltExpr t e] -> SymbExpr t e
forall a b. (a -> b) -> a -> b
$
[ String -> Fixity e -> AltExpr t e
mkAlt String
op Fixity e
fix | (String
op, Fixity e
fix) <- [(String, Fixity e)]
ops ]
where mkAlt :: String -> Fixity e -> AltExpr t e
mkAlt String
op Fixity e
fix = case Fixity e
fix of
Prefix String -> e -> e
f -> String -> e -> e
f (String -> e -> e) -> SymbExpr t String -> AltExpr t (e -> e)
forall t (s :: * -> * -> *) a b.
(Show t, Ord t, IsSymbExpr s) =>
(a -> b) -> s t a -> AltExpr t b
<$$> String -> SymbExpr t String
forall t. SubsumesToken t => String -> SymbExpr t String
keyword String
op AltExpr t (e -> e) -> s t e -> AltExpr t e
forall t (i :: * -> * -> *) (s :: * -> * -> *) a b.
(Show t, Ord t, IsAltExpr i, IsSymbExpr s) =>
i t (a -> b) -> s t a -> AltExpr t b
<**> s t e
rec
Infix e -> String -> e -> e
f Assoc
assoc -> case Assoc
assoc of
Assoc
LAssoc -> e -> String -> e -> e
f (e -> String -> e -> e) -> s t e -> AltExpr t (String -> e -> e)
forall t (s :: * -> * -> *) a b.
(Show t, Ord t, IsSymbExpr s) =>
(a -> b) -> s t a -> AltExpr t b
<$$> s t e
rec AltExpr t (String -> e -> e)
-> SymbExpr t String -> AltExpr t (e -> e)
forall t (i :: * -> * -> *) (s :: * -> * -> *) a b.
(Show t, Ord t, IsAltExpr i, IsSymbExpr s) =>
i t (a -> b) -> s t a -> AltExpr t b
<**> String -> SymbExpr t String
forall t. SubsumesToken t => String -> SymbExpr t String
keyword String
op AltExpr t (e -> e) -> s t e -> AltExpr t e
forall t (i :: * -> * -> *) (s :: * -> * -> *) a b.
(Show t, Ord t, IsAltExpr i, IsSymbExpr s) =>
i t (a -> b) -> s t a -> AltExpr t b
<**>>> s t e
rec
Assoc
RAssoc -> e -> String -> e -> e
f (e -> String -> e -> e) -> s t e -> AltExpr t (String -> e -> e)
forall t (s :: * -> * -> *) a b.
(Show t, Ord t, IsSymbExpr s) =>
(a -> b) -> s t a -> AltExpr t b
<$$> s t e
rec AltExpr t (String -> e -> e)
-> SymbExpr t String -> AltExpr t (e -> e)
forall t (i :: * -> * -> *) (s :: * -> * -> *) a b.
(Show t, Ord t, IsAltExpr i, IsSymbExpr s) =>
i t (a -> b) -> s t a -> AltExpr t b
<**> String -> SymbExpr t String
forall t. SubsumesToken t => String -> SymbExpr t String
keyword String
op AltExpr t (e -> e) -> s t e -> AltExpr t e
forall t (i :: * -> * -> *) (s :: * -> * -> *) a b.
(Show t, Ord t, IsAltExpr i, IsSymbExpr s) =>
i t (a -> b) -> s t a -> AltExpr t b
<<<**> s t e
rec
Assoc
_ -> e -> String -> e -> e
f (e -> String -> e -> e) -> s t e -> AltExpr t (String -> e -> e)
forall t (s :: * -> * -> *) a b.
(Show t, Ord t, IsSymbExpr s) =>
(a -> b) -> s t a -> AltExpr t b
<$$> s t e
rec AltExpr t (String -> e -> e)
-> SymbExpr t String -> AltExpr t (e -> e)
forall t (i :: * -> * -> *) (s :: * -> * -> *) a b.
(Show t, Ord t, IsAltExpr i, IsSymbExpr s) =>
i t (a -> b) -> s t a -> AltExpr t b
<**> String -> SymbExpr t String
forall t. SubsumesToken t => String -> SymbExpr t String
keyword String
op AltExpr t (e -> e) -> s t e -> AltExpr t e
forall t (i :: * -> * -> *) (s :: * -> * -> *) a b.
(Show t, Ord t, IsAltExpr i, IsSymbExpr s) =>
i t (a -> b) -> s t a -> AltExpr t b
<**> s t e
rec
ntName :: a -> String
ntName a
i = a -> String
forall a. Show a => a -> String
show a
i String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
nt String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
"-op-row"