uu-cco-0.1.0.0: src/CCO/Tree/ATerm/Parser.hs
-------------------------------------------------------------------------------
-- |
-- Module : CCO.Tree.ATerm.Parser
-- Copyright : (c) 2008 Utrecht University
-- License : All rights reserved
--
-- Maintainer : stefan@cs.uu.nl
-- Stability : provisional
-- Portability : portable
--
-- A 'Parser' for 'ATerm's.
--
-------------------------------------------------------------------------------
module CCO.Tree.ATerm.Parser (
-- * Parser
parser -- :: Component String ATerm
) where
import CCO.Component (Component)
import qualified CCO.Component as C (parser)
import CCO.Parsing (Parser, eof, (<!>), opt, manySepBy)
import CCO.Tree.ATerm (ATerm (..))
import CCO.Tree.ATerm.Lexer
import Control.Applicative
-------------------------------------------------------------------------------
-- Token parsers
-------------------------------------------------------------------------------
-- | Type of 'Parser's that consume symbols described by 'Token's.
type TokenParser = Parser Token
-------------------------------------------------------------------------------
-- Parser
-------------------------------------------------------------------------------
-- | A 'Component' for parsing 'ATerm's.
parser :: Component String ATerm
parser = C.parser lexer (pATerm <* eof)
-- | Parses zero or more 'ATerm's separated by commas.
pATerms :: TokenParser [ATerm]
pATerms = manySepBy (spec ',') pATerm
-- | Parses a single 'ATerm'.
pATerm :: TokenParser ATerm
pATerm = foldl Ann <$>
pBase <*>
many (spec '{' *> pATerms <* spec '}' <!> "annotation")
where
pBase = pInteger <|> pFloat <|> pString <|> pApp <|> pTuple <|> pList <!>
"term"
-- | Parses an 'Integer'.
pInteger :: TokenParser ATerm
pInteger = Integer <$> integer
-- | Parses a 'Float'.
pFloat :: TokenParser ATerm
pFloat = Float <$> float
-- | Parses a 'String'.
pString :: TokenParser ATerm
pString = String <$> string
-- | Parses an 'App'.
pApp :: TokenParser ATerm
pApp = App <$> con <*> args
where
args = spec '(' *> pATerms <* spec ')' `opt` []
-- | Parses a 'Tuple'.
pTuple :: TokenParser ATerm
pTuple = Tuple <$ spec '(' <*> pATerms <* spec ')'
-- | Parses a 'List'.
pList :: TokenParser ATerm
pList = List <$ spec '[' <*> pATerms <* spec ']'