diff --git a/Language/Symantic/Grammar/ContextFree.hs b/Language/Symantic/Grammar/ContextFree.hs
--- a/Language/Symantic/Grammar/ContextFree.hs
+++ b/Language/Symantic/Grammar/ContextFree.hs
@@ -6,6 +6,7 @@
 import Data.Semigroup (Semigroup(..))
 import Data.String (IsString(..))
 import Prelude hiding (any)
+import qualified Data.List as L
 
 import Language.Symantic.Grammar.Meta
 import Language.Symantic.Grammar.Fixity
@@ -77,12 +78,18 @@
 	option x g = g <+> pure x
 	optional :: g a -> g (Maybe a)
 	optional v = Just <$> v <+> pure Nothing
+	manyFoldL :: b -> (a -> b -> b) -> g a -> g b
+	manyFoldL e f a = someFoldL e f a <+> pure e
+	someFoldL :: b -> (a -> b -> b) -> g a -> g b
+	someFoldL e f a = f <$> a <*> manyFoldL e f a
 	many :: g a -> g [a]
-	many a = some a <+> pure []
+	many = fmap L.reverse . manyFoldL [] (:)
 	some :: g a -> g [a]
-	some a = (:) <$> a <*> many a
-	skipMany :: g a -> g ()
-	skipMany = void . many
+	some = fmap L.reverse . someFoldL [] (:)
+	manySkip :: g a -> g ()
+	manySkip = void . many
+	someSkip :: g a -> g ()
+	someSkip = void . some
 	--manyTill :: g a -> g end -> g [a]
 	--manyTill g end = go where go = ([] <$ end) <|> ((:) <$> g <*> go)
 	inside
@@ -96,8 +103,8 @@
 		(f <$ begin <*> in_ <* end) <+> next
 deriving instance Gram_AltApp RuleEBNF
 instance Gram_AltApp EBNF where
-	many (EBNF g) = EBNF $ \rm _po -> "{" <> g rm (op, SideL) <> "}"  where op = infixN0
-	some (EBNF g) = EBNF $ \rm _po -> "{" <> g rm (op, SideL) <> "}-" where op = infixN0
+	manyFoldL _ _ (EBNF g) = EBNF $ \rm _po -> "{" <> g rm (op, SideL) <> "}"  where op = infixN0
+	someFoldL _ _ (EBNF g) = EBNF $ \rm _po -> "{" <> g rm (op, SideL) <> "}-" where op = infixN0
 	option _x (EBNF g) = EBNF $ \rm _po ->
 		"[" <> g rm (op, SideL) <> "]" where op = infixN0
 
@@ -113,7 +120,7 @@
  ) => Gram_Comment g where
 	commentable :: g () -> g () -> g () -> g ()
 	commentable = rule3 "commentable" $ \space line block ->
-		skipMany $ choice [space, line, block]
+		manySkip $ choice [space, line, block]
 	comment_line :: CF g String -> CF g String
 	comment_line prefix = rule "comment_line" $
 		prefix *> many (any `minus` (void (char '\n') <+> eoi))
diff --git a/symantic-grammar.cabal b/symantic-grammar.cabal
--- a/symantic-grammar.cabal
+++ b/symantic-grammar.cabal
@@ -22,7 +22,7 @@
 -- PVP:  +-+------- breaking API changes
 --       | | +----- non-breaking API additions
 --       | | | +--- code changes with no API change
-version: 0.1.0.20170703
+version: 0.2.0.20170709
 
 Source-Repository head
   location: git://git.autogeree.net/symantic
