{-# LANGUAGE DeriveTraversable #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE PatternGuards #-}
{-# LANGUAGE PatternSynonyms #-}
{-# LANGUAGE RecordWildCards #-}
module BNFC.CF where
import Prelude hiding ((<>))
import Control.Arrow ( (&&&) )
import Control.Monad ( guard )
import Data.Char
import Data.Ord ( Down(..) )
import qualified Data.Either as Either
import Data.Function ( on )
import Data.List ( nub, sort, group )
import qualified Data.List as List
import Data.List.NonEmpty (pattern (:|))
import qualified Data.List.NonEmpty as List1
import Data.Maybe
import Data.Map (Map)
import qualified Data.Map as Map
import Data.Set (Set)
import qualified Data.Set as Set
import Data.String (IsString(..))
import BNFC.Abs (Reg())
import BNFC.Par (pCat)
import BNFC.Lex (tokens)
import qualified BNFC.Abs as Abs
import BNFC.PrettyPrint
import BNFC.Utils (spanEnd)
type List1 = List1.NonEmpty
type CF = CFG RFun
type Rule = Rul RFun
data Rul function = Rule
{ Rul function -> function
funRule :: function
, Rul function -> RCat
valRCat :: RCat
, Rul function -> SentForm
rhsRule :: SentForm
, Rul function -> InternalRule
internal :: InternalRule
} deriving (Rul function -> Rul function -> Bool
(Rul function -> Rul function -> Bool)
-> (Rul function -> Rul function -> Bool) -> Eq (Rul function)
forall function.
Eq function =>
Rul function -> Rul function -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Rul function -> Rul function -> Bool
$c/= :: forall function.
Eq function =>
Rul function -> Rul function -> Bool
== :: Rul function -> Rul function -> Bool
$c== :: forall function.
Eq function =>
Rul function -> Rul function -> Bool
Eq, a -> Rul b -> Rul a
(a -> b) -> Rul a -> Rul b
(forall a b. (a -> b) -> Rul a -> Rul b)
-> (forall a b. a -> Rul b -> Rul a) -> Functor Rul
forall a b. a -> Rul b -> Rul a
forall a b. (a -> b) -> Rul a -> Rul b
forall (f :: * -> *).
(forall a b. (a -> b) -> f a -> f b)
-> (forall a b. a -> f b -> f a) -> Functor f
<$ :: a -> Rul b -> Rul a
$c<$ :: forall a b. a -> Rul b -> Rul a
fmap :: (a -> b) -> Rul a -> Rul b
$cfmap :: forall a b. (a -> b) -> Rul a -> Rul b
Functor)
data InternalRule
= Internal
| Parsable
deriving (InternalRule -> InternalRule -> Bool
(InternalRule -> InternalRule -> Bool)
-> (InternalRule -> InternalRule -> Bool) -> Eq InternalRule
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: InternalRule -> InternalRule -> Bool
$c/= :: InternalRule -> InternalRule -> Bool
== :: InternalRule -> InternalRule -> Bool
$c== :: InternalRule -> InternalRule -> Bool
Eq)
instance Pretty function => Pretty (Rul function) where
pretty :: Rul function -> Doc
pretty (Rule function
f RCat
cat SentForm
rhs InternalRule
internal) =
(if InternalRule
internal InternalRule -> InternalRule -> Bool
forall a. Eq a => a -> a -> Bool
== InternalRule
Internal then (Doc
"internal" Doc -> Doc -> Doc
<+>) else Doc -> Doc
forall a. a -> a
id) (Doc -> Doc) -> Doc -> Doc
forall a b. (a -> b) -> a -> b
$
function -> Doc
forall a. Pretty a => a -> Doc
pretty function
f Doc -> Doc -> Doc
<> Doc
"." Doc -> Doc -> Doc
<+> RCat -> Doc
forall a. Pretty a => a -> Doc
pretty RCat
cat Doc -> Doc -> Doc
<+> Doc
"::=" Doc -> Doc -> Doc
<+> [Doc] -> Doc
sep ((Either Cat String -> Doc) -> SentForm -> [Doc]
forall a b. (a -> b) -> [a] -> [b]
map ((Cat -> Doc) -> (String -> Doc) -> Either Cat String -> Doc
forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either Cat -> Doc
forall a. Pretty a => a -> Doc
pretty (String -> Doc
text (String -> Doc) -> (String -> String) -> String -> Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> String
forall a. Show a => a -> String
show)) SentForm
rhs)
type SentForm = [Either Cat String]
data CFG function = CFG
{ CFG function -> [Pragma]
cfgPragmas :: [Pragma]
, CFG function -> Set Cat
cfgUsedCats :: Set Cat
, CFG function -> [String]
cfgLiterals :: [Literal]
, CFG function -> [String]
cfgSymbols :: [Symbol]
, CFG function -> [String]
cfgKeywords :: [KeyWord]
, CFG function -> [Cat]
cfgReversibleCats :: [Cat]
, CFG function -> [Rul function]
cfgRules :: [Rul function]
, CFG function -> Signature
cfgSignature :: Signature
} deriving (a -> CFG b -> CFG a
(a -> b) -> CFG a -> CFG b
(forall a b. (a -> b) -> CFG a -> CFG b)
-> (forall a b. a -> CFG b -> CFG a) -> Functor CFG
forall a b. a -> CFG b -> CFG a
forall a b. (a -> b) -> CFG a -> CFG b
forall (f :: * -> *).
(forall a b. (a -> b) -> f a -> f b)
-> (forall a b. a -> f b -> f a) -> Functor f
<$ :: a -> CFG b -> CFG a
$c<$ :: forall a b. a -> CFG b -> CFG a
fmap :: (a -> b) -> CFG a -> CFG b
$cfmap :: forall a b. (a -> b) -> CFG a -> CFG b
Functor)
type Signature = Map String (WithPosition Type)
type Base = Base' String
data Base' a
= BaseT a
| ListT (Base' a)
deriving (Base' a -> Base' a -> Bool
(Base' a -> Base' a -> Bool)
-> (Base' a -> Base' a -> Bool) -> Eq (Base' a)
forall a. Eq a => Base' a -> Base' a -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Base' a -> Base' a -> Bool
$c/= :: forall a. Eq a => Base' a -> Base' a -> Bool
== :: Base' a -> Base' a -> Bool
$c== :: forall a. Eq a => Base' a -> Base' a -> Bool
Eq, Eq (Base' a)
Eq (Base' a)
-> (Base' a -> Base' a -> Ordering)
-> (Base' a -> Base' a -> Bool)
-> (Base' a -> Base' a -> Bool)
-> (Base' a -> Base' a -> Bool)
-> (Base' a -> Base' a -> Bool)
-> (Base' a -> Base' a -> Base' a)
-> (Base' a -> Base' a -> Base' a)
-> Ord (Base' a)
Base' a -> Base' a -> Bool
Base' a -> Base' a -> Ordering
Base' a -> Base' a -> Base' a
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
forall a. Ord a => Eq (Base' a)
forall a. Ord a => Base' a -> Base' a -> Bool
forall a. Ord a => Base' a -> Base' a -> Ordering
forall a. Ord a => Base' a -> Base' a -> Base' a
min :: Base' a -> Base' a -> Base' a
$cmin :: forall a. Ord a => Base' a -> Base' a -> Base' a
max :: Base' a -> Base' a -> Base' a
$cmax :: forall a. Ord a => Base' a -> Base' a -> Base' a
>= :: Base' a -> Base' a -> Bool
$c>= :: forall a. Ord a => Base' a -> Base' a -> Bool
> :: Base' a -> Base' a -> Bool
$c> :: forall a. Ord a => Base' a -> Base' a -> Bool
<= :: Base' a -> Base' a -> Bool
$c<= :: forall a. Ord a => Base' a -> Base' a -> Bool
< :: Base' a -> Base' a -> Bool
$c< :: forall a. Ord a => Base' a -> Base' a -> Bool
compare :: Base' a -> Base' a -> Ordering
$ccompare :: forall a. Ord a => Base' a -> Base' a -> Ordering
$cp1Ord :: forall a. Ord a => Eq (Base' a)
Ord, a -> Base' b -> Base' a
(a -> b) -> Base' a -> Base' b
(forall a b. (a -> b) -> Base' a -> Base' b)
-> (forall a b. a -> Base' b -> Base' a) -> Functor Base'
forall a b. a -> Base' b -> Base' a
forall a b. (a -> b) -> Base' a -> Base' b
forall (f :: * -> *).
(forall a b. (a -> b) -> f a -> f b)
-> (forall a b. a -> f b -> f a) -> Functor f
<$ :: a -> Base' b -> Base' a
$c<$ :: forall a b. a -> Base' b -> Base' a
fmap :: (a -> b) -> Base' a -> Base' b
$cfmap :: forall a b. (a -> b) -> Base' a -> Base' b
Functor)
data Type = FunT [Base] Base
deriving (Type -> Type -> Bool
(Type -> Type -> Bool) -> (Type -> Type -> Bool) -> Eq Type
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Type -> Type -> Bool
$c/= :: Type -> Type -> Bool
== :: Type -> Type -> Bool
$c== :: Type -> Type -> Bool
Eq, Eq Type
Eq Type
-> (Type -> Type -> Ordering)
-> (Type -> Type -> Bool)
-> (Type -> Type -> Bool)
-> (Type -> Type -> Bool)
-> (Type -> Type -> Bool)
-> (Type -> Type -> Type)
-> (Type -> Type -> Type)
-> Ord Type
Type -> Type -> Bool
Type -> Type -> Ordering
Type -> Type -> Type
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: Type -> Type -> Type
$cmin :: Type -> Type -> Type
max :: Type -> Type -> Type
$cmax :: Type -> Type -> Type
>= :: Type -> Type -> Bool
$c>= :: Type -> Type -> Bool
> :: Type -> Type -> Bool
$c> :: Type -> Type -> Bool
<= :: Type -> Type -> Bool
$c<= :: Type -> Type -> Bool
< :: Type -> Type -> Bool
$c< :: Type -> Type -> Bool
compare :: Type -> Type -> Ordering
$ccompare :: Type -> Type -> Ordering
$cp1Ord :: Eq Type
Ord)
dummyBase :: Base
dummyBase :: Base
dummyBase = String -> Base
forall a. a -> Base' a
BaseT String
"<DUMMY>"
dummyType :: Type
dummyType :: Type
dummyType = [Base] -> Base -> Type
FunT [] Base
dummyBase
instance Show Base where
show :: Base -> String
show (BaseT String
x) = String
x
show (ListT Base
t) = String
"[" String -> String -> String
forall a. [a] -> [a] -> [a]
++ Base -> String
forall a. Show a => a -> String
show Base
t String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
"]"
instance Show Type where
show :: Type -> String
show (FunT [Base]
ts Base
t) = [String] -> String
unwords ([String] -> String) -> [String] -> String
forall a b. (a -> b) -> a -> b
$ (Base -> String) -> [Base] -> [String]
forall a b. (a -> b) -> [a] -> [b]
map Base -> String
forall a. Show a => a -> String
show [Base]
ts [String] -> [String] -> [String]
forall a. [a] -> [a] -> [a]
++ [String
"->", Base -> String
forall a. Show a => a -> String
show Base
t]
data Exp' f
= App f Type [Exp' f]
| Var String
| LitInt Integer
| LitDouble Double
| LitChar Char
| LitString String
deriving (Exp' f -> Exp' f -> Bool
(Exp' f -> Exp' f -> Bool)
-> (Exp' f -> Exp' f -> Bool) -> Eq (Exp' f)
forall f. Eq f => Exp' f -> Exp' f -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Exp' f -> Exp' f -> Bool
$c/= :: forall f. Eq f => Exp' f -> Exp' f -> Bool
== :: Exp' f -> Exp' f -> Bool
$c== :: forall f. Eq f => Exp' f -> Exp' f -> Bool
Eq)
type Exp = Exp' String
instance (IsFun f, Pretty f) => Pretty (Exp' f) where
prettyPrec :: Int -> Exp' f -> Doc
prettyPrec Int
p Exp' f
e =
case Exp' f -> Either (Exp' f) [Exp' f]
forall a. IsFun a => Exp' a -> Either (Exp' a) [Exp' a]
listView Exp' f
e of
Right [Exp' f]
es -> Doc -> Doc
brackets (Doc -> Doc) -> Doc -> Doc
forall a b. (a -> b) -> a -> b
$ [Doc] -> Doc
hcat ([Doc] -> Doc) -> [Doc] -> Doc
forall a b. (a -> b) -> a -> b
$ Doc -> [Doc] -> [Doc]
punctuate Doc
", " ([Doc] -> [Doc]) -> [Doc] -> [Doc]
forall a b. (a -> b) -> a -> b
$ (Exp' f -> Doc) -> [Exp' f] -> [Doc]
forall a b. (a -> b) -> [a] -> [b]
map (Int -> Exp' f -> Doc
forall a. Pretty a => Int -> a -> Doc
prettyPrec Int
0) [Exp' f]
es
Left (Var String
x) -> String -> Doc
text String
x
Left (App f
f Type
_ []) -> Int -> f -> Doc
forall a. Pretty a => Int -> a -> Doc
prettyPrec Int
p f
f
Left (App f
f Type
_ [Exp' f
e1,Exp' f
e2])
| f -> Bool
forall a. IsFun a => a -> Bool
isConsFun f
f -> Bool -> Doc -> Doc
parensIf (Int
p Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
> Int
0) (Doc -> Doc) -> Doc -> Doc
forall a b. (a -> b) -> a -> b
$ [Doc] -> Doc
hsep [ Int -> Exp' f -> Doc
forall a. Pretty a => Int -> a -> Doc
prettyPrec Int
1 Exp' f
e1, Doc
":", Int -> Exp' f -> Doc
forall a. Pretty a => Int -> a -> Doc
prettyPrec Int
0 Exp' f
e2 ]
Left (App f
f Type
_ [Exp' f]
es) -> Bool -> Doc -> Doc
parensIf (Int
p Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
> Int
1) (Doc -> Doc) -> Doc -> Doc
forall a b. (a -> b) -> a -> b
$ [Doc] -> Doc
hsep ([Doc] -> Doc) -> [Doc] -> Doc
forall a b. (a -> b) -> a -> b
$ Int -> f -> Doc
forall a. Pretty a => Int -> a -> Doc
prettyPrec Int
1 f
f Doc -> [Doc] -> [Doc]
forall a. a -> [a] -> [a]
: (Exp' f -> Doc) -> [Exp' f] -> [Doc]
forall a b. (a -> b) -> [a] -> [b]
map (Int -> Exp' f -> Doc
forall a. Pretty a => Int -> a -> Doc
prettyPrec Int
2) [Exp' f]
es
Left (LitInt Integer
n) -> (String -> Doc
text (String -> Doc) -> (Integer -> String) -> Integer -> Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Integer -> String
forall a. Show a => a -> String
show) Integer
n
Left (LitDouble Double
x) -> (String -> Doc
text (String -> Doc) -> (Double -> String) -> Double -> Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Double -> String
forall a. Show a => a -> String
show) Double
x
Left (LitChar Char
c) -> (String -> Doc
text (String -> Doc) -> (Char -> String) -> Char -> Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Char -> String
forall a. Show a => a -> String
show) Char
c
Left (LitString String
s) -> (String -> Doc
text (String -> Doc) -> (String -> String) -> String -> Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> String
forall a. Show a => a -> String
show) String
s
where
listView :: Exp' a -> Either (Exp' a) [Exp' a]
listView (App a
f Type
_ [])
| a -> Bool
forall a. IsFun a => a -> Bool
isNilFun a
f = [Exp' a] -> Either (Exp' a) [Exp' a]
forall a b. b -> Either a b
Right []
listView (App a
f Type
_ [Exp' a
e1,Exp' a
e2])
| a -> Bool
forall a. IsFun a => a -> Bool
isConsFun a
f
, Right [Exp' a]
es <- Exp' a -> Either (Exp' a) [Exp' a]
listView Exp' a
e2 = [Exp' a] -> Either (Exp' a) [Exp' a]
forall a b. b -> Either a b
Right ([Exp' a] -> Either (Exp' a) [Exp' a])
-> [Exp' a] -> Either (Exp' a) [Exp' a]
forall a b. (a -> b) -> a -> b
$ Exp' a
e1Exp' a -> [Exp' a] -> [Exp' a]
forall a. a -> [a] -> [a]
:[Exp' a]
es
listView Exp' a
e0 = Exp' a -> Either (Exp' a) [Exp' a]
forall a b. a -> Either a b
Left Exp' a
e0
data Pragma
= String
| (String, String)
| TokenReg RString Bool Reg
| EntryPoints [RCat]
| Layout LayoutKeyWords
| LayoutStop [KeyWord]
| LayoutTop Symbol
| FunDef Define
data Define = Define
{ Define -> RFun
defName :: RFun
, Define -> Telescope
defArgs :: Telescope
, Define -> Exp
defBody :: Exp
, Define -> Base
defType :: Base
}
type Telescope = [(String, Base)]
isFunDef :: Pragma -> Either Pragma Define
isFunDef :: Pragma -> Either Pragma Define
isFunDef = \case
FunDef Define
d -> Define -> Either Pragma Define
forall a b. b -> Either a b
Right Define
d
Pragma
p -> Pragma -> Either Pragma Define
forall a b. a -> Either a b
Left Pragma
p
definitions :: CFG f -> [Define]
definitions :: CFG f -> [Define]
definitions CFG f
cf = [ Define
def | FunDef Define
def <- CFG f -> [Pragma]
forall function. CFG function -> [Pragma]
cfgPragmas CFG f
cf ]
type LayoutKeyWords = [(KeyWord, Delimiters)]
data Delimiters = Delimiters
{ Delimiters -> String
listSep :: Symbol
, Delimiters -> String
listOpen :: Symbol
, Delimiters -> String
listClose :: Symbol
} deriving Int -> Delimiters -> String -> String
[Delimiters] -> String -> String
Delimiters -> String
(Int -> Delimiters -> String -> String)
-> (Delimiters -> String)
-> ([Delimiters] -> String -> String)
-> Show Delimiters
forall a.
(Int -> a -> String -> String)
-> (a -> String) -> ([a] -> String -> String) -> Show a
showList :: [Delimiters] -> String -> String
$cshowList :: [Delimiters] -> String -> String
show :: Delimiters -> String
$cshow :: Delimiters -> String
showsPrec :: Int -> Delimiters -> String -> String
$cshowsPrec :: Int -> Delimiters -> String -> String
Show
tokenPragmas :: CFG f -> [(TokenCat,Reg)]
tokenPragmas :: CFG f -> [(String, Reg)]
tokenPragmas CFG f
cf = [ (RFun -> String
forall a. WithPosition a -> a
wpThing RFun
name, Reg
e) | TokenReg RFun
name Bool
_ Reg
e <- CFG f -> [Pragma]
forall function. CFG function -> [Pragma]
cfgPragmas CFG f
cf ]
tokenNames :: CFG f -> [String]
tokenNames :: CFG f -> [String]
tokenNames CFG f
cf = ((String, Reg) -> String) -> [(String, Reg)] -> [String]
forall a b. (a -> b) -> [a] -> [b]
map (String, Reg) -> String
forall a b. (a, b) -> a
fst (CFG f -> [(String, Reg)]
forall f. CFG f -> [(String, Reg)]
tokenPragmas CFG f
cf)
layoutPragmas :: CF -> (Maybe Symbol, LayoutKeyWords, [KeyWord])
layoutPragmas :: CF -> (Maybe String, LayoutKeyWords, [String])
layoutPragmas CF
cf =
( [String] -> Maybe String
forall a. [a] -> Maybe a
listToMaybe [ String
sep | LayoutTop String
sep <- [Pragma]
ps ]
, [LayoutKeyWords] -> LayoutKeyWords
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat [ LayoutKeyWords
kws | Layout LayoutKeyWords
kws <- [Pragma]
ps ]
, [[String]] -> [String]
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat [ [String]
kws | LayoutStop [String]
kws <- [Pragma]
ps ]
)
where
ps :: [Pragma]
ps = CF -> [Pragma]
forall function. CFG function -> [Pragma]
cfgPragmas CF
cf
hasLayout_ :: (Maybe Symbol, LayoutKeyWords, [KeyWord]) -> Bool
hasLayout_ :: (Maybe String, LayoutKeyWords, [String]) -> Bool
hasLayout_ (Maybe String
top, LayoutKeyWords
kws, [String]
_) = Maybe String -> Bool
forall a. Maybe a -> Bool
isJust Maybe String
top Bool -> Bool -> Bool
|| Bool -> Bool
not (LayoutKeyWords -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null LayoutKeyWords
kws)
hasLayout :: CF -> Bool
hasLayout :: CF -> Bool
hasLayout = (Maybe String, LayoutKeyWords, [String]) -> Bool
hasLayout_ ((Maybe String, LayoutKeyWords, [String]) -> Bool)
-> (CF -> (Maybe String, LayoutKeyWords, [String])) -> CF -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. CF -> (Maybe String, LayoutKeyWords, [String])
layoutPragmas
type Literal = String
type Symbol = String
type KeyWord = String
data Position
= NoPosition
| Position
{ Position -> String
posFile :: FilePath
, Position -> Int
posLine :: Int
, Position -> Int
posColumn :: Int
} deriving (Int -> Position -> String -> String
[Position] -> String -> String
Position -> String
(Int -> Position -> String -> String)
-> (Position -> String)
-> ([Position] -> String -> String)
-> Show Position
forall a.
(Int -> a -> String -> String)
-> (a -> String) -> ([a] -> String -> String) -> Show a
showList :: [Position] -> String -> String
$cshowList :: [Position] -> String -> String
show :: Position -> String
$cshow :: Position -> String
showsPrec :: Int -> Position -> String -> String
$cshowsPrec :: Int -> Position -> String -> String
Show, Position -> Position -> Bool
(Position -> Position -> Bool)
-> (Position -> Position -> Bool) -> Eq Position
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Position -> Position -> Bool
$c/= :: Position -> Position -> Bool
== :: Position -> Position -> Bool
$c== :: Position -> Position -> Bool
Eq, Eq Position
Eq Position
-> (Position -> Position -> Ordering)
-> (Position -> Position -> Bool)
-> (Position -> Position -> Bool)
-> (Position -> Position -> Bool)
-> (Position -> Position -> Bool)
-> (Position -> Position -> Position)
-> (Position -> Position -> Position)
-> Ord Position
Position -> Position -> Bool
Position -> Position -> Ordering
Position -> Position -> Position
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: Position -> Position -> Position
$cmin :: Position -> Position -> Position
max :: Position -> Position -> Position
$cmax :: Position -> Position -> Position
>= :: Position -> Position -> Bool
$c>= :: Position -> Position -> Bool
> :: Position -> Position -> Bool
$c> :: Position -> Position -> Bool
<= :: Position -> Position -> Bool
$c<= :: Position -> Position -> Bool
< :: Position -> Position -> Bool
$c< :: Position -> Position -> Bool
compare :: Position -> Position -> Ordering
$ccompare :: Position -> Position -> Ordering
$cp1Ord :: Eq Position
Ord)
prettyPosition :: Position -> String
prettyPosition :: Position -> String
prettyPosition = \case
Position
NoPosition -> String
""
Position String
file Int
line Int
col -> String -> [String] -> String
forall a. [a] -> [[a]] -> [a]
List.intercalate String
":" [ String
file, Int -> String
forall a. Show a => a -> String
show Int
line, Int -> String
forall a. Show a => a -> String
show Int
col, String
"" ]
data WithPosition a = WithPosition
{ WithPosition a -> Position
wpPosition :: Position
, WithPosition a -> a
wpThing :: a
} deriving (Int -> WithPosition a -> String -> String
[WithPosition a] -> String -> String
WithPosition a -> String
(Int -> WithPosition a -> String -> String)
-> (WithPosition a -> String)
-> ([WithPosition a] -> String -> String)
-> Show (WithPosition a)
forall a. Show a => Int -> WithPosition a -> String -> String
forall a. Show a => [WithPosition a] -> String -> String
forall a. Show a => WithPosition a -> String
forall a.
(Int -> a -> String -> String)
-> (a -> String) -> ([a] -> String -> String) -> Show a
showList :: [WithPosition a] -> String -> String
$cshowList :: forall a. Show a => [WithPosition a] -> String -> String
show :: WithPosition a -> String
$cshow :: forall a. Show a => WithPosition a -> String
showsPrec :: Int -> WithPosition a -> String -> String
$cshowsPrec :: forall a. Show a => Int -> WithPosition a -> String -> String
Show, a -> WithPosition b -> WithPosition a
(a -> b) -> WithPosition a -> WithPosition b
(forall a b. (a -> b) -> WithPosition a -> WithPosition b)
-> (forall a b. a -> WithPosition b -> WithPosition a)
-> Functor WithPosition
forall a b. a -> WithPosition b -> WithPosition a
forall a b. (a -> b) -> WithPosition a -> WithPosition b
forall (f :: * -> *).
(forall a b. (a -> b) -> f a -> f b)
-> (forall a b. a -> f b -> f a) -> Functor f
<$ :: a -> WithPosition b -> WithPosition a
$c<$ :: forall a b. a -> WithPosition b -> WithPosition a
fmap :: (a -> b) -> WithPosition a -> WithPosition b
$cfmap :: forall a b. (a -> b) -> WithPosition a -> WithPosition b
Functor, WithPosition a -> Bool
(a -> m) -> WithPosition a -> m
(a -> b -> b) -> b -> WithPosition a -> b
(forall m. Monoid m => WithPosition m -> m)
-> (forall m a. Monoid m => (a -> m) -> WithPosition a -> m)
-> (forall m a. Monoid m => (a -> m) -> WithPosition a -> m)
-> (forall a b. (a -> b -> b) -> b -> WithPosition a -> b)
-> (forall a b. (a -> b -> b) -> b -> WithPosition a -> b)
-> (forall b a. (b -> a -> b) -> b -> WithPosition a -> b)
-> (forall b a. (b -> a -> b) -> b -> WithPosition a -> b)
-> (forall a. (a -> a -> a) -> WithPosition a -> a)
-> (forall a. (a -> a -> a) -> WithPosition a -> a)
-> (forall a. WithPosition a -> [a])
-> (forall a. WithPosition a -> Bool)
-> (forall a. WithPosition a -> Int)
-> (forall a. Eq a => a -> WithPosition a -> Bool)
-> (forall a. Ord a => WithPosition a -> a)
-> (forall a. Ord a => WithPosition a -> a)
-> (forall a. Num a => WithPosition a -> a)
-> (forall a. Num a => WithPosition a -> a)
-> Foldable WithPosition
forall a. Eq a => a -> WithPosition a -> Bool
forall a. Num a => WithPosition a -> a
forall a. Ord a => WithPosition a -> a
forall m. Monoid m => WithPosition m -> m
forall a. WithPosition a -> Bool
forall a. WithPosition a -> Int
forall a. WithPosition a -> [a]
forall a. (a -> a -> a) -> WithPosition a -> a
forall m a. Monoid m => (a -> m) -> WithPosition a -> m
forall b a. (b -> a -> b) -> b -> WithPosition a -> b
forall a b. (a -> b -> b) -> b -> WithPosition a -> b
forall (t :: * -> *).
(forall m. Monoid m => t m -> m)
-> (forall m a. Monoid m => (a -> m) -> t a -> m)
-> (forall m a. Monoid m => (a -> m) -> t a -> m)
-> (forall a b. (a -> b -> b) -> b -> t a -> b)
-> (forall a b. (a -> b -> b) -> b -> t a -> b)
-> (forall b a. (b -> a -> b) -> b -> t a -> b)
-> (forall b a. (b -> a -> b) -> b -> t a -> b)
-> (forall a. (a -> a -> a) -> t a -> a)
-> (forall a. (a -> a -> a) -> t a -> a)
-> (forall a. t a -> [a])
-> (forall a. t a -> Bool)
-> (forall a. t a -> Int)
-> (forall a. Eq a => a -> t a -> Bool)
-> (forall a. Ord a => t a -> a)
-> (forall a. Ord a => t a -> a)
-> (forall a. Num a => t a -> a)
-> (forall a. Num a => t a -> a)
-> Foldable t
product :: WithPosition a -> a
$cproduct :: forall a. Num a => WithPosition a -> a
sum :: WithPosition a -> a
$csum :: forall a. Num a => WithPosition a -> a
minimum :: WithPosition a -> a
$cminimum :: forall a. Ord a => WithPosition a -> a
maximum :: WithPosition a -> a
$cmaximum :: forall a. Ord a => WithPosition a -> a
elem :: a -> WithPosition a -> Bool
$celem :: forall a. Eq a => a -> WithPosition a -> Bool
length :: WithPosition a -> Int
$clength :: forall a. WithPosition a -> Int
null :: WithPosition a -> Bool
$cnull :: forall a. WithPosition a -> Bool
toList :: WithPosition a -> [a]
$ctoList :: forall a. WithPosition a -> [a]
foldl1 :: (a -> a -> a) -> WithPosition a -> a
$cfoldl1 :: forall a. (a -> a -> a) -> WithPosition a -> a
foldr1 :: (a -> a -> a) -> WithPosition a -> a
$cfoldr1 :: forall a. (a -> a -> a) -> WithPosition a -> a
foldl' :: (b -> a -> b) -> b -> WithPosition a -> b
$cfoldl' :: forall b a. (b -> a -> b) -> b -> WithPosition a -> b
foldl :: (b -> a -> b) -> b -> WithPosition a -> b
$cfoldl :: forall b a. (b -> a -> b) -> b -> WithPosition a -> b
foldr' :: (a -> b -> b) -> b -> WithPosition a -> b
$cfoldr' :: forall a b. (a -> b -> b) -> b -> WithPosition a -> b
foldr :: (a -> b -> b) -> b -> WithPosition a -> b
$cfoldr :: forall a b. (a -> b -> b) -> b -> WithPosition a -> b
foldMap' :: (a -> m) -> WithPosition a -> m
$cfoldMap' :: forall m a. Monoid m => (a -> m) -> WithPosition a -> m
foldMap :: (a -> m) -> WithPosition a -> m
$cfoldMap :: forall m a. Monoid m => (a -> m) -> WithPosition a -> m
fold :: WithPosition m -> m
$cfold :: forall m. Monoid m => WithPosition m -> m
Foldable, Functor WithPosition
Foldable WithPosition
Functor WithPosition
-> Foldable WithPosition
-> (forall (f :: * -> *) a b.
Applicative f =>
(a -> f b) -> WithPosition a -> f (WithPosition b))
-> (forall (f :: * -> *) a.
Applicative f =>
WithPosition (f a) -> f (WithPosition a))
-> (forall (m :: * -> *) a b.
Monad m =>
(a -> m b) -> WithPosition a -> m (WithPosition b))
-> (forall (m :: * -> *) a.
Monad m =>
WithPosition (m a) -> m (WithPosition a))
-> Traversable WithPosition
(a -> f b) -> WithPosition a -> f (WithPosition b)
forall (t :: * -> *).
Functor t
-> Foldable t
-> (forall (f :: * -> *) a b.
Applicative f =>
(a -> f b) -> t a -> f (t b))
-> (forall (f :: * -> *) a. Applicative f => t (f a) -> f (t a))
-> (forall (m :: * -> *) a b.
Monad m =>
(a -> m b) -> t a -> m (t b))
-> (forall (m :: * -> *) a. Monad m => t (m a) -> m (t a))
-> Traversable t
forall (m :: * -> *) a.
Monad m =>
WithPosition (m a) -> m (WithPosition a)
forall (f :: * -> *) a.
Applicative f =>
WithPosition (f a) -> f (WithPosition a)
forall (m :: * -> *) a b.
Monad m =>
(a -> m b) -> WithPosition a -> m (WithPosition b)
forall (f :: * -> *) a b.
Applicative f =>
(a -> f b) -> WithPosition a -> f (WithPosition b)
sequence :: WithPosition (m a) -> m (WithPosition a)
$csequence :: forall (m :: * -> *) a.
Monad m =>
WithPosition (m a) -> m (WithPosition a)
mapM :: (a -> m b) -> WithPosition a -> m (WithPosition b)
$cmapM :: forall (m :: * -> *) a b.
Monad m =>
(a -> m b) -> WithPosition a -> m (WithPosition b)
sequenceA :: WithPosition (f a) -> f (WithPosition a)
$csequenceA :: forall (f :: * -> *) a.
Applicative f =>
WithPosition (f a) -> f (WithPosition a)
traverse :: (a -> f b) -> WithPosition a -> f (WithPosition b)
$ctraverse :: forall (f :: * -> *) a b.
Applicative f =>
(a -> f b) -> WithPosition a -> f (WithPosition b)
$cp2Traversable :: Foldable WithPosition
$cp1Traversable :: Functor WithPosition
Traversable)
instance Eq a => Eq (WithPosition a) where == :: WithPosition a -> WithPosition a -> Bool
(==) = a -> a -> Bool
forall a. Eq a => a -> a -> Bool
(==) (a -> a -> Bool)
-> (WithPosition a -> a)
-> WithPosition a
-> WithPosition a
-> Bool
forall b c a. (b -> b -> c) -> (a -> b) -> a -> a -> c
`on` WithPosition a -> a
forall a. WithPosition a -> a
wpThing
instance Ord a => Ord (WithPosition a) where compare :: WithPosition a -> WithPosition a -> Ordering
compare = a -> a -> Ordering
forall a. Ord a => a -> a -> Ordering
compare (a -> a -> Ordering)
-> (WithPosition a -> a)
-> WithPosition a
-> WithPosition a
-> Ordering
forall b c a. (b -> b -> c) -> (a -> b) -> a -> a -> c
`on` WithPosition a -> a
forall a. WithPosition a -> a
wpThing
instance Pretty a => Pretty (WithPosition a) where pretty :: WithPosition a -> Doc
pretty = a -> Doc
forall a. Pretty a => a -> Doc
pretty (a -> Doc) -> (WithPosition a -> a) -> WithPosition a -> Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. WithPosition a -> a
forall a. WithPosition a -> a
wpThing
noPosition :: a -> WithPosition a
noPosition :: a -> WithPosition a
noPosition = Position -> a -> WithPosition a
forall a. Position -> a -> WithPosition a
WithPosition Position
NoPosition
type RString = WithPosition String
blendInPosition :: RString -> String
blendInPosition :: RFun -> String
blendInPosition (WithPosition Position
pos String
msg)
| String -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null String
p = String
msg
| Bool
otherwise = [String] -> String
unwords [ String
p, String
msg ]
where
p :: String
p = Position -> String
prettyPosition Position
pos
type RCat = WithPosition Cat
valCat :: Rul fun -> Cat
valCat :: Rul fun -> Cat
valCat = RCat -> Cat
forall a. WithPosition a -> a
wpThing (RCat -> Cat) -> (Rul fun -> RCat) -> Rul fun -> Cat
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Rul fun -> RCat
forall function. Rul function -> RCat
valRCat
npRule :: Fun -> Cat -> SentForm -> InternalRule -> Rule
npRule :: String -> Cat -> SentForm -> InternalRule -> Rule
npRule String
f Cat
c SentForm
r InternalRule
internal = RFun -> RCat -> SentForm -> InternalRule -> Rule
forall function.
function -> RCat -> SentForm -> InternalRule -> Rul function
Rule (String -> RFun
forall a. a -> WithPosition a
noPosition String
f) (Cat -> RCat
forall a. a -> WithPosition a
noPosition Cat
c) SentForm
r InternalRule
internal
npIdentifier :: String -> Abs.Identifier
npIdentifier :: String -> Identifier
npIdentifier String
x = ((Int, Int), String) -> Identifier
Abs.Identifier ((Int
0, Int
0), String
x)
data Cat
= Cat String
| TokenCat TokenCat
| ListCat Cat
| CoercCat String Integer
deriving (Cat -> Cat -> Bool
(Cat -> Cat -> Bool) -> (Cat -> Cat -> Bool) -> Eq Cat
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Cat -> Cat -> Bool
$c/= :: Cat -> Cat -> Bool
== :: Cat -> Cat -> Bool
$c== :: Cat -> Cat -> Bool
Eq, Eq Cat
Eq Cat
-> (Cat -> Cat -> Ordering)
-> (Cat -> Cat -> Bool)
-> (Cat -> Cat -> Bool)
-> (Cat -> Cat -> Bool)
-> (Cat -> Cat -> Bool)
-> (Cat -> Cat -> Cat)
-> (Cat -> Cat -> Cat)
-> Ord Cat
Cat -> Cat -> Bool
Cat -> Cat -> Ordering
Cat -> Cat -> Cat
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: Cat -> Cat -> Cat
$cmin :: Cat -> Cat -> Cat
max :: Cat -> Cat -> Cat
$cmax :: Cat -> Cat -> Cat
>= :: Cat -> Cat -> Bool
$c>= :: Cat -> Cat -> Bool
> :: Cat -> Cat -> Bool
$c> :: Cat -> Cat -> Bool
<= :: Cat -> Cat -> Bool
$c<= :: Cat -> Cat -> Bool
< :: Cat -> Cat -> Bool
$c< :: Cat -> Cat -> Bool
compare :: Cat -> Cat -> Ordering
$ccompare :: Cat -> Cat -> Ordering
$cp1Ord :: Eq Cat
Ord)
type TokenCat = String
type BaseCat = String
type NonTerminal = Cat
catToStr :: Cat -> String
catToStr :: Cat -> String
catToStr = \case
Cat String
s -> String
s
TokenCat String
s -> String
s
ListCat Cat
c -> String
"[" String -> String -> String
forall a. [a] -> [a] -> [a]
++ Cat -> String
catToStr Cat
c String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
"]"
CoercCat String
s Integer
i -> String
s String -> String -> String
forall a. [a] -> [a] -> [a]
++ Integer -> String
forall a. Show a => a -> String
show Integer
i
instance Show Cat where
show :: Cat -> String
show = Cat -> String
catToStr
instance Pretty Cat where
pretty :: Cat -> Doc
pretty = \case
Cat String
s -> String -> Doc
text String
s
TokenCat String
s -> String -> Doc
text String
s
ListCat Cat
c -> Doc -> Doc
brackets (Doc -> Doc) -> Doc -> Doc
forall a b. (a -> b) -> a -> b
$ Cat -> Doc
forall a. Pretty a => a -> Doc
pretty Cat
c
CoercCat String
s Integer
i -> String -> Doc
text String
s Doc -> Doc -> Doc
<> Integer -> Doc
forall a. Pretty a => a -> Doc
pretty Integer
i
strToCat :: String -> Cat
strToCat :: String -> Cat
strToCat String
s =
case [Token] -> Err Cat
pCat (String -> [Token]
tokens String
s) of
Right Cat
c -> Cat -> Cat
cat2cat Cat
c
Left String
_ -> String -> Cat
Cat String
s
where
cat2cat :: Cat -> Cat
cat2cat = \case
Abs.IdCat (Abs.Identifier ((Int, Int)
_pos, String
x))
| String -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null String
ds -> if String
c String -> [String] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` [String]
specialCatsP then String -> Cat
TokenCat String
c else String -> Cat
Cat String
c
| Bool
otherwise -> String -> Integer -> Cat
CoercCat String
c (String -> Integer
forall a. Read a => String -> a
read String
ds)
where (String
ds, String
c) = (Char -> Bool) -> String -> (String, String)
forall a. (a -> Bool) -> [a] -> ([a], [a])
spanEnd Char -> Bool
isDigit String
x
Abs.ListCat Cat
c -> Cat -> Cat
ListCat (Cat -> Cat
cat2cat Cat
c)
catString, catInteger, catDouble, catChar, catIdent :: TokenCat
catString :: String
catString = String
"String"
catInteger :: String
catInteger = String
"Integer"
catDouble :: String
catDouble = String
"Double"
catChar :: String
catChar = String
"Char"
catIdent :: String
catIdent = String
"Ident"
baseTokenCatNames :: [TokenCat]
baseTokenCatNames :: [String]
baseTokenCatNames = [ String
catChar, String
catDouble, String
catInteger, String
catString ]
specialCatsP :: [TokenCat]
specialCatsP :: [String]
specialCatsP = String
catIdent String -> [String] -> [String]
forall a. a -> [a] -> [a]
: [String]
baseTokenCatNames
isDataCat :: Cat -> Bool
isDataCat :: Cat -> Bool
isDataCat Cat
c = Cat -> Bool
isDataOrListCat Cat
c Bool -> Bool -> Bool
&& Bool -> Bool
not (Cat -> Bool
isList Cat
c)
isDataOrListCat :: Cat -> Bool
isDataOrListCat :: Cat -> Bool
isDataOrListCat (CoercCat String
_ Integer
_) = Bool
False
isDataOrListCat (Cat (Char
'@':String
_)) = Bool
False
isDataOrListCat (ListCat Cat
c) = Cat -> Bool
isDataOrListCat Cat
c
isDataOrListCat Cat
_ = Bool
True
sameCat :: Cat -> Cat -> Bool
sameCat :: Cat -> Cat -> Bool
sameCat = Cat -> Cat -> Bool
forall a. Eq a => a -> a -> Bool
(==) (Cat -> Cat -> Bool) -> (Cat -> Cat) -> Cat -> Cat -> Bool
forall b c a. (b -> b -> c) -> (a -> b) -> a -> a -> c
`on` Cat -> Cat
normCat
normCat :: Cat -> Cat
normCat :: Cat -> Cat
normCat (ListCat Cat
c) = Cat -> Cat
ListCat (Cat -> Cat
normCat Cat
c)
normCat (CoercCat String
c Integer
_) = String -> Cat
Cat String
c
normCat Cat
c = Cat
c
normCatOfList :: Cat -> Cat
normCatOfList :: Cat -> Cat
normCatOfList = Cat -> Cat
normCat (Cat -> Cat) -> (Cat -> Cat) -> Cat -> Cat
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Cat -> Cat
catOfList
identCat :: Cat -> String
identCat :: Cat -> String
identCat (ListCat Cat
c) = String
"List" String -> String -> String
forall a. [a] -> [a] -> [a]
++ Cat -> String
identCat Cat
c
identCat Cat
c = Cat -> String
catToStr Cat
c
identType :: Base -> String
identType :: Base -> String
identType (ListT Base
t) = String
"List" String -> String -> String
forall a. [a] -> [a] -> [a]
++ Base -> String
identType Base
t
identType (BaseT String
s) = String
s
catOfType :: [TokenCat] -> Base -> Cat
catOfType :: [String] -> Base -> Cat
catOfType [String]
tk = \case
ListT Base
t -> Cat -> Cat
ListCat (Cat -> Cat) -> Cat -> Cat
forall a b. (a -> b) -> a -> b
$ [String] -> Base -> Cat
catOfType [String]
tk Base
t
BaseT String
s
| String
s String -> [String] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` [String]
tk -> String -> Cat
TokenCat String
s
| Bool
otherwise -> String -> Cat
Cat String
s
isList :: Cat -> Bool
isList :: Cat -> Bool
isList (ListCat Cat
_) = Bool
True
isList Cat
_ = Bool
False
baseCat :: Cat -> Either BaseCat TokenCat
baseCat :: Cat -> Either String String
baseCat = \case
ListCat Cat
c -> Cat -> Either String String
baseCat Cat
c
CoercCat String
x Integer
_ -> String -> Either String String
forall a b. a -> Either a b
Left String
x
Cat String
x -> String -> Either String String
forall a b. a -> Either a b
Left String
x
TokenCat String
x -> String -> Either String String
forall a b. b -> Either a b
Right String
x
isTokenCat :: Cat -> Bool
isTokenCat :: Cat -> Bool
isTokenCat (TokenCat String
_) = Bool
True
isTokenCat Cat
_ = Bool
False
maybeTokenCat :: Cat -> Maybe TokenCat
maybeTokenCat :: Cat -> Maybe String
maybeTokenCat = \case
TokenCat String
c -> String -> Maybe String
forall a. a -> Maybe a
Just String
c
Cat
_ -> Maybe String
forall a. Maybe a
Nothing
catOfList :: Cat -> Cat
catOfList :: Cat -> Cat
catOfList (ListCat Cat
c) = Cat
c
catOfList Cat
c = Cat
c
type Fun = String
type RFun = RString
instance IsString RFun where
fromString :: String -> RFun
fromString = String -> RFun
forall a. a -> WithPosition a
noPosition
class IsFun a where
funName :: a -> String
isNilFun :: a -> Bool
isOneFun :: a -> Bool
isConsFun :: a -> Bool
isConcatFun :: a -> Bool
isCoercion :: a -> Bool
isNilFun = (String -> Bool) -> a -> Bool
forall a. IsFun a => (String -> Bool) -> a -> Bool
funNameSatisfies (String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
"[]")
isOneFun = (String -> Bool) -> a -> Bool
forall a. IsFun a => (String -> Bool) -> a -> Bool
funNameSatisfies (String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
"(:[])")
isConsFun = (String -> Bool) -> a -> Bool
forall a. IsFun a => (String -> Bool) -> a -> Bool
funNameSatisfies (String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
"(:)")
isConcatFun = (String -> Bool) -> a -> Bool
forall a. IsFun a => (String -> Bool) -> a -> Bool
funNameSatisfies (String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
"(++)")
isCoercion = (String -> Bool) -> a -> Bool
forall a. IsFun a => (String -> Bool) -> a -> Bool
funNameSatisfies (String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
"_")
instance IsFun String where
funName :: String -> String
funName = String -> String
forall a. a -> a
id
instance IsFun a => IsFun (WithPosition a) where
funName :: WithPosition a -> String
funName = a -> String
forall a. IsFun a => a -> String
funName (a -> String) -> (WithPosition a -> a) -> WithPosition a -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. WithPosition a -> a
forall a. WithPosition a -> a
wpThing
instance IsFun a => IsFun (Rul a) where
funName :: Rul a -> String
funName = a -> String
forall a. IsFun a => a -> String
funName (a -> String) -> (Rul a -> a) -> Rul a -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Rul a -> a
forall function. Rul function -> function
funRule
instance IsFun a => IsFun (k, a) where
funName :: (k, a) -> String
funName = a -> String
forall a. IsFun a => a -> String
funName (a -> String) -> ((k, a) -> a) -> (k, a) -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (k, a) -> a
forall a b. (a, b) -> b
snd
funNameSatisfies :: IsFun a => (String -> Bool) -> a -> Bool
funNameSatisfies :: (String -> Bool) -> a -> Bool
funNameSatisfies String -> Bool
f = String -> Bool
f (String -> Bool) -> (a -> String) -> a -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> String
forall a. IsFun a => a -> String
funName
isDefinedRule :: IsFun a => a -> Bool
isDefinedRule :: a -> Bool
isDefinedRule = (String -> Bool) -> a -> Bool
forall a. IsFun a => (String -> Bool) -> a -> Bool
funNameSatisfies ((String -> Bool) -> a -> Bool) -> (String -> Bool) -> a -> Bool
forall a b. (a -> b) -> a -> b
$ \case
(Char
x:String
_) -> Char -> Bool
isLower Char
x
[] -> String -> Bool
forall a. HasCallStack => String -> a
error String
"isDefinedRule: empty function name"
isProperLabel :: IsFun a => a -> Bool
isProperLabel :: a -> Bool
isProperLabel a
f = Bool -> Bool
not (a -> Bool
forall a. IsFun a => a -> Bool
isCoercion a
f Bool -> Bool -> Bool
|| a -> Bool
forall a. IsFun a => a -> Bool
isDefinedRule a
f)
isNilCons :: IsFun a => a -> Bool
isNilCons :: a -> Bool
isNilCons a
f = a -> Bool
forall a. IsFun a => a -> Bool
isNilFun a
f Bool -> Bool -> Bool
|| a -> Bool
forall a. IsFun a => a -> Bool
isOneFun a
f Bool -> Bool -> Bool
|| a -> Bool
forall a. IsFun a => a -> Bool
isConsFun a
f Bool -> Bool -> Bool
|| a -> Bool
forall a. IsFun a => a -> Bool
isConcatFun a
f
type Data = (Cat, [(String, [Cat])])
firstEntry :: CF -> Cat
firstEntry :: CF -> Cat
firstEntry CF
cf = NonEmpty Cat -> Cat
forall a. NonEmpty a -> a
List1.head (NonEmpty Cat -> Cat) -> NonEmpty Cat -> Cat
forall a b. (a -> b) -> a -> b
$ CF -> NonEmpty Cat
forall f. CFG f -> NonEmpty Cat
allEntryPoints CF
cf
allNames :: CF -> [RString]
allNames :: CF -> [RFun]
allNames CF
cf =
[ RFun
f | RFun
f <- (Rule -> RFun) -> [Rule] -> [RFun]
forall a b. (a -> b) -> [a] -> [b]
map Rule -> RFun
forall function. Rul function -> function
funRule ([Rule] -> [RFun]) -> [Rule] -> [RFun]
forall a b. (a -> b) -> a -> b
$ CF -> [Rule]
forall function. CFG function -> [Rul function]
cfgRules CF
cf
, Bool -> Bool
not (Bool -> Bool) -> Bool -> Bool
forall a b. (a -> b) -> a -> b
$ RFun -> Bool
forall a. IsFun a => a -> Bool
isNilCons RFun
f
, Bool -> Bool
not (Bool -> Bool) -> Bool -> Bool
forall a b. (a -> b) -> a -> b
$ RFun -> Bool
forall a. IsFun a => a -> Bool
isCoercion RFun
f
] [RFun] -> [RFun] -> [RFun]
forall a. [a] -> [a] -> [a]
++
CF -> [RFun]
allCatsIdNorm CF
cf
filterNonUnique :: (Ord a) => [a] -> [a]
filterNonUnique :: [a] -> [a]
filterNonUnique [a]
xs = [ a
x | (a
x:a
_:[a]
_) <- [a] -> [[a]]
forall a. Eq a => [a] -> [[a]]
group ([a] -> [[a]]) -> [a] -> [[a]]
forall a b. (a -> b) -> a -> b
$ [a] -> [a]
forall a. Ord a => [a] -> [a]
sort [a]
xs ]
commentPragmas :: [Pragma] -> [Pragma]
= (Pragma -> Bool) -> [Pragma] -> [Pragma]
forall a. (a -> Bool) -> [a] -> [a]
filter Pragma -> Bool
isComment
where isComment :: Pragma -> Bool
isComment (CommentS String
_) = Bool
True
isComment (CommentM (String, String)
_) = Bool
True
isComment Pragma
_ = Bool
False
lookupRule :: Eq f => f -> [Rul f] -> Maybe (Cat, SentForm)
lookupRule :: f -> [Rul f] -> Maybe (Cat, SentForm)
lookupRule f
f = f -> [(f, (Cat, SentForm))] -> Maybe (Cat, SentForm)
forall a b. Eq a => a -> [(a, b)] -> Maybe b
lookup f
f ([(f, (Cat, SentForm))] -> Maybe (Cat, SentForm))
-> ([Rul f] -> [(f, (Cat, SentForm))])
-> [Rul f]
-> Maybe (Cat, SentForm)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Rul f -> (f, (Cat, SentForm)))
-> [Rul f] -> [(f, (Cat, SentForm))]
forall a b. (a -> b) -> [a] -> [b]
map Rul f -> (f, (Cat, SentForm))
forall a. Rul a -> (a, (Cat, SentForm))
unRule
where unRule :: Rul a -> (a, (Cat, SentForm))
unRule (Rule a
f' RCat
c SentForm
rhs InternalRule
_internal) = (a
f', (RCat -> Cat
forall a. WithPosition a -> a
wpThing RCat
c, SentForm
rhs))
rulesForCat :: CF -> Cat -> [Rule]
rulesForCat :: CF -> Cat -> [Rule]
rulesForCat CF
cf Cat
cat =
[ Rule -> Rule
forall f. Rul f -> Rul f
removeWhiteSpaceSeparators Rule
r | Rule
r <- CF -> [Rule]
forall function. CFG function -> [Rul function]
cfgRules CF
cf, Rule -> Bool
forall f. Rul f -> Bool
isParsable Rule
r, Rule -> Cat
forall fun. Rul fun -> Cat
valCat Rule
r Cat -> Cat -> Bool
forall a. Eq a => a -> a -> Bool
== Cat
cat]
removeWhiteSpaceSeparators :: Rul f -> Rul f
removeWhiteSpaceSeparators :: Rul f -> Rul f
removeWhiteSpaceSeparators = (SentForm -> SentForm) -> Rul f -> Rul f
forall f. (SentForm -> SentForm) -> Rul f -> Rul f
mapRhs ((SentForm -> SentForm) -> Rul f -> Rul f)
-> (SentForm -> SentForm) -> Rul f -> Rul f
forall a b. (a -> b) -> a -> b
$ (Either Cat String -> Maybe (Either Cat String))
-> SentForm -> SentForm
forall a b. (a -> Maybe b) -> [a] -> [b]
mapMaybe ((Either Cat String -> Maybe (Either Cat String))
-> SentForm -> SentForm)
-> (Either Cat String -> Maybe (Either Cat String))
-> SentForm
-> SentForm
forall a b. (a -> b) -> a -> b
$ (Cat -> Maybe (Either Cat String))
-> (String -> Maybe (Either Cat String))
-> Either Cat String
-> Maybe (Either Cat String)
forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either (Either Cat String -> Maybe (Either Cat String)
forall a. a -> Maybe a
Just (Either Cat String -> Maybe (Either Cat String))
-> (Cat -> Either Cat String) -> Cat -> Maybe (Either Cat String)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Cat -> Either Cat String
forall a b. a -> Either a b
Left) ((String -> Maybe (Either Cat String))
-> Either Cat String -> Maybe (Either Cat String))
-> (String -> Maybe (Either Cat String))
-> Either Cat String
-> Maybe (Either Cat String)
forall a b. (a -> b) -> a -> b
$ \ String
sep ->
if (Char -> Bool) -> String -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
all Char -> Bool
isSpace String
sep then Maybe (Either Cat String)
forall a. Maybe a
Nothing else Either Cat String -> Maybe (Either Cat String)
forall a. a -> Maybe a
Just (String -> Either Cat String
forall a b. b -> Either a b
Right String
sep)
mapRhs :: (SentForm -> SentForm) -> Rul f -> Rul f
mapRhs :: (SentForm -> SentForm) -> Rul f -> Rul f
mapRhs SentForm -> SentForm
f Rul f
r = Rul f
r { rhsRule :: SentForm
rhsRule = SentForm -> SentForm
f (SentForm -> SentForm) -> SentForm -> SentForm
forall a b. (a -> b) -> a -> b
$ Rul f -> SentForm
forall function. Rul function -> SentForm
rhsRule Rul f
r }
rulesForNormalizedCat :: CF -> Cat -> [Rule]
rulesForNormalizedCat :: CF -> Cat -> [Rule]
rulesForNormalizedCat CF
cf Cat
cat =
[Rule
r | Rule
r <- CF -> [Rule]
forall function. CFG function -> [Rul function]
cfgRules CF
cf, Cat -> Cat
normCat (Rule -> Cat
forall fun. Rul fun -> Cat
valCat Rule
r) Cat -> Cat -> Bool
forall a. Eq a => a -> a -> Bool
== Cat
cat]
rulesForCat' :: CF -> Cat -> [Rule]
rulesForCat' :: CF -> Cat -> [Rule]
rulesForCat' CF
cf Cat
cat = [Rule
r | Rule
r <- CF -> [Rule]
forall function. CFG function -> [Rul function]
cfgRules CF
cf, Rule -> Cat
forall fun. Rul fun -> Cat
valCat Rule
r Cat -> Cat -> Bool
forall a. Eq a => a -> a -> Bool
== Cat
cat]
allCats :: (InternalRule -> Bool) -> CFG f -> [Cat]
allCats :: (InternalRule -> Bool) -> CFG f -> [Cat]
allCats InternalRule -> Bool
pred = [Cat] -> [Cat]
forall a. Eq a => [a] -> [a]
nub ([Cat] -> [Cat]) -> (CFG f -> [Cat]) -> CFG f -> [Cat]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Rul f -> Cat) -> [Rul f] -> [Cat]
forall a b. (a -> b) -> [a] -> [b]
map Rul f -> Cat
forall fun. Rul fun -> Cat
valCat ([Rul f] -> [Cat]) -> (CFG f -> [Rul f]) -> CFG f -> [Cat]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Rul f -> Bool) -> [Rul f] -> [Rul f]
forall a. (a -> Bool) -> [a] -> [a]
filter (InternalRule -> Bool
pred (InternalRule -> Bool) -> (Rul f -> InternalRule) -> Rul f -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Rul f -> InternalRule
forall function. Rul function -> InternalRule
internal) ([Rul f] -> [Rul f]) -> (CFG f -> [Rul f]) -> CFG f -> [Rul f]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. CFG f -> [Rul f]
forall function. CFG function -> [Rul function]
cfgRules
reallyAllCats :: CFG f -> [Cat]
reallyAllCats :: CFG f -> [Cat]
reallyAllCats = (InternalRule -> Bool) -> CFG f -> [Cat]
forall f. (InternalRule -> Bool) -> CFG f -> [Cat]
allCats ((InternalRule -> Bool) -> CFG f -> [Cat])
-> (InternalRule -> Bool) -> CFG f -> [Cat]
forall a b. (a -> b) -> a -> b
$ Bool -> InternalRule -> Bool
forall a b. a -> b -> a
const Bool
True
allParserCats :: CFG f -> [Cat]
allParserCats :: CFG f -> [Cat]
allParserCats = (InternalRule -> Bool) -> CFG f -> [Cat]
forall f. (InternalRule -> Bool) -> CFG f -> [Cat]
allCats (InternalRule -> InternalRule -> Bool
forall a. Eq a => a -> a -> Bool
== InternalRule
Parsable)
allCatsIdNorm :: CF -> [RString]
allCatsIdNorm :: CF -> [RFun]
allCatsIdNorm = [RFun] -> [RFun]
forall a. Eq a => [a] -> [a]
nub ([RFun] -> [RFun]) -> (CF -> [RFun]) -> CF -> [RFun]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Rule -> RFun) -> [Rule] -> [RFun]
forall a b. (a -> b) -> [a] -> [b]
map ((Cat -> String) -> RCat -> RFun
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (Cat -> String
identCat (Cat -> String) -> (Cat -> Cat) -> Cat -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Cat -> Cat
normCat) (RCat -> RFun) -> (Rule -> RCat) -> Rule -> RFun
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Rule -> RCat
forall function. Rul function -> RCat
valRCat) ([Rule] -> [RFun]) -> (CF -> [Rule]) -> CF -> [RFun]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. CF -> [Rule]
forall function. CFG function -> [Rul function]
cfgRules
allCatsNorm :: CF -> [Cat]
allCatsNorm :: CF -> [Cat]
allCatsNorm = [Cat] -> [Cat]
forall a. Eq a => [a] -> [a]
nub ([Cat] -> [Cat]) -> (CF -> [Cat]) -> CF -> [Cat]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Rule -> Cat) -> [Rule] -> [Cat]
forall a b. (a -> b) -> [a] -> [b]
map (Cat -> Cat
normCat (Cat -> Cat) -> (Rule -> Cat) -> Rule -> Cat
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Rule -> Cat
forall fun. Rul fun -> Cat
valCat) ([Rule] -> [Cat]) -> (CF -> [Rule]) -> CF -> [Cat]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. CF -> [Rule]
forall function. CFG function -> [Rul function]
cfgRules
allParserCatsNorm :: CFG f -> [Cat]
allParserCatsNorm :: CFG f -> [Cat]
allParserCatsNorm = [Cat] -> [Cat]
forall a. Eq a => [a] -> [a]
nub ([Cat] -> [Cat]) -> (CFG f -> [Cat]) -> CFG f -> [Cat]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Cat -> Cat) -> [Cat] -> [Cat]
forall a b. (a -> b) -> [a] -> [b]
map Cat -> Cat
normCat ([Cat] -> [Cat]) -> (CFG f -> [Cat]) -> CFG f -> [Cat]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. CFG f -> [Cat]
forall f. CFG f -> [Cat]
allParserCats
isUsedCat :: CFG f -> Cat -> Bool
isUsedCat :: CFG f -> Cat -> Bool
isUsedCat CFG f
cf = (Cat -> Set Cat -> Bool
forall a. Ord a => a -> Set a -> Bool
`Set.member` CFG f -> Set Cat
forall function. CFG function -> Set Cat
cfgUsedCats CFG f
cf)
ruleGroups :: CF -> [(Cat,[Rule])]
ruleGroups :: CF -> [(Cat, [Rule])]
ruleGroups CF
cf = [(Cat
c, CF -> Cat -> [Rule]
rulesForCat CF
cf Cat
c) | Cat
c <- CF -> [Cat]
forall f. CFG f -> [Cat]
allParserCats CF
cf]
ruleGroupsInternals :: CF -> [(Cat,[Rule])]
ruleGroupsInternals :: CF -> [(Cat, [Rule])]
ruleGroupsInternals CF
cf = [(Cat
c, CF -> Cat -> [Rule]
rulesForCat' CF
cf Cat
c) | Cat
c <- CF -> [Cat]
forall f. CFG f -> [Cat]
reallyAllCats CF
cf]
literals :: CFG f -> [TokenCat]
literals :: CFG f -> [String]
literals CFG f
cf = CFG f -> [String]
forall function. CFG function -> [String]
cfgLiterals CFG f
cf [String] -> [String] -> [String]
forall a. [a] -> [a] -> [a]
++ ((String, Reg) -> String) -> [(String, Reg)] -> [String]
forall a b. (a -> b) -> [a] -> [b]
map (String, Reg) -> String
forall a b. (a, b) -> a
fst (CFG f -> [(String, Reg)]
forall f. CFG f -> [(String, Reg)]
tokenPragmas CFG f
cf)
reservedWords :: CFG f -> [String]
reservedWords :: CFG f -> [String]
reservedWords = [String] -> [String]
forall a. Ord a => [a] -> [a]
sort ([String] -> [String]) -> (CFG f -> [String]) -> CFG f -> [String]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. CFG f -> [String]
forall function. CFG function -> [String]
cfgKeywords
cfTokens :: CFG f -> [(String,Int)]
cfTokens :: CFG f -> [(String, Int)]
cfTokens CFG f
cf = [String] -> [Int] -> [(String, Int)]
forall a b. [a] -> [b] -> [(a, b)]
zip ([String] -> [String]
forall a. Ord a => [a] -> [a]
sort (CFG f -> [String]
forall function. CFG function -> [String]
cfgSymbols CFG f
cf [String] -> [String] -> [String]
forall a. [a] -> [a] -> [a]
++ CFG f -> [String]
forall function. CFG function -> [String]
reservedWords CFG f
cf)) [Int
1..]
comments :: CF -> ([(String,String)],[String])
CF
cf = ([(String, String)
p | CommentM (String, String)
p <- [Pragma]
xs], [String
s | CommentS String
s <- [Pragma]
xs])
where
xs :: [Pragma]
xs = [Pragma] -> [Pragma]
commentPragmas (CF -> [Pragma]
forall function. CFG function -> [Pragma]
cfgPragmas CF
cf)
numberOfBlockCommentForms :: CF -> Int
= [(String, String)] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length ([(String, String)] -> Int)
-> (CF -> [(String, String)]) -> CF -> Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ([(String, String)], [String]) -> [(String, String)]
forall a b. (a, b) -> a
fst (([(String, String)], [String]) -> [(String, String)])
-> (CF -> ([(String, String)], [String]))
-> CF
-> [(String, String)]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. CF -> ([(String, String)], [String])
comments
hasIdent :: CFG f -> Bool
hasIdent :: CFG f -> Bool
hasIdent CFG f
cf = CFG f -> Cat -> Bool
forall f. CFG f -> Cat -> Bool
isUsedCat CFG f
cf (Cat -> Bool) -> Cat -> Bool
forall a b. (a -> b) -> a -> b
$ String -> Cat
TokenCat String
catIdent
specialCats :: CF -> [TokenCat]
specialCats :: CF -> [String]
specialCats CF
cf = (if CF -> Bool
forall f. CFG f -> Bool
hasIdent CF
cf then (String
catIdentString -> [String] -> [String]
forall a. a -> [a] -> [a]
:) else [String] -> [String]
forall a. a -> a
id) (((String, Reg) -> String) -> [(String, Reg)] -> [String]
forall a b. (a -> b) -> [a] -> [b]
map (String, Reg) -> String
forall a b. (a, b) -> a
fst (CF -> [(String, Reg)]
forall f. CFG f -> [(String, Reg)]
tokenPragmas CF
cf))
getAbstractSyntax :: CF -> [Data]
getAbstractSyntax :: CF -> [Data]
getAbstractSyntax CF
cf = [ ( Cat
c, [(String, [Cat])] -> [(String, [Cat])]
forall a. Eq a => [a] -> [a]
nub (Cat -> [(String, [Cat])]
constructors Cat
c) ) | Cat
c <- CF -> [Cat]
allCatsNorm CF
cf ]
where
constructors :: Cat -> [(String, [Cat])]
constructors Cat
cat = do
Rule
rule <- CF -> [Rule]
forall function. CFG function -> [Rul function]
cfgRules CF
cf
let f :: RFun
f = Rule -> RFun
forall function. Rul function -> function
funRule Rule
rule
Bool -> [()]
forall (f :: * -> *). Alternative f => Bool -> f ()
guard (Bool -> [()]) -> Bool -> [()]
forall a b. (a -> b) -> a -> b
$ Bool -> Bool
not (RFun -> Bool
forall a. IsFun a => a -> Bool
isDefinedRule RFun
f)
Bool -> [()]
forall (f :: * -> *). Alternative f => Bool -> f ()
guard (Bool -> [()]) -> Bool -> [()]
forall a b. (a -> b) -> a -> b
$ Bool -> Bool
not (RFun -> Bool
forall a. IsFun a => a -> Bool
isCoercion RFun
f)
Bool -> [()]
forall (f :: * -> *). Alternative f => Bool -> f ()
guard (Bool -> [()]) -> Bool -> [()]
forall a b. (a -> b) -> a -> b
$ Cat -> Cat
normCat (Rule -> Cat
forall fun. Rul fun -> Cat
valCat Rule
rule) Cat -> Cat -> Bool
forall a. Eq a => a -> a -> Bool
== Cat
cat
let cs :: [Cat]
cs = [Cat -> Cat
normCat Cat
c | Left Cat
c <- Rule -> SentForm
forall function. Rul function -> SentForm
rhsRule Rule
rule ]
(String, [Cat]) -> [(String, [Cat])]
forall (m :: * -> *) a. Monad m => a -> m a
return (RFun -> String
forall a. WithPosition a -> a
wpThing RFun
f, [Cat]
cs)
cf2data' :: (Cat -> Bool) -> CF -> [Data]
cf2data' :: (Cat -> Bool) -> CF -> [Data]
cf2data' Cat -> Bool
predicate CF
cf =
[(Cat
cat, [(String, [Cat])] -> [(String, [Cat])]
forall a. Eq a => [a] -> [a]
nub ((Rule -> (String, [Cat])) -> [Rule] -> [(String, [Cat])]
forall a b. (a -> b) -> [a] -> [b]
map Rule -> (String, [Cat])
forall a. Rul (WithPosition a) -> (a, [Cat])
mkData [Rule
r | Rule
r <- CF -> [Rule]
forall function. CFG function -> [Rul function]
cfgRules CF
cf,
let f :: RFun
f = Rule -> RFun
forall function. Rul function -> function
funRule Rule
r,
Bool -> Bool
not (RFun -> Bool
forall a. IsFun a => a -> Bool
isDefinedRule RFun
f),
Bool -> Bool
not (RFun -> Bool
forall a. IsFun a => a -> Bool
isCoercion RFun
f), Cat
cat Cat -> Cat -> Bool
forall a. Eq a => a -> a -> Bool
== Cat -> Cat
normCat (Rule -> Cat
forall fun. Rul fun -> Cat
valCat Rule
r)]))
| Cat
cat <- [Cat] -> [Cat]
forall a. Eq a => [a] -> [a]
nub ([Cat] -> [Cat]) -> [Cat] -> [Cat]
forall a b. (a -> b) -> a -> b
$ (Cat -> Cat) -> [Cat] -> [Cat]
forall a b. (a -> b) -> [a] -> [b]
map Cat -> Cat
normCat ([Cat] -> [Cat]) -> [Cat] -> [Cat]
forall a b. (a -> b) -> a -> b
$ (Cat -> Bool) -> [Cat] -> [Cat]
forall a. (a -> Bool) -> [a] -> [a]
filter Cat -> Bool
predicate ([Cat] -> [Cat]) -> [Cat] -> [Cat]
forall a b. (a -> b) -> a -> b
$ CF -> [Cat]
forall f. CFG f -> [Cat]
reallyAllCats CF
cf ]
where
mkData :: Rul (WithPosition a) -> (a, [Cat])
mkData (Rule WithPosition a
f RCat
_ SentForm
its InternalRule
_) = (WithPosition a -> a
forall a. WithPosition a -> a
wpThing WithPosition a
f, [Cat -> Cat
normCat Cat
c | Left Cat
c <- SentForm
its ])
cf2data :: CF -> [Data]
cf2data :: CF -> [Data]
cf2data = (Cat -> Bool) -> CF -> [Data]
cf2data' ((Cat -> Bool) -> CF -> [Data]) -> (Cat -> Bool) -> CF -> [Data]
forall a b. (a -> b) -> a -> b
$ Cat -> Bool
isDataCat (Cat -> Bool) -> (Cat -> Cat) -> Cat -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Cat -> Cat
normCat
cf2dataLists :: CF -> [Data]
cf2dataLists :: CF -> [Data]
cf2dataLists = (Cat -> Bool) -> CF -> [Data]
cf2data' ((Cat -> Bool) -> CF -> [Data]) -> (Cat -> Bool) -> CF -> [Data]
forall a b. (a -> b) -> a -> b
$ Cat -> Bool
isDataOrListCat (Cat -> Bool) -> (Cat -> Cat) -> Cat -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Cat -> Cat
normCat
specialData :: CF -> [Data]
specialData :: CF -> [Data]
specialData CF
cf = [(String -> Cat
TokenCat String
name, [(String
name, [String -> Cat
TokenCat String
catString])]) | String
name <- CF -> [String]
specialCats CF
cf]
sigLookup :: IsFun a => a -> CF -> Maybe (WithPosition Type)
sigLookup :: a -> CF -> Maybe (WithPosition Type)
sigLookup a
f = String -> Signature -> Maybe (WithPosition Type)
forall k a. Ord k => k -> Map k a -> Maybe a
Map.lookup (a -> String
forall a. IsFun a => a -> String
funName a
f) (Signature -> Maybe (WithPosition Type))
-> (CF -> Signature) -> CF -> Maybe (WithPosition Type)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. CF -> Signature
forall function. CFG function -> Signature
cfgSignature
isParsable :: Rul f -> Bool
isParsable :: Rul f -> Bool
isParsable = (InternalRule
Parsable InternalRule -> InternalRule -> Bool
forall a. Eq a => a -> a -> Bool
==) (InternalRule -> Bool) -> (Rul f -> InternalRule) -> Rul f -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Rul f -> InternalRule
forall function. Rul function -> InternalRule
internal
hasNilRule :: [Rule] -> Maybe Rule
hasNilRule :: [Rule] -> Maybe Rule
hasNilRule = (Rule -> Bool) -> [Rule] -> Maybe Rule
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Maybe a
List.find Rule -> Bool
forall a. IsFun a => a -> Bool
isNilFun
hasSingletonRule :: [Rule] -> Maybe Rule
hasSingletonRule :: [Rule] -> Maybe Rule
hasSingletonRule = (Rule -> Bool) -> [Rule] -> Maybe Rule
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Maybe a
List.find Rule -> Bool
forall a. IsFun a => a -> Bool
isOneFun
sortRulesByPrecedence :: [Rule] -> [(Integer,Rule)]
sortRulesByPrecedence :: [Rule] -> [(Integer, Rule)]
sortRulesByPrecedence = ((Integer, Rule) -> Down Integer)
-> [(Integer, Rule)] -> [(Integer, Rule)]
forall b a. Ord b => (a -> b) -> [a] -> [a]
List.sortOn (Integer -> Down Integer
forall a. a -> Down a
Down (Integer -> Down Integer)
-> ((Integer, Rule) -> Integer) -> (Integer, Rule) -> Down Integer
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Integer, Rule) -> Integer
forall a b. (a, b) -> a
fst) ([(Integer, Rule)] -> [(Integer, Rule)])
-> ([Rule] -> [(Integer, Rule)]) -> [Rule] -> [(Integer, Rule)]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Rule -> (Integer, Rule)) -> [Rule] -> [(Integer, Rule)]
forall a b. (a -> b) -> [a] -> [b]
map (Rule -> Integer
forall f. Rul f -> Integer
precRule (Rule -> Integer) -> (Rule -> Rule) -> Rule -> (Integer, Rule)
forall (a :: * -> * -> *) b c c'.
Arrow a =>
a b c -> a b c' -> a b (c, c')
&&& Rule -> Rule
forall a. a -> a
id)
isEmptyListCat :: CF -> Cat -> Bool
isEmptyListCat :: CF -> Cat -> Bool
isEmptyListCat CF
cf = (Rule -> Bool) -> [Rule] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
any Rule -> Bool
forall a. IsFun a => a -> Bool
isNilFun ([Rule] -> Bool) -> (Cat -> [Rule]) -> Cat -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. CF -> Cat -> [Rule]
rulesForCat' CF
cf
isNonterm :: Either Cat String -> Bool
isNonterm :: Either Cat String -> Bool
isNonterm = Either Cat String -> Bool
forall a b. Either a b -> Bool
Either.isLeft
revSepListRule :: Rul f -> Rul f
revSepListRule :: Rul f -> Rul f
revSepListRule (Rule f
f RCat
c SentForm
ts InternalRule
internal) = f -> RCat -> SentForm -> InternalRule -> Rul f
forall function.
function -> RCat -> SentForm -> InternalRule -> Rul function
Rule f
f RCat
c (Either Cat String
xs Either Cat String -> SentForm -> SentForm
forall a. a -> [a] -> [a]
: Either Cat String
x Either Cat String -> SentForm -> SentForm
forall a. a -> [a] -> [a]
: SentForm
sep) InternalRule
internal where
(Either Cat String
x,SentForm
sep,Either Cat String
xs) = (SentForm -> Either Cat String
forall a. [a] -> a
head SentForm
ts, SentForm -> SentForm
forall a. [a] -> [a]
init (SentForm -> SentForm
forall a. [a] -> [a]
tail SentForm
ts), SentForm -> Either Cat String
forall a. [a] -> a
last SentForm
ts)
findAllReversibleCats :: CF -> [Cat]
findAllReversibleCats :: CF -> [Cat]
findAllReversibleCats CF
cf = [Cat
c | (Cat
c,[Rule]
r) <- CF -> [(Cat, [Rule])]
ruleGroups CF
cf, Cat -> [Rule] -> Bool
forall a. IsFun a => Cat -> [Rul a] -> Bool
isRev Cat
c [Rule]
r]
where
isRev :: Cat -> [Rul a] -> Bool
isRev Cat
c = \case
[Rul a
r1,Rul a
r2] | Cat -> Bool
isList Cat
c -> if a -> Bool
forall a. IsFun a => a -> Bool
isConsFun (Rul a -> a
forall function. Rul function -> function
funRule Rul a
r2) then Rul a -> Rul a -> Bool
forall a a. (IsFun a, IsFun a) => Rul a -> Rul a -> Bool
tryRev Rul a
r2 Rul a
r1
else a -> Bool
forall a. IsFun a => a -> Bool
isConsFun (Rul a -> a
forall function. Rul function -> function
funRule Rul a
r1) Bool -> Bool -> Bool
&& Rul a -> Rul a -> Bool
forall a a. (IsFun a, IsFun a) => Rul a -> Rul a -> Bool
tryRev Rul a
r1 Rul a
r2
[Rul a]
_ -> Bool
False
tryRev :: Rul a -> Rul a -> Bool
tryRev (Rule a
f RCat
_ ts :: SentForm
ts@(Either Cat String
x:Either Cat String
_:SentForm
_) InternalRule
_) Rul a
r = Rul a -> Bool
forall a. IsFun a => Rul a -> Bool
isEmptyNilRule Rul a
r Bool -> Bool -> Bool
&&
a -> Bool
forall a. IsFun a => a -> Bool
isConsFun a
f Bool -> Bool -> Bool
&& Either Cat String -> Bool
isNonterm Either Cat String
x Bool -> Bool -> Bool
&& Either Cat String -> Bool
isNonterm (SentForm -> Either Cat String
forall a. [a] -> a
last SentForm
ts)
tryRev Rul a
_ Rul a
_ = Bool
False
isEmptyNilRule :: IsFun a => Rul a -> Bool
isEmptyNilRule :: Rul a -> Bool
isEmptyNilRule (Rule a
f RCat
_ SentForm
ts InternalRule
_) = a -> Bool
forall a. IsFun a => a -> Bool
isNilFun a
f Bool -> Bool -> Bool
&& SentForm -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null SentForm
ts
precCat :: Cat -> Integer
precCat :: Cat -> Integer
precCat (CoercCat String
_ Integer
i) = Integer
i
precCat (ListCat Cat
c) = Cat -> Integer
precCat Cat
c
precCat Cat
_ = Integer
0
precRule :: Rul f -> Integer
precRule :: Rul f -> Integer
precRule = Cat -> Integer
precCat (Cat -> Integer) -> (Rul f -> Cat) -> Rul f -> Integer
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Rul f -> Cat
forall fun. Rul fun -> Cat
valCat
hasIdentLikeTokens :: CFG g -> Bool
hasIdentLikeTokens :: CFG g -> Bool
hasIdentLikeTokens CFG g
cf = CFG g -> Bool
forall f. CFG f -> Bool
hasIdent CFG g
cf Bool -> Bool -> Bool
|| [Bool] -> Bool
forall (t :: * -> *). Foldable t => t Bool -> Bool
or [ Bool -> Bool
not Bool
b | TokenReg RFun
_ Bool
b Reg
_ <- CFG g -> [Pragma]
forall function. CFG function -> [Pragma]
cfgPragmas CFG g
cf ]
hasTextualTokens :: CFG g -> Bool
hasTextualTokens :: CFG g -> Bool
hasTextualTokens CFG g
cf = CFG g -> Bool
forall f. CFG f -> Bool
hasIdent CFG g
cf Bool -> Bool -> Bool
|| [Bool] -> Bool
forall (t :: * -> *). Foldable t => t Bool -> Bool
or [ Bool
True | TokenReg{} <- CFG g -> [Pragma]
forall function. CFG function -> [Pragma]
cfgPragmas CFG g
cf ]
hasPositionTokens :: CFG g -> Bool
hasPositionTokens :: CFG g -> Bool
hasPositionTokens CFG g
cf = [Bool] -> Bool
forall (t :: * -> *). Foldable t => t Bool -> Bool
or [ Bool
b | TokenReg RFun
_ Bool
b Reg
_ <- CFG g -> [Pragma]
forall function. CFG function -> [Pragma]
cfgPragmas CFG g
cf ]
isPositionCat :: CFG f -> TokenCat -> Bool
isPositionCat :: CFG f -> String -> Bool
isPositionCat CFG f
cf String
cat = [Bool] -> Bool
forall (t :: * -> *). Foldable t => t Bool -> Bool
or [ Bool
b | TokenReg RFun
name Bool
b Reg
_ <- CFG f -> [Pragma]
forall function. CFG function -> [Pragma]
cfgPragmas CFG f
cf, RFun -> String
forall a. WithPosition a -> a
wpThing RFun
name String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
cat]
allEntryPoints :: CFG f -> List1 Cat
allEntryPoints :: CFG f -> NonEmpty Cat
allEntryPoints CFG f
cf =
case [[RCat]] -> [RCat]
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat [ [RCat]
cats | EntryPoints [RCat]
cats <- CFG f -> [Pragma]
forall function. CFG function -> [Pragma]
cfgPragmas CFG f
cf ] of
[] -> [Cat] -> NonEmpty Cat
forall a. [a] -> NonEmpty a
List1.fromList ([Cat] -> NonEmpty Cat) -> [Cat] -> NonEmpty Cat
forall a b. (a -> b) -> a -> b
$ CFG f -> [Cat]
forall f. CFG f -> [Cat]
allParserCats CFG f
cf
RCat
c:[RCat]
cs -> (RCat -> Cat) -> NonEmpty RCat -> NonEmpty Cat
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap RCat -> Cat
forall a. WithPosition a -> a
wpThing (RCat
c RCat -> [RCat] -> NonEmpty RCat
forall a. a -> [a] -> NonEmpty a
:| [RCat]
cs)