{-# LANGUAGE CPP #-}

module UU.Scanner.TokenParser where

import UU.Parsing.Interface(IsParser(..), (<$), (<$>))
import UU.Parsing.Derived(pListSep, pPacked)
import UU.Scanner.Position(Pos)
import UU.Scanner.GenTokenParser(pReserved, pValToken)
import UU.Scanner.Token(Token,EnumValToken(..))

-------------------------------------------------------------------------
-- IsParsers for  Symbols
-------------------------------------------------------------------------

pKeyPos           :: IsParser p Token => String -> p Pos
pKeyPos :: forall (p :: * -> *). IsParser p Token => String -> p Pos
pKeyPos  String
keyword  =  String -> p Pos
forall (p :: * -> *) key tp val.
IsParser p (GenToken key tp val) =>
key -> p Pos
pReserved String
keyword


pSpecPos          :: IsParser p Token => Char -> p Pos
pSpecPos :: forall (p :: * -> *). IsParser p Token => Char -> p Pos
pSpecPos Char
s        =  String -> p Pos
forall (p :: * -> *) key tp val.
IsParser p (GenToken key tp val) =>
key -> p Pos
pReserved [Char
s]

pKey              :: IsParser p Token => String -> p String
pKey :: forall (p :: * -> *). IsParser p Token => String -> p String
pKey  String
key         =  String
key String -> p Pos -> p String
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ String -> p Pos
forall (p :: * -> *). IsParser p Token => String -> p Pos
pKeyPos String
key

pSpec             :: IsParser p Token => Char -> p String 
pSpec :: forall (p :: * -> *). IsParser p Token => Char -> p String
pSpec Char
c           =  [Char
c] String -> p Pos -> p String
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ Char -> p Pos
forall (p :: * -> *). IsParser p Token => Char -> p Pos
pSpecPos Char
c
      
pStringPos, pCharPos,
  pInteger8Pos, pInteger10Pos, pInteger16Pos, pFractionPos,
  pVaridPos, pConidPos,
  pTextnmPos, pTextlnPos, pIntegerPos, pVarsymPos, pConsymPos  :: IsParser p Token => p (String,Pos)

pStringPos :: forall (p :: * -> *). IsParser p Token => p (String, Pos)
pStringPos     =   EnumValToken -> String -> p (String, Pos)
forall (p :: * -> *) key tp val.
IsParser p (GenToken key tp val) =>
tp -> val -> p (val, Pos)
pValToken EnumValToken
TkString    String
""        
pCharPos :: forall (p :: * -> *). IsParser p Token => p (String, Pos)
pCharPos       =   EnumValToken -> String -> p (String, Pos)
forall (p :: * -> *) key tp val.
IsParser p (GenToken key tp val) =>
tp -> val -> p (val, Pos)
pValToken EnumValToken
TkChar      String
"\NUL"    
pInteger8Pos :: forall (p :: * -> *). IsParser p Token => p (String, Pos)
pInteger8Pos   =   EnumValToken -> String -> p (String, Pos)
forall (p :: * -> *) key tp val.
IsParser p (GenToken key tp val) =>
tp -> val -> p (val, Pos)
pValToken EnumValToken
TkInteger8  String
"0"       
pInteger10Pos :: forall (p :: * -> *). IsParser p Token => p (String, Pos)
pInteger10Pos  =   EnumValToken -> String -> p (String, Pos)
forall (p :: * -> *) key tp val.
IsParser p (GenToken key tp val) =>
tp -> val -> p (val, Pos)
pValToken EnumValToken
TkInteger10 String
"0"       
pInteger16Pos :: forall (p :: * -> *). IsParser p Token => p (String, Pos)
pInteger16Pos  =   EnumValToken -> String -> p (String, Pos)
forall (p :: * -> *) key tp val.
IsParser p (GenToken key tp val) =>
tp -> val -> p (val, Pos)
pValToken EnumValToken
TkInteger16 String
"0"
pFractionPos :: forall (p :: * -> *). IsParser p Token => p (String, Pos)
pFractionPos   =   EnumValToken -> String -> p (String, Pos)
forall (p :: * -> *) key tp val.
IsParser p (GenToken key tp val) =>
tp -> val -> p (val, Pos)
pValToken EnumValToken
TkFraction  String
"0.0"
pVaridPos :: forall (p :: * -> *). IsParser p Token => p (String, Pos)
pVaridPos      =   EnumValToken -> String -> p (String, Pos)
forall (p :: * -> *) key tp val.
IsParser p (GenToken key tp val) =>
tp -> val -> p (val, Pos)
pValToken EnumValToken
TkVarid     String
"<identifier>" 
pConidPos :: forall (p :: * -> *). IsParser p Token => p (String, Pos)
pConidPos      =   EnumValToken -> String -> p (String, Pos)
forall (p :: * -> *) key tp val.
IsParser p (GenToken key tp val) =>
tp -> val -> p (val, Pos)
pValToken EnumValToken
TkConid     String
"<Identifier>" 
pConsymPos :: forall (p :: * -> *). IsParser p Token => p (String, Pos)
pConsymPos     =   EnumValToken -> String -> p (String, Pos)
forall (p :: * -> *) key tp val.
IsParser p (GenToken key tp val) =>
tp -> val -> p (val, Pos)
pValToken EnumValToken
TkConOp     String
"<conoperator>"
pVarsymPos :: forall (p :: * -> *). IsParser p Token => p (String, Pos)
pVarsymPos     =   EnumValToken -> String -> p (String, Pos)
forall (p :: * -> *) key tp val.
IsParser p (GenToken key tp val) =>
tp -> val -> p (val, Pos)
pValToken EnumValToken
TkOp        String
"<operator>" 
pTextnmPos :: forall (p :: * -> *). IsParser p Token => p (String, Pos)
pTextnmPos     =   EnumValToken -> String -> p (String, Pos)
forall (p :: * -> *) key tp val.
IsParser p (GenToken key tp val) =>
tp -> val -> p (val, Pos)
pValToken EnumValToken
TkTextnm    String
"<name>"       
pTextlnPos :: forall (p :: * -> *). IsParser p Token => p (String, Pos)
pTextlnPos     =   EnumValToken -> String -> p (String, Pos)
forall (p :: * -> *) key tp val.
IsParser p (GenToken key tp val) =>
tp -> val -> p (val, Pos)
pValToken EnumValToken
TkTextln    String
"<line>"     
pIntegerPos :: forall (p :: * -> *). IsParser p Token => p (String, Pos)
pIntegerPos    =   p (String, Pos)
forall (p :: * -> *). IsParser p Token => p (String, Pos)
pInteger10Pos

pString, pChar,
  pInteger8, pInteger10, pInteger16, pFraction,
  pVarid, pConid,
  pTextnm, pTextln, pInteger, pVarsym, pConsym  :: IsParser p Token => p String

pString :: forall (p :: * -> *). IsParser p Token => p String
pString        = (String, Pos) -> String
forall a b. (a, b) -> a
fst ((String, Pos) -> String) -> p (String, Pos) -> p String
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> p (String, Pos)
forall (p :: * -> *). IsParser p Token => p (String, Pos)
pStringPos        
pChar :: forall (p :: * -> *). IsParser p Token => p String
pChar          = (String, Pos) -> String
forall a b. (a, b) -> a
fst ((String, Pos) -> String) -> p (String, Pos) -> p String
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> p (String, Pos)
forall (p :: * -> *). IsParser p Token => p (String, Pos)
pCharPos          
pInteger8 :: forall (p :: * -> *). IsParser p Token => p String
pInteger8      = (String, Pos) -> String
forall a b. (a, b) -> a
fst ((String, Pos) -> String) -> p (String, Pos) -> p String
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> p (String, Pos)
forall (p :: * -> *). IsParser p Token => p (String, Pos)
pInteger8Pos      
pInteger10 :: forall (p :: * -> *). IsParser p Token => p String
pInteger10     = (String, Pos) -> String
forall a b. (a, b) -> a
fst ((String, Pos) -> String) -> p (String, Pos) -> p String
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> p (String, Pos)
forall (p :: * -> *). IsParser p Token => p (String, Pos)
pInteger10Pos     
pInteger16 :: forall (p :: * -> *). IsParser p Token => p String
pInteger16     = (String, Pos) -> String
forall a b. (a, b) -> a
fst ((String, Pos) -> String) -> p (String, Pos) -> p String
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> p (String, Pos)
forall (p :: * -> *). IsParser p Token => p (String, Pos)
pInteger16Pos     
pFraction :: forall (p :: * -> *). IsParser p Token => p String
pFraction      = (String, Pos) -> String
forall a b. (a, b) -> a
fst ((String, Pos) -> String) -> p (String, Pos) -> p String
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> p (String, Pos)
forall (p :: * -> *). IsParser p Token => p (String, Pos)
pFractionPos     
pVarid :: forall (p :: * -> *). IsParser p Token => p String
pVarid         = (String, Pos) -> String
forall a b. (a, b) -> a
fst ((String, Pos) -> String) -> p (String, Pos) -> p String
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> p (String, Pos)
forall (p :: * -> *). IsParser p Token => p (String, Pos)
pVaridPos         
pConid :: forall (p :: * -> *). IsParser p Token => p String
pConid         = (String, Pos) -> String
forall a b. (a, b) -> a
fst ((String, Pos) -> String) -> p (String, Pos) -> p String
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> p (String, Pos)
forall (p :: * -> *). IsParser p Token => p (String, Pos)
pConidPos         
pVarsym :: forall (p :: * -> *). IsParser p Token => p String
pVarsym        = (String, Pos) -> String
forall a b. (a, b) -> a
fst ((String, Pos) -> String) -> p (String, Pos) -> p String
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> p (String, Pos)
forall (p :: * -> *). IsParser p Token => p (String, Pos)
pVarsymPos  
pConsym :: forall (p :: * -> *). IsParser p Token => p String
pConsym        = (String, Pos) -> String
forall a b. (a, b) -> a
fst ((String, Pos) -> String) -> p (String, Pos) -> p String
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> p (String, Pos)
forall (p :: * -> *). IsParser p Token => p (String, Pos)
pConsymPos       
pTextnm :: forall (p :: * -> *). IsParser p Token => p String
pTextnm        = (String, Pos) -> String
forall a b. (a, b) -> a
fst ((String, Pos) -> String) -> p (String, Pos) -> p String
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> p (String, Pos)
forall (p :: * -> *). IsParser p Token => p (String, Pos)
pTextnmPos       
pTextln :: forall (p :: * -> *). IsParser p Token => p String
pTextln        = (String, Pos) -> String
forall a b. (a, b) -> a
fst ((String, Pos) -> String) -> p (String, Pos) -> p String
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> p (String, Pos)
forall (p :: * -> *). IsParser p Token => p (String, Pos)
pTextlnPos            
pInteger :: forall (p :: * -> *). IsParser p Token => p String
pInteger       = (String, Pos) -> String
forall a b. (a, b) -> a
fst ((String, Pos) -> String) -> p (String, Pos) -> p String
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> p (String, Pos)
forall (p :: * -> *). IsParser p Token => p (String, Pos)
pIntegerPos       
  
pComma, pSemi, pOParen, pCParen, pOBrack, pCBrack, pOCurly, pCCurly
   :: IsParser p Token => p String

pComma :: forall (p :: * -> *). IsParser p Token => p String
pComma  = Char -> p String
forall (p :: * -> *). IsParser p Token => Char -> p String
pSpec Char
','
pSemi :: forall (p :: * -> *). IsParser p Token => p String
pSemi   = Char -> p String
forall (p :: * -> *). IsParser p Token => Char -> p String
pSpec Char
';'
pOParen :: forall (p :: * -> *). IsParser p Token => p String
pOParen = Char -> p String
forall (p :: * -> *). IsParser p Token => Char -> p String
pSpec Char
'('
pCParen :: forall (p :: * -> *). IsParser p Token => p String
pCParen = Char -> p String
forall (p :: * -> *). IsParser p Token => Char -> p String
pSpec Char
')'
pOBrack :: forall (p :: * -> *). IsParser p Token => p String
pOBrack = Char -> p String
forall (p :: * -> *). IsParser p Token => Char -> p String
pSpec Char
'['
pCBrack :: forall (p :: * -> *). IsParser p Token => p String
pCBrack = Char -> p String
forall (p :: * -> *). IsParser p Token => Char -> p String
pSpec Char
']'
pOCurly :: forall (p :: * -> *). IsParser p Token => p String
pOCurly = Char -> p String
forall (p :: * -> *). IsParser p Token => Char -> p String
pSpec Char
'{'
pCCurly :: forall (p :: * -> *). IsParser p Token => p String
pCCurly = Char -> p String
forall (p :: * -> *). IsParser p Token => Char -> p String
pSpec Char
'}'

pCommaPos, pSemiPos, pOParenPos, pCParenPos, pOBrackPos, pCBrackPos, pOCurlyPos, pCCurlyPos
   :: IsParser p Token => p Pos

pCommaPos :: forall (p :: * -> *). IsParser p Token => p Pos
pCommaPos  = Char -> p Pos
forall (p :: * -> *). IsParser p Token => Char -> p Pos
pSpecPos Char
','
pSemiPos :: forall (p :: * -> *). IsParser p Token => p Pos
pSemiPos   = Char -> p Pos
forall (p :: * -> *). IsParser p Token => Char -> p Pos
pSpecPos Char
';'
pOParenPos :: forall (p :: * -> *). IsParser p Token => p Pos
pOParenPos = Char -> p Pos
forall (p :: * -> *). IsParser p Token => Char -> p Pos
pSpecPos Char
'('
pCParenPos :: forall (p :: * -> *). IsParser p Token => p Pos
pCParenPos = Char -> p Pos
forall (p :: * -> *). IsParser p Token => Char -> p Pos
pSpecPos Char
')'
pOBrackPos :: forall (p :: * -> *). IsParser p Token => p Pos
pOBrackPos = Char -> p Pos
forall (p :: * -> *). IsParser p Token => Char -> p Pos
pSpecPos Char
'['
pCBrackPos :: forall (p :: * -> *). IsParser p Token => p Pos
pCBrackPos = Char -> p Pos
forall (p :: * -> *). IsParser p Token => Char -> p Pos
pSpecPos Char
']'
pOCurlyPos :: forall (p :: * -> *). IsParser p Token => p Pos
pOCurlyPos = Char -> p Pos
forall (p :: * -> *). IsParser p Token => Char -> p Pos
pSpecPos Char
'{'
pCCurlyPos :: forall (p :: * -> *). IsParser p Token => p Pos
pCCurlyPos = Char -> p Pos
forall (p :: * -> *). IsParser p Token => Char -> p Pos
pSpecPos Char
'}'

pCommas ::  IsParser p Token => p a -> p [a]
pSemics ::  IsParser p Token => p a -> p [a]
pParens ::  IsParser p Token => p a -> p a
pBracks ::  IsParser p Token => p a -> p a
pCurly  ::  IsParser p Token => p a -> p a

pCommas :: forall (p :: * -> *) a. IsParser p Token => p a -> p [a]
pCommas  = p String -> p a -> p [a]
forall (p :: * -> *) s a a1. IsParser p s => p a -> p a1 -> p [a1]
pListSep p String
forall (p :: * -> *). IsParser p Token => p String
pComma
pSemics :: forall (p :: * -> *) a. IsParser p Token => p a -> p [a]
pSemics  = p String -> p a -> p [a]
forall (p :: * -> *) s a a1. IsParser p s => p a -> p a1 -> p [a1]
pListSep p String
forall (p :: * -> *). IsParser p Token => p String
pSemi
pParens :: forall (p :: * -> *) a. IsParser p Token => p a -> p a
pParens  = p String -> p String -> p a -> p a
forall (p :: * -> *) s a b1 b.
IsParser p s =>
p a -> p b1 -> p b -> p b
pPacked p String
forall (p :: * -> *). IsParser p Token => p String
pOParen p String
forall (p :: * -> *). IsParser p Token => p String
pCParen
pBracks :: forall (p :: * -> *) a. IsParser p Token => p a -> p a
pBracks  = p String -> p String -> p a -> p a
forall (p :: * -> *) s a b1 b.
IsParser p s =>
p a -> p b1 -> p b -> p b
pPacked p String
forall (p :: * -> *). IsParser p Token => p String
pOBrack p String
forall (p :: * -> *). IsParser p Token => p String
pCBrack
pCurly :: forall (p :: * -> *) a. IsParser p Token => p a -> p a
pCurly   = p String -> p String -> p a -> p a
forall (p :: * -> *) s a b1 b.
IsParser p s =>
p a -> p b1 -> p b -> p b
pPacked p String
forall (p :: * -> *). IsParser p Token => p String
pOCurly p String
forall (p :: * -> *). IsParser p Token => p String
pCCurly

pParens_pCommas :: IsParser p Token => p a -> p [a]
pBracks_pCommas :: IsParser p Token => p a -> p [a]
pCurly_pSemics  :: IsParser p Token => p a -> p [a]

pParens_pCommas :: forall (p :: * -> *) a. IsParser p Token => p a -> p [a]
pParens_pCommas = p [a] -> p [a]
forall (p :: * -> *) a. IsParser p Token => p a -> p a
pParens(p [a] -> p [a]) -> (p a -> p [a]) -> p a -> p [a]
forall b c a. (b -> c) -> (a -> b) -> a -> c
.p a -> p [a]
forall (p :: * -> *) a. IsParser p Token => p a -> p [a]
pCommas
pBracks_pCommas :: forall (p :: * -> *) a. IsParser p Token => p a -> p [a]
pBracks_pCommas = p [a] -> p [a]
forall (p :: * -> *) a. IsParser p Token => p a -> p a
pBracks(p [a] -> p [a]) -> (p a -> p [a]) -> p a -> p [a]
forall b c a. (b -> c) -> (a -> b) -> a -> c
.p a -> p [a]
forall (p :: * -> *) a. IsParser p Token => p a -> p [a]
pCommas
pCurly_pSemics :: forall (p :: * -> *) a. IsParser p Token => p a -> p [a]
pCurly_pSemics  = p [a] -> p [a]
forall (p :: * -> *) a. IsParser p Token => p a -> p a
pCurly (p [a] -> p [a]) -> (p a -> p [a]) -> p a -> p [a]
forall b c a. (b -> c) -> (a -> b) -> a -> c
.p a -> p [a]
forall (p :: * -> *) a. IsParser p Token => p a -> p [a]
pSemics