{-#LANGUAGE TupleSections #-}
{-#LANGUAGE OverloadedStrings #-}
{-#LANGUAGE ScopedTypeVariables #-}
{-#LANGUAGE DeriveGeneric #-}
{-#LANGUAGE FlexibleInstances #-}
{-#LANGUAGE MultiParamTypeClasses #-}
-- | Ginger parser.
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 )

-- | Input type for the parser (source code).
type Source = String

-- | Used to resolve includes. Ginger will call this function whenever it
-- encounters an {% include %}, {% import %}, or {% extends %} directive.
-- If the required source code is not available, the resolver should return
-- @Nothing@, else @Just@ the source.
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
             ]

-- | Error information for Ginger parser errors.
data ParserError =
    ParserError
        { ParserError -> SourceName
peErrorMessage :: String -- ^ Human-readable error message
        , 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

-- | Formats a parser errror into something human-friendly.
-- If template source code is not provided, only the line and column numbers
-- and the error message are printed. If template source code is provided,
-- the offending source line is also printed, with a caret (@^@) marking the
-- exact location of the error.
formatParserError :: Maybe String -- ^ Template source code (not filename)
                  -> ParserError -- ^ Error to format
                  -> 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)
        ]

-- | Helper function to create a Ginger parser error from a Parsec error.
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)

-- | Parse Ginger source from a file. Both the initial template and all
-- subsequent includes are loaded through the provided 'IncludeResolver'. A
-- consequence of this is that if you pass a \"null resolver\" (like `const
-- (return Nothing)`), this function will always fail.
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 }

-- | Parse Ginger source from memory. The initial template is taken directly
-- from the provided 'Source', while all subsequent includes are loaded through
-- the provided 'IncludeResolver'.
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 }

-- | Parse Ginger source from a file. Flavor of 'parseGingerFile' that takes
-- additional 'ParserOptions'.
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

-- | Parse Ginger source from memory. Flavor of 'parseGinger' that takes
-- additional 'ParserOptions'.
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


-- | Delimiter configuration.
data Delimiters
    = Delimiters
        { Delimiters -> SourceName
delimOpenInterpolation :: String
        , Delimiters -> SourceName
delimCloseInterpolation :: String
        , Delimiters -> SourceName
delimOpenTag :: String
        , Delimiters -> SourceName
delimCloseTag :: String
        , Delimiters -> SourceName
delimOpenComment :: String
        , Delimiters -> SourceName
delimCloseComment :: String
        }

-- | Default delimiter configuration: @{{ }}@ for interpolation, @{% %}@ for
-- tags, @{# #}@ for comments.
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
        { -- | How to load templates / includes
          ParserOptions m -> IncludeResolver m
poIncludeResolver :: IncludeResolver m
          -- | Current source file name, if any
        , ParserOptions m -> Maybe SourceName
poSourceName :: Maybe SourceName
          -- | Disable newline stripping
        , ParserOptions m -> Bool
poKeepTrailingNewline :: Bool
          -- | Enable auto-stripping of @{% block %}@s
        , ParserOptions m -> Bool
poLStripBlocks :: Bool
          -- | Enable auto-trimming of @{% block %}@s
        , ParserOptions m -> Bool
poTrimBlocks :: Bool
          -- | Interpolation, tag, and comment delimiters
        , ParserOptions m -> Delimiters
poDelimiters :: Delimiters
        }

-- | Default parser options for a given resolver
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

-- include sourceName = templateBody <$> includeTemplate 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)
commentStmtP :: Parser m (Statement SourcePos)
commentStmtP = 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 ()
scriptCommentP :: Parser m ()
scriptCommentP = 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 ()
spacesOrComment :: Parser m ()
spacesOrComment = 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)
    -- No endif here: the parent {% if %} owns that one.
    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)
catchHeaderP :: Parser m (Maybe Text, Maybe Text)
catchHeaderP = 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

-- TODO: try/catch/finally in script mode

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)

-- {% call (foo) bar(baz) %}quux{% endcall %}
--
-- is the same as:
--
-- {% scope %}
-- {% macro __lambda(foo) %}quux{% endmacro %}
-- {% set caller = __lambda %}
-- {{ bar(baz) }}
-- {% endscope %]
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 ()
openCommentP :: Parser m ()
openCommentP =
    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 ()
closeCommentP :: Parser m ()
closeCommentP =
    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

-- vim: sw=4