{-# LANGUAGE ConstraintKinds, CPP, FlexibleContexts, FlexibleInstances, GADTs, GeneralizedNewtypeDeriving, InstanceSigs,
             RankNTypes, ScopedTypeVariables, StandaloneDeriving, TypeApplications, TypeFamilies, TypeOperators,
             UndecidableInstances #-}
-- | A context-free memoizing parser that can handle ambiguous left-recursive grammars.
module Text.Grampa.ContextFree.SortedMemoizing.LeftRecursive (
   Fixed, Parser, SeparatedParser(..),
   autochain, liftPositive, liftPure, mapPrimitive,
   longest, peg, terminalPEG,
   parseSeparated, separated)
where

import Text.Grampa.Internal.LeftRecursive (Fixed(..), SeparatedParser(..),
                                           autochain, asLeaf, liftPositive, liftPure, mapPrimitive,
                                           parseSeparated, separated)
import Text.Grampa.ContextFree.SortedMemoizing (ResultList (..))
import qualified Text.Grampa.ContextFree.SortedMemoizing as Memoizing
import qualified Text.Grampa.PEG.Backtrack.Measured as Backtrack

-- | A parser for left-recursive grammars on top of the sorted memoizing 'Memoizing.Parser'. It's slightly slower than
-- the parser from "Text.Grampa.ContextFree.Memoizing.LeftRecursive" but provides more features.
type Parser = Fixed Memoizing.Parser

-- | Turns a context-free parser into a backtracking PEG parser that consumes the longest possible prefix of the list
-- of input tails, opposite of 'peg'
longest :: Fixed Memoizing.Parser g s a -> Fixed Backtrack.Parser g [(s, g (ResultList g s))] a
longest :: forall (g :: (* -> *) -> *) s a.
Fixed Parser g s a -> Fixed Parser g [(s, g (ResultList g s))] a
longest (PositiveDirectParser Parser g s a
p) = forall (p :: ((* -> *) -> *) -> * -> * -> *) (g :: (* -> *) -> *) s
       a.
p g s a -> Fixed p g s a
PositiveDirectParser (forall (g :: (* -> *) -> *) s a.
Parser g s a -> Parser g [(s, g (ResultList g s))] a
Memoizing.longest Parser g s a
p)
longest p :: Fixed Parser g s a
p@DirectParser{} = DirectParser{complete :: Parser g [(s, g (ResultList g s))] a
complete= forall (g :: (* -> *) -> *) s a.
Parser g s a -> Parser g [(s, g (ResultList g s))] a
Memoizing.longest (forall (p :: ((* -> *) -> *) -> * -> * -> *) (g :: (* -> *) -> *) s
       a.
Fixed p g s a -> p g s a
complete Fixed Parser g s a
p),
                                        direct0 :: Parser g [(s, g (ResultList g s))] a
direct0=  forall (g :: (* -> *) -> *) s a.
Parser g s a -> Parser g [(s, g (ResultList g s))] a
Memoizing.longest (forall (p :: ((* -> *) -> *) -> * -> * -> *) (g :: (* -> *) -> *) s
       a.
Fixed p g s a -> p g s a
direct0 Fixed Parser g s a
p),
                                        direct1 :: Parser g [(s, g (ResultList g s))] a
direct1=  forall (g :: (* -> *) -> *) s a.
Parser g s a -> Parser g [(s, g (ResultList g s))] a
Memoizing.longest (forall (p :: ((* -> *) -> *) -> * -> * -> *) (g :: (* -> *) -> *) s
       a.
Fixed p g s a -> p g s a
direct1 Fixed Parser g s a
p)}
longest p :: Fixed Parser g s a
p@Parser{} = forall (p :: ((* -> *) -> *) -> * -> * -> *) (g :: (* -> *) -> *) s
       a.
Fixed p g s a -> Fixed p g s a
asLeaf Parser{
   complete :: Parser g [(s, g (ResultList g s))] a
complete= forall (g :: (* -> *) -> *) s a.
Parser g s a -> Parser g [(s, g (ResultList g s))] a
Memoizing.longest (forall (p :: ((* -> *) -> *) -> * -> * -> *) (g :: (* -> *) -> *) s
       a.
Fixed p g s a -> p g s a
complete Fixed Parser g s a
p),
   direct :: Parser g [(s, g (ResultList g s))] a
direct=  forall (g :: (* -> *) -> *) s a.
Parser g s a -> Parser g [(s, g (ResultList g s))] a
Memoizing.longest (forall (p :: ((* -> *) -> *) -> * -> * -> *) (g :: (* -> *) -> *) s
       a.
Fixed p g s a -> p g s a
direct Fixed Parser g s a
p),
   direct0 :: Parser g [(s, g (ResultList g s))] a
direct0=  forall (g :: (* -> *) -> *) s a.
Parser g s a -> Parser g [(s, g (ResultList g s))] a
Memoizing.longest (forall (p :: ((* -> *) -> *) -> * -> * -> *) (g :: (* -> *) -> *) s
       a.
Fixed p g s a -> p g s a
direct0 Fixed Parser g s a
p),
   direct1 :: Parser g [(s, g (ResultList g s))] a
direct1=  forall (g :: (* -> *) -> *) s a.
Parser g s a -> Parser g [(s, g (ResultList g s))] a
Memoizing.longest (forall (p :: ((* -> *) -> *) -> * -> * -> *) (g :: (* -> *) -> *) s
       a.
Fixed p g s a -> p g s a
direct1 Fixed Parser g s a
p),
   indirect :: Parser g [(s, g (ResultList g s))] a
indirect=  forall (g :: (* -> *) -> *) s a.
Parser g s a -> Parser g [(s, g (ResultList g s))] a
Memoizing.longest (forall (p :: ((* -> *) -> *) -> * -> * -> *) (g :: (* -> *) -> *) s
       a.
Fixed p g s a -> p g s a
indirect Fixed Parser g s a
p),
   choices :: ChoiceTree (Fixed Parser g [(s, g (ResultList g s))] a)
choices= forall a. HasCallStack => a
undefined,
   isAmbiguous :: Maybe (AmbiguityWitness a)
isAmbiguous= forall a. Maybe a
Nothing,
   cyclicDescendants :: g (Const (ParserFlags g)) -> ParserFlags g
cyclicDescendants= forall (p :: ((* -> *) -> *) -> * -> * -> *) (g :: (* -> *) -> *) s
       a.
Fixed p g s a -> g (Const (ParserFlags g)) -> ParserFlags g
cyclicDescendants Fixed Parser g s a
p}

-- | Turns a backtracking PEG parser of the list of input tails into a context-free parser, opposite of 'longest'
peg :: Ord s => Fixed Backtrack.Parser g [(s, g (ResultList g s))] a -> Fixed Memoizing.Parser g s a
peg :: forall s (g :: (* -> *) -> *) a.
Ord s =>
Fixed Parser g [(s, g (ResultList g s))] a -> Fixed Parser g s a
peg (PositiveDirectParser Parser g [(s, g (ResultList g s))] a
p) = forall (p :: ((* -> *) -> *) -> * -> * -> *) (g :: (* -> *) -> *) s
       a.
p g s a -> Fixed p g s a
PositiveDirectParser (forall s (g :: (* -> *) -> *) a.
Ord s =>
Parser g [(s, g (ResultList g s))] a -> Parser g s a
Memoizing.peg Parser g [(s, g (ResultList g s))] a
p)
peg p :: Fixed Parser g [(s, g (ResultList g s))] a
p@DirectParser{} = DirectParser{complete :: Parser g s a
complete= forall s (g :: (* -> *) -> *) a.
Ord s =>
Parser g [(s, g (ResultList g s))] a -> Parser g s a
Memoizing.peg (forall (p :: ((* -> *) -> *) -> * -> * -> *) (g :: (* -> *) -> *) s
       a.
Fixed p g s a -> p g s a
complete Fixed Parser g [(s, g (ResultList g s))] a
p),
                                        direct0 :: Parser g s a
direct0=  forall s (g :: (* -> *) -> *) a.
Ord s =>
Parser g [(s, g (ResultList g s))] a -> Parser g s a
Memoizing.peg (forall (p :: ((* -> *) -> *) -> * -> * -> *) (g :: (* -> *) -> *) s
       a.
Fixed p g s a -> p g s a
direct0 Fixed Parser g [(s, g (ResultList g s))] a
p),
                                        direct1 :: Parser g s a
direct1=  forall s (g :: (* -> *) -> *) a.
Ord s =>
Parser g [(s, g (ResultList g s))] a -> Parser g s a
Memoizing.peg (forall (p :: ((* -> *) -> *) -> * -> * -> *) (g :: (* -> *) -> *) s
       a.
Fixed p g s a -> p g s a
direct1 Fixed Parser g [(s, g (ResultList g s))] a
p)}
peg p :: Fixed Parser g [(s, g (ResultList g s))] a
p@Parser{} = forall (p :: ((* -> *) -> *) -> * -> * -> *) (g :: (* -> *) -> *) s
       a.
Fixed p g s a -> Fixed p g s a
asLeaf Parser{
   complete :: Parser g s a
complete= forall s (g :: (* -> *) -> *) a.
Ord s =>
Parser g [(s, g (ResultList g s))] a -> Parser g s a
Memoizing.peg (forall (p :: ((* -> *) -> *) -> * -> * -> *) (g :: (* -> *) -> *) s
       a.
Fixed p g s a -> p g s a
complete Fixed Parser g [(s, g (ResultList g s))] a
p),
   direct :: Parser g s a
direct=  forall s (g :: (* -> *) -> *) a.
Ord s =>
Parser g [(s, g (ResultList g s))] a -> Parser g s a
Memoizing.peg (forall (p :: ((* -> *) -> *) -> * -> * -> *) (g :: (* -> *) -> *) s
       a.
Fixed p g s a -> p g s a
direct Fixed Parser g [(s, g (ResultList g s))] a
p),
   direct0 :: Parser g s a
direct0=  forall s (g :: (* -> *) -> *) a.
Ord s =>
Parser g [(s, g (ResultList g s))] a -> Parser g s a
Memoizing.peg (forall (p :: ((* -> *) -> *) -> * -> * -> *) (g :: (* -> *) -> *) s
       a.
Fixed p g s a -> p g s a
direct0 Fixed Parser g [(s, g (ResultList g s))] a
p),
   direct1 :: Parser g s a
direct1=  forall s (g :: (* -> *) -> *) a.
Ord s =>
Parser g [(s, g (ResultList g s))] a -> Parser g s a
Memoizing.peg (forall (p :: ((* -> *) -> *) -> * -> * -> *) (g :: (* -> *) -> *) s
       a.
Fixed p g s a -> p g s a
direct1 Fixed Parser g [(s, g (ResultList g s))] a
p),
   indirect :: Parser g s a
indirect=  forall s (g :: (* -> *) -> *) a.
Ord s =>
Parser g [(s, g (ResultList g s))] a -> Parser g s a
Memoizing.peg (forall (p :: ((* -> *) -> *) -> * -> * -> *) (g :: (* -> *) -> *) s
       a.
Fixed p g s a -> p g s a
indirect Fixed Parser g [(s, g (ResultList g s))] a
p),
   choices :: ChoiceTree (Fixed Parser g s a)
choices= forall a. HasCallStack => a
undefined,
   isAmbiguous :: Maybe (AmbiguityWitness a)
isAmbiguous= forall a. Maybe a
Nothing,
   cyclicDescendants :: g (Const (ParserFlags g)) -> ParserFlags g
cyclicDescendants= forall (p :: ((* -> *) -> *) -> * -> * -> *) (g :: (* -> *) -> *) s
       a.
Fixed p g s a -> g (Const (ParserFlags g)) -> ParserFlags g
cyclicDescendants Fixed Parser g [(s, g (ResultList g s))] a
p}

-- | Turns a backtracking PEG parser into a context-free parser
terminalPEG :: (Monoid s, Ord s) => Fixed Backtrack.Parser g s a -> Fixed Memoizing.Parser g s a
terminalPEG :: forall s (g :: (* -> *) -> *) a.
(Monoid s, Ord s) =>
Fixed Parser g s a -> Fixed Parser g s a
terminalPEG (PositiveDirectParser Parser g s a
p) = forall (p :: ((* -> *) -> *) -> * -> * -> *) (g :: (* -> *) -> *) s
       a.
p g s a -> Fixed p g s a
PositiveDirectParser (forall s (g :: (* -> *) -> *) a.
(Monoid s, Ord s) =>
Parser g s a -> Parser g s a
Memoizing.terminalPEG Parser g s a
p)
terminalPEG p :: Fixed Parser g s a
p@DirectParser{} = DirectParser{complete :: Parser g s a
complete= forall s (g :: (* -> *) -> *) a.
(Monoid s, Ord s) =>
Parser g s a -> Parser g s a
Memoizing.terminalPEG (forall (p :: ((* -> *) -> *) -> * -> * -> *) (g :: (* -> *) -> *) s
       a.
Fixed p g s a -> p g s a
complete Fixed Parser g s a
p),
                                            direct0 :: Parser g s a
direct0=  forall s (g :: (* -> *) -> *) a.
(Monoid s, Ord s) =>
Parser g s a -> Parser g s a
Memoizing.terminalPEG (forall (p :: ((* -> *) -> *) -> * -> * -> *) (g :: (* -> *) -> *) s
       a.
Fixed p g s a -> p g s a
direct0 Fixed Parser g s a
p),
                                            direct1 :: Parser g s a
direct1=  forall s (g :: (* -> *) -> *) a.
(Monoid s, Ord s) =>
Parser g s a -> Parser g s a
Memoizing.terminalPEG (forall (p :: ((* -> *) -> *) -> * -> * -> *) (g :: (* -> *) -> *) s
       a.
Fixed p g s a -> p g s a
direct1 Fixed Parser g s a
p)}
terminalPEG p :: Fixed Parser g s a
p@Parser{} = forall (p :: ((* -> *) -> *) -> * -> * -> *) (g :: (* -> *) -> *) s
       a.
Fixed p g s a -> Fixed p g s a
asLeaf Parser{
   complete :: Parser g s a
complete= forall s (g :: (* -> *) -> *) a.
(Monoid s, Ord s) =>
Parser g s a -> Parser g s a
Memoizing.terminalPEG (forall (p :: ((* -> *) -> *) -> * -> * -> *) (g :: (* -> *) -> *) s
       a.
Fixed p g s a -> p g s a
complete Fixed Parser g s a
p),
   direct :: Parser g s a
direct=  forall s (g :: (* -> *) -> *) a.
(Monoid s, Ord s) =>
Parser g s a -> Parser g s a
Memoizing.terminalPEG (forall (p :: ((* -> *) -> *) -> * -> * -> *) (g :: (* -> *) -> *) s
       a.
Fixed p g s a -> p g s a
direct Fixed Parser g s a
p),
   direct0 :: Parser g s a
direct0=  forall s (g :: (* -> *) -> *) a.
(Monoid s, Ord s) =>
Parser g s a -> Parser g s a
Memoizing.terminalPEG (forall (p :: ((* -> *) -> *) -> * -> * -> *) (g :: (* -> *) -> *) s
       a.
Fixed p g s a -> p g s a
direct0 Fixed Parser g s a
p),
   direct1 :: Parser g s a
direct1=  forall s (g :: (* -> *) -> *) a.
(Monoid s, Ord s) =>
Parser g s a -> Parser g s a
Memoizing.terminalPEG (forall (p :: ((* -> *) -> *) -> * -> * -> *) (g :: (* -> *) -> *) s
       a.
Fixed p g s a -> p g s a
direct1 Fixed Parser g s a
p),
   indirect :: Parser g s a
indirect=  forall s (g :: (* -> *) -> *) a.
(Monoid s, Ord s) =>
Parser g s a -> Parser g s a
Memoizing.terminalPEG (forall (p :: ((* -> *) -> *) -> * -> * -> *) (g :: (* -> *) -> *) s
       a.
Fixed p g s a -> p g s a
indirect Fixed Parser g s a
p),
   choices :: ChoiceTree (Fixed Parser g s a)
choices= forall a. HasCallStack => a
undefined,
   isAmbiguous :: Maybe (AmbiguityWitness a)
isAmbiguous= forall a. Maybe a
Nothing,
   cyclicDescendants :: g (Const (ParserFlags g)) -> ParserFlags g
cyclicDescendants= forall (p :: ((* -> *) -> *) -> * -> * -> *) (g :: (* -> *) -> *) s
       a.
Fixed p g s a -> g (Const (ParserFlags g)) -> ParserFlags g
cyclicDescendants Fixed Parser g s a
p}