{-#LANGUAGE TupleSections #-}
{-#LANGUAGE OverloadedStrings #-}
{-#LANGUAGE ScopedTypeVariables #-}
{-#LANGUAGE DeriveGeneric #-}
{-#LANGUAGE FlexibleInstances #-}
{-#LANGUAGE MultiParamTypeClasses #-}
module Text.Ginger.Parse
( parseGinger
, parseGingerFile
, parseGinger'
, parseGingerFile'
, ParserError (..)
, ParserOptions (..)
, mkParserOptions
, Delimiters (..)
, defDelimiters
, formatParserError
, IncludeResolver
, Source, SourceName
, SourcePos (..)
, sourceName
, sourceLine
, sourceColumn
, setSourceName
)
where
import Text.Parsec ( ParseError (..)
, SourcePos (..)
, SourceName (..)
, sourceName
, sourceLine
, sourceColumn
, setSourceName
, ParsecT
, runParserT
, try, lookAhead
, manyTill, oneOf, string, notFollowedBy, between, sepBy
, eof, space, spaces, anyChar, noneOf, char
, choice, option, optionMaybe
, unexpected
, digit
, getState, modifyState, putState
, (<?>)
, getPosition
)
import Text.Parsec.Error ( errorMessages
, errorPos
, showErrorMessages
)
import Text.Ginger.AST
import Text.Ginger.Html ( unsafeRawHtml )
import Text.Ginger.GVal (GVal, ToGVal (..), dict, (~>))
import Control.Monad (when)
import Control.Monad.Reader ( ReaderT
, runReaderT
, ask, asks
)
import Control.Monad.Trans.Class ( lift )
import Control.Applicative
import Control.Exception (Exception)
import GHC.Generics
import Safe ( readMay )
import Data.Text (Text)
import Data.Maybe ( fromMaybe, catMaybes, listToMaybe )
import Data.Scientific ( Scientific )
import qualified Data.Text as Text
import Data.List ( foldr, nub, sort )
import Data.HashMap.Strict (HashMap)
import qualified Data.HashMap.Strict as HashMap
import Data.Default ( Default (..) )
import Data.Monoid ( (<>) )
import Data.Char (isSpace)
import System.FilePath ( takeDirectory, (</>) )
import Text.Printf ( printf )
type Source = String
type IncludeResolver m = SourceName -> m (Maybe Source)
instance ToGVal m SourcePos where
toGVal :: SourcePos -> GVal m
toGVal SourcePos
p =
[Pair m] -> GVal m
forall (m :: * -> *). [Pair m] -> GVal m
dict [ Text
"name" Text -> SourceName -> Pair m
forall (m :: * -> *) a. ToGVal m a => Text -> a -> Pair m
~> SourcePos -> SourceName
sourceName SourcePos
p
, Text
"line" Text -> Line -> Pair m
forall (m :: * -> *) a. ToGVal m a => Text -> a -> Pair m
~> SourcePos -> Line
sourceLine SourcePos
p
, Text
"column" Text -> Line -> Pair m
forall (m :: * -> *) a. ToGVal m a => Text -> a -> Pair m
~> SourcePos -> Line
sourceColumn SourcePos
p
]
data ParserError =
ParserError
{ ParserError -> SourceName
peErrorMessage :: String
, ParserError -> Maybe SourcePos
peSourcePosition :: Maybe SourcePos
}
deriving (Line -> ParserError -> ShowS
[ParserError] -> ShowS
ParserError -> SourceName
(Line -> ParserError -> ShowS)
-> (ParserError -> SourceName)
-> ([ParserError] -> ShowS)
-> Show ParserError
forall a.
(Line -> a -> ShowS)
-> (a -> SourceName) -> ([a] -> ShowS) -> Show a
showList :: [ParserError] -> ShowS
$cshowList :: [ParserError] -> ShowS
show :: ParserError -> SourceName
$cshow :: ParserError -> SourceName
showsPrec :: Line -> ParserError -> ShowS
$cshowsPrec :: Line -> ParserError -> ShowS
Show, (forall x. ParserError -> Rep ParserError x)
-> (forall x. Rep ParserError x -> ParserError)
-> Generic ParserError
forall x. Rep ParserError x -> ParserError
forall x. ParserError -> Rep ParserError x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep ParserError x -> ParserError
$cfrom :: forall x. ParserError -> Rep ParserError x
Generic)
instance Exception ParserError where
formatParserError :: Maybe String
-> ParserError
-> String
formatParserError :: Maybe SourceName -> ParserError -> SourceName
formatParserError Maybe SourceName
tplSrc ParserError
e =
let sourceLocation :: Maybe SourceName
sourceLocation = do
SourcePos
pos <- ParserError -> Maybe SourcePos
peSourcePosition ParserError
e
SourceName -> Maybe SourceName
forall (m :: * -> *) a. Monad m => a -> m a
return (SourceName -> Maybe SourceName) -> SourceName -> Maybe SourceName
forall a b. (a -> b) -> a -> b
$ SourceName -> SourceName -> Line -> Line -> SourceName
forall r. PrintfType r => SourceName -> r
printf SourceName
"%s:%i:%i\n"
(SourcePos -> SourceName
sourceName SourcePos
pos)
(SourcePos -> Line
sourceLine SourcePos
pos)
(SourcePos -> Line
sourceColumn SourcePos
pos)
markerLines :: Maybe SourceName
markerLines = do
[SourceName]
sourceLines <- SourceName -> [SourceName]
lines (SourceName -> [SourceName])
-> Maybe SourceName -> Maybe [SourceName]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Maybe SourceName
tplSrc
SourcePos
pos <- ParserError -> Maybe SourcePos
peSourcePosition ParserError
e
let lineNum :: Line
lineNum = SourcePos -> Line
sourceLine SourcePos
pos
SourceName
offendingLine <- [SourceName] -> Maybe SourceName
forall a. [a] -> Maybe a
listToMaybe ([SourceName] -> Maybe SourceName)
-> ([SourceName] -> [SourceName])
-> [SourceName]
-> Maybe SourceName
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Line -> [SourceName] -> [SourceName]
forall a. Line -> [a] -> [a]
drop (Line -> Line
forall a. Enum a => a -> a
pred Line
lineNum) ([SourceName] -> Maybe SourceName)
-> [SourceName] -> Maybe SourceName
forall a b. (a -> b) -> a -> b
$ [SourceName]
sourceLines
let offendingColumn :: Line
offendingColumn = SourcePos -> Line
sourceColumn SourcePos
pos
SourceName -> Maybe SourceName
forall (m :: * -> *) a. Monad m => a -> m a
return (SourceName -> Maybe SourceName)
-> ([SourceName] -> SourceName) -> [SourceName] -> Maybe SourceName
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [SourceName] -> SourceName
unlines ([SourceName] -> Maybe SourceName)
-> [SourceName] -> Maybe SourceName
forall a b. (a -> b) -> a -> b
$
[ SourceName
offendingLine
, (Line -> Char -> SourceName
forall a. Line -> a -> [a]
replicate (Line -> Line
forall a. Enum a => a -> a
pred Line
offendingColumn) Char
' ') SourceName -> ShowS
forall a. Semigroup a => a -> a -> a
<> SourceName
"^"
]
in [SourceName] -> SourceName
unlines ([SourceName] -> SourceName)
-> ([Maybe SourceName] -> [SourceName])
-> [Maybe SourceName]
-> SourceName
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Maybe SourceName] -> [SourceName]
forall a. [Maybe a] -> [a]
catMaybes ([Maybe SourceName] -> SourceName)
-> [Maybe SourceName] -> SourceName
forall a b. (a -> b) -> a -> b
$
[ Maybe SourceName
sourceLocation
, Maybe SourceName
markerLines
, SourceName -> Maybe SourceName
forall a. a -> Maybe a
Just (ParserError -> SourceName
peErrorMessage ParserError
e)
]
fromParsecError :: ParseError -> ParserError
fromParsecError :: ParseError -> ParserError
fromParsecError ParseError
e =
SourceName -> Maybe SourcePos -> ParserError
ParserError
((Char -> Bool) -> ShowS
forall a. (a -> Bool) -> [a] -> [a]
dropWhile (Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
== Char
'\n') ShowS -> ([Message] -> SourceName) -> [Message] -> SourceName
forall b c a. (b -> c) -> (a -> b) -> a -> c
.
SourceName
-> SourceName
-> SourceName
-> SourceName
-> SourceName
-> [Message]
-> SourceName
showErrorMessages
SourceName
"or"
SourceName
"unknown parse error"
SourceName
"expecting"
SourceName
"unexpected"
SourceName
"end of input"
([Message] -> SourceName) -> [Message] -> SourceName
forall a b. (a -> b) -> a -> b
$ ParseError -> [Message]
errorMessages ParseError
e)
(SourcePos -> Maybe SourcePos
forall a. a -> Maybe a
Just (SourcePos -> Maybe SourcePos) -> SourcePos -> Maybe SourcePos
forall a b. (a -> b) -> a -> b
$ ParseError -> SourcePos
errorPos ParseError
e)
parseGingerFile :: forall m. Monad m
=> IncludeResolver m
-> SourceName
-> m (Either ParserError (Template SourcePos))
parseGingerFile :: IncludeResolver m
-> SourceName -> m (Either ParserError (Template SourcePos))
parseGingerFile IncludeResolver m
resolver SourceName
sourceName =
ParserOptions m
-> SourceName -> m (Either ParserError (Template SourcePos))
forall (m :: * -> *).
Monad m =>
ParserOptions m
-> SourceName -> m (Either ParserError (Template SourcePos))
parseGingerFile' ParserOptions m
opts SourceName
sourceName
where
opts :: ParserOptions m
opts :: ParserOptions m
opts =
(IncludeResolver m -> ParserOptions m
forall (m :: * -> *).
Monad m =>
IncludeResolver m -> ParserOptions m
mkParserOptions IncludeResolver m
resolver)
{ poSourceName :: Maybe SourceName
poSourceName = SourceName -> Maybe SourceName
forall a. a -> Maybe a
Just SourceName
sourceName }
parseGinger :: forall m. Monad m
=> IncludeResolver m
-> Maybe SourceName
-> Source
-> m (Either ParserError (Template SourcePos))
parseGinger :: IncludeResolver m
-> Maybe SourceName
-> SourceName
-> m (Either ParserError (Template SourcePos))
parseGinger IncludeResolver m
resolver Maybe SourceName
sourceName SourceName
source =
ParserOptions m
-> SourceName -> m (Either ParserError (Template SourcePos))
forall (m :: * -> *).
Monad m =>
ParserOptions m
-> SourceName -> m (Either ParserError (Template SourcePos))
parseGinger' ParserOptions m
opts SourceName
source
where
opts :: ParserOptions m
opts :: ParserOptions m
opts =
(IncludeResolver m -> ParserOptions m
forall (m :: * -> *).
Monad m =>
IncludeResolver m -> ParserOptions m
mkParserOptions IncludeResolver m
resolver)
{ poSourceName :: Maybe SourceName
poSourceName = Maybe SourceName
sourceName }
parseGingerFile' :: Monad m => ParserOptions m -> SourceName -> m (Either ParserError (Template SourcePos))
parseGingerFile' :: ParserOptions m
-> SourceName -> m (Either ParserError (Template SourcePos))
parseGingerFile' ParserOptions m
opts' SourceName
fn = do
let opts :: ParserOptions m
opts = ParserOptions m
opts' { poSourceName :: Maybe SourceName
poSourceName = SourceName -> Maybe SourceName
forall a. a -> Maybe a
Just SourceName
fn }
let resolve :: IncludeResolver m
resolve = ParserOptions m -> IncludeResolver m
forall (m :: * -> *). ParserOptions m -> IncludeResolver m
poIncludeResolver ParserOptions m
opts
Maybe SourceName
srcMay <- IncludeResolver m
resolve SourceName
fn
case Maybe SourceName
srcMay of
Maybe SourceName
Nothing -> Either ParserError (Template SourcePos)
-> m (Either ParserError (Template SourcePos))
forall (m :: * -> *) a. Monad m => a -> m a
return (Either ParserError (Template SourcePos)
-> m (Either ParserError (Template SourcePos)))
-> (ParserError -> Either ParserError (Template SourcePos))
-> ParserError
-> m (Either ParserError (Template SourcePos))
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ParserError -> Either ParserError (Template SourcePos)
forall a b. a -> Either a b
Left (ParserError -> m (Either ParserError (Template SourcePos)))
-> ParserError -> m (Either ParserError (Template SourcePos))
forall a b. (a -> b) -> a -> b
$
ParserError :: SourceName -> Maybe SourcePos -> ParserError
ParserError
{ peErrorMessage :: SourceName
peErrorMessage = SourceName
"Template source not found: " SourceName -> ShowS
forall a. [a] -> [a] -> [a]
++ SourceName
fn
, peSourcePosition :: Maybe SourcePos
peSourcePosition = Maybe SourcePos
forall a. Maybe a
Nothing
}
Just SourceName
src -> ParserOptions m
-> SourceName -> m (Either ParserError (Template SourcePos))
forall (m :: * -> *).
Monad m =>
ParserOptions m
-> SourceName -> m (Either ParserError (Template SourcePos))
parseGinger' ParserOptions m
opts SourceName
src
parseGinger' :: Monad m => ParserOptions m -> Source -> m (Either ParserError (Template SourcePos))
parseGinger' :: ParserOptions m
-> SourceName -> m (Either ParserError (Template SourcePos))
parseGinger' ParserOptions m
opts SourceName
src = do
Either ParseError (Template SourcePos)
result <-
ReaderT
(ParserOptions m) m (Either ParseError (Template SourcePos))
-> ParserOptions m -> m (Either ParseError (Template SourcePos))
forall r (m :: * -> *) a. ReaderT r m a -> r -> m a
runReaderT
( ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
(Template SourcePos)
-> ParseState
-> SourceName
-> SourceName
-> ReaderT
(ParserOptions m) m (Either ParseError (Template SourcePos))
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> u -> SourceName -> s -> m (Either ParseError a)
runParserT
(ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
(Template SourcePos)
forall (m :: * -> *). Monad m => Parser m (Template SourcePos)
templateP ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
(Template SourcePos)
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ()
-> ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
(Template SourcePos)
forall (m :: * -> *) a b. Monad m => m a -> m b -> m a
`before` ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ()
forall s (m :: * -> *) t u.
(Stream s m t, Show t) =>
ParsecT s u m ()
eof)
ParseState
defParseState { psDelimiters :: Delimiters
psDelimiters = ParserOptions m -> Delimiters
forall (m :: * -> *). ParserOptions m -> Delimiters
poDelimiters ParserOptions m
opts }
(SourceName -> Maybe SourceName -> SourceName
forall a. a -> Maybe a -> a
fromMaybe SourceName
"<<unknown>>" (Maybe SourceName -> SourceName) -> Maybe SourceName -> SourceName
forall a b. (a -> b) -> a -> b
$ ParserOptions m -> Maybe SourceName
forall (m :: * -> *). ParserOptions m -> Maybe SourceName
poSourceName ParserOptions m
opts)
SourceName
src
)
ParserOptions m
opts
case Either ParseError (Template SourcePos)
result of
Right Template SourcePos
t -> Either ParserError (Template SourcePos)
-> m (Either ParserError (Template SourcePos))
forall (m :: * -> *) a. Monad m => a -> m a
return (Either ParserError (Template SourcePos)
-> m (Either ParserError (Template SourcePos)))
-> (Template SourcePos -> Either ParserError (Template SourcePos))
-> Template SourcePos
-> m (Either ParserError (Template SourcePos))
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Template SourcePos -> Either ParserError (Template SourcePos)
forall a b. b -> Either a b
Right (Template SourcePos -> m (Either ParserError (Template SourcePos)))
-> Template SourcePos
-> m (Either ParserError (Template SourcePos))
forall a b. (a -> b) -> a -> b
$ Template SourcePos
t
Left ParseError
e -> Either ParserError (Template SourcePos)
-> m (Either ParserError (Template SourcePos))
forall (m :: * -> *) a. Monad m => a -> m a
return (Either ParserError (Template SourcePos)
-> m (Either ParserError (Template SourcePos)))
-> (ParserError -> Either ParserError (Template SourcePos))
-> ParserError
-> m (Either ParserError (Template SourcePos))
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ParserError -> Either ParserError (Template SourcePos)
forall a b. a -> Either a b
Left (ParserError -> m (Either ParserError (Template SourcePos)))
-> ParserError -> m (Either ParserError (Template SourcePos))
forall a b. (a -> b) -> a -> b
$ ParseError -> ParserError
fromParsecError ParseError
e
data Delimiters
= Delimiters
{ Delimiters -> SourceName
delimOpenInterpolation :: String
, Delimiters -> SourceName
delimCloseInterpolation :: String
, Delimiters -> SourceName
delimOpenTag :: String
, Delimiters -> SourceName
delimCloseTag :: String
, :: String
, :: String
}
defDelimiters :: Delimiters
defDelimiters :: Delimiters
defDelimiters
= Delimiters :: SourceName
-> SourceName
-> SourceName
-> SourceName
-> SourceName
-> SourceName
-> Delimiters
Delimiters
{ delimOpenInterpolation :: SourceName
delimOpenInterpolation = SourceName
"{{"
, delimCloseInterpolation :: SourceName
delimCloseInterpolation = SourceName
"}}"
, delimOpenTag :: SourceName
delimOpenTag = SourceName
"{%"
, delimCloseTag :: SourceName
delimCloseTag = SourceName
"%}"
, delimOpenComment :: SourceName
delimOpenComment = SourceName
"{#"
, delimCloseComment :: SourceName
delimCloseComment = SourceName
"#}"
}
data ParserOptions m
= ParserOptions
{
ParserOptions m -> IncludeResolver m
poIncludeResolver :: IncludeResolver m
, ParserOptions m -> Maybe SourceName
poSourceName :: Maybe SourceName
, ParserOptions m -> Bool
poKeepTrailingNewline :: Bool
, ParserOptions m -> Bool
poLStripBlocks :: Bool
, ParserOptions m -> Bool
poTrimBlocks :: Bool
, ParserOptions m -> Delimiters
poDelimiters :: Delimiters
}
mkParserOptions :: Monad m => IncludeResolver m -> ParserOptions m
mkParserOptions :: IncludeResolver m -> ParserOptions m
mkParserOptions IncludeResolver m
resolver =
ParserOptions :: forall (m :: * -> *).
IncludeResolver m
-> Maybe SourceName
-> Bool
-> Bool
-> Bool
-> Delimiters
-> ParserOptions m
ParserOptions
{ poIncludeResolver :: IncludeResolver m
poIncludeResolver = IncludeResolver m
resolver
, poSourceName :: Maybe SourceName
poSourceName = Maybe SourceName
forall a. Maybe a
Nothing
, poKeepTrailingNewline :: Bool
poKeepTrailingNewline = Bool
False
, poLStripBlocks :: Bool
poLStripBlocks = Bool
False
, poTrimBlocks :: Bool
poTrimBlocks = Bool
False
, poDelimiters :: Delimiters
poDelimiters = Delimiters
defDelimiters
}
data ParseState
= ParseState
{ ParseState -> HashMap Text (Block SourcePos)
psBlocks :: HashMap VarName (Block SourcePos)
, ParseState -> SourceName
psStripIndent :: String
, ParseState -> Delimiters
psDelimiters :: Delimiters
}
defParseState :: ParseState
defParseState :: ParseState
defParseState =
ParseState :: HashMap Text (Block SourcePos)
-> SourceName -> Delimiters -> ParseState
ParseState
{ psBlocks :: HashMap Text (Block SourcePos)
psBlocks = HashMap Text (Block SourcePos)
forall k v. HashMap k v
HashMap.empty
, psStripIndent :: SourceName
psStripIndent = SourceName
""
, psDelimiters :: Delimiters
psDelimiters = Delimiters
defDelimiters
}
type Parser m a = ParsecT String ParseState (ReaderT (ParserOptions m) m) a
ignore :: Monad m => m a -> m ()
ignore :: m a -> m ()
ignore = (m a -> m () -> m ()
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> () -> m ()
forall (m :: * -> *) a. Monad m => a -> m a
return ())
ifFlag :: Monad m => (ParserOptions m -> Bool) -> Parser m () -> Parser m () -> Parser m ()
ifFlag :: (ParserOptions m -> Bool)
-> Parser m () -> Parser m () -> Parser m ()
ifFlag ParserOptions m -> Bool
flag Parser m ()
yes Parser m ()
no = do
Bool
cond <- (ParserOptions m -> Bool)
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) Bool
forall r (m :: * -> *) a. MonadReader r m => (r -> a) -> m a
asks ParserOptions m -> Bool
flag
if Bool
cond then Parser m ()
yes else Parser m ()
no
whenFlag :: Monad m => (ParserOptions m -> Bool) -> Parser m () -> Parser m ()
whenFlag :: (ParserOptions m -> Bool) -> Parser m () -> Parser m ()
whenFlag ParserOptions m -> Bool
flag Parser m ()
yes = do
Bool
cond <- (ParserOptions m -> Bool)
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) Bool
forall r (m :: * -> *) a. MonadReader r m => (r -> a) -> m a
asks ParserOptions m -> Bool
flag
Bool -> Parser m () -> Parser m ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when Bool
cond Parser m ()
yes
unlessFlag :: Monad m => (ParserOptions m -> Bool) -> Parser m () -> Parser m ()
unlessFlag :: (ParserOptions m -> Bool) -> Parser m () -> Parser m ()
unlessFlag ParserOptions m -> Bool
flag Parser m ()
no = do
Bool
cond <- (ParserOptions m -> Bool)
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) Bool
forall r (m :: * -> *) a. MonadReader r m => (r -> a) -> m a
asks ParserOptions m -> Bool
flag
Bool -> Parser m () -> Parser m ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (Bool -> Bool
not Bool
cond) Parser m ()
no
getResolver :: Monad m => Parser m (IncludeResolver m)
getResolver :: Parser m (IncludeResolver m)
getResolver = (ParserOptions m -> IncludeResolver m)
-> Parser m (IncludeResolver m)
forall r (m :: * -> *) a. MonadReader r m => (r -> a) -> m a
asks ParserOptions m -> IncludeResolver m
forall (m :: * -> *). ParserOptions m -> IncludeResolver m
poIncludeResolver
include :: Monad m => SourceName -> Parser m (Statement SourcePos)
include :: SourceName -> Parser m (Statement SourcePos)
include SourceName
sourceName =
SourcePos -> Template SourcePos -> Statement SourcePos
forall a. a -> Template a -> Statement a
PreprocessedIncludeS
(SourcePos -> Template SourcePos -> Statement SourcePos)
-> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourcePos
-> ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
(Template SourcePos -> Statement SourcePos)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourcePos
forall (m :: * -> *) s u. Monad m => ParsecT s u m SourcePos
getPosition
ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
(Template SourcePos -> Statement SourcePos)
-> ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
(Template SourcePos)
-> Parser m (Statement SourcePos)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> SourceName
-> ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
(Template SourcePos)
forall (m :: * -> *).
Monad m =>
SourceName -> Parser m (Template SourcePos)
includeTemplate SourceName
sourceName
includeTemplate :: Monad m => SourceName -> Parser m (Template SourcePos)
includeTemplate :: SourceName -> Parser m (Template SourcePos)
includeTemplate SourceName
sourceName = do
IncludeResolver m
resolver <- Parser m (IncludeResolver m)
forall (m :: * -> *). Monad m => Parser m (IncludeResolver m)
getResolver
SourceName
currentSource <- SourceName -> Maybe SourceName -> SourceName
forall a. a -> Maybe a -> a
fromMaybe SourceName
"" (Maybe SourceName -> SourceName)
-> ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
(Maybe SourceName)
-> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourceName
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (ParserOptions m -> Maybe SourceName)
-> ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
(Maybe SourceName)
forall r (m :: * -> *) a. MonadReader r m => (r -> a) -> m a
asks ParserOptions m -> Maybe SourceName
forall (m :: * -> *). ParserOptions m -> Maybe SourceName
poSourceName
let includeSourceName :: SourceName
includeSourceName = ShowS
takeDirectory SourceName
currentSource SourceName -> ShowS
</> SourceName
sourceName
ParserOptions m
opts <- ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
(ParserOptions m)
forall r (m :: * -> *). MonadReader r m => m r
ask
Either ParserError (Template SourcePos)
pres <- ReaderT
(ParserOptions m) m (Either ParserError (Template SourcePos))
-> ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
(Either ParserError (Template SourcePos))
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (ReaderT
(ParserOptions m) m (Either ParserError (Template SourcePos))
-> ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
(Either ParserError (Template SourcePos)))
-> (m (Either ParserError (Template SourcePos))
-> ReaderT
(ParserOptions m) m (Either ParserError (Template SourcePos)))
-> m (Either ParserError (Template SourcePos))
-> ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
(Either ParserError (Template SourcePos))
forall b c a. (b -> c) -> (a -> b) -> a -> c
. m (Either ParserError (Template SourcePos))
-> ReaderT
(ParserOptions m) m (Either ParserError (Template SourcePos))
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (m (Either ParserError (Template SourcePos))
-> ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
(Either ParserError (Template SourcePos)))
-> m (Either ParserError (Template SourcePos))
-> ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
(Either ParserError (Template SourcePos))
forall a b. (a -> b) -> a -> b
$ ParserOptions m
-> SourceName -> m (Either ParserError (Template SourcePos))
forall (m :: * -> *).
Monad m =>
ParserOptions m
-> SourceName -> m (Either ParserError (Template SourcePos))
parseGingerFile' ParserOptions m
opts SourceName
includeSourceName
case Either ParserError (Template SourcePos)
pres of
Right Template SourcePos
t -> Template SourcePos -> Parser m (Template SourcePos)
forall (m :: * -> *) a. Monad m => a -> m a
return Template SourcePos
t
Left ParserError
err -> SourceName -> Parser m (Template SourcePos)
forall (m :: * -> *) a. MonadFail m => SourceName -> m a
fail (ParserError -> SourceName
forall a. Show a => a -> SourceName
show ParserError
err)
reduceStatements :: SourcePos -> [(Statement SourcePos)] -> (Statement SourcePos)
reduceStatements :: SourcePos -> [Statement SourcePos] -> Statement SourcePos
reduceStatements SourcePos
pos [] = SourcePos -> Statement SourcePos
forall a. a -> Statement a
NullS SourcePos
pos
reduceStatements SourcePos
pos [Statement SourcePos
x] = Statement SourcePos
x
reduceStatements SourcePos
pos [Statement SourcePos]
xs = SourcePos -> [Statement SourcePos] -> Statement SourcePos
forall a. a -> [Statement a] -> Statement a
MultiS SourcePos
pos [Statement SourcePos]
xs
templateP :: Monad m => Parser m (Template SourcePos)
templateP :: Parser m (Template SourcePos)
templateP = Parser m (Template SourcePos)
forall (m :: * -> *). Monad m => Parser m (Template SourcePos)
derivedTemplateP Parser m (Template SourcePos)
-> Parser m (Template SourcePos) -> Parser m (Template SourcePos)
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Parser m (Template SourcePos)
forall (m :: * -> *). Monad m => Parser m (Template SourcePos)
baseTemplateP
derivedTemplateP :: Monad m => Parser m (Template SourcePos)
derivedTemplateP :: Parser m (Template SourcePos)
derivedTemplateP = do
SourcePos
pos <- ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourcePos
forall (m :: * -> *) s u. Monad m => ParsecT s u m SourcePos
getPosition
SourceName
parentName <- ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourceName
-> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourceName
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ()
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m ()
spaces ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ()
-> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourceName
-> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourceName
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> SourceName
-> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourceName
-> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourceName
forall (m :: * -> *) a.
Monad m =>
SourceName -> Parser m a -> Parser m a
fancyTagP SourceName
"extends" ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourceName
forall (m :: * -> *). Monad m => Parser m SourceName
stringLiteralP)
Template SourcePos
parentTemplate <- SourceName -> Parser m (Template SourcePos)
forall (m :: * -> *).
Monad m =>
SourceName -> Parser m (Template SourcePos)
includeTemplate SourceName
parentName
HashMap Text (Block SourcePos)
topLevelBlocks <- [(Text, Block SourcePos)] -> HashMap Text (Block SourcePos)
forall k v. (Eq k, Hashable k) => [(k, v)] -> HashMap k v
HashMap.fromList ([(Text, Block SourcePos)] -> HashMap Text (Block SourcePos))
-> ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
[(Text, Block SourcePos)]
-> ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
(HashMap Text (Block SourcePos))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
(Text, Block SourcePos)
-> ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
[(Text, Block SourcePos)]
forall (f :: * -> *) a. Alternative f => f a -> f [a]
many ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
(Text, Block SourcePos)
forall (m :: * -> *). Monad m => Parser m (Text, Block SourcePos)
blockP
HashMap Text (Block SourcePos)
nestedBlocks <- ParseState -> HashMap Text (Block SourcePos)
psBlocks (ParseState -> HashMap Text (Block SourcePos))
-> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) ParseState
-> ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
(HashMap Text (Block SourcePos))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) ParseState
forall (m :: * -> *) s u. Monad m => ParsecT s u m u
getState
let blocks :: HashMap Text (Block SourcePos)
blocks = HashMap Text (Block SourcePos)
topLevelBlocks HashMap Text (Block SourcePos)
-> HashMap Text (Block SourcePos) -> HashMap Text (Block SourcePos)
forall a. Semigroup a => a -> a -> a
<> HashMap Text (Block SourcePos)
nestedBlocks
Template SourcePos -> Parser m (Template SourcePos)
forall (m :: * -> *) a. Monad m => a -> m a
return
Template :: forall a.
Statement a
-> HashMap Text (Block a) -> Maybe (Template a) -> Template a
Template
{ templateBody :: Statement SourcePos
templateBody = SourcePos -> Statement SourcePos
forall a. a -> Statement a
NullS SourcePos
pos
, templateParent :: Maybe (Template SourcePos)
templateParent = Template SourcePos -> Maybe (Template SourcePos)
forall a. a -> Maybe a
Just Template SourcePos
parentTemplate
, templateBlocks :: HashMap Text (Block SourcePos)
templateBlocks = HashMap Text (Block SourcePos)
blocks
}
baseTemplateP :: Monad m => Parser m (Template SourcePos)
baseTemplateP :: Parser m (Template SourcePos)
baseTemplateP = do
Statement SourcePos
body <- Parser m (Statement SourcePos)
forall (m :: * -> *). Monad m => Parser m (Statement SourcePos)
statementsP
HashMap Text (Block SourcePos)
blocks <- ParseState -> HashMap Text (Block SourcePos)
psBlocks (ParseState -> HashMap Text (Block SourcePos))
-> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) ParseState
-> ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
(HashMap Text (Block SourcePos))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) ParseState
forall (m :: * -> *) s u. Monad m => ParsecT s u m u
getState
Template SourcePos -> Parser m (Template SourcePos)
forall (m :: * -> *) a. Monad m => a -> m a
return
Template :: forall a.
Statement a
-> HashMap Text (Block a) -> Maybe (Template a) -> Template a
Template
{ templateBody :: Statement SourcePos
templateBody = Statement SourcePos
body
, templateParent :: Maybe (Template SourcePos)
templateParent = Maybe (Template SourcePos)
forall a. Maybe a
Nothing
, templateBlocks :: HashMap Text (Block SourcePos)
templateBlocks = HashMap Text (Block SourcePos)
blocks
}
isNullS :: Statement a -> Bool
isNullS (NullS a
_) = Bool
True
isNullS Statement a
_ = Bool
False
statementsP :: Monad m => Parser m (Statement SourcePos)
statementsP :: Parser m (Statement SourcePos)
statementsP = do
SourcePos
pos <- ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourcePos
forall (m :: * -> *) s u. Monad m => ParsecT s u m SourcePos
getPosition
SourcePos -> [Statement SourcePos] -> Statement SourcePos
reduceStatements SourcePos
pos ([Statement SourcePos] -> Statement SourcePos)
-> ([Statement SourcePos] -> [Statement SourcePos])
-> [Statement SourcePos]
-> Statement SourcePos
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Statement SourcePos -> Bool)
-> [Statement SourcePos] -> [Statement SourcePos]
forall a. (a -> Bool) -> [a] -> [a]
filter (Bool -> Bool
not (Bool -> Bool)
-> (Statement SourcePos -> Bool) -> Statement SourcePos -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Statement SourcePos -> Bool
forall a. Statement a -> Bool
isNullS) ([Statement SourcePos] -> Statement SourcePos)
-> ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
[Statement SourcePos]
-> Parser m (Statement SourcePos)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parser m (Statement SourcePos)
-> ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
[Statement SourcePos]
forall (f :: * -> *) a. Alternative f => f a -> f [a]
many (Parser m (Statement SourcePos) -> Parser m (Statement SourcePos)
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try Parser m (Statement SourcePos)
forall (m :: * -> *). Monad m => Parser m (Statement SourcePos)
statementP)
scriptStatementsP :: Monad m => Parser m (Statement SourcePos)
scriptStatementsP :: Parser m (Statement SourcePos)
scriptStatementsP = do
Parser m ()
forall (m :: * -> *). Monad m => Parser m ()
spacesOrComment
SourcePos
pos <- ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourcePos
forall (m :: * -> *) s u. Monad m => ParsecT s u m SourcePos
getPosition
SourcePos -> [Statement SourcePos] -> Statement SourcePos
reduceStatements SourcePos
pos ([Statement SourcePos] -> Statement SourcePos)
-> ([Statement SourcePos] -> [Statement SourcePos])
-> [Statement SourcePos]
-> Statement SourcePos
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Statement SourcePos -> Bool)
-> [Statement SourcePos] -> [Statement SourcePos]
forall a. (a -> Bool) -> [a] -> [a]
filter (Bool -> Bool
not (Bool -> Bool)
-> (Statement SourcePos -> Bool) -> Statement SourcePos -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Statement SourcePos -> Bool
forall a. Statement a -> Bool
isNullS) ([Statement SourcePos] -> Statement SourcePos)
-> ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
[Statement SourcePos]
-> Parser m (Statement SourcePos)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$>
Parser m (Statement SourcePos)
-> ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
[Statement SourcePos]
forall (f :: * -> *) a. Alternative f => f a -> f [a]
many (Parser m (Statement SourcePos) -> Parser m (Statement SourcePos)
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try Parser m (Statement SourcePos)
forall (m :: * -> *). Monad m => Parser m (Statement SourcePos)
scriptStatementP)
scriptStatementBlockP :: Monad m => Parser m (Statement SourcePos)
scriptStatementBlockP :: Parser m (Statement SourcePos)
scriptStatementBlockP = do
Char
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
'{'
Parser m ()
forall (m :: * -> *). Monad m => Parser m ()
spacesOrComment
Statement SourcePos
inner <- Parser m (Statement SourcePos)
forall (m :: * -> *). Monad m => Parser m (Statement SourcePos)
scriptStatementsP
Char
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
'}'
Parser m ()
forall (m :: * -> *). Monad m => Parser m ()
spacesOrComment
Statement SourcePos -> Parser m (Statement SourcePos)
forall (m :: * -> *) a. Monad m => a -> m a
return Statement SourcePos
inner
statementP :: Monad m => Parser m (Statement SourcePos)
statementP :: Parser m (Statement SourcePos)
statementP = Parser m (Statement SourcePos)
forall (m :: * -> *). Monad m => Parser m (Statement SourcePos)
interpolationStmtP
Parser m (Statement SourcePos)
-> Parser m (Statement SourcePos) -> Parser m (Statement SourcePos)
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Parser m (Statement SourcePos)
forall (m :: * -> *). Monad m => Parser m (Statement SourcePos)
commentStmtP
Parser m (Statement SourcePos)
-> Parser m (Statement SourcePos) -> Parser m (Statement SourcePos)
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Parser m (Statement SourcePos)
forall (m :: * -> *). Monad m => Parser m (Statement SourcePos)
tryCatchStmtP
Parser m (Statement SourcePos)
-> Parser m (Statement SourcePos) -> Parser m (Statement SourcePos)
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Parser m (Statement SourcePos)
forall (m :: * -> *). Monad m => Parser m (Statement SourcePos)
ifStmtP
Parser m (Statement SourcePos)
-> Parser m (Statement SourcePos) -> Parser m (Statement SourcePos)
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Parser m (Statement SourcePos)
forall (m :: * -> *). Monad m => Parser m (Statement SourcePos)
switchStmtP
Parser m (Statement SourcePos)
-> Parser m (Statement SourcePos) -> Parser m (Statement SourcePos)
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Parser m (Statement SourcePos)
forall (m :: * -> *). Monad m => Parser m (Statement SourcePos)
setStmtP
Parser m (Statement SourcePos)
-> Parser m (Statement SourcePos) -> Parser m (Statement SourcePos)
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Parser m (Statement SourcePos)
forall (m :: * -> *). Monad m => Parser m (Statement SourcePos)
forStmtP
Parser m (Statement SourcePos)
-> Parser m (Statement SourcePos) -> Parser m (Statement SourcePos)
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Parser m (Statement SourcePos)
forall (m :: * -> *). Monad m => Parser m (Statement SourcePos)
includeP
Parser m (Statement SourcePos)
-> Parser m (Statement SourcePos) -> Parser m (Statement SourcePos)
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Parser m (Statement SourcePos)
forall (m :: * -> *). Monad m => Parser m (Statement SourcePos)
macroStmtP
Parser m (Statement SourcePos)
-> Parser m (Statement SourcePos) -> Parser m (Statement SourcePos)
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Parser m (Statement SourcePos)
forall (m :: * -> *). Monad m => Parser m (Statement SourcePos)
blockStmtP
Parser m (Statement SourcePos)
-> Parser m (Statement SourcePos) -> Parser m (Statement SourcePos)
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Parser m (Statement SourcePos)
forall (m :: * -> *). Monad m => Parser m (Statement SourcePos)
callStmtP
Parser m (Statement SourcePos)
-> Parser m (Statement SourcePos) -> Parser m (Statement SourcePos)
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Parser m (Statement SourcePos)
forall (m :: * -> *). Monad m => Parser m (Statement SourcePos)
scopeStmtP
Parser m (Statement SourcePos)
-> Parser m (Statement SourcePos) -> Parser m (Statement SourcePos)
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Parser m (Statement SourcePos)
forall (m :: * -> *). Monad m => Parser m (Statement SourcePos)
indentStmtP
Parser m (Statement SourcePos)
-> Parser m (Statement SourcePos) -> Parser m (Statement SourcePos)
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Parser m (Statement SourcePos)
forall (m :: * -> *). Monad m => Parser m (Statement SourcePos)
scriptStmtP
Parser m (Statement SourcePos)
-> Parser m (Statement SourcePos) -> Parser m (Statement SourcePos)
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Parser m (Statement SourcePos)
forall (m :: * -> *). Monad m => Parser m (Statement SourcePos)
literalStmtP
scriptStatementP :: Monad m => Parser m (Statement SourcePos)
scriptStatementP :: Parser m (Statement SourcePos)
scriptStatementP = Parser m (Statement SourcePos)
forall (m :: * -> *). Monad m => Parser m (Statement SourcePos)
scriptStatementBlockP
Parser m (Statement SourcePos)
-> Parser m (Statement SourcePos) -> Parser m (Statement SourcePos)
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Parser m (Statement SourcePos)
forall (m :: * -> *). Monad m => Parser m (Statement SourcePos)
scriptEchoStmtP
Parser m (Statement SourcePos)
-> Parser m (Statement SourcePos) -> Parser m (Statement SourcePos)
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Parser m (Statement SourcePos)
forall (m :: * -> *). Monad m => Parser m (Statement SourcePos)
scriptIfStmtP
Parser m (Statement SourcePos)
-> Parser m (Statement SourcePos) -> Parser m (Statement SourcePos)
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Parser m (Statement SourcePos)
forall (m :: * -> *). Monad m => Parser m (Statement SourcePos)
scriptSwitchStmtP
Parser m (Statement SourcePos)
-> Parser m (Statement SourcePos) -> Parser m (Statement SourcePos)
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Parser m (Statement SourcePos)
forall (m :: * -> *). Monad m => Parser m (Statement SourcePos)
scriptSetStmtP
Parser m (Statement SourcePos)
-> Parser m (Statement SourcePos) -> Parser m (Statement SourcePos)
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Parser m (Statement SourcePos)
forall (m :: * -> *). Monad m => Parser m (Statement SourcePos)
scriptForStmtP
Parser m (Statement SourcePos)
-> Parser m (Statement SourcePos) -> Parser m (Statement SourcePos)
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Parser m (Statement SourcePos)
forall (m :: * -> *). Monad m => Parser m (Statement SourcePos)
scriptIncludeP
Parser m (Statement SourcePos)
-> Parser m (Statement SourcePos) -> Parser m (Statement SourcePos)
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Parser m (Statement SourcePos)
forall (m :: * -> *). Monad m => Parser m (Statement SourcePos)
scriptMacroStmtP
Parser m (Statement SourcePos)
-> Parser m (Statement SourcePos) -> Parser m (Statement SourcePos)
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Parser m (Statement SourcePos)
forall (m :: * -> *). Monad m => Parser m (Statement SourcePos)
scriptScopeStmtP
Parser m (Statement SourcePos)
-> Parser m (Statement SourcePos) -> Parser m (Statement SourcePos)
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Parser m (Statement SourcePos)
forall (m :: * -> *). Monad m => Parser m (Statement SourcePos)
scriptExprStmtP
interpolationStmtP :: Monad m => Parser m (Statement SourcePos)
interpolationStmtP :: Parser m (Statement SourcePos)
interpolationStmtP = do
SourcePos
pos <- ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourcePos
forall (m :: * -> *) s u. Monad m => ParsecT s u m SourcePos
getPosition
ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ()
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ()
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ()
forall (m :: * -> *). Monad m => Parser m ()
openInterpolationP
ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ()
forall (m :: * -> *). Monad m => Parser m ()
spacesOrComment
Expression SourcePos
expr <- Parser m (Expression SourcePos)
forall (m :: * -> *). Monad m => Parser m (Expression SourcePos)
expressionP
ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ()
forall (m :: * -> *). Monad m => Parser m ()
spacesOrComment
ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ()
forall (m :: * -> *). Monad m => Parser m ()
closeInterpolationP
Statement SourcePos -> Parser m (Statement SourcePos)
forall (m :: * -> *) a. Monad m => a -> m a
return (Statement SourcePos -> Parser m (Statement SourcePos))
-> Statement SourcePos -> Parser m (Statement SourcePos)
forall a b. (a -> b) -> a -> b
$ SourcePos -> Expression SourcePos -> Statement SourcePos
forall a. a -> Expression a -> Statement a
InterpolationS SourcePos
pos Expression SourcePos
expr
scriptEchoStmtP :: Monad m => Parser m (Statement SourcePos)
scriptEchoStmtP :: Parser m (Statement SourcePos)
scriptEchoStmtP = do
SourcePos
pos <- ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourcePos
forall (m :: * -> *) s u. Monad m => ParsecT s u m SourcePos
getPosition
ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourceName
-> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourceName
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourceName
-> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourceName)
-> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourceName
-> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourceName
forall a b. (a -> b) -> a -> b
$ SourceName
-> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourceName
forall (m :: * -> *). Monad m => SourceName -> Parser m SourceName
keyword SourceName
"echo"
Parser m ()
forall (m :: * -> *). Monad m => Parser m ()
spacesOrComment
Char
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
'('
Expression SourcePos
expr <- Parser m (Expression SourcePos)
forall (m :: * -> *). Monad m => Parser m (Expression SourcePos)
expressionP
Parser m ()
forall (m :: * -> *). Monad m => Parser m ()
spacesOrComment
Char
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
')'
Parser m ()
forall (m :: * -> *). Monad m => Parser m ()
spacesOrComment
Char
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
';'
Parser m ()
forall (m :: * -> *). Monad m => Parser m ()
spacesOrComment
Statement SourcePos -> Parser m (Statement SourcePos)
forall (m :: * -> *) a. Monad m => a -> m a
return (Statement SourcePos -> Parser m (Statement SourcePos))
-> Statement SourcePos -> Parser m (Statement SourcePos)
forall a b. (a -> b) -> a -> b
$ SourcePos -> Expression SourcePos -> Statement SourcePos
forall a. a -> Expression a -> Statement a
InterpolationS SourcePos
pos Expression SourcePos
expr
literalStmtP :: Monad m => Parser m (Statement SourcePos)
literalStmtP :: Parser m (Statement SourcePos)
literalStmtP = do
SourcePos
pos <- ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourcePos
forall (m :: * -> *) s u. Monad m => ParsecT s u m SourcePos
getPosition
SourceName
txt <- [SourceName] -> SourceName
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat ([SourceName] -> SourceName)
-> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) [SourceName]
-> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourceName
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourceName
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ()
-> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) [SourceName]
forall s (m :: * -> *) t u a end.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m end -> ParsecT s u m [a]
manyTill ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourceName
forall (m :: * -> *). Monad m => Parser m SourceName
literalCharsP ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ()
forall (m :: * -> *). Monad m => Parser m ()
endOfLiteralP
case SourceName
txt of
[] -> SourceName -> Parser m (Statement SourcePos)
forall s (m :: * -> *) t u a.
Stream s m t =>
SourceName -> ParsecT s u m a
unexpected SourceName
"{{"
SourceName
_ -> Statement SourcePos -> Parser m (Statement SourcePos)
forall (m :: * -> *) a. Monad m => a -> m a
return (Statement SourcePos -> Parser m (Statement SourcePos))
-> (SourceName -> Statement SourcePos)
-> SourceName
-> Parser m (Statement SourcePos)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. SourcePos -> Html -> Statement SourcePos
forall a. a -> Html -> Statement a
LiteralS SourcePos
pos (Html -> Statement SourcePos)
-> (SourceName -> Html) -> SourceName -> Statement SourcePos
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> Html
unsafeRawHtml (Text -> Html) -> (SourceName -> Text) -> SourceName -> Html
forall b c a. (b -> c) -> (a -> b) -> a -> c
. SourceName -> Text
Text.pack (SourceName -> Parser m (Statement SourcePos))
-> SourceName -> Parser m (Statement SourcePos)
forall a b. (a -> b) -> a -> b
$ SourceName
txt
literalCharsP :: Monad m => Parser m [Char]
literalCharsP :: Parser m SourceName
literalCharsP = do
Delimiters
dlims <- ParseState -> Delimiters
psDelimiters (ParseState -> Delimiters)
-> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) ParseState
-> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) Delimiters
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) ParseState
forall (m :: * -> *) s u. Monad m => ParsecT s u m u
getState
let forbiddenChars :: SourceName
forbiddenChars =
ShowS
forall a. Eq a => [a] -> [a]
nub ShowS -> ShowS -> ShowS
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ShowS
forall a. Ord a => [a] -> [a]
sort ShowS -> ShowS
forall a b. (a -> b) -> a -> b
$
SourceName
" \t\r\n" SourceName -> ShowS
forall a. [a] -> [a] -> [a]
++
Delimiters -> SourceName
delimOpenInterpolation Delimiters
dlims SourceName -> ShowS
forall a. [a] -> [a] -> [a]
++
Delimiters -> SourceName
delimOpenComment Delimiters
dlims SourceName -> ShowS
forall a. [a] -> [a] -> [a]
++
Delimiters -> SourceName
delimOpenTag Delimiters
dlims
(ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) Char
-> Parser m SourceName
forall (f :: * -> *) a. Alternative f => f a -> f [a]
some (ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) Char
-> Parser m SourceName)
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) Char
-> Parser m SourceName
forall a b. (a -> b) -> a -> b
$ SourceName
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) Char
forall s (m :: * -> *) u.
Stream s m Char =>
SourceName -> ParsecT s u m Char
noneOf SourceName
forbiddenChars) Parser m SourceName -> Parser m SourceName -> Parser m SourceName
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|>
((Char -> SourceName)
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) Char
-> Parser m SourceName
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (Char -> ShowS
forall a. a -> [a] -> [a]
:[]) ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) Char
forall (m :: * -> *). Monad m => Parser m Char
literalNewlineP) Parser m SourceName -> Parser m SourceName -> Parser m SourceName
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|>
ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) Char
-> Parser m SourceName
forall (f :: * -> *) a. Alternative f => f a -> f [a]
some ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) Char
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Char
space Parser m SourceName -> Parser m SourceName -> Parser m SourceName
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|>
((Char -> SourceName)
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) Char
-> Parser m SourceName
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (Char -> ShowS
forall a. a -> [a] -> [a]
:[]) ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) Char
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Char
anyChar)
literalNewlineP :: Monad m => Parser m Char
literalNewlineP :: Parser m Char
literalNewlineP = do
SourceName
stripStr <- ParseState -> SourceName
psStripIndent (ParseState -> SourceName)
-> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) ParseState
-> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourceName
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) ParseState
forall (m :: * -> *) s u. Monad m => ParsecT s u m u
getState
Char -> Parser m Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
'\n'
Bool
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ()
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (Bool -> Bool
not (Bool -> Bool) -> Bool -> Bool
forall a b. (a -> b) -> a -> b
$ SourceName -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null SourceName
stripStr) (ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
(Maybe SourceName)
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ()
forall (m :: * -> *) a. Monad m => m a -> m ()
ignore (ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
(Maybe SourceName)
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ())
-> (ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourceName
-> ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
(Maybe SourceName))
-> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourceName
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourceName
-> ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
(Maybe SourceName)
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional (ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourceName
-> ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
(Maybe SourceName))
-> (ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourceName
-> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourceName)
-> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourceName
-> ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
(Maybe SourceName)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourceName
-> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourceName
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourceName
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ())
-> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourceName
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ()
forall a b. (a -> b) -> a -> b
$ SourceName
-> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourceName
forall s (m :: * -> *) u.
Stream s m Char =>
SourceName -> ParsecT s u m SourceName
string SourceName
stripStr)
Char -> Parser m Char
forall (m :: * -> *) a. Monad m => a -> m a
return Char
'\n'
endOfLiteralP :: Monad m => Parser m ()
endOfLiteralP :: Parser m ()
endOfLiteralP =
(Parser m () -> Parser m ()
forall (m :: * -> *) a. Monad m => m a -> m ()
ignore (Parser m () -> Parser m ())
-> (Parser m () -> Parser m ()) -> Parser m () -> Parser m ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Parser m () -> Parser m ()
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m a
lookAhead (Parser m () -> Parser m ())
-> (Parser m () -> Parser m ()) -> Parser m () -> Parser m ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Parser m () -> Parser m ()
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (Parser m () -> Parser m ()) -> Parser m () -> Parser m ()
forall a b. (a -> b) -> a -> b
$ Parser m ()
forall (m :: * -> *). Monad m => Parser m ()
openInterpolationP) Parser m () -> Parser m () -> Parser m ()
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|>
(Parser m () -> Parser m ()
forall (m :: * -> *) a. Monad m => m a -> m ()
ignore (Parser m () -> Parser m ())
-> (Parser m () -> Parser m ()) -> Parser m () -> Parser m ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Parser m () -> Parser m ()
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m a
lookAhead (Parser m () -> Parser m ()) -> Parser m () -> Parser m ()
forall a b. (a -> b) -> a -> b
$ Parser m ()
forall (m :: * -> *). Monad m => Parser m ()
openTagP) Parser m () -> Parser m () -> Parser m ()
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|>
(Parser m () -> Parser m ()
forall (m :: * -> *) a. Monad m => m a -> m ()
ignore (Parser m () -> Parser m ())
-> (Parser m () -> Parser m ()) -> Parser m () -> Parser m ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Parser m () -> Parser m ()
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m a
lookAhead (Parser m () -> Parser m ()) -> Parser m () -> Parser m ()
forall a b. (a -> b) -> a -> b
$ Parser m ()
forall (m :: * -> *). Monad m => Parser m ()
openCommentP) Parser m () -> Parser m () -> Parser m ()
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|>
Parser m ()
forall s (m :: * -> *) t u.
(Stream s m t, Show t) =>
ParsecT s u m ()
eof
commentStmtP :: Monad m => Parser m (Statement SourcePos)
= do
SourcePos
pos <- ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourcePos
forall (m :: * -> *) s u. Monad m => ParsecT s u m SourcePos
getPosition
ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ()
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ()
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ()
forall (m :: * -> *). Monad m => Parser m ()
openCommentP
ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ()
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ()
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) [()]
forall s (m :: * -> *) t u a end.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m end -> ParsecT s u m [a]
manyTill
( (SourceName
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) Char
forall s (m :: * -> *) u.
Stream s m Char =>
SourceName -> ParsecT s u m Char
noneOf SourceName
"#" ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) Char
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ()
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ()
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> ()
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ()
forall (m :: * -> *) a. Monad m => a -> m a
return ())
ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ()
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ()
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ()
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> (ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ()
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ()
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ()
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ())
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ()
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ()
forall a b. (a -> b) -> a -> b
$ Char
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
'#' ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) Char
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ()
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ()
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) Char
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ()
forall s (m :: * -> *) t a u.
(Stream s m t, Show a) =>
ParsecT s u m a -> ParsecT s u m ()
notFollowedBy (Char
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
'}'))
)
(ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ()
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ()
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ()
forall (m :: * -> *). Monad m => Parser m ()
closeCommentP)
Statement SourcePos -> Parser m (Statement SourcePos)
forall (m :: * -> *) a. Monad m => a -> m a
return (Statement SourcePos -> Parser m (Statement SourcePos))
-> Statement SourcePos -> Parser m (Statement SourcePos)
forall a b. (a -> b) -> a -> b
$ SourcePos -> Statement SourcePos
forall a. a -> Statement a
NullS SourcePos
pos
scriptCommentP :: Monad m => Parser m ()
= do
Parser m () -> Parser m ()
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (Parser m () -> Parser m ()) -> Parser m () -> Parser m ()
forall a b. (a -> b) -> a -> b
$ Char
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
'#' ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) Char
-> Parser m () -> Parser m ()
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) Char
-> Parser m ()
forall s (m :: * -> *) t a u.
(Stream s m t, Show a) =>
ParsecT s u m a -> ParsecT s u m ()
notFollowedBy (Char
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
'}')
ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) Char
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) Char
-> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourceName
forall s (m :: * -> *) t u a end.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m end -> ParsecT s u m [a]
manyTill ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) Char
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Char
anyChar ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) Char
forall (m :: * -> *). Monad m => Parser m Char
endl
Parser m ()
forall (m :: * -> *). Monad m => Parser m ()
spacesOrComment
spacesOrComment :: Monad m => Parser m ()
= do
Parser m ()
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) [()]
forall (f :: * -> *) a. Alternative f => f a -> f [a]
many (Parser m ()
-> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) [()])
-> Parser m ()
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) [()]
forall a b. (a -> b) -> a -> b
$ Parser m ()
forall (m :: * -> *). Monad m => Parser m ()
scriptCommentP Parser m () -> Parser m () -> Parser m ()
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> (SourceName
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) Char
forall s (m :: * -> *) u.
Stream s m Char =>
SourceName -> ParsecT s u m Char
oneOf SourceName
" \t\r\n" ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) Char
-> Parser m () -> Parser m ()
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> () -> Parser m ()
forall (m :: * -> *) a. Monad m => a -> m a
return ())
() -> Parser m ()
forall (m :: * -> *) a. Monad m => a -> m a
return ()
scriptExprStmtP :: Monad m => Parser m (Statement SourcePos)
scriptExprStmtP :: Parser m (Statement SourcePos)
scriptExprStmtP = do
SourcePos
pos <- ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourcePos
forall (m :: * -> *) s u. Monad m => ParsecT s u m SourcePos
getPosition
Expression SourcePos
expr <- ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
(Expression SourcePos)
-> ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
(Expression SourcePos)
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
(Expression SourcePos)
-> ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
(Expression SourcePos))
-> ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
(Expression SourcePos)
-> ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
(Expression SourcePos)
forall a b. (a -> b) -> a -> b
$ ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
(Expression SourcePos)
forall (m :: * -> *). Monad m => Parser m (Expression SourcePos)
expressionP
Char
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
';'
Parser m ()
forall (m :: * -> *). Monad m => Parser m ()
spacesOrComment
Statement SourcePos -> Parser m (Statement SourcePos)
forall (m :: * -> *) a. Monad m => a -> m a
return (Statement SourcePos -> Parser m (Statement SourcePos))
-> Statement SourcePos -> Parser m (Statement SourcePos)
forall a b. (a -> b) -> a -> b
$ SourcePos -> Expression SourcePos -> Statement SourcePos
forall a. a -> Expression a -> Statement a
ExpressionS SourcePos
pos Expression SourcePos
expr
endl :: Monad m => Parser m Char
endl :: Parser m Char
endl = Char -> Parser m Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
'\n' Parser m Char -> Parser m Char -> Parser m Char
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> (Char -> Parser m Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
'\r' Parser m Char -> Parser m Char -> Parser m Char
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Char -> Parser m Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
'\n')
scriptStmtP :: Monad m => Parser m (Statement SourcePos)
scriptStmtP :: Parser m (Statement SourcePos)
scriptStmtP =
ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ()
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ()
-> Parser m (Statement SourcePos)
-> Parser m (Statement SourcePos)
forall s (m :: * -> *) t u open close a.
Stream s m t =>
ParsecT s u m open
-> ParsecT s u m close -> ParsecT s u m a -> ParsecT s u m a
between
(ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ()
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ()
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ()
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ())
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ()
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ()
forall a b. (a -> b) -> a -> b
$ SourceName
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ()
forall (m :: * -> *). Monad m => SourceName -> Parser m ()
simpleTagP SourceName
"script")
(SourceName
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ()
forall (m :: * -> *). Monad m => SourceName -> Parser m ()
simpleTagP SourceName
"endscript")
Parser m (Statement SourcePos)
forall (m :: * -> *). Monad m => Parser m (Statement SourcePos)
scriptStatementsP
ifStmtP :: Monad m => Parser m (Statement SourcePos)
ifStmtP :: Parser m (Statement SourcePos)
ifStmtP = do
SourcePos
pos <- ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourcePos
forall (m :: * -> *) s u. Monad m => ParsecT s u m SourcePos
getPosition
Expression SourcePos
condExpr <- SourceName
-> Parser m (Expression SourcePos)
-> Parser m (Expression SourcePos)
forall (m :: * -> *) a.
Monad m =>
SourceName -> Parser m a -> Parser m a
fancyTagP SourceName
"if" Parser m (Expression SourcePos)
forall (m :: * -> *). Monad m => Parser m (Expression SourcePos)
expressionP
Statement SourcePos
trueStmt <- Parser m (Statement SourcePos)
forall (m :: * -> *). Monad m => Parser m (Statement SourcePos)
statementsP
Statement SourcePos
falseStmt <- Parser m (Statement SourcePos)
forall (m :: * -> *). Monad m => Parser m (Statement SourcePos)
elifBranchP Parser m (Statement SourcePos)
-> Parser m (Statement SourcePos) -> Parser m (Statement SourcePos)
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Parser m (Statement SourcePos)
forall (m :: * -> *). Monad m => Parser m (Statement SourcePos)
elseBranchP Parser m (Statement SourcePos)
-> Parser m (Statement SourcePos) -> Parser m (Statement SourcePos)
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> (SourcePos -> Statement SourcePos
forall a. a -> Statement a
NullS (SourcePos -> Statement SourcePos)
-> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourcePos
-> Parser m (Statement SourcePos)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourcePos
forall (m :: * -> *) s u. Monad m => ParsecT s u m SourcePos
getPosition)
SourceName -> Parser m ()
forall (m :: * -> *). Monad m => SourceName -> Parser m ()
simpleTagP SourceName
"endif"
Statement SourcePos -> Parser m (Statement SourcePos)
forall (m :: * -> *) a. Monad m => a -> m a
return (Statement SourcePos -> Parser m (Statement SourcePos))
-> Statement SourcePos -> Parser m (Statement SourcePos)
forall a b. (a -> b) -> a -> b
$ SourcePos
-> Expression SourcePos
-> Statement SourcePos
-> Statement SourcePos
-> Statement SourcePos
forall a.
a -> Expression a -> Statement a -> Statement a -> Statement a
IfS SourcePos
pos Expression SourcePos
condExpr Statement SourcePos
trueStmt Statement SourcePos
falseStmt
elseBranchP :: Monad m => Parser m (Statement SourcePos)
elseBranchP :: Parser m (Statement SourcePos)
elseBranchP = do
ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ()
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ()
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ()
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ())
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ()
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ()
forall a b. (a -> b) -> a -> b
$ SourceName
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ()
forall (m :: * -> *). Monad m => SourceName -> Parser m ()
simpleTagP SourceName
"else"
Parser m (Statement SourcePos)
forall (m :: * -> *). Monad m => Parser m (Statement SourcePos)
statementsP
elifBranchP :: Monad m => Parser m (Statement SourcePos)
elifBranchP :: Parser m (Statement SourcePos)
elifBranchP = do
SourcePos
pos <- ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourcePos
forall (m :: * -> *) s u. Monad m => ParsecT s u m SourcePos
getPosition
Expression SourcePos
condExpr <- ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
(Expression SourcePos)
-> ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
(Expression SourcePos)
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
(Expression SourcePos)
-> ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
(Expression SourcePos))
-> ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
(Expression SourcePos)
-> ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
(Expression SourcePos)
forall a b. (a -> b) -> a -> b
$ SourceName
-> ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
(Expression SourcePos)
-> ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
(Expression SourcePos)
forall (m :: * -> *) a.
Monad m =>
SourceName -> Parser m a -> Parser m a
fancyTagP SourceName
"elif" ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
(Expression SourcePos)
forall (m :: * -> *). Monad m => Parser m (Expression SourcePos)
expressionP
Statement SourcePos
trueStmt <- Parser m (Statement SourcePos)
forall (m :: * -> *). Monad m => Parser m (Statement SourcePos)
statementsP
Statement SourcePos
falseStmt <- Parser m (Statement SourcePos)
forall (m :: * -> *). Monad m => Parser m (Statement SourcePos)
elifBranchP Parser m (Statement SourcePos)
-> Parser m (Statement SourcePos) -> Parser m (Statement SourcePos)
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Parser m (Statement SourcePos)
forall (m :: * -> *). Monad m => Parser m (Statement SourcePos)
elseBranchP Parser m (Statement SourcePos)
-> Parser m (Statement SourcePos) -> Parser m (Statement SourcePos)
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> (SourcePos -> Statement SourcePos
forall a. a -> Statement a
NullS (SourcePos -> Statement SourcePos)
-> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourcePos
-> Parser m (Statement SourcePos)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourcePos
forall (m :: * -> *) s u. Monad m => ParsecT s u m SourcePos
getPosition)
Statement SourcePos -> Parser m (Statement SourcePos)
forall (m :: * -> *) a. Monad m => a -> m a
return (Statement SourcePos -> Parser m (Statement SourcePos))
-> Statement SourcePos -> Parser m (Statement SourcePos)
forall a b. (a -> b) -> a -> b
$ SourcePos
-> Expression SourcePos
-> Statement SourcePos
-> Statement SourcePos
-> Statement SourcePos
forall a.
a -> Expression a -> Statement a -> Statement a -> Statement a
IfS SourcePos
pos Expression SourcePos
condExpr Statement SourcePos
trueStmt Statement SourcePos
falseStmt
scriptIfStmtP :: Monad m => Parser m (Statement SourcePos)
scriptIfStmtP :: Parser m (Statement SourcePos)
scriptIfStmtP = do
SourcePos
pos <- ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourcePos
forall (m :: * -> *) s u. Monad m => ParsecT s u m SourcePos
getPosition
ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourceName
-> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourceName
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourceName
-> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourceName)
-> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourceName
-> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourceName
forall a b. (a -> b) -> a -> b
$ SourceName
-> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourceName
forall (m :: * -> *). Monad m => SourceName -> Parser m SourceName
keyword SourceName
"if"
Parser m ()
forall (m :: * -> *). Monad m => Parser m ()
spacesOrComment
Char
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
'('
Expression SourcePos
condExpr <- Parser m (Expression SourcePos)
forall (m :: * -> *). Monad m => Parser m (Expression SourcePos)
expressionP
Parser m ()
forall (m :: * -> *). Monad m => Parser m ()
spacesOrComment
Char
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
')'
Parser m ()
forall (m :: * -> *). Monad m => Parser m ()
spacesOrComment
Statement SourcePos
trueStmt <- Parser m (Statement SourcePos)
forall (m :: * -> *). Monad m => Parser m (Statement SourcePos)
scriptStatementP
Parser m ()
forall (m :: * -> *). Monad m => Parser m ()
spacesOrComment
Statement SourcePos
falseStmt <- Parser m (Statement SourcePos)
forall (m :: * -> *). Monad m => Parser m (Statement SourcePos)
scriptElifP Parser m (Statement SourcePos)
-> Parser m (Statement SourcePos) -> Parser m (Statement SourcePos)
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Parser m (Statement SourcePos)
forall (m :: * -> *). Monad m => Parser m (Statement SourcePos)
scriptElseP Parser m (Statement SourcePos)
-> Parser m (Statement SourcePos) -> Parser m (Statement SourcePos)
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> (SourcePos -> Statement SourcePos
forall a. a -> Statement a
NullS (SourcePos -> Statement SourcePos)
-> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourcePos
-> Parser m (Statement SourcePos)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourcePos
forall (m :: * -> *) s u. Monad m => ParsecT s u m SourcePos
getPosition)
Statement SourcePos -> Parser m (Statement SourcePos)
forall (m :: * -> *) a. Monad m => a -> m a
return (Statement SourcePos -> Parser m (Statement SourcePos))
-> Statement SourcePos -> Parser m (Statement SourcePos)
forall a b. (a -> b) -> a -> b
$ SourcePos
-> Expression SourcePos
-> Statement SourcePos
-> Statement SourcePos
-> Statement SourcePos
forall a.
a -> Expression a -> Statement a -> Statement a -> Statement a
IfS SourcePos
pos Expression SourcePos
condExpr Statement SourcePos
trueStmt Statement SourcePos
falseStmt
scriptElseP :: Monad m => Parser m (Statement SourcePos)
scriptElseP :: Parser m (Statement SourcePos)
scriptElseP = do
ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourceName
-> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourceName
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourceName
-> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourceName)
-> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourceName
-> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourceName
forall a b. (a -> b) -> a -> b
$ SourceName
-> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourceName
forall (m :: * -> *). Monad m => SourceName -> Parser m SourceName
keyword SourceName
"else"
Parser m ()
forall (m :: * -> *). Monad m => Parser m ()
spacesOrComment
Parser m (Statement SourcePos)
forall (m :: * -> *). Monad m => Parser m (Statement SourcePos)
scriptStatementP
scriptElifP :: Monad m => Parser m (Statement SourcePos)
scriptElifP :: Parser m (Statement SourcePos)
scriptElifP = do
SourcePos
pos <- ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourcePos
forall (m :: * -> *) s u. Monad m => ParsecT s u m SourcePos
getPosition
ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourceName
-> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourceName
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourceName
-> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourceName)
-> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourceName
-> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourceName
forall a b. (a -> b) -> a -> b
$ SourceName
-> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourceName
forall (m :: * -> *). Monad m => SourceName -> Parser m SourceName
keyword SourceName
"elif"
Parser m ()
forall (m :: * -> *). Monad m => Parser m ()
spacesOrComment
Char
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
'('
Parser m ()
forall (m :: * -> *). Monad m => Parser m ()
spacesOrComment
Expression SourcePos
condExpr <- Parser m (Expression SourcePos)
forall (m :: * -> *). Monad m => Parser m (Expression SourcePos)
expressionP
Parser m ()
forall (m :: * -> *). Monad m => Parser m ()
spacesOrComment
Char
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
')'
Parser m ()
forall (m :: * -> *). Monad m => Parser m ()
spacesOrComment
Statement SourcePos
trueStmt <- Parser m (Statement SourcePos)
forall (m :: * -> *). Monad m => Parser m (Statement SourcePos)
scriptStatementP
Parser m ()
forall (m :: * -> *). Monad m => Parser m ()
spacesOrComment
Statement SourcePos
falseStmt <- Parser m (Statement SourcePos)
forall (m :: * -> *). Monad m => Parser m (Statement SourcePos)
scriptElifP Parser m (Statement SourcePos)
-> Parser m (Statement SourcePos) -> Parser m (Statement SourcePos)
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Parser m (Statement SourcePos)
forall (m :: * -> *). Monad m => Parser m (Statement SourcePos)
scriptElseP Parser m (Statement SourcePos)
-> Parser m (Statement SourcePos) -> Parser m (Statement SourcePos)
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> (SourcePos -> Statement SourcePos
forall a. a -> Statement a
NullS (SourcePos -> Statement SourcePos)
-> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourcePos
-> Parser m (Statement SourcePos)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourcePos
forall (m :: * -> *) s u. Monad m => ParsecT s u m SourcePos
getPosition)
Statement SourcePos -> Parser m (Statement SourcePos)
forall (m :: * -> *) a. Monad m => a -> m a
return (Statement SourcePos -> Parser m (Statement SourcePos))
-> Statement SourcePos -> Parser m (Statement SourcePos)
forall a b. (a -> b) -> a -> b
$ SourcePos
-> Expression SourcePos
-> Statement SourcePos
-> Statement SourcePos
-> Statement SourcePos
forall a.
a -> Expression a -> Statement a -> Statement a -> Statement a
IfS SourcePos
pos Expression SourcePos
condExpr Statement SourcePos
trueStmt Statement SourcePos
falseStmt
tryCatchStmtP :: Monad m => Parser m (Statement SourcePos)
tryCatchStmtP :: Parser m (Statement SourcePos)
tryCatchStmtP = do
SourcePos
pos <- ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourcePos
forall (m :: * -> *) s u. Monad m => ParsecT s u m SourcePos
getPosition
ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ()
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ()
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ()
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ())
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ()
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ()
forall a b. (a -> b) -> a -> b
$ SourceName
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ()
forall (m :: * -> *). Monad m => SourceName -> Parser m ()
simpleTagP SourceName
"try"
Statement SourcePos
tryS <- Parser m (Statement SourcePos)
forall (m :: * -> *). Monad m => Parser m (Statement SourcePos)
statementsP
[CatchBlock SourcePos]
catchesS <- ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
(CatchBlock SourcePos)
-> ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
[CatchBlock SourcePos]
forall (f :: * -> *) a. Alternative f => f a -> f [a]
many ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
(CatchBlock SourcePos)
forall (m :: * -> *). Monad m => Parser m (CatchBlock SourcePos)
catchBranchP
Statement SourcePos
finallyS <- Parser m (Statement SourcePos)
forall (m :: * -> *). Monad m => Parser m (Statement SourcePos)
finallyBranchP Parser m (Statement SourcePos)
-> Parser m (Statement SourcePos) -> Parser m (Statement SourcePos)
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> (SourcePos -> Statement SourcePos
forall a. a -> Statement a
NullS (SourcePos -> Statement SourcePos)
-> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourcePos
-> Parser m (Statement SourcePos)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourcePos
forall (m :: * -> *) s u. Monad m => ParsecT s u m SourcePos
getPosition)
SourceName
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ()
forall (m :: * -> *). Monad m => SourceName -> Parser m ()
simpleTagP SourceName
"endtry"
Statement SourcePos -> Parser m (Statement SourcePos)
forall (m :: * -> *) a. Monad m => a -> m a
return (Statement SourcePos -> Parser m (Statement SourcePos))
-> Statement SourcePos -> Parser m (Statement SourcePos)
forall a b. (a -> b) -> a -> b
$ SourcePos
-> Statement SourcePos
-> [CatchBlock SourcePos]
-> Statement SourcePos
-> Statement SourcePos
forall a.
a -> Statement a -> [CatchBlock a] -> Statement a -> Statement a
TryCatchS SourcePos
pos Statement SourcePos
tryS [CatchBlock SourcePos]
catchesS Statement SourcePos
finallyS
catchBranchP :: Monad m => Parser m (CatchBlock SourcePos)
catchBranchP :: Parser m (CatchBlock SourcePos)
catchBranchP = do
(Maybe Text
what, Maybe Text
captureName) <- ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
(Maybe Text, Maybe Text)
-> ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
(Maybe Text, Maybe Text)
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
(Maybe Text, Maybe Text)
-> ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
(Maybe Text, Maybe Text))
-> ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
(Maybe Text, Maybe Text)
-> ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
(Maybe Text, Maybe Text)
forall a b. (a -> b) -> a -> b
$
SourceName
-> ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
(Maybe Text, Maybe Text)
-> ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
(Maybe Text, Maybe Text)
forall (m :: * -> *) a.
Monad m =>
SourceName -> Parser m a -> Parser m a
fancyTagP SourceName
"catch" (ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
(Maybe Text, Maybe Text)
-> ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
(Maybe Text, Maybe Text)
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
(Maybe Text, Maybe Text)
forall (m :: * -> *). Monad m => Parser m (Maybe Text, Maybe Text)
catchHeaderP ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
(Maybe Text, Maybe Text)
-> ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
(Maybe Text, Maybe Text)
-> ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
(Maybe Text, Maybe Text)
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> (Maybe Text, Maybe Text)
-> ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
(Maybe Text, Maybe Text)
forall (m :: * -> *) a. Monad m => a -> m a
return (Maybe Text
forall a. Maybe a
Nothing, Maybe Text
forall a. Maybe a
Nothing))
Statement SourcePos
body <- Parser m (Statement SourcePos)
forall (m :: * -> *). Monad m => Parser m (Statement SourcePos)
statementsP
CatchBlock SourcePos -> Parser m (CatchBlock SourcePos)
forall (m :: * -> *) a. Monad m => a -> m a
return (CatchBlock SourcePos -> Parser m (CatchBlock SourcePos))
-> CatchBlock SourcePos -> Parser m (CatchBlock SourcePos)
forall a b. (a -> b) -> a -> b
$ Maybe Text
-> Maybe Text -> Statement SourcePos -> CatchBlock SourcePos
forall a. Maybe Text -> Maybe Text -> Statement a -> CatchBlock a
Catch Maybe Text
what Maybe Text
captureName Statement SourcePos
body
suchThat :: Monad m => (a -> Bool) -> Parser m a -> Parser m a
suchThat :: (a -> Bool) -> Parser m a -> Parser m a
suchThat a -> Bool
p Parser m a
action = do
a
val <- Parser m a
action
if a -> Bool
p a
val then a -> Parser m a
forall (m :: * -> *) a. Monad m => a -> m a
return a
val else SourceName -> Parser m a
forall (m :: * -> *) a. MonadFail m => SourceName -> m a
fail SourceName
"Requirement not met"
catchHeaderP :: Monad m => Parser m (Maybe Text, Maybe VarName)
= do
ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ()
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m ()
spaces
Maybe Text
what <- Parser m (Maybe Text)
forall (m :: * -> *). Monad m => Parser m (Maybe Text)
catchWhatP
ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ()
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m ()
spaces
Maybe Text
captureName <- Parser m (Maybe Text)
forall (m :: * -> *). Monad m => Parser m (Maybe Text)
catchCaptureP
(Maybe Text, Maybe Text) -> Parser m (Maybe Text, Maybe Text)
forall (m :: * -> *) a. Monad m => a -> m a
return ((Maybe Text, Maybe Text) -> Parser m (Maybe Text, Maybe Text))
-> (Maybe Text, Maybe Text) -> Parser m (Maybe Text, Maybe Text)
forall a b. (a -> b) -> a -> b
$ (Maybe Text
what, Maybe Text
captureName)
catchWhatP :: Monad m => Parser m (Maybe Text)
catchWhatP :: Parser m (Maybe Text)
catchWhatP =
(Maybe Text
forall a. Maybe a
Nothing Maybe Text
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) Char
-> Parser m (Maybe Text)
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ Char
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
'*') Parser m (Maybe Text)
-> Parser m (Maybe Text) -> Parser m (Maybe Text)
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|>
(Text -> Maybe Text
forall a. a -> Maybe a
Just (Text -> Maybe Text)
-> (SourceName -> Text) -> SourceName -> Maybe Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. SourceName -> Text
Text.pack (SourceName -> Maybe Text)
-> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourceName
-> Parser m (Maybe Text)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourceName
-> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourceName
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourceName
forall (m :: * -> *). Monad m => Parser m SourceName
stringLiteralP) Parser m (Maybe Text)
-> Parser m (Maybe Text) -> Parser m (Maybe Text)
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|>
(Text -> Maybe Text
forall a. a -> Maybe a
Just (Text -> Maybe Text)
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) Text
-> Parser m (Maybe Text)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) Text
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) Text
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) Text
forall (m :: * -> *). Monad m => Parser m Text
identifierP)
catchCaptureP :: Monad m => Parser m (Maybe VarName)
catchCaptureP :: Parser m (Maybe Text)
catchCaptureP = ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) Text
-> Parser m (Maybe Text)
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m (Maybe a)
optionMaybe (ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) Text
-> Parser m (Maybe Text))
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) Text
-> Parser m (Maybe Text)
forall a b. (a -> b) -> a -> b
$ do
ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ()
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ()
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (SourceName
-> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourceName
forall s (m :: * -> *) u.
Stream s m Char =>
SourceName -> ParsecT s u m SourceName
string SourceName
"as" ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourceName
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ()
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ()
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) Char
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ()
forall s (m :: * -> *) t a u.
(Stream s m t, Show a) =>
ParsecT s u m a -> ParsecT s u m ()
notFollowedBy ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) Char
forall (m :: * -> *). Monad m => Parser m Char
identCharP)
ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ()
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m ()
spaces
ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) Text
forall (m :: * -> *). Monad m => Parser m Text
identifierP
finallyBranchP :: Monad m => Parser m (Statement SourcePos)
finallyBranchP :: Parser m (Statement SourcePos)
finallyBranchP = do
ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ()
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ()
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ()
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ())
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ()
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ()
forall a b. (a -> b) -> a -> b
$ SourceName
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ()
forall (m :: * -> *). Monad m => SourceName -> Parser m ()
simpleTagP SourceName
"finally"
Parser m (Statement SourcePos)
forall (m :: * -> *). Monad m => Parser m (Statement SourcePos)
statementsP
switchStmtP :: Monad m => Parser m (Statement SourcePos)
switchStmtP :: Parser m (Statement SourcePos)
switchStmtP = do
SourcePos
pos <- ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourcePos
forall (m :: * -> *) s u. Monad m => ParsecT s u m SourcePos
getPosition
Expression SourcePos
pivotExpr <- ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
(Expression SourcePos)
-> ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
(Expression SourcePos)
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
(Expression SourcePos)
-> ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
(Expression SourcePos))
-> ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
(Expression SourcePos)
-> ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
(Expression SourcePos)
forall a b. (a -> b) -> a -> b
$ SourceName
-> ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
(Expression SourcePos)
-> ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
(Expression SourcePos)
forall (m :: * -> *) a.
Monad m =>
SourceName -> Parser m a -> Parser m a
fancyTagP SourceName
"switch" ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
(Expression SourcePos)
forall (m :: * -> *). Monad m => Parser m (Expression SourcePos)
expressionP
[(Expression SourcePos, Statement SourcePos)]
cases <- ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
(Expression SourcePos, Statement SourcePos)
-> ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
[(Expression SourcePos, Statement SourcePos)]
forall (f :: * -> *) a. Alternative f => f a -> f [a]
many ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
(Expression SourcePos, Statement SourcePos)
forall (m :: * -> *).
Monad m =>
Parser m (Expression SourcePos, Statement SourcePos)
switchCaseP
Statement SourcePos
def <- Parser m (Statement SourcePos)
forall (m :: * -> *). Monad m => Parser m (Statement SourcePos)
switchDefaultP Parser m (Statement SourcePos)
-> Parser m (Statement SourcePos) -> Parser m (Statement SourcePos)
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> (SourcePos -> Statement SourcePos
forall a. a -> Statement a
NullS (SourcePos -> Statement SourcePos)
-> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourcePos
-> Parser m (Statement SourcePos)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourcePos
forall (m :: * -> *) s u. Monad m => ParsecT s u m SourcePos
getPosition)
SourceName -> Parser m ()
forall (m :: * -> *). Monad m => SourceName -> Parser m ()
simpleTagP SourceName
"endswitch"
Statement SourcePos -> Parser m (Statement SourcePos)
forall (m :: * -> *) a. Monad m => a -> m a
return (Statement SourcePos -> Parser m (Statement SourcePos))
-> Statement SourcePos -> Parser m (Statement SourcePos)
forall a b. (a -> b) -> a -> b
$ SourcePos
-> Expression SourcePos
-> [(Expression SourcePos, Statement SourcePos)]
-> Statement SourcePos
-> Statement SourcePos
forall a.
a
-> Expression a
-> [(Expression a, Statement a)]
-> Statement a
-> Statement a
SwitchS SourcePos
pos Expression SourcePos
pivotExpr [(Expression SourcePos, Statement SourcePos)]
cases Statement SourcePos
def
switchCaseP :: Monad m => Parser m ((Expression SourcePos), (Statement SourcePos))
switchCaseP :: Parser m (Expression SourcePos, Statement SourcePos)
switchCaseP = do
Expression SourcePos
cmpExpr <- ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
(Expression SourcePos)
-> ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
(Expression SourcePos)
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
(Expression SourcePos)
-> ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
(Expression SourcePos))
-> ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
(Expression SourcePos)
-> ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
(Expression SourcePos)
forall a b. (a -> b) -> a -> b
$ SourceName
-> ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
(Expression SourcePos)
-> ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
(Expression SourcePos)
forall (m :: * -> *) a.
Monad m =>
SourceName -> Parser m a -> Parser m a
fancyTagP SourceName
"case" ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
(Expression SourcePos)
forall (m :: * -> *). Monad m => Parser m (Expression SourcePos)
expressionP
Statement SourcePos
body <- Parser m (Statement SourcePos)
forall (m :: * -> *). Monad m => Parser m (Statement SourcePos)
statementsP
SourceName -> Parser m ()
forall (m :: * -> *). Monad m => SourceName -> Parser m ()
simpleTagP SourceName
"endcase"
(Expression SourcePos, Statement SourcePos)
-> Parser m (Expression SourcePos, Statement SourcePos)
forall (m :: * -> *) a. Monad m => a -> m a
return (Expression SourcePos
cmpExpr, Statement SourcePos
body)
switchDefaultP :: Monad m => Parser m (Statement SourcePos)
switchDefaultP :: Parser m (Statement SourcePos)
switchDefaultP = do
ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ()
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ()
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (SourceName
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ()
forall (m :: * -> *). Monad m => SourceName -> Parser m ()
simpleTagP SourceName
"default") ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ()
-> Parser m (Statement SourcePos) -> Parser m (Statement SourcePos)
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser m (Statement SourcePos)
forall (m :: * -> *). Monad m => Parser m (Statement SourcePos)
statementsP Parser m (Statement SourcePos)
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ()
-> Parser m (Statement SourcePos)
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* SourceName
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ()
forall (m :: * -> *). Monad m => SourceName -> Parser m ()
simpleTagP SourceName
"enddefault"
scriptSwitchStmtP :: Monad m => Parser m (Statement SourcePos)
scriptSwitchStmtP :: Parser m (Statement SourcePos)
scriptSwitchStmtP = do
SourcePos
pos <- ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourcePos
forall (m :: * -> *) s u. Monad m => ParsecT s u m SourcePos
getPosition
ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourceName
-> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourceName
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourceName
-> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourceName)
-> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourceName
-> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourceName
forall a b. (a -> b) -> a -> b
$ SourceName
-> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourceName
forall (m :: * -> *). Monad m => SourceName -> Parser m SourceName
keyword SourceName
"switch"
Parser m ()
forall (m :: * -> *). Monad m => Parser m ()
spacesOrComment
Char
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
'('
Parser m ()
forall (m :: * -> *). Monad m => Parser m ()
spacesOrComment
Expression SourcePos
pivotExpr <- Parser m (Expression SourcePos)
forall (m :: * -> *). Monad m => Parser m (Expression SourcePos)
expressionP
Parser m ()
forall (m :: * -> *). Monad m => Parser m ()
spacesOrComment
Char
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
')'
Parser m ()
forall (m :: * -> *). Monad m => Parser m ()
spacesOrComment
Char
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
'{'
Parser m ()
forall (m :: * -> *). Monad m => Parser m ()
spacesOrComment
[(Expression SourcePos, Statement SourcePos)]
cases <- ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
(Expression SourcePos, Statement SourcePos)
-> ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
[(Expression SourcePos, Statement SourcePos)]
forall (f :: * -> *) a. Alternative f => f a -> f [a]
many ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
(Expression SourcePos, Statement SourcePos)
forall (m :: * -> *).
Monad m =>
Parser m (Expression SourcePos, Statement SourcePos)
scriptSwitchCaseP
Statement SourcePos
def <- Parser m (Statement SourcePos)
forall (m :: * -> *). Monad m => Parser m (Statement SourcePos)
scriptSwitchDefaultP Parser m (Statement SourcePos)
-> Parser m (Statement SourcePos) -> Parser m (Statement SourcePos)
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> (SourcePos -> Statement SourcePos
forall a. a -> Statement a
NullS (SourcePos -> Statement SourcePos)
-> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourcePos
-> Parser m (Statement SourcePos)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourcePos
forall (m :: * -> *) s u. Monad m => ParsecT s u m SourcePos
getPosition)
Parser m ()
forall (m :: * -> *). Monad m => Parser m ()
spacesOrComment
Char
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
'}'
Parser m ()
forall (m :: * -> *). Monad m => Parser m ()
spacesOrComment
Statement SourcePos -> Parser m (Statement SourcePos)
forall (m :: * -> *) a. Monad m => a -> m a
return (Statement SourcePos -> Parser m (Statement SourcePos))
-> Statement SourcePos -> Parser m (Statement SourcePos)
forall a b. (a -> b) -> a -> b
$ SourcePos
-> Expression SourcePos
-> [(Expression SourcePos, Statement SourcePos)]
-> Statement SourcePos
-> Statement SourcePos
forall a.
a
-> Expression a
-> [(Expression a, Statement a)]
-> Statement a
-> Statement a
SwitchS SourcePos
pos Expression SourcePos
pivotExpr [(Expression SourcePos, Statement SourcePos)]
cases Statement SourcePos
def
scriptSwitchCaseP :: Monad m => Parser m ((Expression SourcePos), (Statement SourcePos))
scriptSwitchCaseP :: Parser m (Expression SourcePos, Statement SourcePos)
scriptSwitchCaseP = do
ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourceName
-> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourceName
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourceName
-> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourceName)
-> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourceName
-> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourceName
forall a b. (a -> b) -> a -> b
$ SourceName
-> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourceName
forall (m :: * -> *). Monad m => SourceName -> Parser m SourceName
keyword SourceName
"case"
Parser m ()
forall (m :: * -> *). Monad m => Parser m ()
spacesOrComment
Expression SourcePos
cmpExpr <- Parser m (Expression SourcePos)
forall (m :: * -> *). Monad m => Parser m (Expression SourcePos)
expressionP
Parser m ()
forall (m :: * -> *). Monad m => Parser m ()
spacesOrComment
Char
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
':'
Parser m ()
forall (m :: * -> *). Monad m => Parser m ()
spacesOrComment
Statement SourcePos
body <- Parser m (Statement SourcePos)
forall (m :: * -> *). Monad m => Parser m (Statement SourcePos)
scriptStatementP
Parser m ()
forall (m :: * -> *). Monad m => Parser m ()
spacesOrComment
(Expression SourcePos, Statement SourcePos)
-> Parser m (Expression SourcePos, Statement SourcePos)
forall (m :: * -> *) a. Monad m => a -> m a
return (Expression SourcePos
cmpExpr, Statement SourcePos
body)
scriptSwitchDefaultP :: Monad m => Parser m (Statement SourcePos)
scriptSwitchDefaultP :: Parser m (Statement SourcePos)
scriptSwitchDefaultP = do
ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourceName
-> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourceName
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourceName
-> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourceName)
-> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourceName
-> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourceName
forall a b. (a -> b) -> a -> b
$ SourceName
-> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourceName
forall (m :: * -> *). Monad m => SourceName -> Parser m SourceName
keyword SourceName
"default"
Parser m ()
forall (m :: * -> *). Monad m => Parser m ()
spacesOrComment
Char
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
':'
Parser m ()
forall (m :: * -> *). Monad m => Parser m ()
spacesOrComment
Statement SourcePos
body <- Parser m (Statement SourcePos)
forall (m :: * -> *). Monad m => Parser m (Statement SourcePos)
scriptStatementP
Parser m ()
forall (m :: * -> *). Monad m => Parser m ()
spacesOrComment
Statement SourcePos -> Parser m (Statement SourcePos)
forall (m :: * -> *) a. Monad m => a -> m a
return Statement SourcePos
body
setStmtP :: Monad m => Parser m (Statement SourcePos)
setStmtP :: Parser m (Statement SourcePos)
setStmtP = do
SourcePos
pos <- ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourcePos
forall (m :: * -> *) s u. Monad m => ParsecT s u m SourcePos
getPosition
SourceName
-> Parser m (Statement SourcePos) -> Parser m (Statement SourcePos)
forall (m :: * -> *) a.
Monad m =>
SourceName -> Parser m a -> Parser m a
fancyTagP SourceName
"set" (SourcePos -> Parser m (Statement SourcePos)
forall (m :: * -> *).
Monad m =>
SourcePos -> Parser m (Statement SourcePos)
setStmtInnerP SourcePos
pos)
setStmtInnerP :: Monad m => SourcePos -> Parser m (Statement SourcePos)
setStmtInnerP :: SourcePos -> Parser m (Statement SourcePos)
setStmtInnerP SourcePos
pos = do
Text
name <- Parser m Text
forall (m :: * -> *). Monad m => Parser m Text
identifierP
Parser m ()
forall (m :: * -> *). Monad m => Parser m ()
spacesOrComment
Char
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
'='
Parser m ()
forall (m :: * -> *). Monad m => Parser m ()
spacesOrComment
Expression SourcePos
val <- Parser m (Expression SourcePos)
forall (m :: * -> *). Monad m => Parser m (Expression SourcePos)
expressionP
Parser m ()
forall (m :: * -> *). Monad m => Parser m ()
spacesOrComment
Statement SourcePos -> Parser m (Statement SourcePos)
forall (m :: * -> *) a. Monad m => a -> m a
return (Statement SourcePos -> Parser m (Statement SourcePos))
-> Statement SourcePos -> Parser m (Statement SourcePos)
forall a b. (a -> b) -> a -> b
$ SourcePos -> Text -> Expression SourcePos -> Statement SourcePos
forall a. a -> Text -> Expression a -> Statement a
SetVarS SourcePos
pos Text
name Expression SourcePos
val
scriptSetStmtP :: Monad m => Parser m (Statement SourcePos)
scriptSetStmtP :: Parser m (Statement SourcePos)
scriptSetStmtP = do
SourcePos
pos <- ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourcePos
forall (m :: * -> *) s u. Monad m => ParsecT s u m SourcePos
getPosition
ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourceName
-> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourceName
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourceName
-> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourceName)
-> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourceName
-> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourceName
forall a b. (a -> b) -> a -> b
$ SourceName
-> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourceName
forall (m :: * -> *). Monad m => SourceName -> Parser m SourceName
keyword SourceName
"set"
Parser m ()
forall (m :: * -> *). Monad m => Parser m ()
spacesOrComment
Text
name <- Parser m Text
forall (m :: * -> *). Monad m => Parser m Text
identifierP
Parser m ()
forall (m :: * -> *). Monad m => Parser m ()
spacesOrComment
Char
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
'='
Parser m ()
forall (m :: * -> *). Monad m => Parser m ()
spacesOrComment
Expression SourcePos
val <- Parser m (Expression SourcePos)
forall (m :: * -> *). Monad m => Parser m (Expression SourcePos)
expressionP
Parser m ()
forall (m :: * -> *). Monad m => Parser m ()
spacesOrComment
Char
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
';'
Parser m ()
forall (m :: * -> *). Monad m => Parser m ()
spacesOrComment
Statement SourcePos -> Parser m (Statement SourcePos)
forall (m :: * -> *) a. Monad m => a -> m a
return (Statement SourcePos -> Parser m (Statement SourcePos))
-> Statement SourcePos -> Parser m (Statement SourcePos)
forall a b. (a -> b) -> a -> b
$ SourcePos -> Text -> Expression SourcePos -> Statement SourcePos
forall a. a -> Text -> Expression a -> Statement a
SetVarS SourcePos
pos Text
name Expression SourcePos
val
defineBlock :: VarName -> Block SourcePos -> ParseState -> ParseState
defineBlock :: Text -> Block SourcePos -> ParseState -> ParseState
defineBlock Text
name Block SourcePos
block ParseState
s =
ParseState
s { psBlocks :: HashMap Text (Block SourcePos)
psBlocks = Text
-> Block SourcePos
-> HashMap Text (Block SourcePos)
-> HashMap Text (Block SourcePos)
forall k v.
(Eq k, Hashable k) =>
k -> v -> HashMap k v -> HashMap k v
HashMap.insert Text
name Block SourcePos
block (ParseState -> HashMap Text (Block SourcePos)
psBlocks ParseState
s) }
blockStmtP :: Monad m => Parser m (Statement SourcePos)
blockStmtP :: Parser m (Statement SourcePos)
blockStmtP = do
SourcePos
pos <- ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourcePos
forall (m :: * -> *) s u. Monad m => ParsecT s u m SourcePos
getPosition
(Text
name, Block SourcePos
block) <- Parser m (Text, Block SourcePos)
forall (m :: * -> *). Monad m => Parser m (Text, Block SourcePos)
blockP
(ParseState -> ParseState)
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ()
forall (m :: * -> *) u s. Monad m => (u -> u) -> ParsecT s u m ()
modifyState (Text -> Block SourcePos -> ParseState -> ParseState
defineBlock Text
name Block SourcePos
block)
Statement SourcePos -> Parser m (Statement SourcePos)
forall (m :: * -> *) a. Monad m => a -> m a
return (Statement SourcePos -> Parser m (Statement SourcePos))
-> Statement SourcePos -> Parser m (Statement SourcePos)
forall a b. (a -> b) -> a -> b
$ SourcePos -> Text -> Statement SourcePos
forall a. a -> Text -> Statement a
BlockRefS SourcePos
pos Text
name
blockP :: Monad m => Parser m (VarName, (Block SourcePos))
blockP :: Parser m (Text, Block SourcePos)
blockP = do
Text
name <- SourceName -> Parser m Text -> Parser m Text
forall (m :: * -> *) a.
Monad m =>
SourceName -> Parser m a -> Parser m a
fancyTagP SourceName
"block" Parser m Text
forall (m :: * -> *). Monad m => Parser m Text
identifierP
Statement SourcePos
body <- Parser m (Statement SourcePos)
forall (m :: * -> *). Monad m => Parser m (Statement SourcePos)
statementsP
SourceName -> Parser m (Maybe ()) -> Parser m (Maybe ())
forall (m :: * -> *) a.
Monad m =>
SourceName -> Parser m a -> Parser m a
fancyTagP SourceName
"endblock" (ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ()
-> Parser m (Maybe ())
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional (ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ()
-> Parser m (Maybe ()))
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ()
-> Parser m (Maybe ())
forall a b. (a -> b) -> a -> b
$ SourceName
-> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourceName
forall s (m :: * -> *) u.
Stream s m Char =>
SourceName -> ParsecT s u m SourceName
string (Text -> SourceName
Text.unpack Text
name) ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourceName
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ()
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ()
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ()
forall (m :: * -> *). Monad m => Parser m ()
spacesOrComment)
(Text, Block SourcePos) -> Parser m (Text, Block SourcePos)
forall (m :: * -> *) a. Monad m => a -> m a
return (Text
name, Statement SourcePos -> Block SourcePos
forall a. Statement a -> Block a
Block Statement SourcePos
body)
macroStmtP :: Monad m => Parser m (Statement SourcePos)
macroStmtP :: Parser m (Statement SourcePos)
macroStmtP = do
SourcePos
pos <- ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourcePos
forall (m :: * -> *) s u. Monad m => ParsecT s u m SourcePos
getPosition
(Text
name, [Text]
args) <- ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) (Text, [Text])
-> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) (Text, [Text])
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) (Text, [Text])
-> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) (Text, [Text]))
-> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) (Text, [Text])
-> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) (Text, [Text])
forall a b. (a -> b) -> a -> b
$ SourceName
-> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) (Text, [Text])
-> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) (Text, [Text])
forall (m :: * -> *) a.
Monad m =>
SourceName -> Parser m a -> Parser m a
fancyTagP SourceName
"macro" ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) (Text, [Text])
forall (m :: * -> *). Monad m => Parser m (Text, [Text])
macroHeadP
Statement SourcePos
body <- Parser m (Statement SourcePos)
forall (m :: * -> *). Monad m => Parser m (Statement SourcePos)
statementsP
SourceName -> Parser m (Maybe ()) -> Parser m (Maybe ())
forall (m :: * -> *) a.
Monad m =>
SourceName -> Parser m a -> Parser m a
fancyTagP SourceName
"endmacro" (ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ()
-> Parser m (Maybe ())
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional (ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ()
-> Parser m (Maybe ()))
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ()
-> Parser m (Maybe ())
forall a b. (a -> b) -> a -> b
$ SourceName
-> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourceName
forall s (m :: * -> *) u.
Stream s m Char =>
SourceName -> ParsecT s u m SourceName
string (Text -> SourceName
Text.unpack Text
name) ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourceName
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ()
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ()
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ()
forall (m :: * -> *). Monad m => Parser m ()
spacesOrComment)
Statement SourcePos -> Parser m (Statement SourcePos)
forall (m :: * -> *) a. Monad m => a -> m a
return (Statement SourcePos -> Parser m (Statement SourcePos))
-> Statement SourcePos -> Parser m (Statement SourcePos)
forall a b. (a -> b) -> a -> b
$ SourcePos -> Text -> Macro SourcePos -> Statement SourcePos
forall a. a -> Text -> Macro a -> Statement a
DefMacroS SourcePos
pos Text
name ([Text] -> Statement SourcePos -> Macro SourcePos
forall a. [Text] -> Statement a -> Macro a
Macro [Text]
args Statement SourcePos
body)
scriptMacroStmtP :: Monad m => Parser m (Statement SourcePos)
scriptMacroStmtP :: Parser m (Statement SourcePos)
scriptMacroStmtP = do
SourcePos
pos <- ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourcePos
forall (m :: * -> *) s u. Monad m => ParsecT s u m SourcePos
getPosition
ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourceName
-> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourceName
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourceName
-> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourceName)
-> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourceName
-> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourceName
forall a b. (a -> b) -> a -> b
$ SourceName
-> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourceName
forall (m :: * -> *). Monad m => SourceName -> Parser m SourceName
keyword SourceName
"macro"
Parser m ()
forall (m :: * -> *). Monad m => Parser m ()
spacesOrComment
Text
name <- Parser m Text
forall (m :: * -> *). Monad m => Parser m Text
identifierP
Parser m ()
forall (m :: * -> *). Monad m => Parser m ()
spacesOrComment
[Text]
args <- [Text]
-> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) [Text]
-> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) [Text]
forall s (m :: * -> *) t a u.
Stream s m t =>
a -> ParsecT s u m a -> ParsecT s u m a
option [] (ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) [Text]
-> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) [Text])
-> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) [Text]
-> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) [Text]
forall a b. (a -> b) -> a -> b
$ SourceName
-> SourceName
-> Parser m Text
-> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) [Text]
forall (m :: * -> *) a.
Monad m =>
SourceName -> SourceName -> Parser m a -> Parser m [a]
groupP SourceName
"(" SourceName
")" Parser m Text
forall (m :: * -> *). Monad m => Parser m Text
identifierP
Parser m ()
forall (m :: * -> *). Monad m => Parser m ()
spacesOrComment
Statement SourcePos
body <- Parser m (Statement SourcePos)
forall (m :: * -> *). Monad m => Parser m (Statement SourcePos)
scriptStatementP
Parser m ()
forall (m :: * -> *). Monad m => Parser m ()
spacesOrComment
Statement SourcePos -> Parser m (Statement SourcePos)
forall (m :: * -> *) a. Monad m => a -> m a
return (Statement SourcePos -> Parser m (Statement SourcePos))
-> Statement SourcePos -> Parser m (Statement SourcePos)
forall a b. (a -> b) -> a -> b
$ SourcePos -> Text -> Macro SourcePos -> Statement SourcePos
forall a. a -> Text -> Macro a -> Statement a
DefMacroS SourcePos
pos Text
name ([Text] -> Statement SourcePos -> Macro SourcePos
forall a. [Text] -> Statement a -> Macro a
Macro [Text]
args Statement SourcePos
body)
macroHeadP :: Monad m => Parser m (VarName, [VarName])
macroHeadP :: Parser m (Text, [Text])
macroHeadP = do
Text
name <- Parser m Text
forall (m :: * -> *). Monad m => Parser m Text
identifierP
Parser m ()
forall (m :: * -> *). Monad m => Parser m ()
spacesOrComment
[Text]
args <- [Text]
-> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) [Text]
-> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) [Text]
forall s (m :: * -> *) t a u.
Stream s m t =>
a -> ParsecT s u m a -> ParsecT s u m a
option [] (ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) [Text]
-> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) [Text])
-> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) [Text]
-> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) [Text]
forall a b. (a -> b) -> a -> b
$ SourceName
-> SourceName
-> Parser m Text
-> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) [Text]
forall (m :: * -> *) a.
Monad m =>
SourceName -> SourceName -> Parser m a -> Parser m [a]
groupP SourceName
"(" SourceName
")" Parser m Text
forall (m :: * -> *). Monad m => Parser m Text
identifierP
Parser m ()
forall (m :: * -> *). Monad m => Parser m ()
spacesOrComment
(Text, [Text]) -> Parser m (Text, [Text])
forall (m :: * -> *) a. Monad m => a -> m a
return (Text
name, [Text]
args)
callStmtP :: Monad m => Parser m (Statement SourcePos)
callStmtP :: Parser m (Statement SourcePos)
callStmtP = do
SourcePos
pos <- ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourcePos
forall (m :: * -> *) s u. Monad m => ParsecT s u m SourcePos
getPosition
([Text]
callerArgs, Expression SourcePos
call) <- ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
([Text], Expression SourcePos)
-> ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
([Text], Expression SourcePos)
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
([Text], Expression SourcePos)
-> ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
([Text], Expression SourcePos))
-> ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
([Text], Expression SourcePos)
-> ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
([Text], Expression SourcePos)
forall a b. (a -> b) -> a -> b
$ SourceName
-> ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
([Text], Expression SourcePos)
-> ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
([Text], Expression SourcePos)
forall (m :: * -> *) a.
Monad m =>
SourceName -> Parser m a -> Parser m a
fancyTagP SourceName
"call" ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
([Text], Expression SourcePos)
forall (m :: * -> *).
Monad m =>
Parser m ([Text], Expression SourcePos)
callHeadP
Statement SourcePos
body <- Parser m (Statement SourcePos)
forall (m :: * -> *). Monad m => Parser m (Statement SourcePos)
statementsP
SourceName -> Parser m ()
forall (m :: * -> *). Monad m => SourceName -> Parser m ()
simpleTagP SourceName
"endcall"
Statement SourcePos -> Parser m (Statement SourcePos)
forall (m :: * -> *) a. Monad m => a -> m a
return (
SourcePos -> Statement SourcePos -> Statement SourcePos
forall a. a -> Statement a -> Statement a
ScopedS SourcePos
pos (
SourcePos -> [Statement SourcePos] -> Statement SourcePos
forall a. a -> [Statement a] -> Statement a
MultiS SourcePos
pos
[ SourcePos -> Text -> Macro SourcePos -> Statement SourcePos
forall a. a -> Text -> Macro a -> Statement a
DefMacroS SourcePos
pos Text
"caller" ([Text] -> Statement SourcePos -> Macro SourcePos
forall a. [Text] -> Statement a -> Macro a
Macro [Text]
callerArgs Statement SourcePos
body)
, SourcePos -> Expression SourcePos -> Statement SourcePos
forall a. a -> Expression a -> Statement a
InterpolationS SourcePos
pos Expression SourcePos
call
]))
callHeadP :: Monad m => Parser m ([Text], (Expression SourcePos))
callHeadP :: Parser m ([Text], Expression SourcePos)
callHeadP = do
[Text]
callerArgs <- [Text]
-> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) [Text]
-> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) [Text]
forall s (m :: * -> *) t a u.
Stream s m t =>
a -> ParsecT s u m a -> ParsecT s u m a
option [] (ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) [Text]
-> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) [Text])
-> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) [Text]
-> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) [Text]
forall a b. (a -> b) -> a -> b
$ SourceName
-> SourceName
-> Parser m Text
-> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) [Text]
forall (m :: * -> *) a.
Monad m =>
SourceName -> SourceName -> Parser m a -> Parser m [a]
groupP SourceName
"(" SourceName
")" Parser m Text
forall (m :: * -> *). Monad m => Parser m Text
identifierP
Parser m ()
forall (m :: * -> *). Monad m => Parser m ()
spacesOrComment
Expression SourcePos
call <- Parser m (Expression SourcePos)
forall (m :: * -> *). Monad m => Parser m (Expression SourcePos)
expressionP
Parser m ()
forall (m :: * -> *). Monad m => Parser m ()
spacesOrComment
([Text], Expression SourcePos)
-> Parser m ([Text], Expression SourcePos)
forall (m :: * -> *) a. Monad m => a -> m a
return ([Text]
callerArgs, Expression SourcePos
call)
scopeStmtP :: Monad m => Parser m (Statement SourcePos)
scopeStmtP :: Parser m (Statement SourcePos)
scopeStmtP =
SourcePos -> Statement SourcePos -> Statement SourcePos
forall a. a -> Statement a -> Statement a
ScopedS
(SourcePos -> Statement SourcePos -> Statement SourcePos)
-> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourcePos
-> ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
(Statement SourcePos -> Statement SourcePos)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourcePos
forall (m :: * -> *) s u. Monad m => ParsecT s u m SourcePos
getPosition
ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
(Statement SourcePos -> Statement SourcePos)
-> Parser m (Statement SourcePos) -> Parser m (Statement SourcePos)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ()
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ()
-> Parser m (Statement SourcePos)
-> Parser m (Statement SourcePos)
forall s (m :: * -> *) t u open close a.
Stream s m t =>
ParsecT s u m open
-> ParsecT s u m close -> ParsecT s u m a -> ParsecT s u m a
between
(ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ()
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ()
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ()
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ())
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ()
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ()
forall a b. (a -> b) -> a -> b
$ SourceName
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ()
forall (m :: * -> *). Monad m => SourceName -> Parser m ()
simpleTagP SourceName
"scope")
(SourceName
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ()
forall (m :: * -> *). Monad m => SourceName -> Parser m ()
simpleTagP SourceName
"endscope")
Parser m (Statement SourcePos)
forall (m :: * -> *). Monad m => Parser m (Statement SourcePos)
statementsP
indentStmtP :: Monad m => Parser m (Statement SourcePos)
indentStmtP :: Parser m (Statement SourcePos)
indentStmtP = do
SourcePos
pos <- ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourcePos
forall (m :: * -> *) s u. Monad m => ParsecT s u m SourcePos
getPosition
Expression SourcePos
indentExpr <- ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
(Expression SourcePos)
-> ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
(Expression SourcePos)
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
(Expression SourcePos)
-> ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
(Expression SourcePos))
-> ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
(Expression SourcePos)
-> ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
(Expression SourcePos)
forall a b. (a -> b) -> a -> b
$ SourceName
-> ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
(Expression SourcePos)
-> ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
(Expression SourcePos)
forall (m :: * -> *) a.
Monad m =>
SourceName -> Parser m a -> Parser m a
fancyTagP SourceName
"indent" ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
(Expression SourcePos)
forall (m :: * -> *). Monad m => Parser m (Expression SourcePos)
indentHeadP
SourceName
preIndent <- ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) Char
-> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourceName
forall (f :: * -> *) a. Alternative f => f a -> f [a]
many (SourceName
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) Char
forall s (m :: * -> *) u.
Stream s m Char =>
SourceName -> ParsecT s u m Char
oneOf SourceName
" \t")
ParseState
oldState <- ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) ParseState
forall (m :: * -> *) s u. Monad m => ParsecT s u m u
getState
(ParseState -> ParseState)
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ()
forall (m :: * -> *) u s. Monad m => (u -> u) -> ParsecT s u m ()
modifyState ((ParseState -> ParseState)
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ())
-> (ParseState -> ParseState)
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ()
forall a b. (a -> b) -> a -> b
$ \ParseState
state ->
ParseState
state { psStripIndent :: SourceName
psStripIndent = SourceName
preIndent }
Statement SourcePos
body <- Parser m (Statement SourcePos)
forall (m :: * -> *). Monad m => Parser m (Statement SourcePos)
statementsP
ParseState
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ()
forall (m :: * -> *) u s. Monad m => u -> ParsecT s u m ()
putState ParseState
oldState
SourceName
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ()
forall (m :: * -> *). Monad m => SourceName -> Parser m ()
simpleTagP SourceName
"endindent"
Statement SourcePos -> Parser m (Statement SourcePos)
forall (m :: * -> *) a. Monad m => a -> m a
return (Statement SourcePos -> Parser m (Statement SourcePos))
-> Statement SourcePos -> Parser m (Statement SourcePos)
forall a b. (a -> b) -> a -> b
$ SourcePos
-> Expression SourcePos
-> Statement SourcePos
-> Statement SourcePos
forall a. a -> Expression a -> Statement a -> Statement a
IndentS SourcePos
pos Expression SourcePos
indentExpr Statement SourcePos
body
indentHeadP :: Monad m => Parser m (Expression SourcePos)
indentHeadP :: Parser m (Expression SourcePos)
indentHeadP =
(Parser m (Expression SourcePos)
forall (m :: * -> *). Monad m => Parser m (Expression SourcePos)
expressionP Parser m (Expression SourcePos)
-> Parser m (Expression SourcePos)
-> Parser m (Expression SourcePos)
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> (SourcePos -> Text -> Expression SourcePos
forall a. a -> Text -> Expression a
StringLiteralE (SourcePos -> Text -> Expression SourcePos)
-> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourcePos
-> ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
(Text -> Expression SourcePos)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourcePos
forall (m :: * -> *) s u. Monad m => ParsecT s u m SourcePos
getPosition ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
(Text -> Expression SourcePos)
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) Text
-> Parser m (Expression SourcePos)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Text
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) Text
forall (f :: * -> *) a. Applicative f => a -> f a
pure Text
" ")) Parser m (Expression SourcePos)
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ()
-> Parser m (Expression SourcePos)
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ()
forall (m :: * -> *). Monad m => Parser m ()
spacesOrComment
scriptScopeStmtP :: Monad m => Parser m (Statement SourcePos)
scriptScopeStmtP :: Parser m (Statement SourcePos)
scriptScopeStmtP = do
SourcePos
pos <- ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourcePos
forall (m :: * -> *) s u. Monad m => ParsecT s u m SourcePos
getPosition
ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourceName
-> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourceName
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourceName
-> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourceName)
-> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourceName
-> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourceName
forall a b. (a -> b) -> a -> b
$ SourceName
-> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourceName
forall (m :: * -> *). Monad m => SourceName -> Parser m SourceName
keyword SourceName
"scope"
Parser m ()
forall (m :: * -> *). Monad m => Parser m ()
spacesOrComment
SourcePos -> Statement SourcePos -> Statement SourcePos
forall a. a -> Statement a -> Statement a
ScopedS SourcePos
pos (Statement SourcePos -> Statement SourcePos)
-> Parser m (Statement SourcePos) -> Parser m (Statement SourcePos)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parser m (Statement SourcePos)
forall (m :: * -> *). Monad m => Parser m (Statement SourcePos)
scriptStatementP
forStmtP :: Monad m => Parser m (Statement SourcePos)
forStmtP :: Parser m (Statement SourcePos)
forStmtP = do
SourcePos
pos <- ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourcePos
forall (m :: * -> *) s u. Monad m => ParsecT s u m SourcePos
getPosition
(Expression SourcePos
iteree, Text
varNameVal, Maybe Text
varNameIndex) <- SourceName
-> Parser m (Expression SourcePos, Text, Maybe Text)
-> Parser m (Expression SourcePos, Text, Maybe Text)
forall (m :: * -> *) a.
Monad m =>
SourceName -> Parser m a -> Parser m a
fancyTagP SourceName
"for" Parser m (Expression SourcePos, Text, Maybe Text)
forall (m :: * -> *).
Monad m =>
Parser m (Expression SourcePos, Text, Maybe Text)
forHeadP
Statement SourcePos
body <- Parser m (Statement SourcePos)
forall (m :: * -> *). Monad m => Parser m (Statement SourcePos)
statementsP
Maybe (Statement SourcePos)
elseBranchMay <- Parser m (Statement SourcePos)
-> ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
(Maybe (Statement SourcePos))
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m (Maybe a)
optionMaybe (Parser m (Statement SourcePos)
-> ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
(Maybe (Statement SourcePos)))
-> Parser m (Statement SourcePos)
-> ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
(Maybe (Statement SourcePos))
forall a b. (a -> b) -> a -> b
$ do
ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ()
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ()
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ()
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ())
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ()
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ()
forall a b. (a -> b) -> a -> b
$ SourceName
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ()
forall (m :: * -> *). Monad m => SourceName -> Parser m ()
simpleTagP SourceName
"else"
Parser m (Statement SourcePos)
forall (m :: * -> *). Monad m => Parser m (Statement SourcePos)
statementsP
SourceName
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ()
forall (m :: * -> *). Monad m => SourceName -> Parser m ()
simpleTagP SourceName
"endfor"
let forLoop :: Statement SourcePos
forLoop = SourcePos
-> Maybe Text
-> Text
-> Expression SourcePos
-> Statement SourcePos
-> Statement SourcePos
forall a.
a
-> Maybe Text -> Text -> Expression a -> Statement a -> Statement a
ForS SourcePos
pos Maybe Text
varNameIndex Text
varNameVal Expression SourcePos
iteree Statement SourcePos
body
Statement SourcePos -> Parser m (Statement SourcePos)
forall (m :: * -> *) a. Monad m => a -> m a
return (Statement SourcePos -> Parser m (Statement SourcePos))
-> Statement SourcePos -> Parser m (Statement SourcePos)
forall a b. (a -> b) -> a -> b
$ Statement SourcePos
-> (Statement SourcePos -> Statement SourcePos)
-> Maybe (Statement SourcePos)
-> Statement SourcePos
forall b a. b -> (a -> b) -> Maybe a -> b
maybe
Statement SourcePos
forLoop
(SourcePos
-> Expression SourcePos
-> Statement SourcePos
-> Statement SourcePos
-> Statement SourcePos
forall a.
a -> Expression a -> Statement a -> Statement a -> Statement a
IfS SourcePos
pos Expression SourcePos
iteree Statement SourcePos
forLoop)
Maybe (Statement SourcePos)
elseBranchMay
scriptForStmtP :: Monad m => Parser m (Statement SourcePos)
scriptForStmtP :: Parser m (Statement SourcePos)
scriptForStmtP = do
SourcePos
pos <- ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourcePos
forall (m :: * -> *) s u. Monad m => ParsecT s u m SourcePos
getPosition
ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourceName
-> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourceName
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourceName
-> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourceName)
-> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourceName
-> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourceName
forall a b. (a -> b) -> a -> b
$ SourceName
-> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourceName
forall (m :: * -> *). Monad m => SourceName -> Parser m SourceName
keyword SourceName
"for"
Parser m ()
forall (m :: * -> *). Monad m => Parser m ()
spacesOrComment
Char
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
'('
(Expression SourcePos
iteree, Text
varNameVal, Maybe Text
varNameIndex) <- Parser m (Expression SourcePos, Text, Maybe Text)
forall (m :: * -> *).
Monad m =>
Parser m (Expression SourcePos, Text, Maybe Text)
forHeadP
Parser m ()
forall (m :: * -> *). Monad m => Parser m ()
spacesOrComment
Char
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
')'
Parser m ()
forall (m :: * -> *). Monad m => Parser m ()
spacesOrComment
Statement SourcePos
body <- Parser m (Statement SourcePos)
forall (m :: * -> *). Monad m => Parser m (Statement SourcePos)
scriptStatementP
Maybe (Statement SourcePos)
elseBranchMay <- Parser m (Statement SourcePos)
-> ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
(Maybe (Statement SourcePos))
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m (Maybe a)
optionMaybe (Parser m (Statement SourcePos)
-> ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
(Maybe (Statement SourcePos)))
-> Parser m (Statement SourcePos)
-> ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
(Maybe (Statement SourcePos))
forall a b. (a -> b) -> a -> b
$ do
ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourceName
-> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourceName
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourceName
-> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourceName)
-> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourceName
-> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourceName
forall a b. (a -> b) -> a -> b
$ SourceName
-> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourceName
forall (m :: * -> *). Monad m => SourceName -> Parser m SourceName
keyword SourceName
"else"
Parser m ()
forall (m :: * -> *). Monad m => Parser m ()
spacesOrComment
Parser m (Statement SourcePos)
forall (m :: * -> *). Monad m => Parser m (Statement SourcePos)
scriptStatementP
let forLoop :: Statement SourcePos
forLoop = SourcePos
-> Maybe Text
-> Text
-> Expression SourcePos
-> Statement SourcePos
-> Statement SourcePos
forall a.
a
-> Maybe Text -> Text -> Expression a -> Statement a -> Statement a
ForS SourcePos
pos Maybe Text
varNameIndex Text
varNameVal Expression SourcePos
iteree Statement SourcePos
body
Statement SourcePos -> Parser m (Statement SourcePos)
forall (m :: * -> *) a. Monad m => a -> m a
return (Statement SourcePos -> Parser m (Statement SourcePos))
-> Statement SourcePos -> Parser m (Statement SourcePos)
forall a b. (a -> b) -> a -> b
$ Statement SourcePos
-> (Statement SourcePos -> Statement SourcePos)
-> Maybe (Statement SourcePos)
-> Statement SourcePos
forall b a. b -> (a -> b) -> Maybe a -> b
maybe
Statement SourcePos
forLoop
(SourcePos
-> Expression SourcePos
-> Statement SourcePos
-> Statement SourcePos
-> Statement SourcePos
forall a.
a -> Expression a -> Statement a -> Statement a -> Statement a
IfS SourcePos
pos Expression SourcePos
iteree Statement SourcePos
forLoop)
Maybe (Statement SourcePos)
elseBranchMay
includeP :: Monad m => Parser m (Statement SourcePos)
includeP :: Parser m (Statement SourcePos)
includeP = do
SourceName
sourceName <- SourceName -> Parser m SourceName -> Parser m SourceName
forall (m :: * -> *) a.
Monad m =>
SourceName -> Parser m a -> Parser m a
fancyTagP SourceName
"include" Parser m SourceName
forall (m :: * -> *). Monad m => Parser m SourceName
stringLiteralP
SourceName -> Parser m (Statement SourcePos)
forall (m :: * -> *).
Monad m =>
SourceName -> Parser m (Statement SourcePos)
include SourceName
sourceName
scriptIncludeP :: Monad m => Parser m (Statement SourcePos)
scriptIncludeP :: Parser m (Statement SourcePos)
scriptIncludeP = do
ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourceName
-> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourceName
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourceName
-> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourceName)
-> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourceName
-> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourceName
forall a b. (a -> b) -> a -> b
$ SourceName
-> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourceName
forall (m :: * -> *). Monad m => SourceName -> Parser m SourceName
keyword SourceName
"include"
Parser m ()
forall (m :: * -> *). Monad m => Parser m ()
spacesOrComment
Char
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
'('
SourceName
sourceName <- ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourceName
forall (m :: * -> *). Monad m => Parser m SourceName
stringLiteralP
Parser m ()
forall (m :: * -> *). Monad m => Parser m ()
spacesOrComment
Char
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
')'
Parser m ()
forall (m :: * -> *). Monad m => Parser m ()
spacesOrComment
Char
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
';'
Parser m ()
forall (m :: * -> *). Monad m => Parser m ()
spacesOrComment
SourceName -> Parser m (Statement SourcePos)
forall (m :: * -> *).
Monad m =>
SourceName -> Parser m (Statement SourcePos)
include SourceName
sourceName
forHeadP :: Monad m => Parser m ((Expression SourcePos), VarName, Maybe VarName)
forHeadP :: Parser m (Expression SourcePos, Text, Maybe Text)
forHeadP =
(Parser m (Expression SourcePos, Text, Maybe Text)
-> Parser m (Expression SourcePos, Text, Maybe Text)
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try Parser m (Expression SourcePos, Text, Maybe Text)
forall (m :: * -> *).
Monad m =>
Parser m (Expression SourcePos, Text, Maybe Text)
forHeadInP Parser m (Expression SourcePos, Text, Maybe Text)
-> Parser m (Expression SourcePos, Text, Maybe Text)
-> Parser m (Expression SourcePos, Text, Maybe Text)
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Parser m (Expression SourcePos, Text, Maybe Text)
forall (m :: * -> *).
Monad m =>
Parser m (Expression SourcePos, Text, Maybe Text)
forHeadAsP) Parser m (Expression SourcePos, Text, Maybe Text)
-> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) (Maybe ())
-> Parser m (Expression SourcePos, Text, Maybe Text)
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ()
-> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) (Maybe ())
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional (SourceName -> Parser m SourceName
forall (m :: * -> *). Monad m => SourceName -> Parser m SourceName
keyword SourceName
"recursive" Parser m SourceName
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ()
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ()
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>>ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ()
forall (m :: * -> *). Monad m => Parser m ()
spacesOrComment)
forIteratorP :: Monad m => Parser m (VarName, Maybe VarName)
forIteratorP :: Parser m (Text, Maybe Text)
forIteratorP = Parser m (Text, Maybe Text) -> Parser m (Text, Maybe Text)
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try Parser m (Text, Maybe Text)
forall (m :: * -> *). Monad m => Parser m (Text, Maybe Text)
forIndexedIteratorP Parser m (Text, Maybe Text)
-> Parser m (Text, Maybe Text) -> Parser m (Text, Maybe Text)
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Parser m (Text, Maybe Text) -> Parser m (Text, Maybe Text)
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try Parser m (Text, Maybe Text)
forall (m :: * -> *). Monad m => Parser m (Text, Maybe Text)
forSimpleIteratorP Parser m (Text, Maybe Text)
-> SourceName -> Parser m (Text, Maybe Text)
forall s u (m :: * -> *) a.
ParsecT s u m a -> SourceName -> ParsecT s u m a
<?> SourceName
"iteration variables"
forIndexedIteratorP :: Monad m => Parser m (VarName, Maybe VarName)
forIndexedIteratorP :: Parser m (Text, Maybe Text)
forIndexedIteratorP = do
Text
indexIdent <- Parser m Text
forall (m :: * -> *). Monad m => Parser m Text
identifierP
Parser m ()
forall (m :: * -> *). Monad m => Parser m ()
spacesOrComment
Char
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
','
Parser m ()
forall (m :: * -> *). Monad m => Parser m ()
spacesOrComment
Text
varIdent <- Parser m Text
forall (m :: * -> *). Monad m => Parser m Text
identifierP
Parser m ()
forall (m :: * -> *). Monad m => Parser m ()
spacesOrComment
(Text, Maybe Text) -> Parser m (Text, Maybe Text)
forall (m :: * -> *) a. Monad m => a -> m a
return (Text
varIdent, Text -> Maybe Text
forall a. a -> Maybe a
Just Text
indexIdent)
forSimpleIteratorP :: Monad m => Parser m (VarName, Maybe VarName)
forSimpleIteratorP :: Parser m (Text, Maybe Text)
forSimpleIteratorP = do
Text
varIdent <- Parser m Text
forall (m :: * -> *). Monad m => Parser m Text
identifierP
Parser m ()
forall (m :: * -> *). Monad m => Parser m ()
spacesOrComment
(Text, Maybe Text) -> Parser m (Text, Maybe Text)
forall (m :: * -> *) a. Monad m => a -> m a
return (Text
varIdent, Maybe Text
forall a. Maybe a
Nothing)
forHeadInP :: Monad m => Parser m ((Expression SourcePos), VarName, Maybe VarName)
forHeadInP :: Parser m (Expression SourcePos, Text, Maybe Text)
forHeadInP = do
(Text
varIdent, Maybe Text
indexIdent) <- Parser m (Text, Maybe Text)
forall (m :: * -> *). Monad m => Parser m (Text, Maybe Text)
forIteratorP
Parser m ()
forall (m :: * -> *). Monad m => Parser m ()
spacesOrComment
SourceName -> Parser m SourceName
forall (m :: * -> *). Monad m => SourceName -> Parser m SourceName
keyword SourceName
"in"
Parser m ()
forall (m :: * -> *). Monad m => Parser m ()
spacesOrComment
Expression SourcePos
iteree <- Parser m (Expression SourcePos)
forall (m :: * -> *). Monad m => Parser m (Expression SourcePos)
expressionP
(Expression SourcePos, Text, Maybe Text)
-> Parser m (Expression SourcePos, Text, Maybe Text)
forall (m :: * -> *) a. Monad m => a -> m a
return (Expression SourcePos
iteree, Text
varIdent, Maybe Text
indexIdent)
forHeadAsP :: Monad m => Parser m ((Expression SourcePos), VarName, Maybe VarName)
forHeadAsP :: Parser m (Expression SourcePos, Text, Maybe Text)
forHeadAsP = do
Expression SourcePos
iteree <- Parser m (Expression SourcePos)
forall (m :: * -> *). Monad m => Parser m (Expression SourcePos)
expressionP
Parser m ()
forall (m :: * -> *). Monad m => Parser m ()
spacesOrComment
SourceName -> Parser m SourceName
forall (m :: * -> *). Monad m => SourceName -> Parser m SourceName
keyword SourceName
"as"
Parser m ()
forall (m :: * -> *). Monad m => Parser m ()
spacesOrComment
(Text
varIdent, Maybe Text
indexIdent) <- Parser m (Text, Maybe Text)
forall (m :: * -> *). Monad m => Parser m (Text, Maybe Text)
forIteratorP
(Expression SourcePos, Text, Maybe Text)
-> Parser m (Expression SourcePos, Text, Maybe Text)
forall (m :: * -> *) a. Monad m => a -> m a
return (Expression SourcePos
iteree, Text
varIdent, Maybe Text
indexIdent)
fancyTagP :: Monad m => String -> Parser m a -> Parser m a
fancyTagP :: SourceName -> Parser m a -> Parser m a
fancyTagP SourceName
tagName =
ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ()
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ()
-> Parser m a
-> Parser m a
forall s (m :: * -> *) t u open close a.
Stream s m t =>
ParsecT s u m open
-> ParsecT s u m close -> ParsecT s u m a -> ParsecT s u m a
between
(ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ()
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ()
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ()
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ())
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ()
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ()
forall a b. (a -> b) -> a -> b
$ do
ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ()
forall (m :: * -> *). Monad m => Parser m ()
openTagP
SourceName -> Parser m SourceName
forall (m :: * -> *). Monad m => SourceName -> Parser m SourceName
keyword SourceName
tagName
ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ()
forall (m :: * -> *). Monad m => Parser m ()
spacesOrComment)
ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ()
forall (m :: * -> *). Monad m => Parser m ()
closeTagP
simpleTagP :: Monad m => String -> Parser m ()
simpleTagP :: SourceName -> Parser m ()
simpleTagP SourceName
tagName = Parser m ()
forall (m :: * -> *). Monad m => Parser m ()
openTagP Parser m ()
-> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourceName
-> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourceName
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> SourceName
-> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourceName
forall s (m :: * -> *) u.
Stream s m Char =>
SourceName -> ParsecT s u m SourceName
string SourceName
tagName ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourceName
-> Parser m () -> Parser m ()
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Parser m ()
forall (m :: * -> *). Monad m => Parser m ()
closeTagP
openInterpolationP :: Monad m => Parser m ()
openInterpolationP :: Parser m ()
openInterpolationP =
Delimiters -> SourceName
delimOpenInterpolation (Delimiters -> SourceName)
-> (ParseState -> Delimiters) -> ParseState -> SourceName
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ParseState -> Delimiters
psDelimiters (ParseState -> SourceName)
-> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) ParseState
-> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourceName
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) ParseState
forall (m :: * -> *) s u. Monad m => ParsecT s u m u
getState ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourceName
-> (SourceName -> Parser m ()) -> Parser m ()
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= SourceName -> Parser m ()
forall (m :: * -> *). Monad m => SourceName -> Parser m ()
openP
closeInterpolationP :: Monad m => Parser m ()
closeInterpolationP :: Parser m ()
closeInterpolationP =
Delimiters -> SourceName
delimCloseInterpolation (Delimiters -> SourceName)
-> (ParseState -> Delimiters) -> ParseState -> SourceName
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ParseState -> Delimiters
psDelimiters (ParseState -> SourceName)
-> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) ParseState
-> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourceName
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) ParseState
forall (m :: * -> *) s u. Monad m => ParsecT s u m u
getState ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourceName
-> (SourceName -> Parser m ()) -> Parser m ()
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= SourceName -> Parser m ()
forall (m :: * -> *). Monad m => SourceName -> Parser m ()
closeP
openCommentP :: Monad m => Parser m ()
=
Delimiters -> SourceName
delimOpenComment (Delimiters -> SourceName)
-> (ParseState -> Delimiters) -> ParseState -> SourceName
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ParseState -> Delimiters
psDelimiters (ParseState -> SourceName)
-> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) ParseState
-> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourceName
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) ParseState
forall (m :: * -> *) s u. Monad m => ParsecT s u m u
getState ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourceName
-> (SourceName -> Parser m ()) -> Parser m ()
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= SourceName -> Parser m ()
forall (m :: * -> *). Monad m => SourceName -> Parser m ()
openP
closeCommentP :: Monad m => Parser m ()
=
Delimiters -> SourceName
delimCloseComment (Delimiters -> SourceName)
-> (ParseState -> Delimiters) -> ParseState -> SourceName
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ParseState -> Delimiters
psDelimiters (ParseState -> SourceName)
-> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) ParseState
-> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourceName
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) ParseState
forall (m :: * -> *) s u. Monad m => ParsecT s u m u
getState ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourceName
-> (SourceName -> Parser m ()) -> Parser m ()
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= SourceName -> Parser m ()
forall (m :: * -> *). Monad m => SourceName -> Parser m ()
closeP
openTagP :: Monad m => Parser m ()
openTagP :: Parser m ()
openTagP =
Delimiters -> SourceName
delimOpenTag (Delimiters -> SourceName)
-> (ParseState -> Delimiters) -> ParseState -> SourceName
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ParseState -> Delimiters
psDelimiters (ParseState -> SourceName)
-> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) ParseState
-> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourceName
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) ParseState
forall (m :: * -> *) s u. Monad m => ParsecT s u m u
getState ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourceName
-> (SourceName -> Parser m ()) -> Parser m ()
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= SourceName -> Parser m ()
forall (m :: * -> *). Monad m => SourceName -> Parser m ()
openP
closeTagP :: Monad m => Parser m ()
closeTagP :: Parser m ()
closeTagP = do
Delimiters -> SourceName
delimCloseTag (Delimiters -> SourceName)
-> (ParseState -> Delimiters) -> ParseState -> SourceName
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ParseState -> Delimiters
psDelimiters (ParseState -> SourceName)
-> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) ParseState
-> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourceName
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) ParseState
forall (m :: * -> *) s u. Monad m => ParsecT s u m u
getState ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourceName
-> (SourceName -> Parser m ()) -> Parser m ()
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= SourceName -> Parser m ()
forall (m :: * -> *). Monad m => SourceName -> Parser m ()
closeP
(ParserOptions m -> Bool) -> Parser m () -> Parser m ()
forall (m :: * -> *).
Monad m =>
(ParserOptions m -> Bool) -> Parser m () -> Parser m ()
unlessFlag ParserOptions m -> Bool
forall (m :: * -> *). ParserOptions m -> Bool
poKeepTrailingNewline
(ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) (Maybe Char)
-> Parser m ()
forall (m :: * -> *) a. Monad m => m a -> m ()
ignore (ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) (Maybe Char)
-> Parser m ())
-> (ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) Char
-> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) (Maybe Char))
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) Char
-> Parser m ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) Char
-> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) (Maybe Char)
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional (ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) Char
-> Parser m ())
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) Char
-> Parser m ()
forall a b. (a -> b) -> a -> b
$ ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) Char
forall (m :: * -> *). Monad m => Parser m Char
literalNewlineP)
openP :: Monad m => String -> Parser m ()
openP :: SourceName -> Parser m ()
openP SourceName
c = Parser m () -> Parser m ()
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (SourceName -> Parser m ()
forall (m :: * -> *). Monad m => SourceName -> Parser m ()
openWP SourceName
c)
Parser m () -> Parser m () -> Parser m ()
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Parser m () -> Parser m ()
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (SourceName -> Parser m ()
forall (m :: * -> *). Monad m => SourceName -> Parser m ()
openFWP SourceName
c)
Parser m () -> Parser m () -> Parser m ()
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Parser m () -> Parser m ()
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (SourceName -> Parser m ()
forall (m :: * -> *). Monad m => SourceName -> Parser m ()
openNWP SourceName
c)
openWP :: Monad m => String -> Parser m ()
openWP :: SourceName -> Parser m ()
openWP SourceName
c = Parser m () -> Parser m ()
forall (m :: * -> *) a. Monad m => m a -> m ()
ignore (Parser m () -> Parser m ()) -> Parser m () -> Parser m ()
forall a b. (a -> b) -> a -> b
$ do
Parser m ()
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m ()
spaces
SourceName
-> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourceName
forall s (m :: * -> *) u.
Stream s m Char =>
SourceName -> ParsecT s u m SourceName
string (SourceName
-> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourceName)
-> SourceName
-> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourceName
forall a b. (a -> b) -> a -> b
$ SourceName
c SourceName -> ShowS
forall a. [a] -> [a] -> [a]
++ SourceName
"-"
Parser m ()
forall (m :: * -> *). Monad m => Parser m ()
spacesOrComment
openFWP :: Monad m => String -> Parser m ()
openFWP :: SourceName -> Parser m ()
openFWP SourceName
c = Parser m () -> Parser m ()
forall (m :: * -> *) a. Monad m => m a -> m ()
ignore (Parser m () -> Parser m ()) -> Parser m () -> Parser m ()
forall a b. (a -> b) -> a -> b
$ do
SourceName
-> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourceName
forall s (m :: * -> *) u.
Stream s m Char =>
SourceName -> ParsecT s u m SourceName
string (SourceName
-> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourceName)
-> SourceName
-> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourceName
forall a b. (a -> b) -> a -> b
$ SourceName
c SourceName -> ShowS
forall a. [a] -> [a] -> [a]
++ SourceName
"+"
Parser m ()
forall (m :: * -> *). Monad m => Parser m ()
spacesOrComment
openNWP :: Monad m => String -> Parser m ()
openNWP :: SourceName -> Parser m ()
openNWP SourceName
c = Parser m () -> Parser m ()
forall (m :: * -> *) a. Monad m => m a -> m ()
ignore (Parser m () -> Parser m ()) -> Parser m () -> Parser m ()
forall a b. (a -> b) -> a -> b
$ do
(ParserOptions m -> Bool) -> Parser m () -> Parser m ()
forall (m :: * -> *).
Monad m =>
(ParserOptions m -> Bool) -> Parser m () -> Parser m ()
whenFlag ParserOptions m -> Bool
forall (m :: * -> *). ParserOptions m -> Bool
poLStripBlocks Parser m ()
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m ()
spaces
SourceName
-> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourceName
forall s (m :: * -> *) u.
Stream s m Char =>
SourceName -> ParsecT s u m SourceName
string SourceName
c
ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) Char
-> Parser m ()
forall s (m :: * -> *) t a u.
(Stream s m t, Show a) =>
ParsecT s u m a -> ParsecT s u m ()
notFollowedBy (ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) Char
-> Parser m ())
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) Char
-> Parser m ()
forall a b. (a -> b) -> a -> b
$ SourceName
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) Char
forall s (m :: * -> *) u.
Stream s m Char =>
SourceName -> ParsecT s u m Char
oneOf SourceName
"+-"
Parser m ()
forall (m :: * -> *). Monad m => Parser m ()
spacesOrComment
closeP :: Monad m => String -> Parser m ()
closeP :: SourceName -> Parser m ()
closeP SourceName
c = Parser m () -> Parser m ()
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (SourceName -> Parser m ()
forall (m :: * -> *). Monad m => SourceName -> Parser m ()
closeWP SourceName
c)
Parser m () -> Parser m () -> Parser m ()
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Parser m () -> Parser m ()
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (SourceName -> Parser m ()
forall (m :: * -> *). Monad m => SourceName -> Parser m ()
closeFWP SourceName
c)
Parser m () -> Parser m () -> Parser m ()
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Parser m () -> Parser m ()
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (SourceName -> Parser m ()
forall (m :: * -> *). Monad m => SourceName -> Parser m ()
closeNWP SourceName
c)
closeWP :: Monad m => String -> Parser m ()
closeWP :: SourceName -> Parser m ()
closeWP SourceName
c = Parser m () -> Parser m ()
forall (m :: * -> *) a. Monad m => m a -> m ()
ignore (Parser m () -> Parser m ()) -> Parser m () -> Parser m ()
forall a b. (a -> b) -> a -> b
$ do
Parser m ()
forall (m :: * -> *). Monad m => Parser m ()
spacesOrComment
SourceName
-> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourceName
forall s (m :: * -> *) u.
Stream s m Char =>
SourceName -> ParsecT s u m SourceName
string (SourceName
-> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourceName)
-> SourceName
-> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourceName
forall a b. (a -> b) -> a -> b
$ Char
'-'Char -> ShowS
forall a. a -> [a] -> [a]
:SourceName
c
Parser m ()
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m ()
spaces
closeFWP :: Monad m => String -> Parser m ()
closeFWP :: SourceName -> Parser m ()
closeFWP SourceName
c = ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourceName
-> Parser m ()
forall (m :: * -> *) a. Monad m => m a -> m ()
ignore (ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourceName
-> Parser m ())
-> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourceName
-> Parser m ()
forall a b. (a -> b) -> a -> b
$ do
Parser m ()
forall (m :: * -> *). Monad m => Parser m ()
spacesOrComment
SourceName
-> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourceName
forall s (m :: * -> *) u.
Stream s m Char =>
SourceName -> ParsecT s u m SourceName
string (SourceName
-> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourceName)
-> SourceName
-> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourceName
forall a b. (a -> b) -> a -> b
$ Char
'+'Char -> ShowS
forall a. a -> [a] -> [a]
:SourceName
c
closeNWP :: Monad m => String -> Parser m ()
closeNWP :: SourceName -> Parser m ()
closeNWP SourceName
c = Parser m () -> Parser m ()
forall (m :: * -> *) a. Monad m => m a -> m ()
ignore (Parser m () -> Parser m ()) -> Parser m () -> Parser m ()
forall a b. (a -> b) -> a -> b
$ do
Parser m ()
forall (m :: * -> *). Monad m => Parser m ()
spacesOrComment
SourceName
-> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourceName
forall s (m :: * -> *) u.
Stream s m Char =>
SourceName -> ParsecT s u m SourceName
string SourceName
c
(ParserOptions m -> Bool) -> Parser m () -> Parser m ()
forall (m :: * -> *).
Monad m =>
(ParserOptions m -> Bool) -> Parser m () -> Parser m ()
whenFlag ParserOptions m -> Bool
forall (m :: * -> *). ParserOptions m -> Bool
poTrimBlocks Parser m ()
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m ()
spaces
expressionP :: Monad m => Parser m (Expression SourcePos)
expressionP :: Parser m (Expression SourcePos)
expressionP = Parser m (Expression SourcePos)
forall (m :: * -> *). Monad m => Parser m (Expression SourcePos)
lambdaExprP Parser m (Expression SourcePos)
-> Parser m (Expression SourcePos)
-> Parser m (Expression SourcePos)
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Parser m (Expression SourcePos)
forall (m :: * -> *). Monad m => Parser m (Expression SourcePos)
ternaryExprP
lambdaExprP :: Monad m => Parser m (Expression SourcePos)
lambdaExprP :: Parser m (Expression SourcePos)
lambdaExprP = do
SourcePos
pos <- ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourcePos
forall (m :: * -> *) s u. Monad m => ParsecT s u m SourcePos
getPosition
[Text]
argNames <- ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) [Text]
-> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) [Text]
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) [Text]
-> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) [Text])
-> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) [Text]
-> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) [Text]
forall a b. (a -> b) -> a -> b
$ do
Char
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
'('
Parser m ()
forall (m :: * -> *). Monad m => Parser m ()
spacesOrComment
[Text]
argNames <- ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) Text
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) Char
-> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) [Text]
forall s (m :: * -> *) t u a end.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m end -> ParsecT s u m [a]
sepBy (Parser m ()
forall (m :: * -> *). Monad m => Parser m ()
spacesOrCommentParser m ()
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) Text
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) Text
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) Text
forall (m :: * -> *). Monad m => Parser m Text
identifierP) (ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) Char
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) Char
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) Char
-> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) Char)
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) Char
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) Char
forall a b. (a -> b) -> a -> b
$ Parser m ()
forall (m :: * -> *). Monad m => Parser m ()
spacesOrCommentParser m ()
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) Char
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) Char
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Char
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
',')
Char
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
')'
Parser m ()
forall (m :: * -> *). Monad m => Parser m ()
spacesOrComment
SourceName
-> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourceName
forall s (m :: * -> *) u.
Stream s m Char =>
SourceName -> ParsecT s u m SourceName
string SourceName
"->"
Parser m ()
forall (m :: * -> *). Monad m => Parser m ()
spacesOrComment
[Text]
-> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) [Text]
forall (m :: * -> *) a. Monad m => a -> m a
return [Text]
argNames
Expression SourcePos
body <- Parser m (Expression SourcePos)
forall (m :: * -> *). Monad m => Parser m (Expression SourcePos)
expressionP
Expression SourcePos -> Parser m (Expression SourcePos)
forall (m :: * -> *) a. Monad m => a -> m a
return (Expression SourcePos -> Parser m (Expression SourcePos))
-> Expression SourcePos -> Parser m (Expression SourcePos)
forall a b. (a -> b) -> a -> b
$ SourcePos -> [Text] -> Expression SourcePos -> Expression SourcePos
forall a. a -> [Text] -> Expression a -> Expression a
LambdaE SourcePos
pos [Text]
argNames Expression SourcePos
body
operativeExprP :: forall m. Monad m => Parser m (Expression SourcePos) -> [ (String, Text) ] -> Parser m (Expression SourcePos)
operativeExprP :: Parser m (Expression SourcePos)
-> [(SourceName, Text)] -> Parser m (Expression SourcePos)
operativeExprP Parser m (Expression SourcePos)
operandP [(SourceName, Text)]
operators = do
SourcePos
pos0 <- ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourcePos
forall (m :: * -> *) s u. Monad m => ParsecT s u m SourcePos
getPosition
Expression SourcePos
lhs <- Parser m (Expression SourcePos)
operandP
Parser m ()
forall (m :: * -> *). Monad m => Parser m ()
spacesOrComment
[Expression SourcePos -> Expression SourcePos]
tails <- ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
(Expression SourcePos -> Expression SourcePos)
-> ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
[Expression SourcePos -> Expression SourcePos]
forall (f :: * -> *) a. Alternative f => f a -> f [a]
many (ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
(Expression SourcePos -> Expression SourcePos)
-> ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
[Expression SourcePos -> Expression SourcePos])
-> (ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
(Expression SourcePos -> Expression SourcePos)
-> ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
(Expression SourcePos -> Expression SourcePos))
-> ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
(Expression SourcePos -> Expression SourcePos)
-> ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
[Expression SourcePos -> Expression SourcePos]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
(Expression SourcePos -> Expression SourcePos)
-> ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
(Expression SourcePos -> Expression SourcePos)
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
(Expression SourcePos -> Expression SourcePos)
-> ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
[Expression SourcePos -> Expression SourcePos])
-> ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
(Expression SourcePos -> Expression SourcePos)
-> ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
[Expression SourcePos -> Expression SourcePos]
forall a b. (a -> b) -> a -> b
$ SourcePos
-> ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
(Expression SourcePos -> Expression SourcePos)
operativeTail SourcePos
pos0
Expression SourcePos -> Parser m (Expression SourcePos)
forall (m :: * -> *) a. Monad m => a -> m a
return (Expression SourcePos -> Parser m (Expression SourcePos))
-> Expression SourcePos -> Parser m (Expression SourcePos)
forall a b. (a -> b) -> a -> b
$ (Expression SourcePos
-> (Expression SourcePos -> Expression SourcePos)
-> Expression SourcePos)
-> Expression SourcePos
-> [Expression SourcePos -> Expression SourcePos]
-> Expression SourcePos
forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
foldl (((Expression SourcePos -> Expression SourcePos)
-> Expression SourcePos -> Expression SourcePos)
-> Expression SourcePos
-> (Expression SourcePos -> Expression SourcePos)
-> Expression SourcePos
forall a b c. (a -> b -> c) -> b -> a -> c
flip (Expression SourcePos -> Expression SourcePos)
-> Expression SourcePos -> Expression SourcePos
forall a b. (a -> b) -> a -> b
($)) Expression SourcePos
lhs [Expression SourcePos -> Expression SourcePos]
tails
where
opChars :: [Char]
opChars :: SourceName
opChars = ShowS
forall a. Eq a => [a] -> [a]
nub ShowS
-> ([(SourceName, Text)] -> SourceName)
-> [(SourceName, Text)]
-> SourceName
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ShowS
forall a. Ord a => [a] -> [a]
sort ShowS
-> ([(SourceName, Text)] -> SourceName)
-> [(SourceName, Text)]
-> SourceName
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ((SourceName, Text) -> SourceName)
-> [(SourceName, Text)] -> SourceName
forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap (SourceName, Text) -> SourceName
forall a b. (a, b) -> a
fst ([(SourceName, Text)] -> SourceName)
-> [(SourceName, Text)] -> SourceName
forall a b. (a -> b) -> a -> b
$ [(SourceName, Text)]
operators
operativeTail :: SourcePos -> Parser m (Expression SourcePos -> Expression SourcePos)
operativeTail :: SourcePos
-> ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
(Expression SourcePos -> Expression SourcePos)
operativeTail SourcePos
pos0 = do
SourcePos
pos <- ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourcePos
forall (m :: * -> *) s u. Monad m => ParsecT s u m SourcePos
getPosition
Text
funcName <-
(ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) Text
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) Text
-> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) Text)
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) Text
-> [ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) Text]
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) Text
forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
foldl ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) Text
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) Text
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) Text
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
(<|>) (SourceName
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) Text
forall (m :: * -> *) a. MonadFail m => SourceName -> m a
fail SourceName
"operator")
[ Parser m () -> Parser m ()
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (SourceName
-> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourceName
forall s (m :: * -> *) u.
Stream s m Char =>
SourceName -> ParsecT s u m SourceName
string SourceName
op ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourceName
-> Parser m () -> Parser m ()
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) Char
-> Parser m ()
forall s (m :: * -> *) t a u.
(Stream s m t, Show a) =>
ParsecT s u m a -> ParsecT s u m ()
notFollowedBy (SourceName
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) Char
forall s (m :: * -> *) u.
Stream s m Char =>
SourceName -> ParsecT s u m Char
oneOf SourceName
opChars)) Parser m ()
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) Text
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) Text
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Text
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) Text
forall (m :: * -> *) a. Monad m => a -> m a
return Text
fn | (SourceName
op, Text
fn) <- [(SourceName, Text)]
operators ]
Parser m ()
forall (m :: * -> *). Monad m => Parser m ()
spacesOrComment
Expression SourcePos
rhs <- Parser m (Expression SourcePos)
operandP
Parser m ()
forall (m :: * -> *). Monad m => Parser m ()
spacesOrComment
(Expression SourcePos -> Expression SourcePos)
-> ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
(Expression SourcePos -> Expression SourcePos)
forall (m :: * -> *) a. Monad m => a -> m a
return (\Expression SourcePos
lhs -> SourcePos
-> Expression SourcePos
-> [(Maybe Text, Expression SourcePos)]
-> Expression SourcePos
forall a.
a -> Expression a -> [(Maybe Text, Expression a)] -> Expression a
CallE SourcePos
pos0 (SourcePos -> Text -> Expression SourcePos
forall a. a -> Text -> Expression a
VarE SourcePos
pos Text
funcName) [(Maybe Text
forall a. Maybe a
Nothing, Expression SourcePos
lhs), (Maybe Text
forall a. Maybe a
Nothing, Expression SourcePos
rhs)])
ternaryExprP :: Monad m => Parser m (Expression SourcePos)
ternaryExprP :: Parser m (Expression SourcePos)
ternaryExprP = do
SourcePos
pos <- ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourcePos
forall (m :: * -> *) s u. Monad m => ParsecT s u m SourcePos
getPosition
Expression SourcePos
expr1 <- Parser m (Expression SourcePos)
forall (m :: * -> *). Monad m => Parser m (Expression SourcePos)
booleanExprP
Parser m ()
forall (m :: * -> *). Monad m => Parser m ()
spacesOrComment
SourcePos
-> Expression SourcePos -> Parser m (Expression SourcePos)
forall (m :: * -> *).
Monad m =>
SourcePos
-> Expression SourcePos -> Parser m (Expression SourcePos)
cTernaryTailP SourcePos
pos Expression SourcePos
expr1 Parser m (Expression SourcePos)
-> Parser m (Expression SourcePos)
-> Parser m (Expression SourcePos)
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> SourcePos
-> Expression SourcePos -> Parser m (Expression SourcePos)
forall (m :: * -> *).
Monad m =>
SourcePos
-> Expression SourcePos -> Parser m (Expression SourcePos)
pyTernaryTailP SourcePos
pos Expression SourcePos
expr1 Parser m (Expression SourcePos)
-> Parser m (Expression SourcePos)
-> Parser m (Expression SourcePos)
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Expression SourcePos -> Parser m (Expression SourcePos)
forall (m :: * -> *) a. Monad m => a -> m a
return Expression SourcePos
expr1
cTernaryTailP :: Monad m => SourcePos -> (Expression SourcePos) -> Parser m (Expression SourcePos)
cTernaryTailP :: SourcePos
-> Expression SourcePos -> Parser m (Expression SourcePos)
cTernaryTailP SourcePos
pos Expression SourcePos
condition = Parser m (Expression SourcePos) -> Parser m (Expression SourcePos)
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (Parser m (Expression SourcePos)
-> Parser m (Expression SourcePos))
-> Parser m (Expression SourcePos)
-> Parser m (Expression SourcePos)
forall a b. (a -> b) -> a -> b
$ do
Char
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
'?'
Parser m ()
forall (m :: * -> *). Monad m => Parser m ()
spacesOrComment
Expression SourcePos
yesBranch <- Parser m (Expression SourcePos)
forall (m :: * -> *). Monad m => Parser m (Expression SourcePos)
expressionP
Char
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
':'
Parser m ()
forall (m :: * -> *). Monad m => Parser m ()
spacesOrComment
Expression SourcePos
noBranch <- Parser m (Expression SourcePos)
forall (m :: * -> *). Monad m => Parser m (Expression SourcePos)
expressionP
Expression SourcePos -> Parser m (Expression SourcePos)
forall (m :: * -> *) a. Monad m => a -> m a
return (Expression SourcePos -> Parser m (Expression SourcePos))
-> Expression SourcePos -> Parser m (Expression SourcePos)
forall a b. (a -> b) -> a -> b
$ SourcePos
-> Expression SourcePos
-> Expression SourcePos
-> Expression SourcePos
-> Expression SourcePos
forall a.
a -> Expression a -> Expression a -> Expression a -> Expression a
TernaryE SourcePos
pos Expression SourcePos
condition Expression SourcePos
yesBranch Expression SourcePos
noBranch
pyTernaryTailP :: Monad m => SourcePos -> (Expression SourcePos) -> Parser m (Expression SourcePos)
pyTernaryTailP :: SourcePos
-> Expression SourcePos -> Parser m (Expression SourcePos)
pyTernaryTailP SourcePos
pos Expression SourcePos
yesBranch = do
SourceName -> Parser m SourceName
forall (m :: * -> *). Monad m => SourceName -> Parser m SourceName
keyword SourceName
"if"
Parser m ()
forall (m :: * -> *). Monad m => Parser m ()
spacesOrComment
Expression SourcePos
condition <- Parser m (Expression SourcePos)
forall (m :: * -> *). Monad m => Parser m (Expression SourcePos)
booleanExprP
SourceName -> Parser m SourceName
forall (m :: * -> *). Monad m => SourceName -> Parser m SourceName
keyword SourceName
"else"
Parser m ()
forall (m :: * -> *). Monad m => Parser m ()
spacesOrComment
Expression SourcePos
noBranch <- Parser m (Expression SourcePos)
forall (m :: * -> *). Monad m => Parser m (Expression SourcePos)
expressionP
Expression SourcePos -> Parser m (Expression SourcePos)
forall (m :: * -> *) a. Monad m => a -> m a
return (Expression SourcePos -> Parser m (Expression SourcePos))
-> Expression SourcePos -> Parser m (Expression SourcePos)
forall a b. (a -> b) -> a -> b
$ SourcePos
-> Expression SourcePos
-> Expression SourcePos
-> Expression SourcePos
-> Expression SourcePos
forall a.
a -> Expression a -> Expression a -> Expression a -> Expression a
TernaryE SourcePos
pos Expression SourcePos
condition Expression SourcePos
yesBranch Expression SourcePos
noBranch
booleanExprP :: Monad m => Parser m (Expression SourcePos)
booleanExprP :: Parser m (Expression SourcePos)
booleanExprP =
Parser m (Expression SourcePos)
-> [(SourceName, Text)] -> Parser m (Expression SourcePos)
forall (m :: * -> *).
Monad m =>
Parser m (Expression SourcePos)
-> [(SourceName, Text)] -> Parser m (Expression SourcePos)
operativeExprP
Parser m (Expression SourcePos)
forall (m :: * -> *). Monad m => Parser m (Expression SourcePos)
comparativeExprP
[ (SourceName
"or", Text
"any")
, (SourceName
"||", Text
"any")
, (SourceName
"and", Text
"all")
, (SourceName
"&&", Text
"all")
]
comparativeExprP :: Monad m => Parser m (Expression SourcePos)
comparativeExprP :: Parser m (Expression SourcePos)
comparativeExprP =
Parser m (Expression SourcePos)
-> [(SourceName, Text)] -> Parser m (Expression SourcePos)
forall (m :: * -> *).
Monad m =>
Parser m (Expression SourcePos)
-> [(SourceName, Text)] -> Parser m (Expression SourcePos)
operativeExprP
Parser m (Expression SourcePos)
forall (m :: * -> *). Monad m => Parser m (Expression SourcePos)
additiveExprP
[ (SourceName
"==", Text
"equals")
, (SourceName
"!=", Text
"nequals")
, (SourceName
">=", Text
"greaterEquals")
, (SourceName
"<=", Text
"lessEquals")
, (SourceName
">", Text
"greater")
, (SourceName
"<", Text
"less")
]
additiveExprP :: Monad m => Parser m (Expression SourcePos)
additiveExprP :: Parser m (Expression SourcePos)
additiveExprP =
Parser m (Expression SourcePos)
-> [(SourceName, Text)] -> Parser m (Expression SourcePos)
forall (m :: * -> *).
Monad m =>
Parser m (Expression SourcePos)
-> [(SourceName, Text)] -> Parser m (Expression SourcePos)
operativeExprP
Parser m (Expression SourcePos)
forall (m :: * -> *). Monad m => Parser m (Expression SourcePos)
multiplicativeExprP
[ (SourceName
"+", Text
"sum")
, (SourceName
"-", Text
"difference")
, (SourceName
"~", Text
"concat")
]
multiplicativeExprP :: Monad m => Parser m (Expression SourcePos)
multiplicativeExprP :: Parser m (Expression SourcePos)
multiplicativeExprP =
Parser m (Expression SourcePos)
-> [(SourceName, Text)] -> Parser m (Expression SourcePos)
forall (m :: * -> *).
Monad m =>
Parser m (Expression SourcePos)
-> [(SourceName, Text)] -> Parser m (Expression SourcePos)
operativeExprP
Parser m (Expression SourcePos)
forall (m :: * -> *). Monad m => Parser m (Expression SourcePos)
postfixExprP
[ (SourceName
"*", Text
"product")
, (SourceName
"//", Text
"int_ratio")
, (SourceName
"/", Text
"ratio")
, (SourceName
"%", Text
"modulo")
]
postfixExprP :: Monad m => Parser m (Expression SourcePos)
postfixExprP :: Parser m (Expression SourcePos)
postfixExprP = do
SourcePos
pos <- ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourcePos
forall (m :: * -> *) s u. Monad m => ParsecT s u m SourcePos
getPosition
Expression SourcePos
base <- Parser m (Expression SourcePos)
forall (m :: * -> *). Monad m => Parser m (Expression SourcePos)
atomicExprP
Parser m ()
forall (m :: * -> *). Monad m => Parser m ()
spacesOrComment
[Expression SourcePos -> Expression SourcePos]
postfixes <- ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
(Expression SourcePos -> Expression SourcePos)
-> ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
[Expression SourcePos -> Expression SourcePos]
forall (f :: * -> *) a. Alternative f => f a -> f [a]
many (ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
(Expression SourcePos -> Expression SourcePos)
-> ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
[Expression SourcePos -> Expression SourcePos])
-> (ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
(Expression SourcePos -> Expression SourcePos)
-> ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
(Expression SourcePos -> Expression SourcePos))
-> ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
(Expression SourcePos -> Expression SourcePos)
-> ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
[Expression SourcePos -> Expression SourcePos]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
(Expression SourcePos -> Expression SourcePos)
-> ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
(Expression SourcePos -> Expression SourcePos)
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
(Expression SourcePos -> Expression SourcePos)
-> ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
[Expression SourcePos -> Expression SourcePos])
-> ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
(Expression SourcePos -> Expression SourcePos)
-> ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
[Expression SourcePos -> Expression SourcePos]
forall a b. (a -> b) -> a -> b
$ SourcePos
-> ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
(Expression SourcePos -> Expression SourcePos)
forall (m :: * -> *).
Monad m =>
SourcePos
-> Parser m (Expression SourcePos -> Expression SourcePos)
postfixP SourcePos
pos ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
(Expression SourcePos -> Expression SourcePos)
-> Parser m ()
-> ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
(Expression SourcePos -> Expression SourcePos)
forall (m :: * -> *) a b. Monad m => m a -> m b -> m a
`before`Parser m ()
forall (m :: * -> *). Monad m => Parser m ()
spacesOrComment
Expression SourcePos -> Parser m (Expression SourcePos)
forall (m :: * -> *) a. Monad m => a -> m a
return (Expression SourcePos -> Parser m (Expression SourcePos))
-> Expression SourcePos -> Parser m (Expression SourcePos)
forall a b. (a -> b) -> a -> b
$ (Expression SourcePos
-> (Expression SourcePos -> Expression SourcePos)
-> Expression SourcePos)
-> Expression SourcePos
-> [Expression SourcePos -> Expression SourcePos]
-> Expression SourcePos
forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
foldl (((Expression SourcePos -> Expression SourcePos)
-> Expression SourcePos -> Expression SourcePos)
-> Expression SourcePos
-> (Expression SourcePos -> Expression SourcePos)
-> Expression SourcePos
forall a b c. (a -> b -> c) -> b -> a -> c
flip (Expression SourcePos -> Expression SourcePos)
-> Expression SourcePos -> Expression SourcePos
forall a b. (a -> b) -> a -> b
($)) Expression SourcePos
base [Expression SourcePos -> Expression SourcePos]
postfixes
postfixP :: Monad m => SourcePos -> Parser m ((Expression SourcePos) -> (Expression SourcePos))
postfixP :: SourcePos
-> Parser m (Expression SourcePos -> Expression SourcePos)
postfixP SourcePos
pos = SourcePos
-> Parser m (Expression SourcePos -> Expression SourcePos)
forall (m :: * -> *).
Monad m =>
SourcePos
-> Parser m (Expression SourcePos -> Expression SourcePos)
dotPostfixP SourcePos
pos
Parser m (Expression SourcePos -> Expression SourcePos)
-> Parser m (Expression SourcePos -> Expression SourcePos)
-> Parser m (Expression SourcePos -> Expression SourcePos)
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Parser m (Expression SourcePos -> Expression SourcePos)
forall (m :: * -> *).
Monad m =>
Parser m (Expression SourcePos -> Expression SourcePos)
arrayAccessP
Parser m (Expression SourcePos -> Expression SourcePos)
-> Parser m (Expression SourcePos -> Expression SourcePos)
-> Parser m (Expression SourcePos -> Expression SourcePos)
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Parser m (Expression SourcePos -> Expression SourcePos)
forall (m :: * -> *).
Monad m =>
Parser m (Expression SourcePos -> Expression SourcePos)
funcCallP
Parser m (Expression SourcePos -> Expression SourcePos)
-> Parser m (Expression SourcePos -> Expression SourcePos)
-> Parser m (Expression SourcePos -> Expression SourcePos)
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Parser m (Expression SourcePos -> Expression SourcePos)
forall (m :: * -> *).
Monad m =>
Parser m (Expression SourcePos -> Expression SourcePos)
filterP
Parser m (Expression SourcePos -> Expression SourcePos)
-> Parser m (Expression SourcePos -> Expression SourcePos)
-> Parser m (Expression SourcePos -> Expression SourcePos)
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Parser m (Expression SourcePos -> Expression SourcePos)
forall (m :: * -> *).
Monad m =>
Parser m (Expression SourcePos -> Expression SourcePos)
testExprP
dotPostfixP :: Monad m => SourcePos -> Parser m ((Expression SourcePos) -> (Expression SourcePos))
dotPostfixP :: SourcePos
-> Parser m (Expression SourcePos -> Expression SourcePos)
dotPostfixP SourcePos
pos = do
Char
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
'.'
Parser m ()
forall (m :: * -> *). Monad m => Parser m ()
spacesOrComment
Expression SourcePos
i <- SourcePos -> Text -> Expression SourcePos
forall a. a -> Text -> Expression a
StringLiteralE (SourcePos -> Text -> Expression SourcePos)
-> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourcePos
-> ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
(Text -> Expression SourcePos)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourcePos
forall (m :: * -> *) s u. Monad m => ParsecT s u m SourcePos
getPosition ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
(Text -> Expression SourcePos)
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) Text
-> ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
(Expression SourcePos)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) Text
forall (m :: * -> *). Monad m => Parser m Text
identifierP
(Expression SourcePos -> Expression SourcePos)
-> Parser m (Expression SourcePos -> Expression SourcePos)
forall (m :: * -> *) a. Monad m => a -> m a
return ((Expression SourcePos -> Expression SourcePos)
-> Parser m (Expression SourcePos -> Expression SourcePos))
-> (Expression SourcePos -> Expression SourcePos)
-> Parser m (Expression SourcePos -> Expression SourcePos)
forall a b. (a -> b) -> a -> b
$ \Expression SourcePos
e -> SourcePos
-> Expression SourcePos
-> Expression SourcePos
-> Expression SourcePos
forall a. a -> Expression a -> Expression a -> Expression a
MemberLookupE SourcePos
pos Expression SourcePos
e Expression SourcePos
i
arrayAccessP :: Monad m => Parser m ((Expression SourcePos) -> (Expression SourcePos))
arrayAccessP :: Parser m (Expression SourcePos -> Expression SourcePos)
arrayAccessP = do
SourcePos
pos <- ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourcePos
forall (m :: * -> *) s u. Monad m => ParsecT s u m SourcePos
getPosition
SourceName
-> SourceName
-> Parser m (Expression SourcePos -> Expression SourcePos)
-> Parser m (Expression SourcePos -> Expression SourcePos)
forall (m :: * -> *) a.
Monad m =>
SourceName -> SourceName -> Parser m a -> Parser m a
bracedP SourceName
"[" SourceName
"]" (SourcePos
-> Parser m (Expression SourcePos -> Expression SourcePos)
forall (m :: * -> *).
Monad m =>
SourcePos
-> Parser m (Expression SourcePos -> Expression SourcePos)
inner SourcePos
pos)
where
inner :: SourcePos
-> ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
(Expression SourcePos -> Expression SourcePos)
inner SourcePos
pos = ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
(Expression SourcePos -> Expression SourcePos)
-> ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
(Expression SourcePos -> Expression SourcePos)
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (SourcePos
-> ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
(Expression SourcePos -> Expression SourcePos)
forall (m :: * -> *).
Monad m =>
SourcePos
-> Parser m (Expression SourcePos -> Expression SourcePos)
sliceInner SourcePos
pos) ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
(Expression SourcePos -> Expression SourcePos)
-> ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
(Expression SourcePos -> Expression SourcePos)
-> ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
(Expression SourcePos -> Expression SourcePos)
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> SourcePos
-> ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
(Expression SourcePos -> Expression SourcePos)
forall (m :: * -> *).
Monad m =>
SourcePos
-> Parser m (Expression SourcePos -> Expression SourcePos)
indexInner SourcePos
pos
sliceInner :: SourcePos
-> ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
(Expression SourcePos -> Expression SourcePos)
sliceInner SourcePos
pos = do
Expression SourcePos
offset <- ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
(Expression SourcePos)
-> ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
(Expression SourcePos)
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
(Expression SourcePos)
forall (m :: * -> *). Monad m => Parser m (Expression SourcePos)
expressionP ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
(Expression SourcePos)
-> ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
(Expression SourcePos)
-> ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
(Expression SourcePos)
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> (SourcePos -> Expression SourcePos
forall a. a -> Expression a
NullLiteralE (SourcePos -> Expression SourcePos)
-> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourcePos
-> ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
(Expression SourcePos)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourcePos
forall (m :: * -> *) s u. Monad m => ParsecT s u m SourcePos
getPosition)
Char
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
':'
Expression SourcePos
length <- ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
(Expression SourcePos)
-> ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
(Expression SourcePos)
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
(Expression SourcePos)
forall (m :: * -> *). Monad m => Parser m (Expression SourcePos)
expressionP ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
(Expression SourcePos)
-> ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
(Expression SourcePos)
-> ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
(Expression SourcePos)
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> (SourcePos -> Expression SourcePos
forall a. a -> Expression a
NullLiteralE (SourcePos -> Expression SourcePos)
-> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourcePos
-> ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
(Expression SourcePos)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourcePos
forall (m :: * -> *) s u. Monad m => ParsecT s u m SourcePos
getPosition)
(Expression SourcePos -> Expression SourcePos)
-> ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
(Expression SourcePos -> Expression SourcePos)
forall (m :: * -> *) a. Monad m => a -> m a
return ((Expression SourcePos -> Expression SourcePos)
-> ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
(Expression SourcePos -> Expression SourcePos))
-> (Expression SourcePos -> Expression SourcePos)
-> ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
(Expression SourcePos -> Expression SourcePos)
forall a b. (a -> b) -> a -> b
$ \Expression SourcePos
e ->
SourcePos
-> Expression SourcePos
-> [(Maybe Text, Expression SourcePos)]
-> Expression SourcePos
forall a.
a -> Expression a -> [(Maybe Text, Expression a)] -> Expression a
CallE
SourcePos
pos
(SourcePos -> Text -> Expression SourcePos
forall a. a -> Text -> Expression a
VarE SourcePos
pos Text
"slice")
[ (Maybe Text
forall a. Maybe a
Nothing, Expression SourcePos
e)
, (Maybe Text
forall a. Maybe a
Nothing, Expression SourcePos
offset)
, (Maybe Text
forall a. Maybe a
Nothing, Expression SourcePos
length)
]
indexInner :: SourcePos
-> ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
(Expression SourcePos -> Expression SourcePos)
indexInner SourcePos
pos = do
Expression SourcePos
i <- Parser m (Expression SourcePos)
forall (m :: * -> *). Monad m => Parser m (Expression SourcePos)
expressionP
(Expression SourcePos -> Expression SourcePos)
-> ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
(Expression SourcePos -> Expression SourcePos)
forall (m :: * -> *) a. Monad m => a -> m a
return ((Expression SourcePos -> Expression SourcePos)
-> ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
(Expression SourcePos -> Expression SourcePos))
-> (Expression SourcePos -> Expression SourcePos)
-> ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
(Expression SourcePos -> Expression SourcePos)
forall a b. (a -> b) -> a -> b
$ \Expression SourcePos
e -> SourcePos
-> Expression SourcePos
-> Expression SourcePos
-> Expression SourcePos
forall a. a -> Expression a -> Expression a -> Expression a
MemberLookupE SourcePos
pos Expression SourcePos
e Expression SourcePos
i
funcCallP :: Monad m => Parser m ((Expression SourcePos) -> (Expression SourcePos))
funcCallP :: Parser m (Expression SourcePos -> Expression SourcePos)
funcCallP = do
SourcePos
pos <- ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourcePos
forall (m :: * -> *) s u. Monad m => ParsecT s u m SourcePos
getPosition
[(Maybe Text, Expression SourcePos)]
args <- SourceName
-> SourceName
-> Parser m (Maybe Text, Expression SourcePos)
-> Parser m [(Maybe Text, Expression SourcePos)]
forall (m :: * -> *) a.
Monad m =>
SourceName -> SourceName -> Parser m a -> Parser m [a]
groupP SourceName
"(" SourceName
")" Parser m (Maybe Text, Expression SourcePos)
forall (m :: * -> *).
Monad m =>
Parser m (Maybe Text, Expression SourcePos)
funcArgP
(Expression SourcePos -> Expression SourcePos)
-> Parser m (Expression SourcePos -> Expression SourcePos)
forall (m :: * -> *) a. Monad m => a -> m a
return ((Expression SourcePos -> Expression SourcePos)
-> Parser m (Expression SourcePos -> Expression SourcePos))
-> (Expression SourcePos -> Expression SourcePos)
-> Parser m (Expression SourcePos -> Expression SourcePos)
forall a b. (a -> b) -> a -> b
$ \Expression SourcePos
e -> SourcePos
-> Expression SourcePos
-> [(Maybe Text, Expression SourcePos)]
-> Expression SourcePos
forall a.
a -> Expression a -> [(Maybe Text, Expression a)] -> Expression a
CallE SourcePos
pos Expression SourcePos
e [(Maybe Text, Expression SourcePos)]
args
funcArgP :: Monad m => Parser m (Maybe Text, (Expression SourcePos))
funcArgP :: Parser m (Maybe Text, Expression SourcePos)
funcArgP = Parser m (Maybe Text, Expression SourcePos)
forall (m :: * -> *).
Monad m =>
Parser m (Maybe Text, Expression SourcePos)
namedFuncArgP Parser m (Maybe Text, Expression SourcePos)
-> Parser m (Maybe Text, Expression SourcePos)
-> Parser m (Maybe Text, Expression SourcePos)
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Parser m (Maybe Text, Expression SourcePos)
forall (m :: * -> *).
Monad m =>
Parser m (Maybe Text, Expression SourcePos)
positionalFuncArgP
namedFuncArgP :: Monad m => Parser m (Maybe Text, (Expression SourcePos))
namedFuncArgP :: Parser m (Maybe Text, Expression SourcePos)
namedFuncArgP = do
Text
name <- ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) Text
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) Text
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) Text
-> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) Text)
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) Text
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) Text
forall a b. (a -> b) -> a -> b
$ ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) Text
forall (m :: * -> *). Monad m => Parser m Text
identifierP ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) Text
-> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourceName
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) Text
forall (m :: * -> *) a b. Monad m => m a -> m b -> m a
`before` ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ()
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ()
-> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourceName
-> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourceName
forall s (m :: * -> *) t u open close a.
Stream s m t =>
ParsecT s u m open
-> ParsecT s u m close -> ParsecT s u m a -> ParsecT s u m a
between ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ()
forall (m :: * -> *). Monad m => Parser m ()
spacesOrComment ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ()
forall (m :: * -> *). Monad m => Parser m ()
spacesOrComment (SourceName
-> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourceName
forall s (m :: * -> *) u.
Stream s m Char =>
SourceName -> ParsecT s u m SourceName
string SourceName
"=")
Expression SourcePos
expr <- Parser m (Expression SourcePos)
forall (m :: * -> *). Monad m => Parser m (Expression SourcePos)
expressionP
(Maybe Text, Expression SourcePos)
-> Parser m (Maybe Text, Expression SourcePos)
forall (m :: * -> *) a. Monad m => a -> m a
return (Text -> Maybe Text
forall a. a -> Maybe a
Just Text
name, Expression SourcePos
expr)
positionalFuncArgP :: Monad m => Parser m (Maybe Text, (Expression SourcePos))
positionalFuncArgP :: Parser m (Maybe Text, Expression SourcePos)
positionalFuncArgP = Parser m (Maybe Text, Expression SourcePos)
-> Parser m (Maybe Text, Expression SourcePos)
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (Parser m (Maybe Text, Expression SourcePos)
-> Parser m (Maybe Text, Expression SourcePos))
-> Parser m (Maybe Text, Expression SourcePos)
-> Parser m (Maybe Text, Expression SourcePos)
forall a b. (a -> b) -> a -> b
$ (Maybe Text
forall a. Maybe a
Nothing,) (Expression SourcePos -> (Maybe Text, Expression SourcePos))
-> ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
(Expression SourcePos)
-> Parser m (Maybe Text, Expression SourcePos)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
(Expression SourcePos)
forall (m :: * -> *). Monad m => Parser m (Expression SourcePos)
expressionP
filterP :: Monad m => Parser m ((Expression SourcePos) -> (Expression SourcePos))
filterP :: Parser m (Expression SourcePos -> Expression SourcePos)
filterP = do
SourcePos
pos <- ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourcePos
forall (m :: * -> *) s u. Monad m => ParsecT s u m SourcePos
getPosition
Char
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
'|'
Parser m ()
forall (m :: * -> *). Monad m => Parser m ()
spacesOrComment
Expression SourcePos
func <- Parser m (Expression SourcePos)
forall (m :: * -> *). Monad m => Parser m (Expression SourcePos)
atomicExprP
[(Maybe Text, Expression SourcePos)]
args <- [(Maybe Text, Expression SourcePos)]
-> ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
[(Maybe Text, Expression SourcePos)]
-> ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
[(Maybe Text, Expression SourcePos)]
forall s (m :: * -> *) t a u.
Stream s m t =>
a -> ParsecT s u m a -> ParsecT s u m a
option [] (ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
[(Maybe Text, Expression SourcePos)]
-> ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
[(Maybe Text, Expression SourcePos)])
-> ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
[(Maybe Text, Expression SourcePos)]
-> ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
[(Maybe Text, Expression SourcePos)]
forall a b. (a -> b) -> a -> b
$ SourceName
-> SourceName
-> Parser m (Maybe Text, Expression SourcePos)
-> ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
[(Maybe Text, Expression SourcePos)]
forall (m :: * -> *) a.
Monad m =>
SourceName -> SourceName -> Parser m a -> Parser m [a]
groupP SourceName
"(" SourceName
")" Parser m (Maybe Text, Expression SourcePos)
forall (m :: * -> *).
Monad m =>
Parser m (Maybe Text, Expression SourcePos)
funcArgP
(Expression SourcePos -> Expression SourcePos)
-> Parser m (Expression SourcePos -> Expression SourcePos)
forall (m :: * -> *) a. Monad m => a -> m a
return ((Expression SourcePos -> Expression SourcePos)
-> Parser m (Expression SourcePos -> Expression SourcePos))
-> (Expression SourcePos -> Expression SourcePos)
-> Parser m (Expression SourcePos -> Expression SourcePos)
forall a b. (a -> b) -> a -> b
$ \Expression SourcePos
e -> SourcePos
-> Expression SourcePos
-> [(Maybe Text, Expression SourcePos)]
-> Expression SourcePos
forall a.
a -> Expression a -> [(Maybe Text, Expression a)] -> Expression a
CallE SourcePos
pos Expression SourcePos
func ((Maybe Text
forall a. Maybe a
Nothing, Expression SourcePos
e)(Maybe Text, Expression SourcePos)
-> [(Maybe Text, Expression SourcePos)]
-> [(Maybe Text, Expression SourcePos)]
forall a. a -> [a] -> [a]
:[(Maybe Text, Expression SourcePos)]
args)
testExprP :: Monad m => Parser m ((Expression SourcePos) -> (Expression SourcePos))
testExprP :: Parser m (Expression SourcePos -> Expression SourcePos)
testExprP = do
SourcePos
pos <- ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourcePos
forall (m :: * -> *) s u. Monad m => ParsecT s u m SourcePos
getPosition
SourceName -> Parser m SourceName
forall (m :: * -> *). Monad m => SourceName -> Parser m SourceName
keyword SourceName
"is"
Parser m ()
forall (m :: * -> *). Monad m => Parser m ()
spacesOrComment
Expression SourcePos
funcName <- Parser m (Expression SourcePos)
forall (m :: * -> *). Monad m => Parser m (Expression SourcePos)
atomicExprP
[(Maybe Text, Expression SourcePos)]
args <- [ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
[(Maybe Text, Expression SourcePos)]]
-> ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
[(Maybe Text, Expression SourcePos)]
forall s (m :: * -> *) t u a.
Stream s m t =>
[ParsecT s u m a] -> ParsecT s u m a
choice [SourceName
-> SourceName
-> Parser m (Maybe Text, Expression SourcePos)
-> ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
[(Maybe Text, Expression SourcePos)]
forall (m :: * -> *) a.
Monad m =>
SourceName -> SourceName -> Parser m a -> Parser m [a]
groupP SourceName
"(" SourceName
")" Parser m (Maybe Text, Expression SourcePos)
forall (m :: * -> *).
Monad m =>
Parser m (Maybe Text, Expression SourcePos)
funcArgP
, [(Maybe Text, Expression SourcePos)]
-> ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
[(Maybe Text, Expression SourcePos)]
-> ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
[(Maybe Text, Expression SourcePos)]
forall s (m :: * -> *) t a u.
Stream s m t =>
a -> ParsecT s u m a -> ParsecT s u m a
option [] (ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
[(Maybe Text, Expression SourcePos)]
-> ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
[(Maybe Text, Expression SourcePos)])
-> ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
[(Maybe Text, Expression SourcePos)]
-> ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
[(Maybe Text, Expression SourcePos)]
forall a b. (a -> b) -> a -> b
$ Parser m (Maybe Text, Expression SourcePos)
forall (m :: * -> *).
Monad m =>
Parser m (Maybe Text, Expression SourcePos)
funcArgP Parser m (Maybe Text, Expression SourcePos)
-> ((Maybe Text, Expression SourcePos)
-> ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
[(Maybe Text, Expression SourcePos)])
-> ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
[(Maybe Text, Expression SourcePos)]
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (\(Maybe Text, Expression SourcePos)
a -> [(Maybe Text, Expression SourcePos)]
-> ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
[(Maybe Text, Expression SourcePos)]
forall (m :: * -> *) a. Monad m => a -> m a
return [(Maybe Text, Expression SourcePos)
a])]
(Expression SourcePos -> Expression SourcePos)
-> Parser m (Expression SourcePos -> Expression SourcePos)
forall (m :: * -> *) a. Monad m => a -> m a
return ((Expression SourcePos -> Expression SourcePos)
-> Parser m (Expression SourcePos -> Expression SourcePos))
-> (Expression SourcePos -> Expression SourcePos)
-> Parser m (Expression SourcePos -> Expression SourcePos)
forall a b. (a -> b) -> a -> b
$ \Expression SourcePos
e -> SourcePos
-> Expression SourcePos
-> [(Maybe Text, Expression SourcePos)]
-> Expression SourcePos
forall a.
a -> Expression a -> [(Maybe Text, Expression a)] -> Expression a
CallE SourcePos
pos (Expression SourcePos -> Expression SourcePos
forall a. Expression a -> Expression a
addIsPrefix Expression SourcePos
funcName) ((Maybe Text
forall a. Maybe a
Nothing, Expression SourcePos
e)(Maybe Text, Expression SourcePos)
-> [(Maybe Text, Expression SourcePos)]
-> [(Maybe Text, Expression SourcePos)]
forall a. a -> [a] -> [a]
:[(Maybe Text, Expression SourcePos)]
args)
where
addIsPrefix :: Expression a -> Expression a
addIsPrefix :: Expression a -> Expression a
addIsPrefix Expression a
expr = case Expression a
expr of
(VarE a
a Text
text) -> a -> Text -> Expression a
forall a. a -> Text -> Expression a
VarE a
a (Text -> Expression a) -> Text -> Expression a
forall a b. (a -> b) -> a -> b
$ Text -> Text -> Text
Text.append (SourceName -> Text
Text.pack SourceName
"is_") Text
text
Expression a
_ -> Expression a
expr
atomicExprP :: Monad m => Parser m (Expression SourcePos)
atomicExprP :: Parser m (Expression SourcePos)
atomicExprP = Parser m (Expression SourcePos)
forall (m :: * -> *). Monad m => Parser m (Expression SourcePos)
doExprP
Parser m (Expression SourcePos)
-> Parser m (Expression SourcePos)
-> Parser m (Expression SourcePos)
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Parser m (Expression SourcePos)
forall (m :: * -> *). Monad m => Parser m (Expression SourcePos)
parenthesizedExprP
Parser m (Expression SourcePos)
-> Parser m (Expression SourcePos)
-> Parser m (Expression SourcePos)
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Parser m (Expression SourcePos)
forall (m :: * -> *). Monad m => Parser m (Expression SourcePos)
objectExprP
Parser m (Expression SourcePos)
-> Parser m (Expression SourcePos)
-> Parser m (Expression SourcePos)
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Parser m (Expression SourcePos)
forall (m :: * -> *). Monad m => Parser m (Expression SourcePos)
listExprP
Parser m (Expression SourcePos)
-> Parser m (Expression SourcePos)
-> Parser m (Expression SourcePos)
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Parser m (Expression SourcePos)
forall (m :: * -> *). Monad m => Parser m (Expression SourcePos)
stringLiteralExprP
Parser m (Expression SourcePos)
-> Parser m (Expression SourcePos)
-> Parser m (Expression SourcePos)
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Parser m (Expression SourcePos)
forall (m :: * -> *). Monad m => Parser m (Expression SourcePos)
numberLiteralExprP
Parser m (Expression SourcePos)
-> Parser m (Expression SourcePos)
-> Parser m (Expression SourcePos)
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Parser m (Expression SourcePos)
forall (m :: * -> *). Monad m => Parser m (Expression SourcePos)
varExprP
parenthesizedExprP :: Monad m => Parser m (Expression SourcePos)
parenthesizedExprP :: Parser m (Expression SourcePos)
parenthesizedExprP =
ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ()
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ()
-> Parser m (Expression SourcePos)
-> Parser m (Expression SourcePos)
forall s (m :: * -> *) t u open close a.
Stream s m t =>
ParsecT s u m open
-> ParsecT s u m close -> ParsecT s u m a -> ParsecT s u m a
between
(ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ()
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ()
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ()
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ())
-> (ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ()
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ())
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ()
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ()
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ()
forall (m :: * -> *) a. Monad m => m a -> m ()
ignore (ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ()
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ())
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ()
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ()
forall a b. (a -> b) -> a -> b
$ Char
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
'(' ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) Char
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ()
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ()
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ()
forall (m :: * -> *). Monad m => Parser m ()
spacesOrComment)
(ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ()
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ()
forall (m :: * -> *) a. Monad m => m a -> m ()
ignore (ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ()
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ())
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ()
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ()
forall a b. (a -> b) -> a -> b
$ Char
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
')' ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) Char
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ()
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ()
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ()
forall (m :: * -> *). Monad m => Parser m ()
spacesOrComment)
Parser m (Expression SourcePos)
forall (m :: * -> *). Monad m => Parser m (Expression SourcePos)
expressionP
doExprP :: Monad m => Parser m (Expression SourcePos)
doExprP :: Parser m (Expression SourcePos)
doExprP = do
SourcePos
pos <- ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourcePos
forall (m :: * -> *) s u. Monad m => ParsecT s u m SourcePos
getPosition
ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourceName
-> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourceName
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourceName
-> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourceName)
-> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourceName
-> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourceName
forall a b. (a -> b) -> a -> b
$ SourceName
-> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourceName
forall (m :: * -> *). Monad m => SourceName -> Parser m SourceName
keyword SourceName
"do"
Parser m ()
forall (m :: * -> *). Monad m => Parser m ()
spacesOrComment
Statement SourcePos
stmt <- Parser m (Statement SourcePos)
forall (m :: * -> *). Monad m => Parser m (Statement SourcePos)
scriptStatementP
Parser m ()
forall (m :: * -> *). Monad m => Parser m ()
spacesOrComment
Expression SourcePos -> Parser m (Expression SourcePos)
forall (m :: * -> *) a. Monad m => a -> m a
return (Expression SourcePos -> Parser m (Expression SourcePos))
-> Expression SourcePos -> Parser m (Expression SourcePos)
forall a b. (a -> b) -> a -> b
$ SourcePos -> Statement SourcePos -> Expression SourcePos
forall a. a -> Statement a -> Expression a
DoE SourcePos
pos Statement SourcePos
stmt
listExprP :: Monad m => Parser m (Expression SourcePos)
listExprP :: Parser m (Expression SourcePos)
listExprP =
SourcePos -> [Expression SourcePos] -> Expression SourcePos
forall a. a -> [Expression a] -> Expression a
ListE
(SourcePos -> [Expression SourcePos] -> Expression SourcePos)
-> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourcePos
-> ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
([Expression SourcePos] -> Expression SourcePos)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourcePos
forall (m :: * -> *) s u. Monad m => ParsecT s u m SourcePos
getPosition
ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
([Expression SourcePos] -> Expression SourcePos)
-> ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
[Expression SourcePos]
-> Parser m (Expression SourcePos)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> SourceName
-> SourceName
-> Parser m (Expression SourcePos)
-> ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
[Expression SourcePos]
forall (m :: * -> *) a.
Monad m =>
SourceName -> SourceName -> Parser m a -> Parser m [a]
groupP SourceName
"[" SourceName
"]" Parser m (Expression SourcePos)
forall (m :: * -> *). Monad m => Parser m (Expression SourcePos)
expressionP
objectExprP :: Monad m => Parser m (Expression SourcePos)
objectExprP :: Parser m (Expression SourcePos)
objectExprP = SourcePos
-> [(Expression SourcePos, Expression SourcePos)]
-> Expression SourcePos
forall a. a -> [(Expression a, Expression a)] -> Expression a
ObjectE
(SourcePos
-> [(Expression SourcePos, Expression SourcePos)]
-> Expression SourcePos)
-> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourcePos
-> ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
([(Expression SourcePos, Expression SourcePos)]
-> Expression SourcePos)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourcePos
forall (m :: * -> *) s u. Monad m => ParsecT s u m SourcePos
getPosition
ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
([(Expression SourcePos, Expression SourcePos)]
-> Expression SourcePos)
-> ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
[(Expression SourcePos, Expression SourcePos)]
-> Parser m (Expression SourcePos)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> SourceName
-> SourceName
-> Parser m (Expression SourcePos, Expression SourcePos)
-> ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
[(Expression SourcePos, Expression SourcePos)]
forall (m :: * -> *) a.
Monad m =>
SourceName -> SourceName -> Parser m a -> Parser m [a]
groupP SourceName
"{" SourceName
"}" Parser m (Expression SourcePos, Expression SourcePos)
forall (m :: * -> *).
Monad m =>
Parser m (Expression SourcePos, Expression SourcePos)
expressionPairP
expressionPairP :: Monad m => Parser m ((Expression SourcePos), (Expression SourcePos))
expressionPairP :: Parser m (Expression SourcePos, Expression SourcePos)
expressionPairP = do
Expression SourcePos
a <- Parser m (Expression SourcePos)
forall (m :: * -> *). Monad m => Parser m (Expression SourcePos)
expressionP
Parser m ()
forall (m :: * -> *). Monad m => Parser m ()
spacesOrComment
Char
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
':'
Parser m ()
forall (m :: * -> *). Monad m => Parser m ()
spacesOrComment
Expression SourcePos
b <- Parser m (Expression SourcePos)
forall (m :: * -> *). Monad m => Parser m (Expression SourcePos)
expressionP
Parser m ()
forall (m :: * -> *). Monad m => Parser m ()
spacesOrComment
(Expression SourcePos, Expression SourcePos)
-> Parser m (Expression SourcePos, Expression SourcePos)
forall (m :: * -> *) a. Monad m => a -> m a
return (Expression SourcePos
a, Expression SourcePos
b)
groupP :: Monad m => String -> String -> Parser m a -> Parser m [a]
groupP :: SourceName -> SourceName -> Parser m a -> Parser m [a]
groupP SourceName
obr SourceName
cbr Parser m a
inner =
SourceName -> SourceName -> Parser m [a] -> Parser m [a]
forall (m :: * -> *) a.
Monad m =>
SourceName -> SourceName -> Parser m a -> Parser m a
bracedP SourceName
obr SourceName
cbr
(Parser m a
-> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourceName
-> Parser m [a]
forall s (m :: * -> *) t u a end.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m end -> ParsecT s u m [a]
sepBy (Parser m a
inner Parser m a
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ()
-> Parser m a
forall (m :: * -> *) a b. Monad m => m a -> m b -> m a
`before` ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ()
forall (m :: * -> *). Monad m => Parser m ()
spacesOrComment) (ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourceName
-> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourceName
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourceName
-> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourceName)
-> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourceName
-> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourceName
forall a b. (a -> b) -> a -> b
$ SourceName
-> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourceName
forall s (m :: * -> *) u.
Stream s m Char =>
SourceName -> ParsecT s u m SourceName
string SourceName
"," ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourceName
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ()
-> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourceName
forall (m :: * -> *) a b. Monad m => m a -> m b -> m a
`before` ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ()
forall (m :: * -> *). Monad m => Parser m ()
spacesOrComment))
bracedP :: Monad m => String -> String -> Parser m a -> Parser m a
bracedP :: SourceName -> SourceName -> Parser m a -> Parser m a
bracedP SourceName
obr SourceName
cbr =
ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ()
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ()
-> Parser m a
-> Parser m a
forall s (m :: * -> *) t u open close a.
Stream s m t =>
ParsecT s u m open
-> ParsecT s u m close -> ParsecT s u m a -> ParsecT s u m a
between
(ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ()
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ()
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ()
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ())
-> (ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ()
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ())
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ()
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ()
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ()
forall (m :: * -> *) a. Monad m => m a -> m ()
ignore (ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ()
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ())
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ()
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ()
forall a b. (a -> b) -> a -> b
$ SourceName
-> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourceName
forall s (m :: * -> *) u.
Stream s m Char =>
SourceName -> ParsecT s u m SourceName
string SourceName
obr ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourceName
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ()
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ()
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ()
forall (m :: * -> *). Monad m => Parser m ()
spacesOrComment)
(ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ()
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ()
forall (m :: * -> *) a. Monad m => m a -> m ()
ignore (ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ()
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ())
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ()
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ()
forall a b. (a -> b) -> a -> b
$ SourceName
-> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourceName
forall s (m :: * -> *) u.
Stream s m Char =>
SourceName -> ParsecT s u m SourceName
string SourceName
cbr ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourceName
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ()
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ()
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ()
forall (m :: * -> *). Monad m => Parser m ()
spacesOrComment)
varExprP :: Monad m => Parser m (Expression SourcePos)
varExprP :: Parser m (Expression SourcePos)
varExprP = do
SourcePos
pos <- ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourcePos
forall (m :: * -> *) s u. Monad m => ParsecT s u m SourcePos
getPosition
Text
litName <- Parser m Text
forall (m :: * -> *). Monad m => Parser m Text
identifierP
Parser m ()
forall (m :: * -> *). Monad m => Parser m ()
spacesOrComment
Expression SourcePos -> Parser m (Expression SourcePos)
forall (m :: * -> *) a. Monad m => a -> m a
return (Expression SourcePos -> Parser m (Expression SourcePos))
-> Expression SourcePos -> Parser m (Expression SourcePos)
forall a b. (a -> b) -> a -> b
$ case Text
litName of
Text
"True" -> SourcePos -> Bool -> Expression SourcePos
forall a. a -> Bool -> Expression a
BoolLiteralE SourcePos
pos Bool
True
Text
"true" -> SourcePos -> Bool -> Expression SourcePos
forall a. a -> Bool -> Expression a
BoolLiteralE SourcePos
pos Bool
True
Text
"False" -> SourcePos -> Bool -> Expression SourcePos
forall a. a -> Bool -> Expression a
BoolLiteralE SourcePos
pos Bool
False
Text
"false" -> SourcePos -> Bool -> Expression SourcePos
forall a. a -> Bool -> Expression a
BoolLiteralE SourcePos
pos Bool
False
Text
"null" -> SourcePos -> Expression SourcePos
forall a. a -> Expression a
NullLiteralE SourcePos
pos
Text
_ -> SourcePos -> Text -> Expression SourcePos
forall a. a -> Text -> Expression a
VarE SourcePos
pos Text
litName
identifierP :: Monad m => Parser m Text
identifierP :: Parser m Text
identifierP =
SourceName -> Text
Text.pack (SourceName -> Text)
-> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourceName
-> Parser m Text
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (
(:)
(Char -> ShowS)
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) Char
-> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) ShowS
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> SourceName
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) Char
forall s (m :: * -> *) u.
Stream s m Char =>
SourceName -> ParsecT s u m Char
oneOf ([Char
'a'..Char
'z'] SourceName -> ShowS
forall a. [a] -> [a] -> [a]
++ [Char
'A'..Char
'Z'] SourceName -> ShowS
forall a. [a] -> [a] -> [a]
++ [Char
'_'])
ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ShowS
-> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourceName
-> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourceName
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) Char
-> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourceName
forall (f :: * -> *) a. Alternative f => f a -> f [a]
many ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) Char
forall (m :: * -> *). Monad m => Parser m Char
identCharP)
identCharP :: Monad m => Parser m Char
identCharP :: Parser m Char
identCharP = SourceName -> Parser m Char
forall s (m :: * -> *) u.
Stream s m Char =>
SourceName -> ParsecT s u m Char
oneOf ([Char
'a'..Char
'z'] SourceName -> ShowS
forall a. [a] -> [a] -> [a]
++ [Char
'A'..Char
'Z'] SourceName -> ShowS
forall a. [a] -> [a] -> [a]
++ [Char
'_'] SourceName -> ShowS
forall a. [a] -> [a] -> [a]
++ [Char
'0'..Char
'9'])
stringLiteralExprP :: Monad m => Parser m (Expression SourcePos)
stringLiteralExprP :: Parser m (Expression SourcePos)
stringLiteralExprP =
SourcePos -> Text -> Expression SourcePos
forall a. a -> Text -> Expression a
StringLiteralE
(SourcePos -> Text -> Expression SourcePos)
-> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourcePos
-> ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
(Text -> Expression SourcePos)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourcePos
forall (m :: * -> *) s u. Monad m => ParsecT s u m SourcePos
getPosition
ParsecT
SourceName
ParseState
(ReaderT (ParserOptions m) m)
(Text -> Expression SourcePos)
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) Text
-> Parser m (Expression SourcePos)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> (SourceName -> Text
Text.pack (SourceName -> Text)
-> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourceName
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) Text
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourceName
forall (m :: * -> *). Monad m => Parser m SourceName
stringLiteralP)
stringLiteralP :: Monad m => Parser m String
stringLiteralP :: Parser m SourceName
stringLiteralP = do
Char
d <- SourceName
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) Char
forall s (m :: * -> *) u.
Stream s m Char =>
SourceName -> ParsecT s u m Char
oneOf [ Char
'\'', Char
'\"' ]
ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) Char
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) Char
-> Parser m SourceName
forall s (m :: * -> *) t u a end.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m end -> ParsecT s u m [a]
manyTill ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) Char
forall (m :: * -> *). Monad m => Parser m Char
stringCharP (Char
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
d)
stringCharP :: Monad m => Parser m Char
stringCharP :: Parser m Char
stringCharP = do
Char
c1 <- Parser m Char
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Char
anyChar
case Char
c1 of
Char
'\\' -> do
Char
c2 <- Parser m Char
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Char
anyChar
case Char
c2 of
Char
'n' -> Char -> Parser m Char
forall (m :: * -> *) a. Monad m => a -> m a
return Char
'\n'
Char
'r' -> Char -> Parser m Char
forall (m :: * -> *) a. Monad m => a -> m a
return Char
'\r'
Char
'b' -> Char -> Parser m Char
forall (m :: * -> *) a. Monad m => a -> m a
return Char
'\b'
Char
'v' -> Char -> Parser m Char
forall (m :: * -> *) a. Monad m => a -> m a
return Char
'\v'
Char
'0' -> Char -> Parser m Char
forall (m :: * -> *) a. Monad m => a -> m a
return Char
'\0'
Char
't' -> Char -> Parser m Char
forall (m :: * -> *) a. Monad m => a -> m a
return Char
'\t'
Char
_ -> Char -> Parser m Char
forall (m :: * -> *) a. Monad m => a -> m a
return Char
c2
Char
_ -> Char -> Parser m Char
forall (m :: * -> *) a. Monad m => a -> m a
return Char
c1
numberLiteralExprP :: Monad m => Parser m (Expression SourcePos)
numberLiteralExprP :: Parser m (Expression SourcePos)
numberLiteralExprP = do
SourcePos
pos <- ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) SourcePos
forall (m :: * -> *) s u. Monad m => ParsecT s u m SourcePos
getPosition
SourceName
str <- Parser m SourceName
forall (m :: * -> *). Monad m => Parser m SourceName
numberLiteralP
let nMay :: Maybe Scientific
nMay :: Maybe Scientific
nMay = SourceName -> Maybe Scientific
forall a. Read a => SourceName -> Maybe a
readMay SourceName
str
case Maybe Scientific
nMay of
Just Scientific
n -> Expression SourcePos -> Parser m (Expression SourcePos)
forall (m :: * -> *) a. Monad m => a -> m a
return (Expression SourcePos -> Parser m (Expression SourcePos))
-> (Scientific -> Expression SourcePos)
-> Scientific
-> Parser m (Expression SourcePos)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. SourcePos -> Scientific -> Expression SourcePos
forall a. a -> Scientific -> Expression a
NumberLiteralE SourcePos
pos (Scientific -> Parser m (Expression SourcePos))
-> Scientific -> Parser m (Expression SourcePos)
forall a b. (a -> b) -> a -> b
$ Scientific
n
Maybe Scientific
Nothing -> SourceName -> Parser m (Expression SourcePos)
forall (m :: * -> *) a. MonadFail m => SourceName -> m a
fail (SourceName -> Parser m (Expression SourcePos))
-> SourceName -> Parser m (Expression SourcePos)
forall a b. (a -> b) -> a -> b
$ SourceName
"Failed to parse " SourceName -> ShowS
forall a. [a] -> [a] -> [a]
++ SourceName
str SourceName -> ShowS
forall a. [a] -> [a] -> [a]
++ SourceName
" as a number"
numberLiteralP :: Monad m => Parser m String
numberLiteralP :: Parser m SourceName
numberLiteralP = do
SourceName
sign <- SourceName -> Parser m SourceName -> Parser m SourceName
forall s (m :: * -> *) t a u.
Stream s m t =>
a -> ParsecT s u m a -> ParsecT s u m a
option SourceName
"" (Parser m SourceName -> Parser m SourceName)
-> Parser m SourceName -> Parser m SourceName
forall a b. (a -> b) -> a -> b
$ SourceName -> Parser m SourceName
forall s (m :: * -> *) u.
Stream s m Char =>
SourceName -> ParsecT s u m SourceName
string SourceName
"-"
SourceName
integral <- SourceName -> Parser m SourceName
forall s (m :: * -> *) u.
Stream s m Char =>
SourceName -> ParsecT s u m SourceName
string SourceName
"0" Parser m SourceName -> Parser m SourceName -> Parser m SourceName
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> ((:) (Char -> ShowS)
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) Char
-> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) ShowS
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> SourceName
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) Char
forall s (m :: * -> *) u.
Stream s m Char =>
SourceName -> ParsecT s u m Char
oneOf [Char
'1'..Char
'9'] ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ShowS
-> Parser m SourceName -> Parser m SourceName
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) Char
-> Parser m SourceName
forall (f :: * -> *) a. Alternative f => f a -> f [a]
many ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) Char
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Char
digit)
SourceName
fractional <- SourceName -> Parser m SourceName -> Parser m SourceName
forall s (m :: * -> *) t a u.
Stream s m t =>
a -> ParsecT s u m a -> ParsecT s u m a
option SourceName
"" (Parser m SourceName -> Parser m SourceName)
-> Parser m SourceName -> Parser m SourceName
forall a b. (a -> b) -> a -> b
$ (:) (Char -> ShowS)
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) Char
-> ParsecT
SourceName ParseState (ReaderT (ParserOptions m) m) ShowS
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Char
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
'.' ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ShowS
-> Parser m SourceName -> Parser m SourceName
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) Char
-> Parser m SourceName
forall (f :: * -> *) a. Alternative f => f a -> f [a]
many ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) Char
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Char
digit
SourceName -> Parser m SourceName
forall (m :: * -> *) a. Monad m => a -> m a
return (SourceName -> Parser m SourceName)
-> SourceName -> Parser m SourceName
forall a b. (a -> b) -> a -> b
$ SourceName
sign SourceName -> ShowS
forall a. [a] -> [a] -> [a]
++ SourceName
integral SourceName -> ShowS
forall a. [a] -> [a] -> [a]
++ SourceName
fractional
followedBy :: Monad m => m b -> m a -> m a
followedBy :: m b -> m a -> m a
followedBy m b
b m a
a = m a
a m a -> (a -> m a) -> m a
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \a
x -> m b
b m b -> m a -> m a
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return a
x
before :: Monad m => m a -> m b -> m a
before :: m a -> m b -> m a
before = (m b -> m a -> m a) -> m a -> m b -> m a
forall a b c. (a -> b -> c) -> b -> a -> c
flip m b -> m a -> m a
forall (m :: * -> *) b a. Monad m => m b -> m a -> m a
followedBy
keyword :: Monad m => String -> Parser m String
keyword :: SourceName -> Parser m SourceName
keyword SourceName
kw = do
SourceName -> Parser m SourceName
forall s (m :: * -> *) u.
Stream s m Char =>
SourceName -> ParsecT s u m SourceName
string SourceName
kw
ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) Char
-> ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) ()
forall s (m :: * -> *) t a u.
(Stream s m t, Show a) =>
ParsecT s u m a -> ParsecT s u m ()
notFollowedBy ParsecT SourceName ParseState (ReaderT (ParserOptions m) m) Char
forall (m :: * -> *). Monad m => Parser m Char
identCharP
SourceName -> Parser m SourceName
forall (m :: * -> *) a. Monad m => a -> m a
return SourceName
kw