-- Hoogle documentation, generated by Haddock -- See Hoogle, http://www.haskell.org/hoogle/ -- | Syntax descriptions for unified parsing and pretty-printing. -- @package syntax @version 0.3.0.0 -- | Combinators that work with any sequence type. module Data.Syntax.Combinator -- | One or zero occurences of f. optional :: SemiIsoAlternative f => f a -> f (Maybe a) -- | Like optional, but specialized for (). opt :: SemiIsoAlternative f => f () -> f () -- | Parser one or zero occurences of f, but prints nothing. opt_ :: SemiIsoAlternative f => f () -> f () -- | manyTill p end applies action p zero or more times until -- action end succeeds, and returns the list of values returned by p. manyTill :: SemiIsoAlternative f => f a -> f () -> f [a] -- | Zero or more occurences of v separated by s. sepBy :: SemiIsoAlternative f => f a -> f () -> f [a] -- | One or more occurences of v separated by s. sepBy1 :: SemiIsoAlternative f => f a -> f () -> f [a] -- | Tries to apply the actions in the list in order, until one of them -- succeeds. Returns the value of the succeeding action. choice :: SemiIsoAlternative f => [f a] -> f a -- | Combine two alternatives. eitherOf :: SemiIsoAlternative f => f a -> f b -> f (Either a b) -- | Abstract syntax descriptions based on semi-isomorphisms. module Data.Syntax -- | An abstract syntax description based on semi-isomorphisms. -- -- This class can be implemented by both parsers and printers (and maybe -- more?). -- -- The usual use is to write a polymorphic syntax description and -- instantiate it both as a parser and a printer. An example is available -- in the 'syntax-example' package. -- -- Methods of this class try to mimic Data.Attoparsec.Text -- interface. class (SemiIsoAlternative syn, SemiIsoMonad syn, IsSequence seq, Eq seq, Eq (Element seq)) => Syntax syn seq | syn -> seq where char c = rev (exact c) /$/ anyChar notChar c = bifiltered (/= c) /$/ anyChar satisfy p = bifiltered p /$/ anyChar satisfyWith ai p = bifiltered p . ai /$/ anyChar string s = rev (exact s) /$/ take (olength s) take n = packed /$/ sireplicate n anyChar takeWhile p = packed /$/ simany (satisfy p) takeWhile1 p = packed /$/ sisome (satisfy p) takeTill p = takeWhile (not . p) takeTill1 p = takeWhile1 (not . p) anyChar :: Syntax syn seq => syn (Element seq) char :: Syntax syn seq => Element seq -> syn () notChar :: Syntax syn seq => Element seq -> syn (Element seq) satisfy :: Syntax syn seq => (Element seq -> Bool) -> syn (Element seq) satisfyWith :: Syntax syn seq => ASemiIso' a (Element seq) -> (a -> Bool) -> syn a string :: Syntax syn seq => seq -> syn () take :: Syntax syn seq => Int -> syn seq takeWhile :: Syntax syn seq => (Element seq -> Bool) -> syn seq takeWhile1 :: Syntax syn seq => (Element seq -> Bool) -> syn seq takeTill :: Syntax syn seq => (Element seq -> Bool) -> syn seq takeTill1 :: Syntax syn seq => (Element seq -> Bool) -> syn seq -- | An isomorphism between a sequence and a list of its elements. packed :: IsSequence seq => Iso' seq [Element seq] -- | Common combinators that work with sequences of chars. module Data.Syntax.Char -- | Syntax constrainted to sequences of chars. -- -- Note: methods of this class do not have default implementations (for -- now), because their code is quite ugly and already written in most -- parser libraries. class (Syntax syn seq, Element seq ~ Char) => SyntaxChar syn seq decimal :: (SyntaxChar syn seq, Integral a) => syn a hexadecimal :: (SyntaxChar syn seq, Integral a, Bits a) => syn a realFloat :: (SyntaxChar syn seq, RealFloat a) => syn a scientific :: SyntaxChar syn seq => syn Scientific -- | An useful synonym for SyntaxChars with Text sequences. type SyntaxText syn = SyntaxChar syn Text -- | A number with an optional leading + or - sign character. signed :: (Real a, SyntaxChar syn seq) => syn a -> syn a -- | Accepts zero or more spaces. Generates a single space. spaces :: SyntaxChar syn seq => syn () -- | Accepts zero or more spaces. Generates no output. spaces_ :: SyntaxChar syn seq => syn () -- | Accepts one or more spaces. Generates a single space. spaces1 :: SyntaxChar syn seq => syn () -- | Accepts a single newline. Generates a newline. endOfLine :: SyntaxChar syn seq => syn () -- | A decimal digit. digitDec :: SyntaxChar syn seq => syn Int -- | An octal digit. digitOct :: SyntaxChar syn seq => syn Int -- | A hex digit. digitHex :: SyntaxChar syn seq => syn Int -- | Provides a very simple indentation as a "monad" transformer. module Data.Syntax.Indent -- | Adds indentation to a syntax description. data Indent m a -- | runIndent m tab runs the Indent transformer using -- tab once for each level of indentation. runIndent :: Indent m a -> m () -> m a -- | Inserts a new line and correct indentation, but does not require any -- formatting when parsing (it just skips all white space). breakLine :: SyntaxChar syn seq => Indent syn () -- | Increases the indentation level of its argument by one. indented :: Indent m a -> Indent m a instance SyntaxChar syn seq => SyntaxChar (Indent syn) seq instance Syntax syn seq => Syntax (Indent syn) seq instance SemiIsoFix m => SemiIsoFix (Indent m) instance SemiIsoMonad m => SemiIsoMonad (Indent m) instance SemiIsoAlternative m => SemiIsoAlternative (Indent m) instance SemiIsoApply m => SemiIsoApply (Indent m) instance SemiIsoFunctor m => SemiIsoFunctor (Indent m)