diff --git a/CHANGELOG.markdown b/CHANGELOG.markdown
--- a/CHANGELOG.markdown
+++ b/CHANGELOG.markdown
@@ -1,3 +1,7 @@
+0.1.11.0
+-------
+* some minor clean-up
+
 0.1.10.0
 -------
 * allow parsing empty `<sum>`. https://github.com/msakai/pseudo-boolean/pull/5
diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -1,8 +1,7 @@
 # pseudo-boolean
 Haskell library for parsing/generating OPB/WBO files used in pseudo boolean competition.
 
-[![Build Status (Travis-CI)](https://travis-ci.org/msakai/pseudo-boolean.svg?branch=master)](https://travis-ci.org/msakai/pseudo-boolean)
-[![Build Status (GitHub Actions)](https://github.com/msakai/pseudo-boolean/workflows/build/badge.svg)](https://github.com/msakai/pseudo-boolean/actions)
+[![Build Status](https://github.com/msakai/pseudo-boolean/workflows/build/badge.svg)](https://github.com/msakai/pseudo-boolean/actions)
 [![Coverage Status](https://coveralls.io/repos/msakai/pseudo-boolean/badge.svg)](https://coveralls.io/r/msakai/pseudo-boolean)
 [![Hackage](https://img.shields.io/hackage/v/pseudo-boolean.svg)](https://hackage.haskell.org/package/pseudo-boolean)
 [![Hackage Deps](https://img.shields.io/hackage-deps/v/pseudo-boolean.svg)](https://packdeps.haskellers.com/feed?needle=pseudo-boolean)
diff --git a/pseudo-boolean.cabal b/pseudo-boolean.cabal
--- a/pseudo-boolean.cabal
+++ b/pseudo-boolean.cabal
@@ -2,7 +2,7 @@
 -- documentation, see http://haskell.org/cabal/users-guide/
 
 name:                pseudo-boolean
-version:             0.1.10.0
+version:             0.1.11.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
@@ -22,14 +22,16 @@
     test/samples/*.wbo
 cabal-version:       >=1.10
 tested-with:
-   GHC ==7.8.4
-   GHC ==7.10.3
    GHC ==8.0.2
    GHC ==8.2.2
    GHC ==8.4.4
    GHC ==8.6.5
    GHC ==8.8.4
-   GHC ==8.10.4
+   GHC ==8.10.7
+   GHC ==9.0.2
+   GHC ==9.2.8
+   GHC ==9.4.8
+   GHC ==9.6.4
 
 source-repository head
   type:     git
@@ -55,16 +57,16 @@
      FlexibleContexts
      OverloadedStrings
   build-depends:
-     base >=4.6.0.1 && <4.16,
+     base >=4.6.0.1 && <4.20,
      containers >=0.4.2.1,
      parsec >=3.1.2 && <4,
      megaparsec >=4 && <10,
-     bytestring >=0.9.2.1 && <0.12,
+     bytestring >=0.9.2.1 && <0.13,
      bytestring-builder,
      dlist >=0.7.0 && <1.1.0,
      attoparsec >=0.10.4.0,
      deepseq >=1.3.0.0,
-     hashable >=1.1.2.5 && <1.4.0.0,
+     hashable >=1.1.2.5 && <1.5.0.0,
      void
   hs-source-dirs:      src
   default-language:    Haskell2010
diff --git a/src/Data/PseudoBoolean/Attoparsec.hs b/src/Data/PseudoBoolean/Attoparsec.hs
--- a/src/Data/PseudoBoolean/Attoparsec.hs
+++ b/src/Data/PseudoBoolean/Attoparsec.hs
@@ -193,7 +193,7 @@
 oneOrMoreLiterals :: Parser [Lit]
 oneOrMoreLiterals = do
   l <- literal
-  mplus (try $ oneOrMoreSpace >> liftM (l:) (oneOrMoreLiterals)) (return [l])
+  mplus (try $ oneOrMoreSpace >> liftM (l:) oneOrMoreLiterals) (return [l])
 -- Note that we cannot use sepBy1.
 -- In "p `sepBy1` q", p should success whenever q success.
 -- But it's not the case here.
diff --git a/src/Data/PseudoBoolean/Megaparsec.hs b/src/Data/PseudoBoolean/Megaparsec.hs
--- a/src/Data/PseudoBoolean/Megaparsec.hs
+++ b/src/Data/PseudoBoolean/Megaparsec.hs
@@ -1,5 +1,6 @@
 {-# LANGUAGE BangPatterns, FlexibleContexts, TypeFamilies, CPP, ConstraintKinds #-}
 {-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE TypeOperators #-}
 {-# OPTIONS_GHC -Wall #-}
 -----------------------------------------------------------------------------
 -- |
@@ -252,7 +253,7 @@
 oneOrMoreLiterals :: C e s m => m [Lit]
 oneOrMoreLiterals = do
   l <- literal
-  mplus (try $ oneOrMoreSpace >> liftM (l:) (oneOrMoreLiterals)) (return [l])
+  mplus (try $ oneOrMoreSpace >> liftM (l:) oneOrMoreLiterals) (return [l])
 -- Note that we cannot use sepBy1.
 -- In "p `sepBy1` q", p should success whenever q success.
 -- But it's not the case here.
diff --git a/src/Data/PseudoBoolean/Parsec.hs b/src/Data/PseudoBoolean/Parsec.hs
--- a/src/Data/PseudoBoolean/Parsec.hs
+++ b/src/Data/PseudoBoolean/Parsec.hs
@@ -193,7 +193,7 @@
 oneOrMoreLiterals :: Stream s m Char => ParsecT s u m [Lit]
 oneOrMoreLiterals = do
   l <- literal
-  mplus (try $ oneOrMoreSpace >> liftM (l:) (oneOrMoreLiterals)) (return [l])
+  mplus (try $ oneOrMoreSpace >> liftM (l:) oneOrMoreLiterals) (return [l])
 -- Note that we cannot use sepBy1.
 -- In "p `sepBy1` q", p should success whenever q success.
 -- But it's not the case here.
diff --git a/test/samples/invalid-empty-term.opb b/test/samples/invalid-empty-term.opb
new file mode 100644
--- /dev/null
+++ b/test/samples/invalid-empty-term.opb
@@ -0,0 +1,6 @@
+* #variable= 1 #constraint= 1
+* This is invalid according to the grammer of http://www.cril.univ-artois.fr/PB11/format.pdf ,
+* but we relax the grammar to allow it.
+min: +2 x1 +1 ;
++2 >= +1;
+
