pseudo-boolean 0.1.4.0 → 0.1.5.0
raw patch · 3 files changed
+83/−35 lines, 3 filesdep ~basedep ~dlistdep ~megaparsecPVP: major bump suggested
API removals or changes: PVP suggests a major version bump
Dependency ranges changed: base, dlist, megaparsec
API changes (from Hackage documentation)
- Data.PseudoBoolean.Megaparsec: opbParser :: Stream s Char => ParsecT s m Formula
+ Data.PseudoBoolean.Megaparsec: opbParser :: (MonadParsec e s m, Token s ~ Char) => m Formula
- Data.PseudoBoolean.Megaparsec: parseOPBByteString :: String -> ByteString -> Either ParseError Formula
+ Data.PseudoBoolean.Megaparsec: parseOPBByteString :: String -> ByteString -> Either (ParseError Char Dec) Formula
- Data.PseudoBoolean.Megaparsec: parseOPBFile :: FilePath -> IO (Either ParseError Formula)
+ Data.PseudoBoolean.Megaparsec: parseOPBFile :: FilePath -> IO (Either (ParseError Char Dec) Formula)
- Data.PseudoBoolean.Megaparsec: parseOPBString :: String -> String -> Either ParseError Formula
+ Data.PseudoBoolean.Megaparsec: parseOPBString :: String -> String -> Either (ParseError Char Dec) Formula
- Data.PseudoBoolean.Megaparsec: parseWBOByteString :: String -> ByteString -> Either ParseError SoftFormula
+ Data.PseudoBoolean.Megaparsec: parseWBOByteString :: String -> ByteString -> Either (ParseError Char Dec) SoftFormula
- Data.PseudoBoolean.Megaparsec: parseWBOFile :: FilePath -> IO (Either ParseError SoftFormula)
+ Data.PseudoBoolean.Megaparsec: parseWBOFile :: FilePath -> IO (Either (ParseError Char Dec) SoftFormula)
- Data.PseudoBoolean.Megaparsec: parseWBOString :: String -> String -> Either ParseError SoftFormula
+ Data.PseudoBoolean.Megaparsec: parseWBOString :: String -> String -> Either (ParseError Char Dec) SoftFormula
- Data.PseudoBoolean.Megaparsec: wboParser :: Stream s Char => ParsecT s m SoftFormula
+ Data.PseudoBoolean.Megaparsec: wboParser :: (MonadParsec e s m, Token s ~ Char) => m SoftFormula
Files
- CHANGELOG.markdown +4/−0
- pseudo-boolean.cabal +4/−3
- src/Data/PseudoBoolean/Megaparsec.hs +75/−32
CHANGELOG.markdown view
@@ -1,3 +1,7 @@+0.1.5.0+-------+* support megaparsec-5.*+ 0.1.4.0 ------- * add Megaparsec-based parsers
pseudo-boolean.cabal view
@@ -2,7 +2,7 @@ -- documentation, see http://haskell.org/cabal/users-guide/ name: pseudo-boolean-version: 0.1.4.0+version: 0.1.5.0 synopsis: Reading/Writing OPB/WBO files used in pseudo boolean competition description: Reading\/Writing OPB\/WBO files used in pseudo boolean competition homepage: https://github.com/msakai/pseudo-boolean@@ -39,16 +39,17 @@ Data.PseudoBoolean.Types other-extensions: BangPatterns+ ConstraintKinds CPP DeriveDataTypeable DeriveGeneric FlexibleContexts OverloadedStrings build-depends:- base >=4.6.0.1 && <4.9,+ base >=4.6.0.1 && <4.10, containers >=0.4.2.1, parsec >=3.1.2 && <4,- megaparsec >=4 && <5,+ megaparsec >=4 && <6, bytestring >=0.9.2.1 && <0.11, bytestring-builder, dlist >=0.7.0 && <0.8.0,
src/Data/PseudoBoolean/Megaparsec.hs view
@@ -1,4 +1,4 @@-{-# LANGUAGE BangPatterns, FlexibleContexts #-}+{-# LANGUAGE BangPatterns, FlexibleContexts, TypeFamilies, CPP, ConstraintKinds #-} {-# OPTIONS_GHC -Wall #-} ----------------------------------------------------------------------------- -- |@@ -7,7 +7,7 @@ -- License : BSD-style -- -- Maintainer : masahiro.sakai@gmail.com--- Portability : non-portable (BangPatterns, FlexibleContexts)+-- Portability : non-portable (BangPatterns, FlexibleContexts, TypeFamilies, CPP, ConstraintKinds) -- -- A parser library for OPB file and WBO files used in pseudo boolean competition. -- @@ -38,21 +38,37 @@ import Control.Applicative ((<*)) import Control.Monad import Data.ByteString.Lazy (ByteString)+import qualified Data.ByteString.Lazy as BL import Data.Maybe import Text.Megaparsec+import Text.Megaparsec.Prim (MonadParsec ()) import Data.PseudoBoolean.Types import Data.PseudoBoolean.Internal.TextUtil +#if MIN_VERSION_megaparsec(5,0,0)+type C e s m = (MonadParsec e s m, Token s ~ Char)+#else+type C e s m = (MonadParsec s m Char)+#endif+ -- | Parser for OPB files-opbParser :: Stream s Char => ParsecT s m Formula+#if MIN_VERSION_megaparsec(5,0,0)+opbParser :: (MonadParsec e s m, Token s ~ Char) => m Formula+#else+opbParser :: (MonadParsec s m Char) => m Formula+#endif opbParser = formula -- | Parser for WBO files-wboParser :: Stream s Char => ParsecT s m SoftFormula+#if MIN_VERSION_megaparsec(5,0,0)+wboParser :: (MonadParsec e s m, Token s ~ Char) => m SoftFormula+#else+wboParser :: (MonadParsec s m Char) => m SoftFormula+#endif wboParser = softformula -- <formula>::= <sequence_of_comments> [<objective>] <sequence_of_comments_or_constraints>-formula :: Stream s Char => ParsecT s m Formula+formula :: C e s m => m Formula formula = do h <- optional hint sequence_of_comments@@ -66,7 +82,7 @@ , pbNumConstraints = fromMaybe (length cs) (fmap snd h) } -hint :: Stream s Char => ParsecT s m (Int,Int)+hint :: C e s m => m (Int,Int) hint = try $ do _ <- char '*' zeroOrMoreSpace@@ -81,11 +97,11 @@ return (fromIntegral nv, fromIntegral nc) -- <sequence_of_comments>::= <comment> [<sequence_of_comments>]-sequence_of_comments :: Stream s Char => ParsecT s m ()+sequence_of_comments :: C e s m => m () sequence_of_comments = skipMany comment -- XXX: we allow empty sequence -- <comment>::= "*" <any_sequence_of_characters_other_than_EOL> <EOL>-comment :: Stream s Char => ParsecT s m ()+comment :: C e s m => m () comment = do _ <- char '*' _ <- manyTill anyChar eol@@ -93,18 +109,18 @@ return () -- <sequence_of_comments_or_constraints>::= <comment_or_constraint> [<sequence_of_comments_or_constraints>]-sequence_of_comments_or_constraints :: Stream s Char => ParsecT s m [Constraint]+sequence_of_comments_or_constraints :: C e s m => m [Constraint] sequence_of_comments_or_constraints = do xs <- many comment_or_constraint -- We relax the grammer and allow spaces in the beginning of next component. return $ catMaybes xs -- <comment_or_constraint>::= <comment>|<constraint>-comment_or_constraint :: Stream s Char => ParsecT s m (Maybe Constraint)+comment_or_constraint :: C e s m => m (Maybe Constraint) comment_or_constraint = (comment >> return Nothing) <|> (liftM Just constraint) -- <objective>::= "min:" <zeroOrMoreSpace> <sum> ";"-objective :: Stream s Char => ParsecT s m Sum+objective :: C e s m => m Sum objective = do _ <- string "min:" zeroOrMoreSpace@@ -113,7 +129,7 @@ return obj -- <constraint>::= <sum> <relational_operator> <zeroOrMoreSpace> <integer> <zeroOrMoreSpace> ";"-constraint :: Stream s Char => ParsecT s m Constraint+constraint :: C e s m => m Constraint constraint = do lhs <- sum op <- relational_operator@@ -124,11 +140,11 @@ return (lhs, op, rhs) -- <sum>::= <weightedterm> | <weightedterm> <sum>-sum :: Stream s Char => ParsecT s m Sum+sum :: C e s m => m Sum sum = some weightedterm -- <weightedterm>::= <integer> <oneOrMoreSpace> <term> <oneOrMoreSpace>-weightedterm :: Stream s Char => ParsecT s m WeightedTerm+weightedterm :: C e s m => m WeightedTerm weightedterm = do w <- integer oneOrMoreSpace@@ -137,7 +153,7 @@ return (w,t) -- <integer>::= <unsigned_integer> | "+" <unsigned_integer> | "-" <unsigned_integer>-integer :: Stream s Char => ParsecT s m Integer+integer :: C e s m => m Integer integer = msum [ unsigned_integer , char '+' >> unsigned_integer@@ -145,33 +161,33 @@ ] -- <unsigned_integer>::= <digit> | <digit><unsigned_integer>-unsigned_integer :: Stream s Char => ParsecT s m Integer+unsigned_integer :: C e s m => m Integer unsigned_integer = do ds <- some digitChar return $! readUnsignedInteger ds -- <relational_operator>::= ">=" | "="-relational_operator :: Stream s Char => ParsecT s m Op+relational_operator :: C e s m => m Op relational_operator = (string ">=" >> return Ge) <|> (string "=" >> return Eq) -- <variablename>::= "x" <unsigned_integer>-variablename :: Stream s Char => ParsecT s m Var+variablename :: C e s m => m Var variablename = do _ <- char 'x' i <- unsigned_integer return $! fromIntegral i -- <oneOrMoreSpace>::= " " [<oneOrMoreSpace>]-oneOrMoreSpace :: Stream s Char => ParsecT s m ()+oneOrMoreSpace :: C e s m => m () oneOrMoreSpace = skipSome (char ' ') -- <zeroOrMoreSpace>::= [" " <zeroOrMoreSpace>]-zeroOrMoreSpace :: Stream s Char => ParsecT s m ()+zeroOrMoreSpace :: C e s m => m () -- zeroOrMoreSpace = skipMany (char ' ') zeroOrMoreSpace = space -- We relax the grammer and allow more type of spacing -semi :: Stream s Char => ParsecT s m ()+semi :: C e s m => m () semi = char ';' >> space -- We relax the grammer and allow spaces in the beginning of next component. @@ -182,11 +198,11 @@ For non-linear instances, <term> is defined as <term>::= <oneOrMoreLiterals> -}-term :: Stream s Char => ParsecT s m Term+term :: C e s m => m Term term = oneOrMoreLiterals -- <oneOrMoreLiterals>::= <literal> | <literal> <oneOrMoreSpace> <oneOrMoreLiterals>-oneOrMoreLiterals :: Stream s Char => ParsecT s m [Lit]+oneOrMoreLiterals :: C e s m => m [Lit] oneOrMoreLiterals = do l <- literal mplus (try $ oneOrMoreSpace >> liftM (l:) (oneOrMoreLiterals)) (return [l])@@ -195,24 +211,37 @@ -- But it's not the case here. -- <literal>::= <variablename> | "~"<variablename>-literal :: Stream s Char => ParsecT s m Lit+literal :: C e s m => m Lit literal = variablename <|> (char '~' >> liftM negate variablename) -- | Parse a OPB format string containing pseudo boolean problem.+#if MIN_VERSION_megaparsec(5,0,0)+parseOPBString :: String -> String -> Either (ParseError Char Dec) Formula+#else parseOPBString :: String -> String -> Either ParseError Formula+#endif parseOPBString = parse (formula <* eof) -- | Parse a OPB format lazy bytestring containing pseudo boolean problem.+#if MIN_VERSION_megaparsec(5,0,0)+parseOPBByteString :: String -> ByteString -> Either (ParseError Char Dec) Formula+#else parseOPBByteString :: String -> ByteString -> Either ParseError Formula+#endif parseOPBByteString = parse (formula <* eof) -- | Parse a OPB file containing pseudo boolean problem.+#if MIN_VERSION_megaparsec(5,0,0)+parseOPBFile :: FilePath -> IO (Either (ParseError Char Dec) Formula)+#else parseOPBFile :: FilePath -> IO (Either ParseError Formula)-parseOPBFile = parseFromFile ((formula <* eof) :: Parsec ByteString Formula)-+#endif+parseOPBFile filepath = do+ s <- BL.readFile filepath+ return $! parse (formula <* eof) filepath s -- <softformula>::= <sequence_of_comments> <softheader> <sequence_of_comments_or_constraints>-softformula :: Stream s Char => ParsecT s m SoftFormula+softformula :: C e s m => m SoftFormula softformula = do h <- optional hint sequence_of_comments@@ -227,7 +256,7 @@ } -- <softheader>::= "soft:" [<unsigned_integer>] ";"-softheader :: Stream s Char => ParsecT s m (Maybe Integer)+softheader :: C e s m => m (Maybe Integer) softheader = do _ <- string "soft:" zeroOrMoreSpace -- XXX@@ -237,19 +266,19 @@ return top -- <sequence_of_comments_or_constraints>::= <comment_or_constraint> [<sequence_of_comments_or_constraints>]-wbo_sequence_of_comments_or_constraints :: Stream s Char => ParsecT s m [SoftConstraint]+wbo_sequence_of_comments_or_constraints :: C e s m => m [SoftConstraint] wbo_sequence_of_comments_or_constraints = do xs <- many wbo_comment_or_constraint -- XXX: we relax the grammer to allow empty sequence return $ catMaybes xs -- <comment_or_constraint>::= <comment>|<constraint>|<softconstraint>-wbo_comment_or_constraint :: Stream s Char => ParsecT s m (Maybe SoftConstraint)+wbo_comment_or_constraint :: C e s m => m (Maybe SoftConstraint) wbo_comment_or_constraint = (comment >> return Nothing) <|> m where m = liftM Just $ (constraint >>= \c -> return (Nothing, c)) <|> softconstraint -- <softconstraint>::= "[" <zeroOrMoreSpace> <unsigned_integer> <zeroOrMoreSpace> "]" <constraint>-softconstraint :: Stream s Char => ParsecT s m SoftConstraint+softconstraint :: C e s m => m SoftConstraint softconstraint = do _ <- char '[' zeroOrMoreSpace@@ -261,13 +290,27 @@ return (Just cost, c) -- | Parse a WBO format string containing weighted boolean optimization problem.+#if MIN_VERSION_megaparsec(5,0,0)+parseWBOString :: String -> String -> Either (ParseError Char Dec) SoftFormula+#else parseWBOString :: String -> String -> Either ParseError SoftFormula+#endif parseWBOString = parse (softformula <* eof) -- | Parse a WBO format lazy bytestring containing pseudo boolean problem.+#if MIN_VERSION_megaparsec(5,0,0)+parseWBOByteString :: String -> ByteString -> Either (ParseError Char Dec) SoftFormula+#else parseWBOByteString :: String -> ByteString -> Either ParseError SoftFormula+#endif parseWBOByteString = parse (softformula <* eof) -- | Parse a WBO file containing weighted boolean optimization problem.+#if MIN_VERSION_megaparsec(5,0,0)+parseWBOFile :: FilePath -> IO (Either (ParseError Char Dec) SoftFormula)+#else parseWBOFile :: FilePath -> IO (Either ParseError SoftFormula)-parseWBOFile = parseFromFile ((softformula <* eof) :: Parsec ByteString SoftFormula)+#endif+parseWBOFile filepath = do+ s <- BL.readFile filepath+ return $! parse (softformula <* eof) filepath s