module Parser
where
import Data.Maybe
import UU.Parsing
import UU.Parsing.Machine(RealParser(..),RealRecogn(..),anaDynE,mkPR)
import ConcreteSyntax
import CommonTypes
import Patterns
import UU.Pretty(text,PP_Doc,empty,(>-<))
import TokenDef
import Data.List (intersperse)
import Data.Char
import Scanner (Input(..),scanLit,input)
import System.FilePath
import Data.List
import Expression
import Macro
import UU.Scanner.Token
import UU.Scanner.TokenParser
import UU.Scanner.GenToken
import UU.Scanner.GenTokenOrd
import UU.Scanner.GenTokenParser
import UU.Scanner.Position
import UU.Scanner.TokenShow()
import System.Directory
import System.FilePath
import HsTokenScanner
import Options
import Scanner(lowercaseKeywords)
type AGParser = AnaParser Input Pair Token Pos
pIdentifier, pIdentifierU, pIdentifierExcl :: AGParser Identifier
pIdentifierU = uncurry Ident <$> pConidPos
pIdentifier = pIdentifierExcl
pIdentifierExcl = uncurry Ident <$> pVaridPos
pKeywordAsIdent :: AGParser Identifier
pKeywordAsIdent = pAny (\nm -> Ident nm <$> pKeyPos nm) lowercaseKeywords
parseAG :: Options -> [FilePath] -> String -> IO (AG,[Message Token Pos])
parseAG opts searchPath file = do
(es,_,_,_,mesg) <- parseFile False opts searchPath file
return (AG es, mesg)
parseAGI :: Options -> [FilePath] -> String -> IO (AG, Maybe String)
parseAGI opts searchPath file
= do (es,_,_,ext,_) <- parseFile True opts searchPath file
return (AG es, ext)
depsAG :: Options -> [FilePath] -> String -> IO ([String], [Message Token Pos])
depsAG opts searchPath file
= do let fn = normalise file
(_,_,fs,_,mesgs) <- parseFile False opts searchPath fn
return (filter (/= fn) fs, mesgs)
parseFile :: Bool -> Options -> [FilePath] -> String -> IO ([Elem],[String],[String], Maybe String,[Message Token Pos ])
parseFile = parseFile' []
parseFile' :: [String] -> Bool -> Options -> [FilePath] -> String -> IO ([Elem],[String],[String], Maybe String,[Message Token Pos ])
parseFile' parsedfiles agi opts searchPath filename
= do file <- normalise `fmap` resolveFile opts searchPath filename
if file `elem` parsedfiles
then return ([], [], parsedfiles, Nothing, [])
else do
txt <- readFile file
let searchPath' = takeDirectory file : searchPath
litMode = ".lag" `isSuffixOf` file
(files,text) = if litMode then scanLit txt
else ([],txt)
tokens = input opts (initPos file) text
steps = parse (pElemsFiles agi) tokens
stop (_,fs,_,_,_) = null fs
cont (es,f:fs,allfs,ext,msg)
= do (ess,fss,allfss,_, msgs) <- parseFile' allfs agi opts searchPath' f
return (ess ++ es, fss ++ fs, allfss, ext, msg ++ msgs)
let (Pair (es,fls,ext) _ ,mesg) = evalStepsMessages steps
loopp stop cont (es,files ++ fls,file : parsedfiles, ext,mesg)
where
pElemsFiles :: Bool -> AGParser ([Elem],[String],Maybe String)
pElemsFiles agi = pFoldr (($),([],[],Nothing)) pElem'
where pElem' = addElem <$> pElem
<|> pINCLUDE *> (addInc <$> pStringPos)
<|> pEXTENDS *> (addExt <$> pStringPos)
addElem e (es,fs,ext) = (e:es, fs, ext)
addInc (fn,_) (es,fs,ext)
| noIncludes opts = (es, fs, ext)
| otherwise = (es,normalise fn:fs, ext)
addExt (fn,_) (es,fs,ext)
| noIncludes opts = (es, fs, ext)
| otherwise = if agi then (es,fs, Just fn') else (es,fn':fs, ext)
where fn' = normalise fn
pCodescrapL = (\(ValToken _ str pos) -> (str, pos))<$>
parseScrapL <?> "a code block"
parseScrapL :: AGParser Token
parseScrapL
= let p acc = (\k (Input pos str next) ->
let (sc,rest) = case next of
Just (t@(ValToken TkTextln _ _), rs) -> (t,rs)
_ -> let (tok,p2,inp2) = codescrapL pos str
in (tok, input opts p2 inp2)
steps = k ( rest)
in (val (acc sc) steps)
)
in anaDynE (mkPR (P (p ), R (p (const id))))
pElems :: AGParser Elems
pElems = pList_ng pElem
pComplexType = List <$> pBracks pTypeEncapsulated
<|> Maybe <$ pMAYBE <*> pType
<|> Either <$ pEITHER <*> pType <*> pType
<|> Map <$ pMAP <*> pTypePrimitive <*> pType
<|> IntMap <$ pINTMAP <*> pType
<|> OrdSet <$ pSET <*> pType
<|> IntSet <$ pINTSET
<|> tuple <$> pParens (pListSep pComma field)
where field = (,) <$> ((Just <$> pIdentifier <* pTypeColon) `opt` Nothing) <*> pTypeEncapsulated
tuple xs = Tuple [(fromMaybe (Ident ("x"++show n) noPos) f, t)
| (n,(f,t)) <- zip [1..] xs
]
pOptClassContext' :: AGParser ClassContext
pOptClassContext'
| ocaml opts = pSucceed []
| otherwise = pOptClassContext
pTyVars :: AGParser [Identifier]
pTyVars
| ocaml opts = return <$> pTypeVar
<|> pSucceed []
<|> pParens (pListSep pComma pTypeVar)
| otherwise = pList pIdentifier
pElem :: AGParser Elem
pElem
= (\(pos, ct) -> Data pos ct)
<$> ( (\x -> (x, DataConstructor)) <$> (pDATA <|> pTYPE)
<|> (\x -> (x, RecordConstructor)) <$> pRECORD
)
<*> pOptClassContext'
<*> pNontSet
<*> pTyVars
<*> pOptAttrs
<*> pAlts
<*> pSucceed False
<|> Attr <$> pATTR
<*> pOptClassContext'
<*> pNontSet
<*> pOptQuantifiers
<*> pAttrs
<|> Type <$> pTYPE
<*> pOptClassContext'
<*> pTypeCon
<*> pTyVars
<* pEquals
<*> pComplexType
<|> Sem <$> pSEM
<*> pOptClassContext'
<*> pNontSet
<*> pOptAttrs
<*> pOptQuantifiers
<*> pSemAlts
<|> Set <$> pSET
<*> pTypeCon
<*> ( False <$ pEquals
<|> True <$ pColon
)
<*> pNontSet
<|> Deriving
<$> pDERIVING
<*> pNontSet
<* pColon
<*> pListSep pComma pIdentifierU
<|> Wrapper
<$> pWRAPPER
<*> pNontSet
<|> Nocatas
<$> pNOCATAS
<*> pNontSet
<|> Pragma
<$> pPRAGMA
<*> pList1 pIdentifier
<|> Module
<$> pMODULE
<*> pCodescrap'
<*> pCodescrap'
<*> pCodescrap'
<|> codeBlock <$> pBlockKind <*> ((Just <$ pATTACH <*> pTypeCon) <|> pSucceed Nothing) <*> pCodeBlock <?> "a statement"
where codeBlock knd mbNt (txt,pos) = Txt pos knd mbNt (lines txt)
pBlockKind :: AGParser BlockKind
pBlockKind =
BlockPragma <$ pOPTPRAGMAS
<|> BlockImport <$ pIMPORTS
<|> BlockMain <$ pTOPLEVEL
<|> BlockData <$ pDATABLOCK
<|> BlockRec <$ pRECBLOCK
<|> pSucceed BlockOther
pAttrs :: AGParser Attrs
pAttrs
= Attrs <$> pOBrackPos <*> (concat <$> pList pInhAttrNames <?> "inherited attribute declarations")
<* pBar <*> (concat <$> pList pAttrNames <?> "chained attribute declarations" )
<* pBar <*> (concat <$> pList pAttrNames <?> "synthesised attribute declarations" )
<* pCBrack
<|> (\ds -> Attrs (fst $ head ds) [n | (_,(nms,_,_)) <- ds, n <- nms] [n | (_,(_,nms,_)) <- ds, n <- nms] [n | (_,(_,_,nms)) <- ds, n <- nms]) <$> pList1 pSingleAttrDefs
pSingleAttrDefs :: AGParser (Pos, (AttrNames, AttrNames, AttrNames))
pSingleAttrDefs
= (\p is -> (p, (is,[],[]))) <$> pINH <*> pList1Sep pComma pSingleInhAttrDef
<|> (\p is -> (p, ([],[],is))) <$> pSYN <*> pList1Sep pComma pSingleSynAttrDef
<|> (\p is -> (p, ([],is,[]))) <$> pCHN <*> pList1Sep pComma pSingleChnAttrDef
pSingleInhAttrDef :: AGParser (Identifier,Type,(String,String,String))
pSingleInhAttrDef
= (\v tp -> (v,tp,("","",""))) <$> pAttrIdentifier <* pTypeColon <*> pTypeOrSelf <?> "inh attribute declaration"
pSingleSynAttrDef :: AGParser (Identifier,Type,(String,String,String))
pSingleSynAttrDef
= (\v u tp -> (v,tp,u)) <$> pAttrIdentifier <*> pUse <* pTypeColon <*> pTypeOrSelf <?> "syn attribute declaration"
pSingleChnAttrDef :: AGParser (Identifier,Type,(String,String,String))
pSingleChnAttrDef
= (\v tp -> (v,tp,("","",""))) <$> pAttrIdentifier <* pTypeColon <*> pTypeOrSelf <?> "chn attribute declaration"
pOptAttrs :: AGParser Attrs
pOptAttrs = pAttrs `opt` Attrs noPos [] [] []
pInhAttrNames :: AGParser AttrNames
pInhAttrNames
= (\vs tp -> map (\v -> (v,tp,("","",""))) vs)
<$> pAttrIdentifiers <* pTypeColon <*> pTypeOrSelf <?> "attribute declarations"
pAttrNames :: AGParser AttrNames
pAttrNames
= (\vs use tp -> map (\v -> (v,tp,use)) vs)
<$> pAttrIdentifiers <*> pUse <* pTypeColon <*> pTypeOrSelf <?> "attribute declarations"
pAlt :: AGParser Alt
pAlt = (Alt <$> pBar <*> pSimpleConstructorSet <*> (pList1_ng pTypeVar <* pDot <|> pSucceed []) <*> pFields <*> pMaybeMacro <?> "a datatype alternative")
pAlts :: AGParser Alts
pAlts = pList_ng pAlt <?> "datatype alternatives"
pFields :: AGParser Fields
pFields = concat <$> pList_ng pField <?> "fields"
pField :: AGParser Fields
pField
= (\nms tp -> map (\nm -> FChild nm tp) nms) <$> pAttrIdentifiers <* pTypeColon <*> pType
<|> (\s -> [FChild (Ident (mklower $ getName s) (getPos s)) (NT s [] False)]) <$> pIdentifierU
<|> (\t -> [FCtx [t]]) <$ pSmallerEqual <*> pTypePrimitive
pSemAlt :: AGParser SemAlt
pSemAlt = SemAlt <$> pBar <*> pConstructorSet <*> pSemDefs <?> "SEM alternative"
pSemAlts :: AGParser SemAlts
pSemAlts = pList pSemAlt <?> "SEM alternatives"
pSemDef :: AGParser [SemDef]
pSemDef
= (\x y fs -> map (\f -> f x y) fs) <$> pMaybeRuleName <*> pFieldIdentifier <*> pList1 pAttrDef
<|> pLOC *> pList1 pLocDecl
<|> pINST *> pList1 pInstDecl
<|> pSEMPRAGMA *> pList1 (SemPragma <$> pNames)
<|> (\n e -> [AugmentDef n e]) <$ pAugmentToken <*> pAttrIdentifier <* pAssign <*> pExpr
<|> (\n e -> [AroundDef n e]) <$ pAROUND <*> pAttrIdentifier <* pAssign <*> pExpr
<|> (\a b -> [AttrOrderBefore a [b]]) <$> pList1 pAttrOrIdent <* pSmaller <*> pAttrOrIdent
<|> (\sources target nt expr -> [MergeDef target nt sources expr]) <$ pMERGE <*> (pList1_ng pIdentifier <* pAS <|> pSucceed []) <*> pIdentifier <* pTypeColon <*> pIdentifierU <* pAssign <*> pExpr
<|> (\mbNm pat (owrt,pos,pur,eager) exp -> [Def pos mbNm (pat ()) exp owrt pur eager]) <$> pMaybeRuleName <*> pPattern (const <$> pAttr) <*> pRuleSym <*> pExpr
pMaybeRuleName :: AGParser (Maybe Identifier)
pMaybeRuleName
= (Just <$> pIdentifier <* pColon <?> "rule name")
<|> pSucceed Nothing
pAttrDef :: AGParser (Maybe Identifier -> Identifier -> SemDef)
pAttrDef
= (\pat (owrt,pos,pur,eager) exp mbNm fld -> Def pos mbNm (pat fld) exp owrt pur eager)
<$ pDot <*> pattern <*> pRuleSym <*> pExpr
where pattern = pPattern pVar
<|> (\ir a fld -> ir $ Alias fld a (Underscore noPos)) <$> ((Irrefutable <$ pTilde) `opt` id) <*> pAttrIdentifier
pLocDecl :: AGParser SemDef
pLocDecl = pDot <**> (pIdentifier <**> (pTypeColon <**> ( (\(tp,pos) _ ident _ -> TypeDef pos ident tp) <$> pLocType
<|> (\ref _ ident _ -> UniqueDef ident ref) <$ pUNIQUEREF <*> pIdentifier )))
pLocType :: AGParser (Type, Pos)
pLocType = (\u -> (Haskell $ getName u, getPos u)) <$> pTypeCon
<|> (\(s,p) -> (Haskell s,p)) <$> pCodescrap <?> "a type"
pInstDecl :: AGParser SemDef
pInstDecl = (\ident tp -> TypeDef (getPos ident) ident tp)
<$ pDot <*> pIdentifier <* pTypeColon <*> pTypeNt
pSemDefs :: AGParser SemDefs
pSemDefs = concat <$> pList_ng pSemDef <?> "attribute rules"
pExpr :: AGParser Expression
pExpr = (\(str,pos) -> Expression pos (lexTokens opts pos str)) <$> pCodescrapL <?> "an expression"
pTypeColon :: AGParser Pos
pTypeColon
= if doubleColons opts
then pDoubleColon
else pColon
pMaybeMacro :: AGParser MaybeMacro
pMaybeMacro = Just <$ pDoubleArrow <*> pMacro
<|> pSucceed Nothing
pMacro :: AGParser Macro
pMacro
= Macro <$> pIdentifierU
<*> pList1 pMacroChild
<?> "macro"
pMacroChild :: AGParser MacroChild
pMacroChild
= (pIdentifier <* pEquals) <**>
(flip RuleChild <$> pMacro <|>
flip ChildChild <$> pIdentifier <|>
flip ValueChild <$> pCodescrap' )
pTypeNt :: AGParser Type
pTypeNt
= ((\nt -> mkNtType nt []) <$> pTypeCon <?> "nonterminal name (no brackets)")
<|> (pParens (mkNtType <$> pTypeCon <*> pList pTypeHaskellAnyAsString) <?> "nonterminal name with parameters (using parenthesis)")
pTypeCon :: AGParser Identifier
pTypeCon
| ocaml opts = pIdentifierExcl
| otherwise = pIdentifierU
pTypeVar :: AGParser Identifier
pTypeVar
| ocaml opts = (\(nm, pos) -> Ident nm pos) <$> pTextnmPos
| otherwise = pIdentifier
pTypeHaskellAnyAsString :: AGParser String
pTypeHaskellAnyAsString
= getName <$> pTypeVar
<|> getName <$> pTypeCon
<|> pCodescrap' <?> "a type"
pTypeEncapsulated :: AGParser Type
pTypeEncapsulated
= pParens pTypeEncapsulated
<|> mkNtType <$> pTypeCon <*> pList pTypeHaskellAnyAsString
<|> (Haskell . getName) <$> pTypeVar
<|> pTypePrimitive
pTypePrimitive :: AGParser Type
pTypePrimitive
= Haskell <$> pCodescrap' <?> "a type"
pType :: AGParser Type
pType = pTypeNt
<|> pTypePrimitive
pTypeOrSelf :: AGParser Type
pTypeOrSelf = pType <|> Self <$ pSELF
pOptClassContext :: AGParser ClassContext
pOptClassContext
= pClassContext <* pDoubleArrow
<|> pSucceed []
pClassContext :: AGParser ClassContext
pClassContext
= pListSep pComma ((,) <$> pIdentifierU <*> pList pTypeHaskellAnyAsString)
pNontSet = set0 where
set0 = pChainr (Intersect <$ pIntersect) set1
set1 = pChainl (Difference <$ pMinus) set2
set2 = pChainr (pSucceed Union) set3
set3 = pTypeCon <**> opt (flip Path <$ pArrow <*> pTypeCon) NamedSet
<|> All <$ pStar
<|> pParens set0
resolveFile :: Options -> [FilePath] -> FilePath -> IO FilePath
resolveFile opts path fname = search (path ++ ["."])
where search (p:ps) = do let filename = joinPath [p, fname]
fExists <- doesFileExist filename
if fExists
then return filename
else do let filename' = joinPath [p, replaceExtension fname "ag"]
fExists' <- doesFileExist filename'
if fExists'
then return filename'
else search ps
search [] = do
outputStr opts ("File: " ++ show fname ++ " not found in search path: " ++ show (concat (intersperse ";" (path ++ ["."]))) ++ "\n")
failWithCode opts 1
return (error "resolveFile: file not found")
evalStepsMessages :: (Eq s, Show s, Show p) => Steps a s p -> (a,[Message s p])
evalStepsMessages steps = case steps of
OkVal v rest -> let (arg,ms) = evalStepsMessages rest
in (v arg,ms)
Ok rest -> evalStepsMessages rest
Cost _ rest -> evalStepsMessages rest
StRepair _ msg rest -> let (v,ms) = evalStepsMessages rest
in (v, msg:ms)
Best _ rest _ -> evalStepsMessages rest
NoMoreSteps v -> (v,[])
loopp ::(a->Bool) -> (a->IO a) -> a -> IO a
loopp pred cont x | pred x = return x
| otherwise = do x' <- cont x
loopp pred cont x'
codescrapL p [] = (valueToken TkTextln "" p,p,[])
codescrapL p (x:xs) | isSpace x = (updPos' x p) codescrapL xs
| otherwise = let refcol = column p
(p',sc,rest) = scrapL refcol p (x:xs)
in (valueToken TkTextln sc p,p',rest)
scrapL ref p (x:xs) | isSpace x || column p >= ref =
let (p'',sc,inp) = updPos' x p (scrapL ref) xs
in (p'',x:sc,inp)
| otherwise =(p,[],x:xs)
scrapL ref p [] = (p,[],[])
pNames :: AGParser [Identifier]
pNames = pIdentifiers
pCodeBlock :: AGParser (String,Pos)
pCodeBlock = pCostValToken 90 TkTextln "" <?> "a code block"
pOptQuantifiers :: AGParser [String]
pOptQuantifiers = (return <$ pDoubleColon <*> pCodescrap') `opt` []
pIdentifiers :: AGParser [Identifier]
pIdentifiers = pList1Sep pComma pIdentifier <?> "lowercase identifiers"
pAttrIdentifier :: AGParser Identifier
pAttrIdentifier = pIdentifier
<|> (\pos -> Ident "imports" pos) <$> pIMPORTS
<|> (\pos -> Ident "toplevel" pos) <$> pTOPLEVEL
pAttrIdentifiers :: AGParser [Identifier]
pAttrIdentifiers = pList1Sep pComma pAttrIdentifier <?> "lowercase identifiers"
pUse :: AGParser (String,String,String)
pUse = ( (\u x y->(x,y,show u)) <$> pUSE <*> pCodescrap' <*> pCodescrap') `opt` ("","","") <?> "USE declaration"
mklower :: String -> String
mklower (x:xs) = toLower x : xs
mklower [] = []
pSimpleConstructorSet :: AGParser ConstructorSet
pSimpleConstructorSet = CName <$> pIdentifierU
<|> CAll <$ pStar
<|> pParens pConstructorSet
pConstructorSet :: AGParser ConstructorSet
pConstructorSet = pChainl (CDifference <$ pMinus) term2
where term2 = pChainr (pSucceed CUnion) term1
term1 = CName <$> pIdentifierU
<|> CAll <$ pStar
pFieldIdentifier :: AGParser Identifier
pFieldIdentifier = pIdentifier
<|> Ident "lhs" <$> pLHS
<|> Ident "loc" <$> pLOC
<|> Ident "inst" <$> pINST
pAugmentToken :: AGParser ()
pAugmentToken = () <$ (pAUGMENT <|> pPlus)
pAttr = (,) <$> pFieldIdentifier <* pDot <*> pAttrIdentifier
pAttrOrIdent
= OccAttr <$> pFieldIdentifier <* pDot <*> pAttrIdentifier
<|> OccRule <$> pIdentifier
nl2sp :: Char -> Char
nl2sp '\n' = ' '
nl2sp '\r' = ' '
nl2sp x = x
pVar :: AGParser (Identifier -> (Identifier, Identifier))
pVar = (\att fld -> (fld,att)) <$> pAttrIdentifier
pAssign :: AGParser Bool
pAssign = False <$ pReserved "="
<|> True <$ pReserved ":="
pRuleSym :: AGParser (Bool, Pos, Bool, Bool)
pRuleSym = (\p -> (False, p, True, False)) <$> pReserved "="
<|> (\p -> (True, p, True, False)) <$> pReserved ":="
<|> (\p -> (False, p, True, False)) <$> pReserved "<-"
<|> (\p -> (False, p, True, True)) <$> pReserved "<<-"
pPattern :: AGParser (a -> (Identifier,Identifier)) -> AGParser (a -> Pattern)
pPattern pvar = pPattern2 where
pPattern0 = (\i pats a -> Constr i (map ($ a) pats))
<$> pIdentifierU <*> pList pPattern1
<|> pPattern1 <?> "a pattern"
pPattern1 = pvariable
<|> pPattern2
pvariable = (\ir var pat a -> case var a of (fld,att) -> ir $ Alias fld att (pat a))
<$> ((Irrefutable <$ pTilde) `opt` id) <*> pvar <*> ((pAt *> pPattern1) `opt` const (Underscore noPos))
pPattern2 = (mkTuple <$> pOParenPos <*> pListSep pComma pPattern0 <* pCParen )
<|> (const . Underscore) <$> pUScore <?> "a pattern"
where mkTuple _ [x] a = x a
mkTuple p xs a = Product p (map ($ a) xs)
pCostSym' c t = pCostSym c t t
pCodescrap' :: AGParser String
pCodescrap' = fst <$> pCodescrap
pCodescrap :: AGParser (String,Pos)
pCodescrap = pCodeBlock
pSEM, pATTR, pDATA, pRECORD, pUSE, pLOC,pINCLUDE, pTYPE, pEquals, pColonEquals, pTilde,
pEXTENDS,
pBar, pColon, pLHS,pINST,pSET,pDERIVING,pMinus,pIntersect,pDoubleArrow,pArrow,
pDot, pUScore, pEXT,pAt,pStar, pSmaller, pWRAPPER, pNOCATAS, pPRAGMA, pMAYBE, pEITHER, pMAP, pINTMAP,
pMODULE, pATTACH, pUNIQUEREF, pINH, pSYN, pAUGMENT, pPlus, pAROUND, pSEMPRAGMA, pMERGE, pAS, pSELF,
pIMPORTS, pOPTPRAGMAS, pSmallerEqual, pINTSET, pDATABLOCK, pRECBLOCK
:: AGParser Pos
pSET = pCostReserved 90 "SET" <?> "SET"
pDERIVING = pCostReserved 90 "DERIVING"<?> "DERIVING"
pWRAPPER = pCostReserved 90 "WRAPPER" <?> "WRAPPER"
pNOCATAS = pCostReserved 90 "NOCATAS" <?> "NOCATAS"
pPRAGMA = pCostReserved 90 "PRAGMA" <?> "PRAGMA"
pSEMPRAGMA = pCostReserved 90 "SEMPRAGMA" <?> "SEMPRAGMA"
pATTACH = pCostReserved 90 "ATTACH" <?> "ATTACH"
pDATA = pCostReserved 90 "DATA" <?> "DATA"
pRECORD = pCostReserved 90 "RECORD" <?> "RECORD"
pEXT = pCostReserved 90 "EXT" <?> "EXT"
pATTR = pCostReserved 90 "ATTR" <?> "ATTR"
pSEM = pCostReserved 90 "SEM" <?> "SEM"
pINCLUDE = pCostReserved 90 "INCLUDE" <?> "INCLUDE"
pEXTENDS = pCostReserved 90 "EXTENDS" <?> "EXTENDS"
pTYPE = pCostReserved 90 "TYPE" <?> "TYPE"
pINH = pCostReserved 90 "INH" <?> "INH"
pSYN = pCostReserved 90 "SYN" <?> "SYN"
pCHN = pCostReserved 90 "CHN" <?> "CHN"
pMAYBE = pCostReserved 5 "MAYBE" <?> "MAYBE"
pEITHER = pCostReserved 5 "EITHER" <?> "EITHER"
pMAP = pCostReserved 5 "MAP" <?> "MAP"
pINTMAP = pCostReserved 5 "INTMAP" <?> "INTMAP"
pINTSET = pCostReserved 5 "INTSET" <?> "INTSET"
pUSE = pCostReserved 5 "USE" <?> "USE"
pLOC = pCostReserved 5 "loc" <?> "loc"
pLHS = pCostReserved 5 "lhs" <?> "loc"
pINST = pCostReserved 5 "inst" <?> "inst"
pAt = pCostReserved 5 "@" <?> "@"
pDot = pCostReserved 5 "." <?> "."
pUScore = pCostReserved 5 "_" <?> "_"
pColon = pCostReserved 5 ":" <?> ":"
pDoubleColon = pCostReserved 5 "::" <?> "::"
pEquals = pCostReserved 5 "=" <?> "="
pColonEquals = pCostReserved 5 ":=" <?> ":="
pTilde = pCostReserved 5 "~" <?> "~"
pPlus = pCostReserved 5 "+" <?> "+"
pBar = pCostReserved 5 "|" <?> "|"
pIntersect = pCostReserved 5 "/\\" <?> "/\\"
pMinus = pCostReserved 5 "-" <?> "-"
pDoubleArrow = pCostReserved 5 "=>" <?> "=>"
pSmallerEqual= pCostReserved 5 "<=" <?> "<="
pArrow = pCostReserved 5 "->" <?> "->"
pStar = pCostReserved 5 "*" <?> "*"
pSmaller = pCostReserved 5 "<" <?> "<"
pMODULE = pCostReserved 5 "MODULE" <?> "MODULE"
pUNIQUEREF = pCostReserved 5 "UNIQUEREF" <?> "UNIQUEREF"
pAUGMENT = pCostReserved 5 "AUGMENT" <?> "AUGMENT"
pAROUND = pCostReserved 5 "AROUND" <?> "AROUND"
pMERGE = pCostReserved 5 "MERGE" <?> "MERGE"
pAS = pCostReserved 5 "AS" <?> "AS"
pSELF = pCostReserved 5 "SELF" <?> "SELF"
pIMPORTS = pCostReserved 5 "imports" <?> "imports"
pOPTPRAGMAS = pCostReserved 5 "optpragmas" <?> "optpragmas"
pTOPLEVEL = pCostReserved 5 "toplevel" <?> "toplevel"
pDATABLOCK = pCostReserved 5 "datablock" <?> "datadecl block"
pRECBLOCK = pCostReserved 5 "recblock" <?> "recursive block"