module UHC.Light.Compiler.HS.Parser
( HSParser, HSParser'
, pAGItf
, pAGItfImport )
where
import UU.Parsing
import UU.Parsing.Offside
import UHC.Util.ParseUtils
import UU.Scanner.GenToken
import UHC.Util.ScanUtils
import UHC.Light.Compiler.Base.Common
import UHC.Light.Compiler.Base.HsName.Builtin
import UHC.Light.Compiler.Scanner.Common
import UHC.Light.Compiler.Base.TermLike
import UHC.Light.Compiler.Opts
import UHC.Light.Compiler.HS
import System.IO
import UHC.Util.Utils
import UHC.Util.Pretty
import Data.Maybe
import UHC.Light.Compiler.Base.Target
import qualified UHC.Util.FastSeq as Seq
pPacked' :: HSParser Token -> HSParser Token -> HSParser (Range -> v) -> HSParser v
pPacked' pO pC pMk = (\o mk c -> mk (mkRange2 o c)) <$> pO <*> pMk <*> pC
pParens' :: HSParser (Range -> v) -> HSParser v
pParens' = pPacked' pOPAREN pCPAREN
pBracks' :: HSParser (Range -> v) -> HSParser v
pBracks' = pPacked' pOBRACK pCBRACK
pCurlys' :: HSParser (Range -> v) -> HSParser v
pCurlys' = pPacked' pOCURLY pCCURLY
pImpls' :: HSParser (Range -> v) -> HSParser v
pImpls' = pPacked' pOIMPL pCIMPL
pImpls :: IsParser p Token => p v -> p v
pImpls = pPacked pOIMPL pCIMPL
pApp :: AppLike a boundmeta => HSParser a -> HSParser a
pApp p = appTopApp <$> pList1 p
type HSParser ep = LayoutParser Token ep
type HSParser2 ep = LayoutParser2 Token ep
type HSParser' ep = PlainParser Token ep
pAGItf :: EHCOpts -> HSParser AGItf
pAGItf opts
= AGItf_AGItf <$> pModule opts pBody'
pAGItfImport :: EHCOpts -> HSParser AGItf
pAGItfImport opts
= AGItf_AGItf <$> pModule opts (\opts _ -> pBodyImport opts)
data Expression4Result
= Expression4Result_Op (Expression,Range)
| Expression4Result_CommaList [Expression]
| Expression4Result_Typed
| Expression4Result_NotOpPre
type Expression4 = (Expression,Int,[Expression4Result])
pPragma' :: (Range -> Pragma -> x) -> HSParser x
pPragma' mk
= pPacked' pOPRAGMA pCPRAGMA
( (\t ps r -> mk r $ Pragma_Language (mkRange1 t) ps)
<$> pLANGUAGE_prag <*> pCommas (tokMkQName <$> conid)
<|> (\t cl fld val r -> mk r $ Pragma_Derivable (mkRange1 t) (tokMkQName cl) (tokMkQName fld) (tokMkQName val))
<$> pDERIVABLE_prag <*> gtycon' tyconsym <*> var <*> qvar
<|> (\t targ r -> mk r $ Pragma_ExcludeIfTarget (mkRange1 t) (map tokMkStr $ concat targ))
<$> pEXCLUDEIFTARGET_prag <*> pList1Sep pCOMMA (pList1 (conid <|> varid))
<|> (\t targ r -> mk r $ Pragma_OptionsUHC (mkRange1 t) (tokMkStr targ))
<$> pOPTIONSUHC_prag <*> pStringTk
)
pPragma :: HSParser Pragma
pPragma = pPragma' (flip const)
pDeclarationPragma :: HSParser Declaration
pDeclarationPragma
= pPragma' Declaration_Pragma
pModule :: EHCOpts -> (EHCOpts -> (HSParser2 Declaration) -> HSParser Body) -> HSParser Module
pModule opts pBody
= pList_gr pPragma
<**> ( (\ b p -> Module_Module emptyRange Nothing p Nothing b) <$> pBody opts id
<|> (\t m e b p -> Module_Module (mkRange1 t) (Just $ tokMkQName $ m) p e b) <$> pMODULE <*> modid <*> pMaybeExports <* pWHERE <*> pBody opts (\d -> d <|> pDeclarationPragma)
)
<?> "pModule"
pImportExport :: (Range -> Name -> ie,Range -> Name -> MaybeNames -> ie,Range -> Name -> ie) -> HSParser ie
pImportExport (sem_Var,sem_tOrC,sem_tOrC_complete)
= mkRngNm sem_Var <$> qvar
<|> qtycon
<**> ( pParens
( (\c n -> mkRngNm sem_tOrC n (Just (tokMkQNames c))) <$> qcnames
<|> mkRngNm sem_tOrC_complete <$ pDOTDOT
)
<|> pSucceed (\n -> mkRngNm sem_tOrC n Nothing)
)
<?> "pImportExport"
pExport :: HSParser Export
pExport
= (\t m -> Export_Module (mkRange1 t) (tokMkQName m)) <$> pMODULE <*> modid
<|> pImportExport (Export_Variable,Export_TypeOrClass,Export_TypeOrClassComplete)
<?> "pExport"
pMaybeExports :: HSParser MaybeExports
pMaybeExports
= Just <$> pParens (pListSep_ng pCOMMA pExport <* pMb pCOMMA)
<|> pSucceed Nothing
<?> "pMaybeExports"
pImport :: HSParser Import
pImport
= pImportExport (Import_Variable,Import_TypeOrClass,Import_TypeOrClassComplete)
<?> "pImport"
pImportDeclaration :: HSParser ImportDeclaration
pImportDeclaration
= (\q m a i -> ImportDeclaration_Import (mkRange1 m) q (tokMkQName m) (fmap tokMkQName a) i)
<$ pIMPORT <*> (True <$ pQUALIFIED <|> pSucceed False)
<*> modid
<*> (Just <$ pAS <*> modid <|> pSucceed Nothing)
<*> (Just <$> pImportSpecification <|> pSucceed Nothing)
<?> "pImportDeclaration"
where pImportSpecification :: HSParser ImportSpecification
pImportSpecification
= (True <$ pHIDING <|> pSucceed False)
<**> pParens'
((\i r h -> ImportSpecification_Import r h i) <$> pListSep_ng pCOMMA pImport <* pMb pCOMMA)
pLayoutList :: HSParser d -> HSParser [d]
pLayoutList pD
= pBlock pOCURLY pSEMI pCCURLY pD
pLayoutList1 :: HSParser d -> HSParser [d]
pLayoutList1 pD
= pBlock1 pOCURLY pSEMI pCCURLY pD
pBodyImport :: EHCOpts -> HSParser Body
pBodyImport opts
= (\d -> Body_Body emptyRange d []) <$> pLayoutList pImportDeclaration
<?> "pBodyImport"
pBody :: EHCOpts -> HSParser Body
pBody opts = pBody' opts id
pBody' :: EHCOpts -> (HSParser2 Declaration) -> HSParser Body
pBody' opts addDecl
= (\ids -> let (i,d) = foldr cmbid ([],[]) ids in Body_Body emptyRange i d)
<$> pLayoutList ( (\d -> ([],[d])) <$> (addDecl pTopDeclaration)
<|> (\i -> ([i],[])) <$> pImportDeclaration
)
<?> "pBody"
where
cmbid ([i],_) (is,ds) = (i:is,ds)
cmbid (_,[d]) (_ ,ds) = ([],d:ds)
pDeclaration :: HSParser Declaration
pDeclaration
= pDeclarationValue
<|> pDeclarationTypeSignature
<|> pDeclarationData
<|> pDeclarationKindSignature
<|> pDeclarationInstance
<|> pDeclarationType
<|> pDeclarationFusion
<|> pDeclarationConversion
<?> "pDeclaration"
pTopDeclaration :: HSParser Declaration
pTopDeclaration
= pDeclaration
<|> pDeclarationFixity
<|> pDeclarationForeign
<|> pDeclarationClass
<|> pDeclarationDefault
<?> "pTopDeclaration"
pDeclarations :: HSParser Declarations
pDeclarations
= pLayoutList pDeclaration
pDeclarations1 :: HSParser Declarations
pDeclarations1
= pLayoutList1 pDeclaration
pWhere'' :: HSParser d -> HSParser [d]
pWhere'' pD = pWHERE *> pLayoutList pD
pWhere' :: HSParser d -> HSParser (Maybe [d])
pWhere' pD = pMb (pWhere'' pD)
pWhere :: HSParser MaybeDeclarations
pWhere = pWhere' pDeclaration
pDeclarationFixity :: HSParser Declaration
pDeclarationFixity
= (\f p os@(o:_) -> Declaration_Fixity (mkRange1 o) f p (tokMkQNames os))
<$> pFixity
<*> ((Just . tokMkInt) <$> pInteger10Tk <|> pSucceed Nothing)
<*> pList1Sep pCOMMA op
pFixity :: HSParser' Fixity
pFixity = Fixity_Infixl <$ pINFIXL <|> Fixity_Infixr <$ pINFIXR <|> Fixity_Infix <$ pINFIX
pDeclarationTypeSignature :: HSParser Declaration
pDeclarationTypeSignature
= (\(v:vs) t -> Declaration_TypeSignature (mkRange1 v) (tokMkQNames (v:vs)) t)
<$> pList1Sep pCOMMA var <* pDCOLON <*> pType
<?> "pDeclarationTypeSignature"
pDeclarationValue :: HSParser Declaration
pDeclarationValue
= mkF <$> pLhs <*> rhs
<|> pPatternOp
<**> ( (flip mkP) <$> rhs
<|> (\o r rhs l -> mkF (mkLI l o r) rhs)
<$> pVarOp <*> pPatternOp <*> rhs
)
<?> "pDeclarationValue"
where pVarOp :: HSParser Token
pVarOp = if ehcOptBangPatterns opts then varop_no_bang else varop
pLhsTail :: HSParser [Pattern]
pLhsTail = pList1 pPatternBaseCon
pLhs :: HSParser (Range,LeftHandSide)
pLhs = (\v lhs -> let r = mkRange1 v in (r, LeftHandSide_Function r (tokMkQName v) lhs)) <$> var <*> pLhsTail
<|> pParens'
( (\l r t -> (r, mkLP r l t))
<$> pLhs
<|> (\pl o pr r t -> (r, mkLP r (mkLI pl o pr) t))
<$> pPatternOp <*> varop <*> pPatternOp
)
<*> pLhsTail
mkP p rhs = Declaration_PatternBinding emptyRange (p2p p) rhs'
where (p2p,rhs') = mkTyPat rhs
mkF (r,lhs) rhs= Declaration_FunctionBindings r [FunctionBinding_FunctionBinding r (l2l lhs) rhs']
where (l2l,rhs') = mkTyLhs rhs
mkLI l o rh = (r, LeftHandSide_Infix r l (tokMkQName o) rh)
where r = mkRange1 o
mkLP r (_,l) t = LeftHandSide_Parenthesized r l t
rhs = pMbTy <+> pRhs pEQUAL
pMbTy :: HSParser (Maybe (Token,Type))
pMbTy = pMb (pDCOLON <+> pType)
mkTyLhs (Just (tok,ty),rhs) = (\l -> LeftHandSide_Typed (mkRange1 tok) l ty,rhs)
mkTyLhs (_ ,rhs) = (id ,rhs)
mkTyPat (Just (tok,ty),rhs) = (\p -> Pattern_Typed (mkRange1 tok) p ty,rhs)
mkTyPat (_ ,rhs) = (id ,rhs)
pDeclarationSimpleValue :: HSParser Declaration
pDeclarationSimpleValue
= Declaration_PatternBinding emptyRange <$> lhs <*> rhs
<?> "pDeclarationSimpleValue"
where lhs = mkRngNm Pattern_Variable <$> var
rhs = (\t e -> RightHandSide_Expression (mkRange1 t) e Nothing) <$> pEQUAL <*> pExpression
pRhs :: HSParser Token -> HSParser RightHandSide
pRhs pSep
= (RightHandSide_Expression . mkRange1) <$> pSep <*> pExpression <*> pWhere
<|> RightHandSide_Guarded emptyRange
<$> pList1 ((GuardedExpression_GuardedExpression . mkRange1) <$> pVBAR <*> pExpression <* pSep <*> pExpression)
<*> pWhere
<?> "pRhs"
pDeclarationKindSignature :: HSParser Declaration
pDeclarationKindSignature
= (\(v:vs) t -> Declaration_KindSignature (mkRange1 v) (tokMkQNames (v:vs)) t)
<$> pList1Sep pCOMMA con <* pDCOLON <*> pKind
<?> "pDeclarationKindSignature"
pDeclarationData :: HSParser Declaration
pDeclarationData
= pDATA
<**> (pCtxt
<**> (pTypeLeftHandSide
<**> ( (\cs der lhs cx k -> mk Declaration_Data k cx lhs cs der)
<$> (pEQUAL *> pListSep pVBAR pDCon) <*> pDer
<|> (\cs der lhs cx k -> mk Declaration_Data k cx lhs cs der)
<$> pWhere'' (pGADTConstructor) <*> pDer
<|> pSucceed (\lhs cx k -> mk Declaration_Data k cx lhs [] [])
)))
<|> pNEWTYPE
<**> ( (\cx lhs c der k -> mk Declaration_Newtype k cx lhs c der)
<$> pCtxt <*> pTypeLeftHandSide <* pEQUAL <*> pNCon <*> pDer
)
<?> "pDeclarationData"
where mk sem =
\k cx lhs cs der
-> sem (mkRange1 k) cx lhs cs der
pDCon, pNCon :: HSParser Constructor
pDCon = pList pTypeQuantPrefix *> pContextedConstructor
pNCon = pList pTypeQuantPrefix *> pConstructor
pCtxt :: HSParser ContextItems
pCtxt = pContextItemsPrefixOpt
pDer :: HSParser [Deriving]
pDer = pDERIVING *> ((:[]) <$> pDeriving <|> pParens (pListSep pCOMMA pDeriving)) <|> pSucceed []
pDeriving :: HSParser Deriving
pDeriving
= (\(n,u) t -> Deriving_Deriving (mkRange1 t) n u (tokMkQName t)) <$> pInstanceName <*> qconid
pConstructor :: HSParser Constructor
pConstructor
= con
<**> ( (\ts c -> mkRngNm Constructor_Constructor c ts) <$> pList pTB
<|> pCurlys' ((\fs r c -> mkRngNm Constructor_Record c fs) <$> pListSep pCOMMA pFieldDeclaration)
)
<|> (\l o r -> Constructor_Infix (mkRange1 o) l (tokMkQName o) r) <$> pT <*> conop <*> pT
where pT = pAnnotatedType pType
pTB = pAnnotatedType pTypeBase
pContextedConstructor :: HSParser Constructor
pContextedConstructor
= Constructor_Contexted emptyRange <$> pContextItemsPrefix <*> pConstructor
<|> pConstructor
pGADTConstructor :: HSParser Constructor
pGADTConstructor
= mkRngNm Constructor_GADTFunction <$> con <* pDCOLON <*> pType
pFieldDeclaration :: HSParser FieldDeclaration
pFieldDeclaration
= (\vs@(v:_) -> FieldDeclaration_FieldDeclaration (mkRange1 v) (tokMkQNames vs))
<$> pList1Sep pCOMMA var <* pDCOLON <*> pAnnotatedType pType
pDeclarationForeign :: HSParser Declaration
pDeclarationForeign
= pFOREIGN
<**> ( (\c s (i,n,t) r -> Declaration_ForeignImport (mkRange1 r) (fst c) s i (tokMkQName n) t)
<$ pIMPORT <*> pFFIWay <*> pSafety <*> pFSpec
<|> (\c (i,n,t) r -> Declaration_ForeignExport (mkRange1 r) (fst c) i (tokMkQName n) t)
<$ pEXPORT <*> pFFIWay <*> pFSpec
)
where pSafety = (Just . tokMkStr) <$> safety <|> pSucceed Nothing
pFSpec = (,,) <$> ((Just . tokMkStr) <$> pStringTk <|> pSucceed Nothing) <*> var <* pDCOLON <*> pType
pDeclarationClass :: HSParser Declaration
pDeclarationClass
= (\t -> Declaration_Class (mkRange1 t))
<$> pCLASS
<*> pContextItemsPrefixOpt <*> pTypeLeftHandSide
<*> (pVBAR *> pListSep pCOMMA pFunctionalDependency
`opt` []
)
<*> pWhere' (pDeclarationValue <|> pDeclarationTypeSignature)
where pFunctionalDependency :: HSParser FunctionalDependency
pFunctionalDependency
= (\vs1@(v:_) vs2 -> FunctionalDependency_Dependency (mkRange1 v) (tokMkQNames vs1) (tokMkQNames vs2))
<$> pList1 tyvar <* pRARROW <*> pList1 tyvar
pInstanceName :: HSParser (Maybe HsName,Bool)
pInstanceName
= (\n e -> (Just (tokMkQName n),e)) <$> varid <*> (True <$ pLTCOLON <|> False <$ pDCOLON)
<|> pSucceed (Nothing,True)
pDeclarationInstance :: HSParser Declaration
pDeclarationInstance
= pINSTANCE
<**> (
(\((n,u),c,h) d t -> Declaration_Instance (mkRange1 t) InstNormal n u c h d)
<$> pHeader
<*> pWhere' pDeclarationValue
<|> (\e cl ts t -> Declaration_InstanceUseImplicitly (mkRange1 t) e (tokMkQName cl) ts)
<$> pExpression <* pLTCOLON <*> qconid <*> pList1 pTypeBase
)
<|>
(\t ((n,u),c,h) -> Declaration_Instance (mkRange1 t) (InstDeriving InstDerivingFrom_Standalone) n u c h Nothing)
<$> pDERIVING <* pINSTANCE <*> pHeader
where pHeader = (,,) <$> pInstanceName <*> pContextItemsPrefixOpt <*> pType' pTypeOpBase (\_ p -> p)
pDeclarationDefault :: HSParser Declaration
pDeclarationDefault
= (Declaration_Default . mkRange1) <$> pDEFAULT <*> pMb (tokMkQName <$> qtyconid)
<*> ( (:[]) <$> pTypeBase
<|> pParens (pListSep pCOMMA pTypeBase)
)
pDeclarationType :: HSParser Declaration
pDeclarationType
= (Declaration_Type . mkRange1) <$> pTYPE <*> pTypeLeftHandSide <* pEQUAL <*> pType
pDeclarationFusion :: HSParser Declaration
pDeclarationFusion
= (Declaration_FusionDeclaration . mkRange1) <$> pFUSE <*> (tokMkQName <$> qvar)
pDeclarationConversion :: HSParser Declaration
pDeclarationConversion
= (Declaration_FusionConversion . mkRange1) <$> pCONVERT <*> (tokMkQName <$> qvar) <* pCOMMA <*> (tokMkQName <$> qvar)
pKindBase :: HSParser Kind
pKindBase
= mkRngNm Kind_Constructor <$> pSTAR
<|> mkRngNm Kind_Variable <$> tyvar
<|> pParens' pInParens
<?> "pKindBase"
where pInParens :: HSParser (Range -> Kind)
pInParens
= (pKind
<**> ( pSucceed (flip Kind_Parenthesized)
) )
pKind :: HSParser Kind
pKind
= mkK <$> pK
<?> "pKind"
where pK :: HSParser (Kind,Int)
pK = pKindBase
<**> ( pSucceed (\k -> (k,1))
<|> (\(op,rng) (r,opCnt) l -> (Kind_InfixApplication rng l op r,opCnt+1)) <$> pKindOp <*> pK
)
<|> (\p e -> (p $ mkK $ e,1)) <$> pKindPrefix <*> pK
mkK (e,1) = e
mkK (e,_) = e
pKindOp :: HSParser (Kind,Range)
pKindOp = mkRngNm' Kind_Constructor <$> pRARROW
pKindPrefix :: HSParser (Kind -> Kind)
pKindPrefix
= ((Kind_Forall . mkRange1) <$> pFORALL)
<*> (tokMkQNames <$> pTyVarBinds) <* pDOT
pTypeBaseCon :: HSParser Type
pTypeBaseCon
= mkRngNm Type_Constructor <$> gtycon_no_delims_commas
pTypeBase :: HSParser Type
pTypeBase
= pTypeBaseCon
<|> (Type_Wildcard . mkRange1) <$> pTDOT
<|> (Type_MonoWildcard . mkRange1) <$> pQDOT
<|> mkRngNm Type_Variable <$> var_no_ty
<|> mkRngNm Type_NamedWildcard <$ pPERCENT <*> tyvar
<|> pBracks'
( (\t r -> Type_NormalApplication r (Type_Constructor r hsnDataList) [t])
<$> pType
<|> pSucceed (\r -> Type_Constructor r hsnDataList)
)
<|> pParens' pInParens
<|> pPacked' pOROWROW pCROWROW
( pExtFlds Type_RowEmpty Type_RowUpdate
<|> (\fs r -> Type_RowUpdate r (Type_RowEmpty r) fs) <$> pFlds
)
<|> pPacked' pOROWSUM pCROWSUM
( pExtFlds Type_RowSumEmpty Type_RowSumUpdate
<|> (\fs r -> Type_RowSumUpdate r (Type_RowSumEmpty r) fs) <$> pFlds
)
where pInParens :: HSParser (Range -> Type)
pInParens
= (pType
<**> ( pSucceed (flip Type_Parenthesized)
<|> (\es e r -> Type_RowRecUpdate r (Type_RowRecEmpty r)
(map (RowTypeUpdate_Extends r Nothing) (e:es)))
<$> pList1 (pComma *> pType)
<|> (\(o,_) e r -> Type_SectionApplication r (Just e) o Nothing)
<$> pTypeOpBaseEq
) )
<|> (pTypeOpBaseEq
<**> ( (\e (o,_) r -> Type_SectionApplication r Nothing o (Just e)) <$> pType
) )
<|> flip Type_TupleConstructor <$> commas_arity
<|> pSucceed (\r -> Type_RowRecEmpty r)
<|> (\fs r -> Type_RowRecUpdate r (Type_RowRecEmpty r) fs) <$> pFlds
<|> pExtFlds Type_RowRecEmpty Type_RowRecUpdate
pFld :: HSParser (Type -> RowTypeUpdate)
pFld = qvarid
<**> ( (\l -> RowTypeUpdate_Extends (mkRange1 l) (Just (tokMkQName l))) <$ pDCOLON
)
pFlds :: HSParser [RowTypeUpdate]
pFlds = pList1Sep pComma (pFld <*> pType)
pExtFlds :: (Range -> Type) -> (Range -> Type -> [RowTypeUpdate] -> Type) -> HSParser (Range -> Type)
pExtFlds semEmp semFromRow
= (\e fs r -> semFromRow r e fs)
<$> ( mkRngNm Type_Variable <$> qvarid
<|> pSucceed (semEmp emptyRange)
)
<* pVBAR <*> pFlds
pType' :: HSParser (Type,Range) -> (HSParser Type -> HSParser (Type,Int) -> HSParser (Type,Int)) -> HSParser Type
pType' pOp extend
= pT'
where pT' :: HSParser Type
pT' = mkT <$> pT
pT :: HSParser (Type,Int)
pT = extend pT'
$ pTypeApp
<**> ( pSucceed unit
<|> (\(op,rng) (r,cnt) l -> (Type_InfixApplication rng l op r,cnt+1)) <$> pOp <*> pT
)
unit e = (e,0)
mkT (e,0) = e
mkT (e,_) = Type_InfixApplicationChainTop emptyRange e
pType :: HSParser Type
pType
= pType'
pTypeOp
(\pT pTApp ->
pTApp
<|> (\c t -> unit $ Type_Qualified emptyRange [c] t) <$> pContextItemImpl <* pRARROW <*> pT
<|> unit <$> (pTypeQuantPrefix <*> pT)
)
where unit e = (e,0)
pTypeQuantPrefix :: HSParser (Type -> Type)
pTypeQuantPrefix
= ((Type_Forall . mkRange1) <$> pFORALL <|> (Type_Exists . mkRange1) <$> pEXISTS)
<*> (tokMkQNames <$> pTyVarBinds) <* pDOT
pTypeOpPrefix :: HSParser (Type -> Type)
pTypeOpPrefix
= (\l (op,rng) r -> Type_InfixApplication rng l op r) <$> pTypeApp <*> pTypeOp
<|> (\c -> Type_Qualified emptyRange [c]) <$> pContextItemImpl <* pRARROW
pTypeOp :: HSParser (Type,Range)
pTypeOp
= pTypeOpBaseEq
<|> mkRngNm' Type_Variable <$> varop_no_ty
<|> mkRngNm' Type_Constructor <$> pDARROW
pTypeOpBase :: HSParser (Type,Range)
pTypeOpBase
= mkRngNm' Type_Constructor
<$> ( gtycon_for_insection
)
pTypeOpBaseEq :: HSParser (Type,Range)
pTypeOpBaseEq
= pTypeOpBase
<|> mkRngNm' Type_Constructor <$> pTILDE
pTypeApp :: HSParser Type
pTypeApp
= pT <??> pA
where pT = pTypeBase
pA = (\es e -> Type_NormalApplication emptyRange e es) <$> pList1 pT
pTyVarBind :: HSParser Token
pTyVarBind = tyvar
pTyVarBinds :: HSParser [Token]
pTyVarBinds = pList1 pTyVarBind
pTypeLeftHandSide :: HSParser TypeLeftHandSide
pTypeLeftHandSide
= pLhs
<|> (\c -> mkRngNm TypeLeftHandSide_Function c []) <$> gtycon' tyconsym
<?> "pTypeLeftHandSide"
where pLhs :: HSParser TypeLeftHandSide
pLhs = mkRngNm TypeLeftHandSide_Function <$> gtycon' tyconsym <*> pLhsTail
<|> pParens'
( (\l r t -> TypeLeftHandSide_Parenthesized r l t)
<$> pLhs
)
<*> pLhsTail
<|> (\l o r -> TypeLeftHandSide_Infix (mkRange1 o) l (tokMkQName o) r)
<$> pTypePatternBase <*> tyconop <*> pTypePatternBase
pLhsTail :: HSParser [TypePattern]
pLhsTail = pList1 pTypePatternBase
pAnnotatedType :: HSParser Type -> HSParser Type
pAnnotatedType pT
= (\(r,s) t -> if s
then Type_Annotate r TypeAnnotation_Strict t
else t
)
<$> ((\t -> (mkRange1 t,True)) <$> pBANG <|> pSucceed (emptyRange,False))
<*> pT
pContextItemsPrefix1 :: HSParser ContextItems
pContextItemsPrefix1
= (:[]) <$> pContextItemImpl <* pRARROW
pContextItemsPrefix2 :: HSParser ContextItems
pContextItemsPrefix2
= ( (:[]) <$> (pContextItemBase <|> pContextItemImplWild)
<|> pParens ((:) <$> pContextItemBase
<*> ( pImO
<|> (++) <$> pList1 (pCOMMA *> pContextItemBase) <*> pImO
)
<|> pSucceed []
)
)
<* pDARROW
where pImO = (:[]) <$ pCOMMA <*> pContextItemImplWild `opt` []
pImO :: HSParser ContextItems
pContextItemsPrefix :: HSParser ContextItems
pContextItemsPrefix
= pContextItemsPrefix1
<|> pContextItemsPrefix2
pContextItemsPrefixOpt :: HSParser ContextItems
pContextItemsPrefixOpt = pContextItemsPrefix <|> pSucceed []
pTypeContextPrefix :: HSParser (Type -> Type)
pTypeContextPrefix
= Type_Qualified emptyRange <$> pContextItemsPrefix
pContextItemClass :: HSParser ContextItem
pContextItemClass
= mkRngNm ContextItem_Class <$> qconid <*> pList1 pTypeBase
pContextItemPrefix :: HSParser (ContextItem -> ContextItem)
pContextItemPrefix
= (ContextItem_Forall . mkRange1) <$> pFORALL <*> (tokMkQNames <$> pTyVarBinds) <* pDOT
pContextItem :: HSParser ContextItem
pContextItem
= pContextItemBase
<**> ( pSucceed id
<|> (\o r l -> ContextItem_Arrow (mkRange1 o) l r) <$> pDARROW <*> pContextItem
)
<|> pContextItemPrefix <*> pContextItem
pContextItemImplWild :: HSParser ContextItem
pContextItemImplWild = (ContextItem_Implicits . mkRange1) <$> pTDOT
pContextItemImpl :: HSParser ContextItem
pContextItemImpl
= pImpls'
( const <$> (pContextItem <|> pContextItemImplWild)
<|> pSucceed ContextItem_NoImplicits
)
pContextItemBase :: HSParser ContextItem
pContextItemBase
= pContextItemClass
<|> tyvar <**> ( (\s tv -> mkRngNm ContextItem_RowLacksLabel tv (tokMkQName s))
<$ pLAM <*> pSelector
)
pLiteralNumber :: HSParser Literal
pLiteralNumber
= mk 8 <$> pInteger8Tk
<|> mk 10 <$> pInteger10Tk
<|> mk 16 <$> pInteger16Tk
<?> "pLiteralNumber"
where mk b t = Literal_Int (mkRange1 t) b (tokMkStr t)
pLiteral :: HSParser Literal
pLiteral
= pLiteralNumber
<|> mkRngStr Literal_Char <$> pCharTk
<|> mkRngStr Literal_String <$> pStringTk
<|> mkRngStr Literal_Float <$> pFractionTk
<?> "pLiteral"
pExpressionMinusPrefix :: HSParser (Expression -> Expression)
pExpressionMinusPrefix
= (Expression_Negate . mkRange1) <$> pMINUS
pExpressionMbMinusPrefix :: HSParser (Expression -> Expression)
pExpressionMbMinusPrefix
= pExpressionMinusPrefix
<|> pSucceed id
pExpressionBase :: HSParser Expression
pExpressionBase
= Expression_Literal emptyRange <$> pLiteral
<|> mkRngNm Expression_Variable <$> qvar
<|> pExpressionList
<|> pParens' pInParens
<?> "pExpressionBase"
where pInParens :: HSParser (Range -> Expression)
pInParens
= (\(e,_,res) r ->
let chk ress e
= case ress of
(Expression4Result_Op (o,_) : _)
-> Expression_SectionApplication r (Just e) o Nothing
(Expression4Result_CommaList es : _)
-> Expression_RowRecordUpdate r (Expression_RowRecordEmpty r)
(map (RowRecordExpressionUpdate_Extends r Nothing) (e:es))
_ -> Expression_Parenthesized r e
in chk res e
)
<$> pExpression4'' True pOp pExpressionPrefix pExpressionLayout
<|> flip Expression_TupleConstructor <$> commas_arity
<|> (pOpm
<**> ( (\e (o,_) r -> Expression_SectionApplication r Nothing o (Just e)) <$> pExpression
) )
<|> pSucceed (\r -> Expression_RowRecordEmpty r)
<|> (\fs r -> Expression_RowRecordUpdate r (Expression_RowRecordEmpty r) fs) <$> pFlds
<|> pExtFlds
where pFld :: HSParser (Expression -> RowRecordExpressionUpdate)
pFld = qvarid
<**> ( (\l -> RowRecordExpressionUpdate_Extends (mkRange1 l) (Just (tokMkQName l))) <$ pEQUAL
<|> mkRngNm RowRecordExpressionUpdate_Update <$ pCOLEQUAL
)
pFlds :: HSParser [RowRecordExpressionUpdate]
pFlds = pList1Sep pComma (pFld <*> pExpression)
pExtFlds :: HSParser (Range -> Expression)
pExtFlds
= (\e fs r -> Expression_RowRecordUpdate r e fs)
<$> ( pParens' pExtFlds
<|> mkRngNm Expression_Variable <$> qvarid
<|> pSucceed (Expression_RowRecordEmpty emptyRange)
)
<* pVBAR <*> pFlds
pExpressionList :: HSParser Expression
pExpressionList
= pBracks'
(pExpression
<**> ( pDOTDOT
*> ( (\e3 e1 r -> Expression_Enum r e1 Nothing (Just e3)) <$> pExpression
`opt` (\ e1 r -> Expression_Enum r e1 Nothing Nothing )
)
<|> pCOMMA
*> (pExpression
<**> ( pDOTDOT
*> ( (\e3 e2 e1 r -> Expression_Enum r e1 (Just e2) (Just e3)) <$> pExpression
`opt` (\ e2 e1 r -> Expression_Enum r e1 (Just e2) Nothing )
)
<|> (\es e2 e1 r -> Expression_List r (e1:e2:es)) <$> pList (pComma *> pExpression)
) )
<|> pVBAR
*> ((\c e r -> Expression_Comprehension r e (c ++ [Qualifier_Empty emptyRange])) <$> pListSep pCOMMA pQualifier)
`opt` flip one
)
`opt` zero
)
<?> "pExpressionList"
where zero r = Expression_List r []
one r h = Expression_List r [h]
pQualifier :: HSParser Qualifier
pQualifier
= Qualifier_Guard emptyRange <$> pExpressionNoLet
<|> (Qualifier_Let . mkRange1) <$> pLET <*> pDeclarations
<|> Qualifier_Generator emptyRange <$> pPattern <* pLARROW <*> pExpression
pExpressionDo :: HSParser Expression
pExpressionDo
= (Expression_Do . mkRange1) <$> pDO <*> pBlock1 pOCURLY pSEMI pCCURLY pStatement
<?> "pExpressionDo"
where pStatement :: HSParser Statement
pStatement
= Statement_Expression emptyRange <$> pExpression
<|> (\p t e -> Statement_Generator (mkRange1 t) p e) <$> pPattern <*> pLARROW <*> pExpression
<|> (Statement_Let . mkRange1) <$> pLET <*> pDeclarations
pExpressionConUpd :: HSParser Expression
pExpressionConUpd
= qcon
<**> ( pSucceed (mkRngNm Expression_Constructor)
<|> pCurlys' ((\bs _ c -> mkRngNm Expression_RecordConstruction c bs) <$> pListSep pCOMMA pRecordExpressionBinding)
)
<|> pExpressionBase
<**> ((\u e -> foldr ($) e u) <$> pList pU)
<?> "pExpressionConUpd"
where pU = pCurlys' ((\bs r e -> Expression_RecordUpdate r e bs) <$> pList1Sep pCOMMA pRecordExpressionBinding)
<|> pRowRecordSelectionSuffix
pRecordExpressionBinding :: HSParser RecordExpressionBinding
pRecordExpressionBinding
= mkRngNm RecordExpressionBinding_Binding <$> qvar <* pEQUAL <*> pExpression
<?> "pRecordExpressionBinding"
pExpressionApp :: HSParser Expression
pExpressionApp
= pE <**> ((\as e -> foldl (flip ($)) e as) <$> pList pA)
<?> "pExpressionApp"
where pE = pExpressionConUpd
pA = (\es e -> Expression_NormalApplication emptyRange e es) <$> pList1 pE
<|> (\es e -> Expression_ImpredicativeApplication emptyRange e es) <$> pList1 (pTILDE *> pE)
<|> (\es e -> Expression_ImplicitApplication emptyRange e es) <$> pList1 (pImpls' pContextedExpression)
where pContextedExpression = (\e c r -> ContextedExpression_Contexted r e c) <$> pExpression <* pLTCOLON <*> pContextItem
pContextedExpression :: HSParser (Range -> ContextedExpression)
pExpressionLayout :: HSParser Expression
pExpressionLayout
= pMaybe id id pExpressionMinusPrefix <*> pExpressionApp
<|> (Expression_Case . mkRange1) <$> pCASE <*> pExpression <* pOptSEMISeparator <* pOF <*> pAlternatives
<|> pExpressionDo
<?> "pExpressionLayout"
pOp, pOpm :: HSParser (Expression,Range)
pOp = mkRngNm' Expression_Variable <$> qvarop <|> mkRngNm' Expression_Constructor <$> qconop
pOpm = mkRngNm' Expression_Variable <$> qvarop_no_minus <|> mkRngNm' Expression_Constructor <$> qconop
pExpression4'' :: Bool -> HSParser (Expression,Range) -> HSParser (Expression -> Expression) -> HSParser Expression -> HSParser Expression4
pExpression4'' inParen pOp pPreNotOp pBase
= ((\(e,cnt,res) -> (mkC cnt e,0,res)) <$> pE)
<**> (addCommaP $ addOpP
$ ( (addCommaP2
$ ((\c t (e,cnt,res) -> (Expression_Typed (mkRange1 c) (mkC cnt e) t, 0, Expression4Result_Typed : res))
<$> pDCOLON <*> pType
) )
<|> pSucceed id
) )
where pE :: HSParser Expression4
pE = pBase <**>
( pSucceed (\e -> (e,0,[]))
<|> (\(op,rng) (r,opCnt,res) l -> (Expression_InfixApplication rng l op r, opCnt+1, res)) <$> pOp <*> pE
)
<|> (\p (e,cnt,res) -> (p $ mkC cnt $ e, 0, Expression4Result_NotOpPre : res))
<$> pPreNotOp <*> pE
addCommaP, addCommaP2, addOpP :: HSParser (Expression4 -> Expression4) -> HSParser (Expression4 -> Expression4)
addCommaP p | inParen = p <|> (\es (e,cnt,res) -> (mkC cnt e, 0, Expression4Result_CommaList es : res))
<$> pList1 (pComma *> pExpression)
| otherwise = p
addCommaP2 p | inParen = (\mkecntres es ecntres ->
let (e,cnt,res) = mkecntres ecntres
in (mkC cnt e, 0, (if null es then [] else [Expression4Result_CommaList es]) ++ res)
)
<$> p <*> pList (pComma *> pExpression)
| otherwise = p
addOpP p | inParen = p <|> (\o (e,cnt,res) -> (mkC cnt e, 0, Expression4Result_Op o : res))
<$> pOp
| otherwise = p
mkC cnt = if cnt > 0 then Expression_InfixApplicationChainTop emptyRange else id
pExpression4' :: HSParser (Expression -> Expression) -> HSParser Expression
pExpression4' pPreNotOp = (\(e,_,_) -> e) <$> pExpression4'' False pOp pPreNotOp pExpressionLayout
pExpressionPreBase :: HSParser Expression
pExpressionPreBase = (\ps e -> foldr ($) e ps) <$> pList_gr pExpressionPrefix <*> pExpressionLayout
pExpression :: HSParser Expression
pExpression
= pExpression4' pExpressionPrefix
<?> "pExpression"
pExpressionNoLet :: HSParser Expression
pExpressionNoLet
= pExpression4' pExpressionNoLetPrefix
<?> "pExpressionNoLet"
where pBase3 :: HSParser Expression
pBase3 = (\ps e -> foldr ($) e ps) <$> pList pExpressionNoLetPrefix <*> pExpressionLayout
pExpressionLetPrefix :: HSParser (Expression -> Expression)
pExpressionLetPrefix
= (\(s,t,d) -> Expression_Let (mkRange1 t) s d)
<$> ( (,,) False <$> pLET <*> pDeclarations <* pIN
<|> (,,) True <$> pLETSTRICT <*> pLayoutList pDeclarationSimpleValue <* pIN
)
<?> "pExpressionLetPrefix"
pExpressionNoLetPrefix :: HSParser (Expression -> Expression)
pExpressionNoLetPrefix
= pLAM <**> pLamArgs
<|> (Expression_If . mkRange1) <$> pIF <*> pExpression <* pOptSEMISeparator <* pTHEN <*> pExpression <* pOptSEMISeparator <* pELSE
<?> "pExpressionNoLetPrefix"
where pLamArgs
= (\a1 a2 t e -> a1 t (a2 t e))
<$> ( (\ps t e -> Expression_Lambda (mkRange1 t) ps e) <$> pList1 pPatternBaseCon
<|> (\ps t e -> Expression_ImplicitLambda (mkRange1 t) ps e) <$> pList1 (pImpls' pContextedPattern)
)
<*> pLamArgs
<|> (\_ e -> e) <$ pRARROW
pContextedPattern = (\p c r -> ContextedPattern_Contexted r p c) <$> pPattern <* pLTCOLON <*> pContextItem
pContextedPattern :: HSParser (Range -> ContextedPattern)
pExpressionPrefix :: HSParser (Expression -> Expression)
pExpressionPrefix
= pExpressionLetPrefix
<|> pExpressionNoLetPrefix
<?> "pExpressionPrefix"
pAlternative :: HSParser Alternative
pAlternative
= Alternative_Alternative emptyRange <$> pPattern <*> pRhs pRARROW
pAlternatives :: HSParser Alternatives
pAlternatives
= pBlock1 pOCURLY pSEMI pCCURLY pAlternative
pPatternBaseInParens :: HSParser (Range -> Pattern)
pPatternBaseInParens
= (pPattern
<**> ( pSucceed (flip Pattern_Parenthesized)
<|> (\es e r -> Pattern_RowRecordBinding r (Pattern_RowRecordEmpty r)
(map (RowRecordPatternBinding_Binding r Nothing) (e:es)))
<$> pList1 (pComma *> pPattern)
) )
<|> (\v _ -> mkRngNm Pattern_Variable v) <$> qvarsym_for_inparens
<|> pSucceed (\r -> Pattern_RowRecordEmpty r)
<|> (\fs r -> Pattern_RowRecordBinding r (Pattern_RowRecordEmpty r) fs) <$> pFlds
<|> pExtFlds
<?> "pPatternBaseInParens"
where pFld :: HSParser (Pattern -> RowRecordPatternBinding)
pFld = qvarid
<**> ( (\l -> RowRecordPatternBinding_Binding (mkRange1 l) (Just (tokMkQName l))) <$ pEQUAL
)
pFlds :: HSParser [RowRecordPatternBinding]
pFlds = pList1Sep pComma (pFld <*> pPattern)
pExtFlds :: HSParser (Range -> Pattern)
pExtFlds
= (\e fs r -> Pattern_RowRecordBinding r e fs)
<$> ( mkRngNm Pattern_Variable <$> qvar
<|> pSucceed (Pattern_RowRecordEmpty emptyRange)
)
<* pVBAR <*> pFlds
pPatternBaseMinusLiteral :: HSParser Pattern
pPatternBaseMinusLiteral = (\m n -> Pattern_Literal (mkRange1 m) (1) n) <$> pMINUS <*> pLiteralNumber
pPatternBaseNoParens :: HSParser Pattern
pPatternBaseNoParens
= (
(if ehcOptBangPatterns opts
then (\p -> p <|> (Pattern_Bang . mkRange1) <$> pBANG <*> pPatternBaseCon)
else id
) $
( qvarid
<**> ( (\a p v -> Pattern_As (mkRange1 a) (tokMkQName v) p) <$> pAT <*> pPatternBaseCon
<|> pSucceed (mkRngNm Pattern_Variable)
)
<|> Pattern_Literal emptyRange 1 <$> pLiteral
<|> pBracks' (flip Pattern_List <$> pListSep pCOMMA pPattern)
<|> (Pattern_Irrefutable . mkRange1) <$> pTILDE <*> pPatternBaseCon
) )
<?> "pPatternBaseNoParens"
pPatternBase :: HSParser Pattern
pPatternBase
= pPatternBaseNoParens
<|> pParens' pPatternBaseInParens
<?> "pPatternBase"
pPatternConSuffix :: HSParser (Token -> Pattern)
pPatternConSuffix
= pSucceed (\c -> mkRngNm Pattern_Constructor c [])
<|> pCurlys' ((\bs _ c -> mkRngNm Pattern_Record c bs) <$> pListSep pCOMMA pRecordPatternBinding)
<?> "pPatternConSuffix"
pPatternBaseCon :: HSParser Pattern
pPatternBaseCon
= pPatternBase
<|> qconid <**> pPatternConSuffix
<?> "pPatternBaseCon"
pRecordPatternBinding :: HSParser RecordPatternBinding
pRecordPatternBinding
= qvar
<**> ( pSucceed (\v -> mkRngNm RecordPatternBinding_Pun v)
<|> (\p v -> mkRngNm RecordPatternBinding_Binding v p) <$ pEQUAL <*> pPattern
)
<?> "pRecordPatternBinding"
pPatternApp :: HSParser Pattern
pPatternApp
= pPatternBase
<|> pPatternBaseMinusLiteral
<|> qcon
<**> ( (\l c -> mkRngNm Pattern_Constructor c l) <$> pList1 pPatternBaseCon
<|> pPatternConSuffix
)
<|> (Pattern_Tuple emptyRange) <$> pParens commas_arity <*> pList1 pPatternBaseCon
<?> "pPatternApp"
pPatternOp :: HSParser Pattern
pPatternOp
= pChainr_ng pOp pPatternApp
<?> "pPatternOp"
where pOp =
((\o l r -> Pattern_InfixConstructor (mkRange1 o) l (tokMkQName o) r) <$> qconop)
pPattern :: HSParser Pattern
pPattern
= pPatternOp
<??> ((\c t p -> Pattern_Typed (mkRange1 c) p t) <$> pDCOLON <*> pType)
<?> "pPattern"
pRowRecordSelectionSuffix :: HSParser (Expression -> Expression)
pRowRecordSelectionSuffix
= (\lbls e -> foldl (\e l -> Expression_RowRecordSelect (mkRange1 l) e (tokMkQName l)) e lbls)
<$> pList1 (pHASH *> pSelector)
pSelector :: HSParser Token
pSelector
= qvarid <|> qconid <|> pIntegerTk
pTypePatternBase :: HSParser TypePattern
pTypePatternBase
= mkRngNm TypePattern_Variable <$> var_no_ty
<?> "pTypePatternBase"
commas' :: HSParser [Token]
commas' = pList1 pCOMMA
commas :: HSParser Token
commas = (map (\s -> strProd (length s + 1)) . foldr tokConcat tokEmpty) <$> commas'
where map = tokenMap
commas_arity :: HSParser Int
commas_arity = (\ts -> length ts + 1) <$> commas'
pOptSEMISeparator :: HSParser (Maybe ())
pOptSEMISeparator = pMb (pSeparator <|> () <$ pSEMI)
modid :: HSParser Token
modid
= pCONID
<|> pQCONID
<?> "modid"
qcnames :: HSParser [Token]
qcnames
= pListSep pCOMMA qcname
<?> "qcnames"
qcname :: HSParser Token
qcname
= qvar
<|> gcon
<?> "qcname"
identifier :: HSParser Token
identifier
= qvar
<|> gcon
<|> qop
<?> "identifier"
depreclist :: HSParser [Token]
depreclist
= pList1Sep pCOMMA deprec_var
deprec_var :: HSParser Token
deprec_var
= var
<|> tyconid
<?> "deprec_var"
gcon :: HSParser Token
gcon
= sysdcon
<|> qcon
<?> "gcon"
sysdcon :: HSParser Token
sysdcon
= pParens commas
<|> tokConcat <$> pOBRACK <*> pCBRACK
<?> "sysdcon"
qcon :: HSParser Token
qcon
= qconid
<|> pParens qconsym
<?> "qcon"
conop :: HSParser Token
conop
= consym
<|> pBACKQUOTE *> conid <* pBACKQUOTE
<?> "conop"
qconop :: HSParser Token
qconop
= qconsym
<|> pBACKQUOTE *> qconid <* pBACKQUOTE
<?> "qconop"
qconid :: HSParser Token
qconid
= conid
<|> pQCONID
<?> "qconid"
conid_nopragma :: HSParser Token
conid_nopragma
= pCONID
<?> "conid_nopragma"
conid :: HSParser Token
conid
= conid_nopragma
<|> pLANGUAGE_prag
<|> pDERIVABLE_prag
<?> "conid"
qconsym :: HSParser Token
qconsym
= consym
<|> pQCONSYM
<?> "qconsym"
consym :: HSParser Token
consym
= pCONSYM
<|> pCOLON
<?> "consym"
con :: HSParser Token
con
= conid
<|> pParens consym
<?> "con"
op :: HSParser Token
op
= varop
<|> conop
<?> "op"
qop :: HSParser Token
qop
= qvarop
<|> qconop
<?> "qop"
tyvar :: HSParser Token
tyvar
= varid_no_ty
<?> "tyvar"
safety :: HSParser Token
safety
= pSAFE
<|> pUNSAFE
<|> pTHREADSAFE
<?> "safety"
callconv :: HSParser Token
callconv
= snd <$> pFFIWay
<?> "callconv"
special_id_no_callconv :: HSParser Token
special_id_no_callconv
= pLABEL
<|> pEXPORT
<|> pAS
<|> pQUALIFIED
<|> pHIDING
<|> pDYNAMIC
<?> "special_id_no_callconv"
special_id :: HSParser Token
special_id
= special_id_no_callconv
<|> callconv
<?> "special_id"
varid_no_ty :: HSParser Token
varid_no_ty
= pVARID
<|> special_id_no_callconv
<|> callconv
<|> safety
<?> "varid_no_ty"
varid :: HSParser Token
varid
= varid_no_ty
<|> pFORALL
<|> pEXISTS
<?> "varid"
qvarid :: HSParser Token
qvarid
= varid
<|> pQVARID
<?> "qvarid"
special_sym_no_bang :: HSParser Token
special_sym_no_bang
= pDOT
<|> pSTAR
<|> pPERCENT
<?> "special_sym_no_bang"
special_sym :: HSParser Token
special_sym
= pBANG
<|> special_sym_no_bang
<?> "special_sym"
varsym_no_minus_bang :: HSParser Token
varsym_no_minus_bang
= pVARSYM
<|> special_sym_no_bang
<?> "varsym_no_minus_bang"
varsym_no_minus :: HSParser Token
varsym_no_minus
= pVARSYM
<|> special_sym
<?> "varsym_no_minus"
varsym :: HSParser Token
varsym
= varsym_no_minus
<|> pMINUS
<?> "varsym"
qvarsym_base :: HSParser Token
qvarsym_base
= pQVARSYM
<?> "qvarsym1"
qvarsym_no_minus :: HSParser Token
qvarsym_no_minus
= varsym_no_minus
<|> qvarsym_base
<?> "qvarsym_no_minus"
qvarsym_for_inparens :: HSParser Token
qvarsym_for_inparens
= varsym
<|> qvarsym_base
<?> "qvarsym_for_inparens"
qvarsym :: HSParser Token
qvarsym
= qvarsym_for_inparens
<?> "qvarsym"
varop_no_minus_bang :: HSParser Token
varop_no_minus_bang
= varsym_no_minus_bang
<|> pBACKQUOTE *> varid <* pBACKQUOTE
<?> "varop_no_minus_bang"
varop_no_minus :: HSParser Token
varop_no_minus
= varsym_no_minus
<|> pBACKQUOTE *> varid <* pBACKQUOTE
<?> "varop_no_minus"
varop_no_ty :: HSParser Token
varop_no_ty
= varsym
<|> pBACKQUOTE *> varid_no_ty <* pBACKQUOTE
<?> "varop_no_minus"
varop_no_bang :: HSParser Token
varop_no_bang
= varop_no_minus_bang
<|> pMINUS
<?> "varop_no_bang"
varop :: HSParser Token
varop
= varop_no_minus
<|> pMINUS
<?> "varop"
qvarop_no_minus :: HSParser Token
qvarop_no_minus
= qvarsym_no_minus
<|> pBACKQUOTE *> qvarid <* pBACKQUOTE
<?> "qvarop_no_minus"
qvarop :: HSParser Token
qvarop
= qvarsym
<|> pBACKQUOTE *> qvarid <* pBACKQUOTE
<?> "qvarop"
var_no_ty :: HSParser Token
var_no_ty
= varid_no_ty
<|> pParens varsym
<?> "var"
var :: HSParser Token
var
= varid
<|> pParens varsym
<?> "var"
qvar :: HSParser Token
qvar
= qvarid
<|> pParens qvarsym_for_inparens
<?> "qvar"
tyconsym :: HSParser Token
tyconsym
= pCONSYM
<?> "tyconsym"
qtyconsym :: HSParser Token
qtyconsym
= tyconsym
<|> pQCONSYM
<?> "qtyconsym"
tyconid :: HSParser Token
tyconid
= pCONID
<?> "tyconid"
qtyconid :: HSParser Token
qtyconid
= tyconid
<|> pQCONID
<?> "qtyconid"
tyconop :: HSParser Token
tyconop
= tyconsym
<|> pBACKQUOTE *> tyconid <* pBACKQUOTE
<?> "tyconop"
qtyconop :: HSParser Token
qtyconop
= qtyconsym
<|> pBACKQUOTE *> qtyconid <* pBACKQUOTE
<?> "qtyconop"
qtycon :: HSParser Token
qtycon
= qtyconid
<|> pParens qtyconsym
<?> "qtycon"
gtycon_no_delims' :: HSParser Token -> HSParser Token
gtycon_no_delims' pInParens
= qtyconid
<|> pParens pInParens
<?> "gtycon_no_delims"
gtycon_for_inparens_arrow :: HSParser Token
gtycon_for_inparens_arrow
= pRARROW
<|> qtyconsym
<?> "gtycon_for_inparens_arrow"
gtycon_for_inparens_arrow_commas :: HSParser Token
gtycon_for_inparens_arrow_commas
= gtycon_for_inparens_arrow
<|> commas
<?> "gtycon_for_inparens_arrow"
gtycon_for_insection :: HSParser Token
gtycon_for_insection
= pRARROW
<|> qtyconop
<?> "gtycon_for_insection"
gtycon_no_delims_commas :: HSParser Token
gtycon_no_delims_commas
= gtycon_no_delims' gtycon_for_inparens_arrow
<?> "gtycon_no_delims_commas"
gtycon_no_delims :: HSParser Token
gtycon_no_delims
= gtycon_no_delims' gtycon_for_inparens_arrow_commas
<?> "gtycon_no_delims"
gtycon_only_bracks :: HSParser Token
gtycon_only_bracks
= tokConcat <$> pOBRACK <*> pCBRACK
<?> "gtycon_only_delims"
gtycon' :: HSParser Token -> HSParser Token
gtycon' pInParens
= gtycon_no_delims' pInParens
<|> gtycon_only_bracks
<?> "gtycon'"
gtycon :: HSParser Token
gtycon
= gtycon' gtycon_for_inparens_arrow_commas
<?> "gtycon"