diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,15 @@
 # Revision history for asciidoc-hs
 
+## 0.1.0.2 -- 2026-03-17
+
+  * Allow fenced constructions to end with end-of-input (#9).
+
+  * Fix issue in parsing bracketed arguments (#8).
+
+  * Fix bug in table parsing with rowspans (#5).
+
+  * Improved parsing of line and block comments (#4).
+
 ## 0.1.0.1 -- 2026-02-01
 
   * Fix character escaping issue (#3). Unconstrained forms of
diff --git a/asciidoc.cabal b/asciidoc.cabal
--- a/asciidoc.cabal
+++ b/asciidoc.cabal
@@ -1,6 +1,6 @@
 cabal-version:      3.4
 name:               asciidoc
-version:            0.1.0.1
+version:            0.1.0.2
 synopsis:           AsciiDoc parser.
 description:        A parser for AsciiDoc syntax.
 license:            BSD-3-Clause
@@ -13,6 +13,7 @@
 extra-doc-files:    CHANGELOG.md
 extra-source-files: test/asciidoctor/**/*.test
                     test/regression/*.test
+                    test/regression/issue_9_include.adoc
                     test/feature/**/*.test
                     test/feature/include/**/*.adoc
 
diff --git a/src/AsciiDoc/Parse.hs b/src/AsciiDoc/Parse.hs
--- a/src/AsciiDoc/Parse.hs
+++ b/src/AsciiDoc/Parse.hs
@@ -12,7 +12,7 @@
 
 import Prelude hiding (takeWhile)
 import Text.HTML.TagSoup.Entity (lookupNamedEntity)
-import Data.Maybe (isNothing, listToMaybe, fromMaybe)
+import Data.Maybe (isNothing, listToMaybe, fromMaybe, catMaybes)
 import Data.Bifunctor (first)
 import Data.Either (lefts, rights)
 import qualified Data.Map as M
@@ -254,7 +254,7 @@
   bs <- (case M.lookup "hardbreaks-option" attr' of
             Just "" -> withHardBreaks
             _ -> id) $
-        withBlockContext (SectionContext (minSectionLevel - 1)) (many pBlock)
+        withBlockContext (SectionContext (minSectionLevel - 1)) pBlocks
   skipWhile isSpace
   endOfInput
   attr <- gets docAttrs
@@ -371,8 +371,8 @@
 skipBlankLines = do
   contexts <- asks blockContexts
   case contexts of
-    ListContext{} : _ -> void $ many $ vchar '+' *> pBlankLine
-    _ -> void $ many pBlankLine
+    ListContext{} : _ -> skipMany $ vchar '+' *> pBlankLine
+    _ -> skipMany pBlankLine
 
 pBlankLine :: P ()
 pBlankLine = takeWhile (\c -> c == ' ' || c == '\t') *> (pLineComment <|> endOfLine)
@@ -397,7 +397,7 @@
   skipBlankLines
   skipMany pDocAttribute
   skipBlankLines
-  pure bs
+  pure $ catMaybes bs
 
 parseAsciidoc :: Text -> P Document
 parseAsciidoc = parseWith pDocument . (<> "\n") . T.strip
@@ -415,14 +415,13 @@
 parseInlines :: Text -> P [Inline]
 parseInlines = parseWith pInlines . T.strip
 
-pBlock :: P Block
+pBlock :: P (Maybe Block)
 pBlock = do
   contexts <- asks blockContexts
   skipBlankLines
   skipMany pDocAttribute
   skipBlankLines
   (mbtitle, attr) <- pTitlesAndAttributes
-  skipMany (pCommentBlock attr)
   case contexts of
     ListContext{} : _ -> skipWhile (== ' ')
     _ -> pure ()
@@ -432,7 +431,8 @@
             | Just opts <- M.lookup "options" kvs
               -> "hardbreaks" `T.isInfixOf` opts
           _ -> False
-  (if hardbreaks then withHardBreaks else id) $
+  (Nothing <$ pCommentBlock attr) <|> fmap Just
+    ((if hardbreaks then withHardBreaks else id) $
         pBlockMacro mbtitle attr
     <|> pDiscreteHeading mbtitle attr
     <|> pExampleBlock mbtitle attr
@@ -454,7 +454,7 @@
             , pDefinitionList
             , pIndentedLiteral
             , pPara
-            ]
+            ])
 
 
 pIndentedLiteral :: P BlockType
@@ -556,7 +556,7 @@
       guard (lev > sectionLevel && lev >= 0 && lev <= 5)
       vchar ' '
       title <- pLine >>= parseInlines
-      contents <- withBlockContext (SectionContext lev) $ many pBlock
+      contents <- withBlockContext (SectionContext lev) pBlocks
       -- note: we use sectionLevel, not lev, so in improperly nested content, e.g.,
       -- == foo
       -- ==== bar
@@ -629,7 +629,7 @@
   let newContext = case contexts of
                       ListContext ':' n : _ -> ListContext ':' (n + 1)
                       _ -> ListContext ':' 1
-  defn <- withBlockContext newContext (many pBlock)
+  defn <- withBlockContext newContext pBlocks
   void $ many pBlankLine
   pure (term, defn)
 
@@ -700,14 +700,14 @@
 pListItem = do
   mbCheckboxState <- optional pCheckbox
   skipWhile (==' ')
-  bs <- many pBlock
+  bs <- pBlocks
   pure $ ListItem mbCheckboxState bs
 
 pDelimitedLiteralBlock :: Char -> Int -> P [T.Text]
 pDelimitedLiteralBlock c minimumNumber = do
   len <- length <$> some (vchar c) <* pBlankLine
   guard $ len >= minimumNumber
-  let endFence = count len (vchar c) *> pBlankLine
+  let endFence = count len (vchar c) *> (pBlankLine <|> endOfInput)
   manyTill pLine endFence
 
 pDelimitedBlock :: Char -> Int -> P [Block]
@@ -716,7 +716,7 @@
   guard $ len >= minimumNumber
   let endFence = count len (vchar c) *> pBlankLine
   withBlockContext (DelimitedContext c len) $
-    manyTill pBlock endFence
+    catMaybes <$> manyTill pBlock endFence
 
 pPassBlock :: Maybe BlockTitle -> Attr -> P Block
 pPassBlock mbtitle attr = do
@@ -905,6 +905,7 @@
 
 pNormalLine :: P Text
 pNormalLine = do
+  notFollowedBy (string "////" *> pBlankLine) -- block comment
   t <- pLine
   fp <- asks filePath
   guard $ not $ T.all (\c -> c == ' ' || c == '\t') t
@@ -970,16 +971,16 @@
             -- if there are rowspans from rows above, we need to skip some:
             let mbspecs' = case mbspecs of
                              Nothing -> Nothing
-                             Just specs' -> Just [s | (s,0) <- zip specs' rowspans]
+                             Just specs' -> Just [s | (s,n) <- zip specs' rowspans, n <= 0]
             row@(TableRow cells) <- pTableRow tableOpts mbspecs'
             let numcols = sum (map cellColspan cells)
             let specs = fromMaybe (replicate numcols defaultColumnSpec) mbspecs
             -- now, update rowspans in light of new row
             let updateRowspans [] rs = rs
                 updateRowspans (c:cs) rs =
-                  map (+ (cellRowspan c - 1)) (take (cellColspan c) rs)
+                  map (+ (cellRowspan c)) (take (cellColspan c) rs)
                   ++ updateRowspans cs (drop (cellColspan c) rs)
-            let rowspans' = updateRowspans cells rowspans
+            let rowspans' = updateRowspans cells (map (\x -> x - 1) rowspans)
             (\(rows, colspecs') -> (row:rows, case rows of
                                                  [] -> specs
                                                  _ -> colspecs'))
@@ -1289,17 +1290,18 @@
      pure $ T.pack result
 
 pInlines' :: [Char] -> P [Inline]
-pInlines' cs =
-  (do il' <- pInline cs
-      let il = case il' of
-                 Inline (Attr ps kvs) (Span ils)
-                   | Nothing <- M.lookup "role" kvs
-                   -> Inline (Attr ps kvs) (Highlight ils)
-                 _ -> il'
-      addStr . (il:) <$> pInlines' [])
-  <|> (do c <- anyChar
-          pInlines' (c:cs))
-  <|> (addStr [] <$ endOfInput)
+pInlines' cs = do
+  (pLineComment *> pInlines' cs)
+    <|> (do il' <- pInline cs
+            let il = case il' of
+                       Inline (Attr ps kvs) (Span ils)
+                         | Nothing <- M.lookup "role" kvs
+                         -> Inline (Attr ps kvs) (Highlight ils)
+                       _ -> il'
+            addStr . (il:) <$> pInlines' [])
+    <|> (do c <- anyChar
+            pInlines' (c:cs))
+    <|> (addStr [] <$ endOfInput)
  where
   addStr = case cs of
               [] -> id
@@ -1348,7 +1350,6 @@
                               (d:_) -> isSpace d || isPunctuation d || d == '+'
                               [] -> True
   let inMatched = pInMatched maybeUnconstrained
-  skipMany pLineComment
   (do attr <- pFormattedTextAttributes <|> pure mempty
       c <- peekChar'
       case c of
@@ -1391,7 +1392,7 @@
     <$> (string "+++" *> manyTill anyChar (string "+++"))
 
 pLineComment :: P ()
-pLineComment = string "//" *> skipWhile (== ' ') *> void pLine
+pLineComment = string "//" *> satisfy (\c -> c == ' ' || c == '\t') *> void pLine
 
 pCrossReference :: P Inline
 pCrossReference = do
@@ -1600,7 +1601,7 @@
          (T.pack <$> some ((vchar '\\' *> char ']') <|>
                            (vchar '+' *> vchar '+' *> char ']'
                              <* vchar '+' <* vchar '+') <|>
-                 satisfy (\c -> c /= ']' && not (isEndOfLine c)) <|>
+                 satisfy (\c -> c /= ']' && c /= '[' && not (isEndOfLine c)) <|>
                  (' ' <$ (vchar '\\' <* endOfLine)))
           <|> ((\x -> "[" <> x <> "]") <$> pBracketedText)))
     <* vchar ']'
diff --git a/test/regression/issue_4a.test b/test/regression/issue_4a.test
new file mode 100644
--- /dev/null
+++ b/test/regression/issue_4a.test
@@ -0,0 +1,23 @@
+<<<
+Asciidoc text followed by a line comment.
+// LINE COMMENT
+>>>
+Document
+  { docMeta =
+      Meta
+        { docTitle = []
+        , docTitleAttributes = Nothing
+        , docAuthors = []
+        , docRevision = Nothing
+        , docAttributes = fromList [ ( "sectids" , "" ) ]
+        }
+  , docBlocks =
+      [ Block mempty Nothing PageBreak
+      , Block
+          mempty
+          Nothing
+          (Paragraph
+             [ Inline mempty (Str "Asciidoc text followed by a line comment.\n")
+             ])
+      ]
+  }
diff --git a/test/regression/issue_4b.test b/test/regression/issue_4b.test
new file mode 100644
--- /dev/null
+++ b/test/regression/issue_4b.test
@@ -0,0 +1,26 @@
+<<<
+Asciidoc text followed by a blank line and a line comment.
+
+// LINE COMMENT
+>>>
+Document
+  { docMeta =
+      Meta
+        { docTitle = []
+        , docTitleAttributes = Nothing
+        , docAuthors = []
+        , docRevision = Nothing
+        , docAttributes = fromList [ ( "sectids" , "" ) ]
+        }
+  , docBlocks =
+      [ Block mempty Nothing PageBreak
+      , Block
+          mempty
+          Nothing
+          (Paragraph
+             [ Inline
+                 mempty
+                 (Str "Asciidoc text followed by a blank line and a line comment.")
+             ])
+      ]
+  }
diff --git a/test/regression/issue_4c.test b/test/regression/issue_4c.test
new file mode 100644
--- /dev/null
+++ b/test/regression/issue_4c.test
@@ -0,0 +1,26 @@
+<<<
+Asciidoc text followed by a line comment
+// LINE COMMENT
+followed by text.
+>>>
+Document
+  { docMeta =
+      Meta
+        { docTitle = []
+        , docTitleAttributes = Nothing
+        , docAuthors = []
+        , docRevision = Nothing
+        , docAttributes = fromList [ ( "sectids" , "" ) ]
+        }
+  , docBlocks =
+      [ Block mempty Nothing PageBreak
+      , Block
+          mempty
+          Nothing
+          (Paragraph
+             [ Inline
+                 mempty
+                 (Str "Asciidoc text followed by a line comment\nfollowed by text.")
+             ])
+      ]
+  }
diff --git a/test/regression/issue_4d.test b/test/regression/issue_4d.test
new file mode 100644
--- /dev/null
+++ b/test/regression/issue_4d.test
@@ -0,0 +1,29 @@
+<<<
+Asciidoc text followed by a line comment.
+// LINE COMMENT
+
+Followed by a new paragraph.
+>>>
+Document
+  { docMeta =
+      Meta
+        { docTitle = []
+        , docTitleAttributes = Nothing
+        , docAuthors = []
+        , docRevision = Nothing
+        , docAttributes = fromList [ ( "sectids" , "" ) ]
+        }
+  , docBlocks =
+      [ Block mempty Nothing PageBreak
+      , Block
+          mempty
+          Nothing
+          (Paragraph
+             [ Inline mempty (Str "Asciidoc text followed by a line comment.\n")
+             ])
+      , Block
+          mempty
+          Nothing
+          (Paragraph [ Inline mempty (Str "Followed by a new paragraph.") ])
+      ]
+  }
diff --git a/test/regression/issue_4e.test b/test/regression/issue_4e.test
new file mode 100644
--- /dev/null
+++ b/test/regression/issue_4e.test
@@ -0,0 +1,30 @@
+<<<
+Asciidoc text followed by a line comment.
+
+// LINE COMMENT
+
+Followed by a new paragraph.
+>>>
+Document
+  { docMeta =
+      Meta
+        { docTitle = []
+        , docTitleAttributes = Nothing
+        , docAuthors = []
+        , docRevision = Nothing
+        , docAttributes = fromList [ ( "sectids" , "" ) ]
+        }
+  , docBlocks =
+      [ Block mempty Nothing PageBreak
+      , Block
+          mempty
+          Nothing
+          (Paragraph
+             [ Inline mempty (Str "Asciidoc text followed by a line comment.")
+             ])
+      , Block
+          mempty
+          Nothing
+          (Paragraph [ Inline mempty (Str "Followed by a new paragraph.") ])
+      ]
+  }
diff --git a/test/regression/issue_4f.test b/test/regression/issue_4f.test
new file mode 100644
--- /dev/null
+++ b/test/regression/issue_4f.test
@@ -0,0 +1,30 @@
+<<<
+Asciidoc text followed by a block comment
+////
+BLOCK COMMENT
+////
+followed by text.
+>>>
+Document
+  { docMeta =
+      Meta
+        { docTitle = []
+        , docTitleAttributes = Nothing
+        , docAuthors = []
+        , docRevision = Nothing
+        , docAttributes = fromList [ ( "sectids" , "" ) ]
+        }
+  , docBlocks =
+      [ Block mempty Nothing PageBreak
+      , Block
+          mempty
+          Nothing
+          (Paragraph
+             [ Inline mempty (Str "Asciidoc text followed by a block comment")
+             ])
+      , Block
+          mempty
+          Nothing
+          (Paragraph [ Inline mempty (Str "followed by text.") ])
+      ]
+  }
diff --git a/test/regression/issue_4g.test b/test/regression/issue_4g.test
new file mode 100644
--- /dev/null
+++ b/test/regression/issue_4g.test
@@ -0,0 +1,32 @@
+<<<
+Asciidoc text followed by a block comment.
+
+////
+BLOCK COMMENT
+////
+
+Followed by a new paragraph.
+>>>
+Document
+  { docMeta =
+      Meta
+        { docTitle = []
+        , docTitleAttributes = Nothing
+        , docAuthors = []
+        , docRevision = Nothing
+        , docAttributes = fromList [ ( "sectids" , "" ) ]
+        }
+  , docBlocks =
+      [ Block mempty Nothing PageBreak
+      , Block
+          mempty
+          Nothing
+          (Paragraph
+             [ Inline mempty (Str "Asciidoc text followed by a block comment.")
+             ])
+      , Block
+          mempty
+          Nothing
+          (Paragraph [ Inline mempty (Str "Followed by a new paragraph.") ])
+      ]
+  }
diff --git a/test/regression/issue_4h.test b/test/regression/issue_4h.test
new file mode 100644
--- /dev/null
+++ b/test/regression/issue_4h.test
@@ -0,0 +1,36 @@
+<<<
+Asciidoc text followed by a multi-line block comment.
+
+////
+BLOCK COMMENT LINE 1
+LINE 2
+LINE 3
+////
+
+Followed by a new paragraph.
+>>>
+Document
+  { docMeta =
+      Meta
+        { docTitle = []
+        , docTitleAttributes = Nothing
+        , docAuthors = []
+        , docRevision = Nothing
+        , docAttributes = fromList [ ( "sectids" , "" ) ]
+        }
+  , docBlocks =
+      [ Block mempty Nothing PageBreak
+      , Block
+          mempty
+          Nothing
+          (Paragraph
+             [ Inline
+                 mempty
+                 (Str "Asciidoc text followed by a multi-line block comment.")
+             ])
+      , Block
+          mempty
+          Nothing
+          (Paragraph [ Inline mempty (Str "Followed by a new paragraph.") ])
+      ]
+  }
diff --git a/test/regression/issue_5.test b/test/regression/issue_5.test
new file mode 100644
--- /dev/null
+++ b/test/regression/issue_5.test
@@ -0,0 +1,116 @@
+<<<
+|===
+|col1|col2
+|11 .2+|12|13
+|21 .2+|22|23
+|===
+>>>
+Document
+  { docMeta =
+      Meta
+        { docTitle = []
+        , docTitleAttributes = Nothing
+        , docAuthors = []
+        , docRevision = Nothing
+        , docAttributes = fromList [ ( "sectids" , "" ) ]
+        }
+  , docBlocks =
+      [ Block mempty Nothing PageBreak
+      , Block
+          mempty
+          Nothing
+          (Table
+             [ ColumnSpec
+                 { colHorizAlign = Nothing
+                 , colVertAlign = Nothing
+                 , colWidth = Nothing
+                 , colStyle = Nothing
+                 }
+             , ColumnSpec
+                 { colHorizAlign = Nothing
+                 , colVertAlign = Nothing
+                 , colWidth = Nothing
+                 , colStyle = Nothing
+                 }
+             ]
+             (Just
+                [ TableRow
+                    [ TableCell
+                        { cellContent =
+                            [ Block mempty Nothing (Paragraph [ Inline mempty (Str "col1") ]) ]
+                        , cellHorizAlign = Nothing
+                        , cellVertAlign = Nothing
+                        , cellColspan = 1
+                        , cellRowspan = 1
+                        }
+                    , TableCell
+                        { cellContent =
+                            [ Block mempty Nothing (Paragraph [ Inline mempty (Str "col2") ]) ]
+                        , cellHorizAlign = Nothing
+                        , cellVertAlign = Nothing
+                        , cellColspan = 1
+                        , cellRowspan = 1
+                        }
+                    ]
+                ])
+             [ TableRow
+                 [ TableCell
+                     { cellContent =
+                         [ Block mempty Nothing (Paragraph [ Inline mempty (Str "11") ]) ]
+                     , cellHorizAlign = Nothing
+                     , cellVertAlign = Nothing
+                     , cellColspan = 1
+                     , cellRowspan = 1
+                     }
+                 , TableCell
+                     { cellContent =
+                         [ Block mempty Nothing (Paragraph [ Inline mempty (Str "12") ]) ]
+                     , cellHorizAlign = Nothing
+                     , cellVertAlign = Nothing
+                     , cellColspan = 1
+                     , cellRowspan = 2
+                     }
+                 ]
+             , TableRow
+                 [ TableCell
+                     { cellContent =
+                         [ Block mempty Nothing (Paragraph [ Inline mempty (Str "13") ]) ]
+                     , cellHorizAlign = Nothing
+                     , cellVertAlign = Nothing
+                     , cellColspan = 1
+                     , cellRowspan = 1
+                     }
+                 ]
+             , TableRow
+                 [ TableCell
+                     { cellContent =
+                         [ Block mempty Nothing (Paragraph [ Inline mempty (Str "21") ]) ]
+                     , cellHorizAlign = Nothing
+                     , cellVertAlign = Nothing
+                     , cellColspan = 1
+                     , cellRowspan = 1
+                     }
+                 , TableCell
+                     { cellContent =
+                         [ Block mempty Nothing (Paragraph [ Inline mempty (Str "22") ]) ]
+                     , cellHorizAlign = Nothing
+                     , cellVertAlign = Nothing
+                     , cellColspan = 1
+                     , cellRowspan = 2
+                     }
+                 ]
+             ]
+             (Just
+                [ TableRow
+                    [ TableCell
+                        { cellContent =
+                            [ Block mempty Nothing (Paragraph [ Inline mempty (Str "23") ]) ]
+                        , cellHorizAlign = Nothing
+                        , cellVertAlign = Nothing
+                        , cellColspan = 1
+                        , cellRowspan = 1
+                        }
+                    ]
+                ]))
+      ]
+  }
diff --git a/test/regression/issue_8.test b/test/regression/issue_8.test
new file mode 100644
--- /dev/null
+++ b/test/regression/issue_8.test
@@ -0,0 +1,40 @@
+A sentence.footnote:[See https://pandoc.org/MANUAL.html[manual] and other https://pandoc.org/demos.html[demos].]
+>>>
+Document
+  { docMeta =
+      Meta
+        { docTitle = []
+        , docTitleAttributes = Nothing
+        , docAuthors = []
+        , docRevision = Nothing
+        , docAttributes = fromList [ ( "sectids" , "" ) ]
+        }
+  , docBlocks =
+      [ Block
+          mempty
+          Nothing
+          (Paragraph
+             [ Inline mempty (Str "A sentence.")
+             , Inline
+                 mempty
+                 (Footnote
+                    Nothing
+                    [ Inline mempty (Str "See ")
+                    , Inline
+                        mempty
+                        (Link
+                           URLLink
+                           (Target "https://pandoc.org/MANUAL.html")
+                           [ Inline mempty (Str "manual") ])
+                    , Inline mempty (Str " and other ")
+                    , Inline
+                        mempty
+                        (Link
+                           URLLink
+                           (Target "https://pandoc.org/demos.html")
+                           [ Inline mempty (Str "demos") ])
+                    , Inline mempty (Str ".")
+                    ])
+             ])
+      ]
+  }
diff --git a/test/regression/issue_9.test b/test/regression/issue_9.test
new file mode 100644
--- /dev/null
+++ b/test/regression/issue_9.test
@@ -0,0 +1,27 @@
+include::issue_9_include.adoc[]
+>>>
+Document
+  { docMeta =
+      Meta
+        { docTitle = []
+        , docTitleAttributes = Nothing
+        , docAuthors = []
+        , docRevision = Nothing
+        , docAttributes = fromList [ ( "sectids" , "" ) ]
+        }
+  , docBlocks =
+      [ Block
+          mempty
+          Nothing
+          (Include
+             "test/regression/issue_9_include.adoc"
+             (Just
+                [ Block
+                    Attr
+                    ( [ "source" , "cpp" ] , fromList [] )
+                    Nothing
+                    (LiteralBlock
+                       "#include \"MyFile.h\"\n\nMyClass::MyClass(LibParent *parent,\n    LibCollectionPtr inputCollection)\n    : LibClass(parent) {\n    \n    myMemberFn(inputCollection, this->getLibItem());\n    \n}\n")
+                ]))
+      ]
+  }
diff --git a/test/regression/issue_9_include.adoc b/test/regression/issue_9_include.adoc
new file mode 100644
--- /dev/null
+++ b/test/regression/issue_9_include.adoc
@@ -0,0 +1,12 @@
+[source, cpp]
+....
+#include "MyFile.h"
+
+MyClass::MyClass(LibParent *parent,
+    LibCollectionPtr inputCollection)
+    : LibClass(parent) {
+    
+    myMemberFn(inputCollection, this->getLibItem());
+    
+}
+....
