runtime(java): Recognise the CommonMark form (///) of Javadoc comments

Complement "g:java_ignore_javadoc" with "g:java_ignore_html"
and "g:java_ignore_markdown" to allow selectively disabling
the recognition of HTML and CommonMark respectively.

(Note that this is not a preview feature.)

======================== LIMITATION ========================

According to the syntactical details of JEP 467:

> Any leading whitespace and the three initial / characters
> are removed from each line.
>
> The lines are shifted left, by removing leading whitespace
> characters, until the non-blank line with the least
> leading whitespace has no remaining leading whitespace.
>
> Additional leading whitespace and any trailing whitespace
> in each line is preserved, because it may be significant.

the following example:
------------------------------------------------------------
///    A summary sentence.
///     A list:
///      - Item A.
///     - Item B.
///
///     Some code span, starting here `
///      1 + 2 ` and ending at the previous \`.
------------------------------------------------------------

should be interpreted as if it were written thus:
------------------------------------------------------------
///A summary sentence.
/// A list:
///  - Item A.
/// - Item B.
///
/// Some code span, starting here `
///  1 + 2 ` and ending at the previous \`.
------------------------------------------------------------

Since automatic line rewriting will not be pursued, parts of
such comments having significant whitespace may be ‘wrongly’
highlighted.  For convenience, a &fex function is defined to
‘correct’ it: g:javaformat#RemoveCommonMarkdownWhitespace()
(:help ft-java-plugin).

References:
https://openjdk.org/jeps/467
https://spec.commonmark.org/0.31.2

closes: #15740

Co-authored-by: Tim Pope <code@tpope.net>
Signed-off-by: Aliaksei Budavei <0x000c70@gmail.com>
Signed-off-by: Christian Brabandt <cb@256bit.org>
diff --git a/runtime/autoload/javaformat.vim b/runtime/autoload/javaformat.vim
new file mode 100644
index 0000000..4d7d32c
--- /dev/null
+++ b/runtime/autoload/javaformat.vim
@@ -0,0 +1,92 @@
+" Vim formatting plugin file
+" Language:		Java
+" Maintainer:		Aliaksei Budavei <0x000c70 AT gmail DOT com>
+" Repository:		https://github.com/zzzyxwvut/java-vim.git
+" Last Change:		2024 Sep 26
+
+" Documented in ":help ft-java-plugin".
+if &cp || exists("g:loaded_javaformat") || exists("g:java_ignore_javadoc") || exists("g:java_ignore_markdown")
+    finish
+endif
+
+let g:loaded_javaformat = 1
+
+"""" STRIVE TO REMAIN COMPATIBLE FOR AT LEAST VIM 7.0.
+
+function! javaformat#RemoveCommonMarkdownWhitespace() abort
+    if mode() != 'n'
+	return 0
+    endif
+
+    let pattern = '\(^\s*///\)\(\s*\)\(.*\)'
+
+    " E121 for v:numbermax before v8.2.2388.
+    " E15 for expr-<< before v8.2.5003.
+    let common = 0x7fffffff
+    let comments = []
+
+    for n in range(v:lnum, (v:lnum + v:count - 1))
+	let parts = matchlist(getline(n), pattern)
+	let whitespace = get(parts, 2, '')
+	let nonwhitespace = get(parts, 3, '')
+
+	if !empty(whitespace)
+	    let common = min([common, strlen(whitespace)])
+	elseif !empty(nonwhitespace) || empty(parts)
+	    " No whitespace prefix or not a Markdown comment.
+	    return 0
+	endif
+
+	call add(comments, [whitespace, parts[1], nonwhitespace])
+    endfor
+
+    let cursor = v:lnum
+
+    for line in comments
+	call setline(cursor, join(line[1 :], strpart(line[0], common)))
+	let cursor += 1
+    endfor
+
+    return 0
+endfunction
+
+" See ":help vim9-mix".
+if !has("vim9script")
+    finish
+endif
+
+def! g:javaformat#RemoveCommonMarkdownWhitespace(): number
+    if mode() != 'n'
+	return 0
+    endif
+
+    const pattern: string = '\(^\s*///\)\(\s*\)\(.*\)'
+    var common: number = v:numbermax
+    var comments: list<list<string>> = []
+
+    for n in range(v:lnum, (v:lnum + v:count - 1))
+	const parts: list<string> = matchlist(getline(n), pattern)
+	const whitespace: string = get(parts, 2, '')
+	const nonwhitespace: string = get(parts, 3, '')
+
+	if !empty(whitespace)
+	    common = min([common, strlen(whitespace)])
+	elseif !empty(nonwhitespace) || empty(parts)
+	    # No whitespace prefix or not a Markdown comment.
+	    return 0
+	endif
+
+	add(comments, [whitespace, parts[1], nonwhitespace])
+    endfor
+
+    var cursor: number = v:lnum
+
+    for line in comments
+	setline(cursor, join(line[1 :], strpart(line[0], common)))
+	cursor += 1
+    endfor
+
+    return 0
+enddef
+
+" vim: fdm=syntax sw=4 ts=8 noet sta
diff --git a/runtime/doc/filetype.txt b/runtime/doc/filetype.txt
index a7ed928..0dfdff8 100644
--- a/runtime/doc/filetype.txt
+++ b/runtime/doc/filetype.txt
@@ -1,4 +1,4 @@
-*filetype.txt*	For Vim version 9.1.  Last change: 2024 Aug 21
+*filetype.txt*	For Vim version 9.1.  Last change: 2024 Sep 29
 
 
 		  VIM REFERENCE MANUAL    by Bram Moolenaar
@@ -698,6 +698,28 @@
 file loaded in it each time after assigning a new value to the variable: >
 	doautocmd FileType
 <
+Markdown documentation comments may contain common runs of vertical leading
+whitespace following the comment marks (`///`) for aesthetic reasons; however,
+some horizontal runs of leading whitespace are significant in Markdown because
+they denote code blocks etc.  For convenience, a 'formatexpr' function is
+provided for the |gq| operator.  As long as neither "g:java_ignore_javadoc"
+nor "g:java_ignore_markdown" is defined, the reformatting of Markdown comments
+can be enabled on demand with: >
+	setlocal formatexpr=g:javaformat#RemoveCommonMarkdownWhitespace()
+<
+Or for Vim versions less than `7.4.265`, with: >
+	setlocal formatexpr=javaformat#RemoveCommonMarkdownWhitespace()
+<
+This function accepts a range of lines, removes a common run of vertical
+leading whitespace, and rewrites the lines of the range.  Depending on the
+author's layout style and the comment contents, which lines to select for
+reformatting can vary from the whole comment to only some portion of it.
+
+To enable the recognition of Markdown comments each time after removing
+"g:java_ignore_markdown" or "g:java_ignore_javadoc", remember to manually
+re-source "javaformat.vim" for Vim versions greater than `8.2.1397`: >
+	runtime autoload/javaformat.vim
+<
 
 JSON-FORMAT						*ft-json-plugin*
 
diff --git a/runtime/doc/syntax.txt b/runtime/doc/syntax.txt
index 4a5b07c..ff80936 100644
--- a/runtime/doc/syntax.txt
+++ b/runtime/doc/syntax.txt
@@ -1,4 +1,4 @@
-*syntax.txt*	For Vim version 9.1.  Last change: 2024 Sep 19
+*syntax.txt*	For Vim version 9.1.  Last change: 2024 Sep 28
 
 
 		  VIM REFERENCE MANUAL	  by Bram Moolenaar
@@ -2106,7 +2106,8 @@
 Javadoc is a program that takes special comments out of Java program files and
 creates HTML pages.  The standard configuration will highlight this HTML code
 similarly to HTML files (see |html.vim|).  You can even add JavaScript and CSS
-inside this code (see below).  The HTML rendering diverges as follows:
+inside this code (see below).  The HTML rendering and the Markdown rendering
+diverge as follows:
   1. The first sentence (all characters up to the first period `.`, which is
      followed by a whitespace character or a line terminator, or up to the
      first block tag, e.g. `@param`, `@return`) is colored as
@@ -2119,8 +2120,14 @@
 	*Special	special symbols
      and some of their arguments are colored as
 	*Function	function names.
-To turn this feature off, add the following line to your startup file: >
+To turn this feature off for both HTML and Markdown, add the following line to
+your startup file: >
 	:let g:java_ignore_javadoc = 1
+Alternatively, only suppress HTML comments or Markdown comments: >
+	:let g:java_ignore_html = 1
+	:let g:java_ignore_markdown = 1
+
+See |ft-java-plugin| for additional support available for Markdown comments.
 
 If you use the special Javadoc comment highlighting described above, you can
 also turn on special highlighting for JavaScript, Visual Basic scripts, and
diff --git a/runtime/ftplugin/java.vim b/runtime/ftplugin/java.vim
index eee7ef0..55b3583 100644
--- a/runtime/ftplugin/java.vim
+++ b/runtime/ftplugin/java.vim
@@ -3,18 +3,29 @@
 " Maintainer:		Aliaksei Budavei <0x000c70 AT gmail DOT com>
 " Former Maintainer:	Dan Sharp
 " Repository:		https://github.com/zzzyxwvut/java-vim.git
-" Last Change:		2024 Apr 18
+" Last Change:		2024 Sep 26
 "			2024 Jan 14 by Vim Project (browsefilter)
 "			2024 May 23 by Riley Bruins <ribru17@gmail.com> ('commentstring')
 
-if exists("b:did_ftplugin") | finish | endif
-let b:did_ftplugin = 1
-
 " Make sure the continuation lines below do not cause problems in
 " compatibility mode.
 let s:save_cpo = &cpo
 set cpo-=C
 
+if (exists("g:java_ignore_javadoc") || exists("g:java_ignore_markdown")) &&
+	\ exists("*javaformat#RemoveCommonMarkdownWhitespace")
+    delfunction javaformat#RemoveCommonMarkdownWhitespace
+    unlet! g:loaded_javaformat
+endif
+
+if exists("b:did_ftplugin")
+    let &cpo = s:save_cpo
+    unlet s:save_cpo
+    finish
+endif
+
+let b:did_ftplugin = 1
+
 " For filename completion, prefer the .java extension over the .class
 " extension.
 set suffixes+=.class
@@ -27,6 +38,8 @@
 " Clean up in case this file is sourced again.
 unlet! s:zip_func_upgradable
 
+"""" STRIVE TO REMAIN COMPATIBLE FOR AT LEAST VIM 7.0.
+
 " Documented in ":help ft-java-plugin".
 if exists("g:ftplugin_java_source_path") &&
 		\ type(g:ftplugin_java_source_path) == type("")
@@ -59,8 +72,9 @@
 " and insert the comment leader when hitting <CR> or using "o".
 setlocal formatoptions-=t formatoptions+=croql
 
-" Set 'comments' to format dashed lists in comments. Behaves just like C.
-setlocal comments& comments^=sO:*\ -,mO:*\ \ ,exO:*/
+" Set 'comments' to format Markdown Javadoc comments and dashed lists
+" in other multi-line comments (it behaves just like C).
+setlocal comments& comments^=:///,sO:*\ -,mO:*\ \ ,exO:*/
 
 setlocal commentstring=//\ %s
 
@@ -103,3 +117,4 @@
 " Restore the saved compatibility options.
 let &cpo = s:save_cpo
 unlet s:save_cpo
+" vim: fdm=syntax sw=4 ts=8 noet sta
diff --git a/runtime/syntax/java.vim b/runtime/syntax/java.vim
index 800faa4..737219a 100644
--- a/runtime/syntax/java.vim
+++ b/runtime/syntax/java.vim
@@ -3,7 +3,7 @@
 " Maintainer:		Aliaksei Budavei <0x000c70 AT gmail DOT com>
 " Former Maintainer:	Claudio Fleiner <claudio@fleiner.com>
 " Repository:		https://github.com/zzzyxwvut/java-vim.git
-" Last Change:		2024 Sep 19
+" Last Change:		2024 Sep 28
 
 " Please check :help java.vim for comments on some of the options available.
 
@@ -156,6 +156,10 @@
   let [s:ff.PeekTo, s:ff.PeekFrom, s:ff.GroupArgs] = repeat([s:ff.RightConstant], 3)
 endif
 
+let s:with_html = !exists("g:java_ignore_html")
+let s:with_markdown = !exists("g:java_ignore_markdown")
+lockvar s:with_html s:with_markdown
+
 " Java module declarations (JLS-17, §7.7).
 "
 " Note that a "module-info" file will be recognised with an arbitrary
@@ -172,7 +176,7 @@
   hi def link javaModuleStmt		Statement
   hi def link javaModuleExternal	Include
 
-  if !exists("g:java_ignore_javadoc") && g:main_syntax != 'jsp'
+  if !exists("g:java_ignore_javadoc") && (s:with_html || s:with_markdown) && g:main_syntax != 'jsp'
     syn match javaDocProvidesTag	contained "@provides\_s\+\S\+" contains=javaDocParam
     syn match javaDocUsesTag		contained "@uses\_s\+\S\+" contains=javaDocParam
     hi def link javaDocProvidesTag	Special
@@ -335,18 +339,52 @@
 exec 'syn region javaCommentMarkupTagAttr contained transparent matchgroup=javaHtmlArg start=/\<\%(re\%(gex\|gion\|placement\)\|substring\|t\%(arget\|ype\)\)\%(\s*=\)\@=/ matchgroup=javaHtmlString end=/\%(=\s*\)\@' . s:ff.Peek('80', '') . '<=\%("[^"]\+"\|' . "\x27[^\x27]\\+\x27" . '\|\%([.-]\|\k\)\+\)/ nextgroup=javaCommentMarkupTagAttr,javaSpaceError skipwhite oneline'
 syn match   javaCommentError contained "/\*"me=e-1 display
 
-if !exists("g:java_ignore_javadoc") && g:main_syntax != 'jsp'
-  " The overridable "html*" default links must be defined _before_ the
-  " inclusion of the same default links from "html.vim".
-  hi def link htmlComment	Special
-  hi def link htmlCommentPart	Special
-  hi def link htmlArg		Type
-  hi def link htmlString	String
+if !exists("g:java_ignore_javadoc") && (s:with_html || s:with_markdown) && g:main_syntax != 'jsp'
+  " The overridable "html*" and "markdown*" default links must be
+  " defined _before_ the inclusion of the same default links from
+  " "html.vim" and "markdown.vim".
+  if s:with_html || s:with_markdown
+    hi def link htmlComment		Special
+    hi def link htmlCommentPart		Special
+    hi def link htmlArg			Type
+    hi def link htmlString		String
+  endif
+
+  if s:with_markdown
+    hi def link markdownCode		Special
+    hi def link markdownCodeBlock	Special
+    hi def link markdownCodeDelimiter	Special
+    hi def link markdownLinkDelimiter	Comment
+  endif
+
   syntax case ignore
 
+  " Note that javaDocSeeTag is valid in HTML and Markdown.
+  let s:ff.WithMarkdown = s:ff.RightConstant
+
   " Include HTML syntax coloring for Javadoc comments.
-  syntax include @javaHtml syntax/html.vim
-  unlet b:current_syntax
+  if s:with_html
+    syntax include @javaHtml syntax/html.vim
+    unlet b:current_syntax
+  endif
+
+  " Include Markdown syntax coloring (v7.2.437) for Javadoc comments.
+  if s:with_markdown
+    try
+      syntax include @javaMarkdown syntax/markdown.vim
+      unlet b:current_syntax
+      let s:ff.WithMarkdown = s:ff.LeftConstant
+    catch /\<E48[45]:/
+      call s:ReportOnce(v:exception)
+      unlockvar s:with_markdown
+      let s:with_markdown = 0
+      lockvar s:with_markdown
+      hi clear markdownCode
+      hi clear markdownCodeBlock
+      hi clear markdownCodeDelimiter
+      hi clear markdownLinkDelimiter
+    endtry
+  endif
 
   " HTML enables spell checking for all text that is not in a syntax
   " item (:syntax spell toplevel); instead, limit spell checking to
@@ -357,10 +395,71 @@
     call s:ReportOnce(v:exception)
   endtry
 
-  syn region javaDocComment	start="/\*\*" end="\*/" keepend contains=javaCommentTitle,@javaHtml,@javaDocTags,javaTodo,javaCommentError,javaSpaceError,@Spell fold
-  exec 'syn region javaCommentTitle contained matchgroup=javaDocComment start="/\*\*" matchgroup=javaCommentTitle end="\.$" end="\.[ \t\r]\@=" end="\%(^\s*\**\s*\)\@' . s:ff.Peek('80', '') . '<=@"me=s-2,he=s-1 end="\*/"me=s-1,he=s-1 contains=@javaHtml,javaCommentStar,javaTodo,javaCommentError,javaSpaceError,@Spell,@javaDocTags'
-  syn region javaCommentTitle	contained matchgroup=javaDocComment start="/\*\*\s*\r\=\n\=\s*\**\s*\%({@return\>\)\@=" matchgroup=javaCommentTitle end="}\%(\s*\.*\)*" contains=@javaHtml,javaCommentStar,javaTodo,javaCommentError,javaSpaceError,@Spell,@javaDocTags,javaTitleSkipBlock
-  syn region javaCommentTitle	contained matchgroup=javaDocComment start="/\*\*\s*\r\=\n\=\s*\**\s*\%({@summary\>\)\@=" matchgroup=javaCommentTitle end="}" contains=@javaHtml,javaCommentStar,javaTodo,javaCommentError,javaSpaceError,@Spell,@javaDocTags,javaTitleSkipBlock
+  if s:with_markdown
+    syn region javaMarkdownComment	start="///" skip="^\s*///.*$" end="^" keepend contains=javaMarkdownCommentTitle,javaMarkdownShortcutLink,@javaMarkdown,@javaDocTags,javaTodo,@Spell nextgroup=javaMarkdownCommentTitle fold
+    syn match javaMarkdownCommentMask	contained "^\s*///"
+    exec 'syn region javaMarkdownCommentTitle contained matchgroup=javaMarkdownComment start="\%(///.*\r\=\n\s*\)\@' . s:ff.Peek('80', '') . '<!///" matchgroup=javaMarkdownCommentTitle end="\.$" end="\.[ \t\r]\@=" end="\n\%(\s*///\s*$\)\@=" end="\%(^\s*///\s*\)\@' . s:ff.Peek('80', '') . '<=@"me=s-2,he=s-1 contains=javaMarkdownShortcutLink,@javaMarkdown,javaMarkdownCommentMask,javaTodo,@Spell,@javaDocTags'
+    exec 'syn region javaMarkdownCommentTitle contained matchgroup=javaMarkdownComment start="\%(///.*\r\=\n\s*\)\@' . s:ff.Peek('80', '') . '<!///\s*\%({@return\>\)\@=" matchgroup=javaMarkdownCommentTitle end="}\%(\s*\.*\)*" contains=javaMarkdownShortcutLink,@javaMarkdown,javaMarkdownCommentMask,javaTodo,@Spell,@javaDocTags,javaTitleSkipBlock'
+    exec 'syn region javaMarkdownCommentTitle contained matchgroup=javaMarkdownComment start="\%(///.*\r\=\n\s*\)\@' . s:ff.Peek('80', '') . '<!///\s*\%({@summary\>\)\@=" matchgroup=javaMarkdownCommentTitle end="}" contains=javaMarkdownShortcutLink,@javaMarkdown,javaMarkdownCommentMask,javaTodo,@Spell,@javaDocTags,javaTitleSkipBlock'
+
+    syn clear markdownId markdownLineStart markdownH1 markdownH2 markdownHeadingRule markdownRule markdownCode markdownCodeBlock markdownIdDeclaration
+    " REDEFINE THE MARKDOWN ITEMS ANCHORED WITH "^", OBSERVING THE
+    " DEFINITION ORDER.
+    syn match markdownLineStart		contained "^\s*///\s*[<@]\@!" contains=@markdownBlock,javaMarkdownCommentTitle,javaMarkdownCommentMask nextgroup=@markdownBlock,htmlSpecialChar
+    " See https://spec.commonmark.org/0.31.2/#setext-headings.
+    syn match markdownH1		contained "^\s*/// \{,3}.\+\r\=\n\s*/// \{,3}=\+\s*$" contains=@markdownInline,markdownHeadingRule,markdownAutomaticLink,javaMarkdownCommentMask
+    syn match markdownH2		contained "^\s*/// \{,3}.\+\r\=\n\s*/// \{,3}-\+\s*$" contains=@markdownInline,markdownHeadingRule,markdownAutomaticLink,javaMarkdownCommentMask
+    " See https://spec.commonmark.org/0.31.2/#atx-headings.
+    syn region markdownH1		contained matchgroup=markdownH1Delimiter start=" \{,3}#\s" end="#*\s*$" keepend contains=@markdownInline,markdownAutomaticLink oneline
+    syn region markdownH2		contained matchgroup=markdownH2Delimiter start=" \{,3}##\s" end="#*\s*$" keepend contains=@markdownInline,markdownAutomaticLink oneline
+    syn match markdownHeadingRule	contained "^\s*/// \{,3}[=-]\+\s*$" contains=javaMarkdownCommentMask
+    " See https://spec.commonmark.org/0.31.2/#thematic-breaks.
+    syn match markdownRule		contained "^\s*/// \{,3}\*\s*\*\%(\s*\*\)\+\s*$" contains=javaMarkdownCommentMask
+    syn match markdownRule		contained "^\s*/// \{,3}_\s*_\%(\s*_\)\+\s*$" contains=javaMarkdownCommentMask
+    syn match markdownRule		contained "^\s*/// \{,3}-\s*-\%(\s*-\)\+\s*$" contains=javaMarkdownCommentMask
+    " See https://spec.commonmark.org/0.31.2/#indented-code-blocks.
+    syn region markdownCodeBlock	contained start="^\s*///\%( \{4,}\|\t\)" end="^\ze\s*///\%(\s*$\| \{,3}\S\)" keepend contains=javaMarkdownCommentMask
+    " See https://spec.commonmark.org/0.31.2/#code-spans.
+    syn region markdownCode		contained matchgroup=markdownCodeDelimiter start="\z(`\+\) \=" end=" \=\z1" keepend contains=markdownLineStart,javaMarkdownCommentMask
+    " See https://spec.commonmark.org/0.31.2/#fenced-code-blocks.
+    syn region markdownCodeBlock	contained start="^\s*/// \{,3}\z(```\+\)\%(.\{-}[^`]`\)\@!" end="^\s*/// \{,3}\z1`*" keepend contains=javaMarkdownCommentMask
+    syn region markdownCodeBlock	contained start="^\s*/// \{,3}\z(\~\~\~\+\)" end="^\s*/// \{,3}\z1\~*" keepend contains=javaMarkdownCommentMask
+    " See https://spec.commonmark.org/0.31.2/#link-reference-definitions.
+    syn region markdownIdDeclaration	contained matchgroup=markdownLinkDelimiter start="^\s*/// \{,3\}!\=\[" end="\]:" keepend contains=javaMarkdownCommentMask nextgroup=markdownUrl oneline skipwhite
+    " See https://spec.commonmark.org/0.31.2/#link-label.
+    syn region markdownId		contained matchgroup=markdownIdDelimiter start="\[\%([\t ]\]\)\@!" end="\]" contains=javaMarkdownSkipBrackets,javaMarkdownCommentMask
+    " Note that escaped brackets can be unbalanced.
+    syn match javaMarkdownSkipBrackets	contained transparent "\\\[\|\\\]"
+    " See https://spec.commonmark.org/0.31.2/#shortcut-reference-link.
+    syn region javaMarkdownShortcutLink	contained matchgroup=markdownLinkTextDelimiter start="!\=\[^\@!\%(\_[^][]*\%(\[\_[^][]*\]\_[^][]*\)*]\%([[(]\)\@!\)\@=" end="\]\%([[(]\)\@!" contains=@markdownInline,markdownLineStart,javaMarkdownSkipBrackets,javaMarkdownCommentMask nextgroup=markdownLink,markdownId skipwhite
+
+    for s:name in ['markdownFootnoteDefinition', 'markdownFootnote']
+      if hlexists(s:name)
+	exec 'syn clear ' . s:name
+      endif
+    endfor
+
+    unlet s:name
+
+    " COMBAK: Footnotes are recognised by "markdown.vim", but are not
+    " in CommonMark.  See https://pandoc.org/MANUAL.html#footnotes.
+""""syn match markdownFootnoteDefinition contained "^\s*///\s*\[^[^\]]\+\]:" contains=javaMarkdownCommentMask
+
+    hi def link javaMarkdownComment	Comment
+    hi def link javaMarkdownCommentMask	javaMarkdownComment
+    hi def link javaMarkdownCommentTitle SpecialComment
+    hi def link javaMarkdownShortcutLink htmlLink
+  endif
+
+  if s:with_html
+    syn region javaDocComment	start="/\*\*" end="\*/" keepend contains=javaCommentTitle,@javaHtml,@javaDocTags,javaTodo,javaCommentError,javaSpaceError,@Spell fold
+    exec 'syn region javaCommentTitle contained matchgroup=javaDocComment start="/\*\*" matchgroup=javaCommentTitle end="\.$" end="\.[ \t\r]\@=" end="\%(^\s*\**\s*\)\@' . s:ff.Peek('80', '') . '<=@"me=s-2,he=s-1 end="\*/"me=s-1,he=s-1 contains=@javaHtml,javaCommentStar,javaTodo,javaCommentError,javaSpaceError,@Spell,@javaDocTags'
+    syn region javaCommentTitle	contained matchgroup=javaDocComment start="/\*\*\s*\r\=\n\=\s*\**\s*\%({@return\>\)\@=" matchgroup=javaCommentTitle end="}\%(\s*\.*\)*" contains=@javaHtml,javaCommentStar,javaTodo,javaCommentError,javaSpaceError,@Spell,@javaDocTags,javaTitleSkipBlock
+    syn region javaCommentTitle	contained matchgroup=javaDocComment start="/\*\*\s*\r\=\n\=\s*\**\s*\%({@summary\>\)\@=" matchgroup=javaCommentTitle end="}" contains=@javaHtml,javaCommentStar,javaTodo,javaCommentError,javaSpaceError,@Spell,@javaDocTags,javaTitleSkipBlock
+    hi def link javaDocComment		Comment
+    hi def link javaCommentTitle	SpecialComment
+  endif
+
   " The members of javaDocTags are sub-grouped according to the Java
   " version of their introduction, and sub-group members in turn are
   " arranged in alphabetical order, so that future newer members can
@@ -403,13 +502,29 @@
   syn match  javaDocSerialFieldTag contained "@serialField\>"
   syn match  javaDocVersionTag	contained "@version\>"
 
-  syn match  javaDocSeeTag	contained "@see\>" nextgroup=javaDocSeeTag1,javaDocSeeTag2,javaDocSeeTag3,javaDocSeeTagStar skipwhite skipempty
-  syn match  javaDocSeeTagStar	contained "^\s*\*\+\%(\s*{\=@\|/\|$\)\@!" nextgroup=javaDocSeeTag1,javaDocSeeTag2,javaDocSeeTag3 skipwhite skipempty
+  syn match javaDocSeeTag contained "@see\>\s*" nextgroup=javaDocSeeTag1,javaDocSeeTag2,javaDocSeeTag3,javaDocSeeTag4,javaDocSeeTagStar,javaDocSeeTagSlash skipwhite skipempty
+
+  if s:with_html
+    syn match  javaDocSeeTagStar contained "^\s*\*\+\%(\s*{\=@\|/\|$\)\@!" nextgroup=javaDocSeeTag1,javaDocSeeTag2,javaDocSeeTag3,javaDocSeeTag4 skipwhite skipempty
+    hi def link javaDocSeeTagStar javaDocComment
+  endif
+
+  if s:with_markdown
+    syn match  javaDocSeeTagSlash contained "^\s*///\%(\s*{\=@\|$\)\@!" nextgroup=javaDocSeeTag1,javaDocSeeTag2,javaDocSeeTag3,javaDocSeeTag4 skipwhite skipempty
+    hi def link javaDocSeeTagSlash javaMarkdownComment
+  endif
+
   syn match  javaDocSeeTag1	contained @"\_[^"]\+"@
   syn match  javaDocSeeTag2	contained @<a\s\+\_.\{-}</a>@ contains=@javaHtml extend
-  syn match  javaDocSeeTag3	contained @["< \t]\@!\%(\k\|[/.]\)*\%(##\=\k\+\%((\_[^)]*)\)\=\)\=@ nextgroup=javaDocSeeTag3Label skipwhite skipempty
+  exec 'syn match javaDocSeeTag3 contained @[' . s:ff.WithMarkdown('[', '') . '"< \t]\@!\%(\k\|[/.]\)*\%(##\=\k\+\%((\_[^)]*)\)\=\)\=@ nextgroup=javaDocSeeTag3Label skipwhite skipempty'
   syn match  javaDocSeeTag3Label contained @\k\%(\k\+\s*\)*$@
 
+  " COMBAK: No support for type javaDocSeeTag2 in Markdown.
+""if s:with_markdown
+""  syn match  javaDocSeeTag4	contained @\[.\+\]\s\=\%(\[.\+\]\|(.\+)\)@ contains=@javaMarkdown extend
+""  hi def link javaDocSeeTag4	Special
+""endif
+
   syn region javaCodeSkipBlock	contained transparent start="{\%(@code\>\)\@!" end="}" contains=javaCodeSkipBlock,javaDocCodeTag
   syn region javaDocCodeTag	contained start="{@code\>" end="}" contains=javaDocCodeTag,javaCodeSkipBlock
 
@@ -418,9 +533,6 @@
   syn region javaDocSnippetTag	contained start="{@snippet\>" end="}" contains=javaDocSnippetTag,javaSnippetSkipBlock,javaDocSnippetTagAttr,javaCommentMarkupTag
 
   syntax case match
-  hi def link javaDocComment		Comment
-  hi def link javaDocSeeTagStar		javaDocComment
-  hi def link javaCommentTitle		SpecialComment
   hi def link javaDocParam		Function
 
   hi def link javaDocAuthorTag		Special
@@ -729,7 +841,7 @@
 
 let b:spell_options = "contained"
 let &cpo = s:cpo_save
-unlet s:ff s:cpo_save
+unlet s:cpo_save s:ff s:with_html s:with_markdown
 
 " See ":help vim9-mix".
 if !has("vim9script")
@@ -757,4 +869,4 @@
   setlocal foldtext=s:JavaSyntaxFoldTextExpr()
   delfunction! g:JavaSyntaxFoldTextExpr
 endif
-" vim: sw=2 ts=8 noet sta
+" vim: fdm=syntax sw=2 ts=8 noet sta
diff --git a/runtime/syntax/testdir/dumps/java_comments_04.dump b/runtime/syntax/testdir/dumps/java_comments_04.dump
deleted file mode 100644
index d415c02..0000000
--- a/runtime/syntax/testdir/dumps/java_comments_04.dump
+++ /dev/null
@@ -1,20 +0,0 @@
-| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72
-|-+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@3|/+0#0000e05&|*@1| |{+8#e000e06&|@|s|u|m@1|a|r|y| |C|o|m|p|a|r|e|s| |t|h|i|s| |i|n|s|t|a|n|c|e| |w|i|t|h| |t|h|e| |p|a|s@1|e|d| |{+0&&|@|c|o|d|e| |t|h|a|t|}| +0#0000000&@3
-||+0#0000e05#a8a8a8255| | +0&#ffffff0@4|*| +8#e000e06&|i|n|s|t|a|n|c|e| |f|o|r| |o|r|d|e|r| |b|y| |i|n|v|o|k|i|n|g| |{+0&&|@|l|i|n|k| |I|n|t|e|g|e|r|#|c|o|m|p|a|r|e|(|i|n|t|,| |i|n|t|)| +0#0000000&@2
-||+0#0000e05#a8a8a8255| | +0#e000e06#ffffff0@4|*| |c|o|m|p|a|r|e|}| +8&&|a|n|d| |p|a|s@1|i|n|g| |i|t| |{+0&&|@|c|o|d|e| |t|h|i|s|.|m|a|j|o|r|V|e|r|s|i|o|n|(|)|}| +8&&|a|n|d| +0#0000000&@10
-||+0#0000e05#a8a8a8255| | +0&#ffffff0@4|*| +8#e000e06&|{+0&&|@|c|o|d|e| |t|h|a|t|.|m|a|j|o|r|V|e|r|s|i|o|n|(|)|}| +8&&|a|s| |r|e|s|p|e|c|t|i|v|e| |@|a|r|g|u|m|e|n|t|s|.|}| +0#0000000&@11
-||+0#0000e05#a8a8a8255| | +0&#ffffff0@4>*| +0#0000000&@66
-||+0#0000e05#a8a8a8255| | +0&#ffffff0@4|*| |{+0#e000e06&|@|i|n|h|e|r|i|t|D|o|c|}| +0#0000e05&|*|/| +0#0000000&@49
-| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@3|@+0#e000e06&|O|v|e|r@1|i|d|e| +0#0000000&|p+0#00e0003&|u|b|l|i|c| +0#0000000&|i+0#00e0003&|n|t| +0#0000000&|c|o|m|p|a|r|e|T|o|(|C|o|m@1|e|n|t|s|T|e|s|t|s| |t|h|a|t|)| @18
-|-+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@3|{| @67
-||+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@7|j|a|v|a|.|u|t|i|l|.|O|b|j|e|c|t|s|.|r|e|q|u|i|r|e|N|o|n|N|u|l@1|(|t|h|a|t|,| |"+0#e000002&|t|h|a|t|"|)+0#0000000&|;| @17
-||+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@7|r+0#af5f00255&|e|t|u|r|n| +0#0000000&|I|n|t|e|g|e|r|.|c|o|m|p|a|r|e|(|t+0#00e0003&|h|i|s|.+0#0000000&|m|a|j|o|r|V|e|r|s|i|o|n|(|)|,| @21
-||+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@23|t|h|a|t|.|m|a|j|o|r|V|e|r|s|i|o|n|(|)@1|;| @27
-||+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@3|}| @67
-| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72
-|-+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@3|/+0#0000e05&|*@1| +8#e000e06&|R|e|t|u|r|n|s| |a|n| |e|m|p|t|y| |s|t|r|i|n|g| |f|o|r| |a|n| |@|O|v|e|r@1|i|d|e| |a|n@1|o|t|a|t|e|d| |m|e|t|h|o|d| +0#0000000&@7
-||+0#0000e05#a8a8a8255| | +0&#ffffff0@3|*| +8#e000e06&|(|s|e@1| |C|h|a|p|t|e|r| |9|.|6|.|4|.|4| |{+0&&|@|l|i|t|e|r|a|l| |@|O|v|e|r@1|i|d|e|}| +8&&|i|n| |a| |J|a|v|a| |L|a|n|g|u|a|g|e| +0#0000000&@6
-||+0#0000e05#a8a8a8255| | +0&#ffffff0@3|*| +8#e000e06&|S|p|e|c|i|f|i|c|a|t|i|o|n|)| |o|v|e|r@1|i|d@1|e|n| |f|r|o|m| |<+0#00e0e07&|c+0#af5f00255&|o|d|e|>+0#00e0e07&|j+8#e000e06&|a|v|a|.|l+8&#ffd7d7255|a|n|g|.+8&#ffffff0|O|b|j|e|c|t|<+0#00e0e07&|/|c+0#af5f00255&|o|d|e|>+0#00e0e07&| +0#0000000&@6
-||+0#0000e05#a8a8a8255| | +0&#ffffff0@3|*| +0#0000000&@67
-||+0#0000e05#a8a8a8255| | +0&#ffffff0@3|*| |@+0#e000e06&|r|e|t|u|r|n| +0#0000e05&|a|n| |e|m|p|t|y| |s|t|r|i|n|g| |*|/@2| |N|o| |p|e|r|i|o|d| |f|o|r| |t|h|e| |a|b|o|v|e| |s|u|m@1|a|r|y|!| +0#0000000&@5
-@57|7|3|,|3|-|6| @7|6|5|%| 
diff --git a/runtime/syntax/testdir/dumps/java_comments_05.dump b/runtime/syntax/testdir/dumps/java_comments_05.dump
deleted file mode 100644
index 85492d8..0000000
--- a/runtime/syntax/testdir/dumps/java_comments_05.dump
+++ /dev/null
@@ -1,20 +0,0 @@
-||+0#0000e05#a8a8a8255| | +0&#ffffff0@3|*| |@+0#e000e06&|r|e|t|u|r|n| +0#0000e05&|a|n| |e|m|p|t|y| |s|t|r|i|n|g| |*|/@2| |N|o| |p|e|r|i|o|d| |f|o|r| |t|h|e| |a|b|o|v|e| |s|u|m@1|a|r|y|!| +0#0000000&@5
-| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@3|@+0#e000e06&|O|v|e|r@1|i|d|e| +0#0000000&|p+0#00e0003&|u|b|l|i|c| +0#0000000&|S|t|r|i|n|g| |t|o|S|t|r|i|n|g|(|)| |{| |r+0#af5f00255&|e|t|u|r|n| +0#0000000&|"+0#e000002&@1|;+0#0000000&| |}| @19
-| +0#0000e05#a8a8a8255@1|}+0#0000000#ffffff0| @71
-| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72
-| +0#0000e05#a8a8a8255@1|/+0&#ffffff0@1| |j+0&#ffd7d7255|a|v|a|d|o|c| +0&#ffffff0|-@1|s|n|i|p@1|e|t|-|p|a|t|h| |.| |-@1|s|o|u|r|c|e|-|p|a|t|h| |.| |-|d| |/|t+0&#ffd7d7255|m|p|/+0&#ffffff0|d|o|c|s|/| |-|p|a|c|k|a|g|e| |\| +0#0000000&@4
-| +0#0000e05#a8a8a8255@1>/+0&#ffffff0@1| +0#ffffff16#ff404010| +0#0000e05#ffffff0|-|t|a|g| |'|j+0&#ffd7d7255|l|s|:+0&#ffffff0|a|:|S|e@1| |J|a|v|a| |L|a|n|g|u|a|g|e| |S|p|e|c|i|f|i|c|a|t|i|o|n|:|'| |S|n|i|p@1|e|t|s|.|j|a|v|a| +0#0000000&@9
-| +0#0000e05#a8a8a8255@1|/+0&#ffffff0|*@1| +8#e000e06&|S|n|i|p@1|e|t|s| |f|o|r| |c|o|m@1|e|n|t| |t|e|s|t|s|.| +0#0000e05&|*|/| +0#0000000&@38
-| +0#0000e05#a8a8a8255@1|c+0#00e0003#ffffff0|l|a|s@1| +0#0000000&|S|n|i|p@1|e|t|s| @58
-| +0#0000e05#a8a8a8255@1|{+0#0000000#ffffff0| @2|/+0#0000001#ffff4012|*| +0#ffffff16#ff404010| +0#0000e05#ffffff0|T|R|A|I|L|I|N|G| |B|L|A|N|K|S| |A|N|D| |M+0&#ffd7d7255|E|S@1|P|I|L@1|I|N|G|S| +0&#ffffff0|A|R|E| |S|I|G|N|I|F|I|C|A|N|T|!| |*+0#0000001#ffff4012|/| +0#0000000#ffffff0@12
-| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@3|p+0#00e0003&|r|i|v|a|t|e| +0#0000000&|S|n|i|p@1|e|t|s|(|)| |{| |}| @46
-| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72
-|-+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@3|/+0#0000e05&|*@1| +8#e000e06&|T|h|e| |m|e|t|h|o|d| |{+0&&|@|c|o|d|e| |m|a|i|n|}| +8&&|m|u|s|t| |b|e| |d|e|c|l|a|r|e|d| |{+0&&|@|c|o|d|e| |p|u|b|l|i|c|}|,+8&&| |{+0&&|@|c|o|d|e| +0#0000000&@1
-||+0#0000e05#a8a8a8255| | +0#e000e06#ffffff0@4|*| |s|t|a|t|i|c|}|,+8&&| |a|n|d| |{+0&&|@|c|o|d|e| |v|o|i|d|}|.+8&&| +0#0000e05&@1|I|t| |m|u|s|t| |s|p|e|c|i|f|y| |a| |f|o|r|m|a|l| |p|a|r|a|m|e|t|e|r| +0#0000000&@3
-||+0#0000e05#a8a8a8255| | +0&#ffffff0@4|*| |w|h|o|s|e| |d|e|c|l|a|r|e|d| |t|y|p|e| |i|s| |a|r@1|a|y| |o|f| |{+0#e000e06&|@|l|i|n|k| |S|t|r|i|n|g|}|.+0#0000e05&| @1|T|h|e|r|e|f|o|r|e|,| +0#0000000&@6
-||+0#0000e05#a8a8a8255| | +0&#ffffff0@4|*| |<+0#00e0e07&|e+0#af5f00255&|m|>+0#00e0e07&|e+0#0000000&|i|t|h|e|r|<+0#00e0e07&|/|e+0#af5f00255&|m|>+0#00e0e07&| +0#0000e05&|o|f| |t|h|e| |f|o|l@1|o|w|i|n|g| |d|e|c|l|a|r|a|t|i|o|n|s| |i|s| |a|c@1|e|p|t|a|b|l|e|:| +0#0000000&@5
-||+0#0000e05#a8a8a8255| | +0&#ffffff0@4|*| +0#ffffff16#ff404010| +0#0000e05#ffffff0|{+0#e000e06&|@|s|n|i|p@1|e|t| |l+0#00e0003&|a|n|g|=+0#e000e06&|"+0#e000002&|j|a|v|a|"|:+0#e000e06&| +0#0000000&@42
-||+0#0000e05#a8a8a8255| | +0#e000e06#ffffff0@4|*| |/@1| |@+0#0000000&|h|i|g|h|l|i|g|h|t| +0#e000e06&|s+0#00e0003&|u|b|s|t|r|i|n|g|=+0#e000e06&|"+0#e000002&|m|a|i|n|"| +0#e000e06&|t+0#00e0003&|y|p|e|=+0#e000e06&|"+0#e000002&|i|t|a|l|i|c|"|:+0#e000e06&| +0#0000000&@20
-||+0#0000e05#a8a8a8255| | +0#e000e06#ffffff0@4|*| |p|u|b|l|i|c| |s|t|a|t|i|c| |v|o|i|d| |m|a|i|n|(|S|t|r|i|n|g|[|]| |a|r|g|s|)| |{| |}| +0#0000000&@23
-||+0#0000e05#a8a8a8255| | +0#e000e06#ffffff0@4|*| |}|<+0#00e0e07&|b+0#af5f00255&|r| +0#00e0e07&|/|>|<|p+0#af5f00255&|r|e| +0#00e0e07&|c+0#00e0003&|l|a|s@1|=+0#00e0e07&|"+0#e000002&|s|n|i|p@1|e|t|"|>+0#00e0e07&| +0#0000000&@37
-@57|9|1|,|1| @9|8|2|%| 
diff --git a/runtime/syntax/testdir/dumps/java_comments_06.dump b/runtime/syntax/testdir/dumps/java_comments_06.dump
deleted file mode 100644
index 84336a3..0000000
--- a/runtime/syntax/testdir/dumps/java_comments_06.dump
+++ /dev/null
@@ -1,20 +0,0 @@
-||+0#0000e05#a8a8a8255| | +0#e000e06#ffffff0@4|*| |}|<+0#00e0e07&|b+0#af5f00255&|r| +0#00e0e07&|/|>|<|p+0#af5f00255&|r|e| +0#00e0e07&|c+0#00e0003&|l|a|s@1|=+0#00e0e07&|"+0#e000002&|s|n|i|p@1|e|t|"|>+0#00e0e07&| +0#0000000&@37
-||+0#0000e05#a8a8a8255| | +0&#ffffff0@4|*|{+0#e000e06&|@|c|o|d|e| |p|u|b|l|i|c| |s|t|a|t|i|c| |v|o|i|d| |m|a|i|n|(|S|t|r|i|n|g|.@2| |a|r|g|s|)| |{| |}@1|<+0#00e0e07&|/|p+0#af5f00255&|r|e|>+0#00e0e07&| +0#0000000&@9
-||+0#0000e05#a8a8a8255| | +0&#ffffff0@4|*| +0#0000000&@66
-||+0#0000e05#a8a8a8255| | +0&#ffffff0@4|*| |@+0#e000e06&|p|a|r|a|m| |a+0#00e0e07&|r|g|s| +0#0000e05&|o|p|t|i|o|n|a|l| |c+0&#ffd7d7255|o|m@1|a|n|d|e|-+0&#ffffff0|l|i|n|e| |a|r|g|u|m|e|n|t|s| +0#ffffff16#ff404010| +0#0000000#ffffff0@20
-||+0#0000e05#a8a8a8255| | +0&#ffffff0@4|*| |@|j+0&#ffd7d7255|l|s| +0&#ffffff0|1|2|.|1|.|4| |I|n|v|o|k|e| |{+0#e000e06&|@|c|o|d|e| |T|e|s|t|.|m|a|i|n|}| +0#0000e05&|*|/| +0#0000000&@26
-| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@3>/+0#0000e05&@1| |@+0#0000000&|s|t|a|r|t| +0#0000e05&|r+0#00e0003&|e|g|i|o|n| +0#0000e05&|=| |m+0#e000002&|a|i|n| +0#ffffff16#ff404010@4| +0#0000000#ffffff0@40
-| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@3|/+0#0000e05&@1| |@+0#0000000&|l|i|n|k| +0#0000e05&|s+0#00e0003&|u|b|s|t|r|i|n|g| +0#0000e05&|=| |'+0#e000002&|S|t|r|i|n|g|'| +0#0000e05&|t+0#00e0003&|a|r|g|e|t| +0#0000e05&|=| |'+0#e000002&|j|a|v|a|.|l|a|n|g|.|S|t|r|i|n|g|'| +0#0000e05&|:| +0#0000000&@9
-| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@3|p+0#00e0003&|u|b|l|i|c| +0#0000000&|s+0#00e0003&|t|a|t|i|c| +0#0000000&|v+0#00e0003&|o|i|d| +0#0000000&|m|a|i|n|(|S|t|r|i|n|g|[|]| |a|r|g|s|)| |{| |}| @26
-| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@3|/+0#0000e05&@1| |@+0#0000000&|e|n|d| +0#ffffff16#ff404010| +0#0000000#ffffff0@60
-| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72
-|-+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@3|/+0#0000e05&|*@1| |{+8#e000e06&|@+0&&|r|e|t|u|r|n| +8&&|a|n| |e|m|p|t|y| |s|t|r|i|n|g|}| +0#0000000&@39
-||+0#0000e05#a8a8a8255| | +0&#ffffff0@4|*| |@+0#e000e06&|s|e@1| +0#0000e05&|<+0#00e0e07&|a+0#af5f00255&| +0#00e0e07&|h+0#00e0003&|r|e|f|=+0#00e0e07&|"+0#e000002&|h|t@1|p|s|:|/@1|d|o|c|s|.|o|r|a|c|l|e|.|c|o|m|/|j|a|v|a|s|e|/|s|p|e|c|s|/|j|l|s|/|s|e|2|1|/|h|t|m|l|/|j
-||+0#0000e05#a8a8a8255| |l+0#e000002#ffffff0|s|-|3|.|h|t|m|l|#|j|l|s|-|3|.|1|0|.|5|"|>+0#00e0e07&|3+8#e000e06&|.|1|0|.|5| |S|t|r|i|n|g| |L|i|t|e|r|a|l|s|<+0#00e0e07&|/|a+0#af5f00255&|>+0#00e0e07&| +0#0000000&@24
-||+0#0000e05#a8a8a8255| | +0&#ffffff0@4|*| |@+0#e000e06&|s|e@1| +0#0000e05&|j+0#00e0e07&|a|v|a|.|b|a|s|e|/|j|a|v|a|.|l|a|n|g|.|O|b|j|e|c|t|#|t|o|S|t|r|i|n|g|(|)| +0#0000e05&|*|/| +0#0000000&@20
-| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@3|/+0#0000e05&@1| |@+0#0000000&|s|t|a|r|t| +0#0000e05&|r+0#00e0003&|e|g|i|o|n| +0#0000e05&|=| |t+0#e000002&|o|S|t|r|i|n|g| +0#ffffff16#ff404010| +0#0000000#ffffff0@40
-| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@3|/+0#0000e05&@1| |@+0#0000000&|r|e|p|l|a|c|e| +0#0000e05&|s+0#00e0003&|u|b|s|t|r|i|n|g| +0#0000e05&|=| |'+0#e000002&|"@1|'| +0#0000e05&|r+0#00e0003&|e|p|l|a|c|e|m|e|n|t| +0#0000e05&|=| |"+0#e000002&|\|u|0@1|2@1|\|u|0@1|2@1|"| +0#0000000&@11
-| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@3|/+0#0000e05&@1| |@+0#0000000&|l|i|n|k| +0#0000e05&|r+0#00e0003&|e|g|e|x| +0#0000e05&|=| |'+0#e000002&|\|b|S|t|r|i|n|g|'| +0#0000e05&|t+0#00e0003&|a|r|g|e|t| +0#0000e05&|=| |j+0#e000002&|a|v|a|.|l|a|n|g|.|S|t|r|i|n|g| +0#0000e05&|t+0#00e0003&|y|p|e| +0#0000e05&|=| |l+0#e000002&|i|n|k|p|l|a|i
-| +0#0000e05#a8a8a8255@1|n+0#e000002#ffffff0| +0#0000e05&|:| +0#0000000&@69
-| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@3|@+0#e000e06&|O|v|e|r@1|i|d|e| +0#0000000&|p+0#00e0003&|u|b|l|i|c| +0#0000000&|S|t|r|i|n|g| |t|o|S|t|r|i|n|g|(|)| |{| |r+0#af5f00255&|e|t|u|r|n| +0#0000000&|"+0#e000002&@1|;+0#0000000&| |}| @19
-@57|1|0|9|,|2|-|5| @6|9|8|%| 
diff --git a/runtime/syntax/testdir/dumps/java_comments_07.dump b/runtime/syntax/testdir/dumps/java_comments_07.dump
deleted file mode 100644
index f83433e..0000000
--- a/runtime/syntax/testdir/dumps/java_comments_07.dump
+++ /dev/null
@@ -1,20 +0,0 @@
-| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@3|@+0#e000e06&|O|v|e|r@1|i|d|e| +0#0000000&|p+0#00e0003&|u|b|l|i|c| +0#0000000&|S|t|r|i|n|g| |t|o|S|t|r|i|n|g|(|)| |{| |r+0#af5f00255&|e|t|u|r|n| +0#0000000&|"+0#e000002&@1|;+0#0000000&| |}| @19
-| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@3|/+0#0000e05&@1| |@+0#0000000&|e|n|d| +0#ffffff16#ff404010| +0#0000000#ffffff0@60
-| +0#0000e05#a8a8a8255@1>}+0#0000000#ffffff0| @71
-|~+0#4040ff13&| @73
-|~| @73
-|~| @73
-|~| @73
-|~| @73
-|~| @73
-|~| @73
-|~| @73
-|~| @73
-|~| @73
-|~| @73
-|~| @73
-|~| @73
-|~| @73
-|~| @73
-|~| @73
-| +0#0000000&@56|1|2@1|,|1| @8|B|o|t| 
diff --git a/runtime/syntax/testdir/dumps/java_comments_00.dump b/runtime/syntax/testdir/dumps/java_comments_html_00.dump
similarity index 92%
rename from runtime/syntax/testdir/dumps/java_comments_00.dump
rename to runtime/syntax/testdir/dumps/java_comments_html_00.dump
index f0ecd9d..be35389 100644
--- a/runtime/syntax/testdir/dumps/java_comments_00.dump
+++ b/runtime/syntax/testdir/dumps/java_comments_html_00.dump
@@ -1,7 +1,7 @@
 | +0#0000e05#a8a8a8255@1>/+0&#ffffff0@1| |V|I|M|_|T|E|S|T|_|S|E|T|U|P| |u|n|l|e|t|!| |g+0&#5fd7ff255|:+0&#ffffff0|j|a|v|a|_|n|o|_|t|a|b|_|s|p|a|c|e|_|e|r@1|o|r| |g|:|j|a|v|a|_|i|g|n|o|r|e|_|j+0&#ffd7d7255|a|v|a|d|o|c| +0#0000000#ffffff0
 | +0#0000e05#a8a8a8255@1|/+0&#ffffff0@1| |V|I|M|_|T|E|S|T|_|S|E|T|U|P| |u|n|l|e|t|!| |g+0&#5fd7ff255|:+0&#ffffff0|j|a|v|a|_|n|o|_|t|r|a|i|l|_|s|p|a|c|e|_|e|r@1|o|r| +0#0000000&@20
 | +0#0000e05#a8a8a8255@1|/+0&#ffffff0@1| |V|I|M|_|T|E|S|T|_|S|E|T|U|P| |l|e|t| |[|g|:|j|a|v|a|_|s|p|a|c|e|_|e|r@1|o|r|s|,|g|:|j|a|v|a|_|c|o|m@1|e|n|t|_|s|t|r|i|n|g|s|]|=|[|1+0#e000002&|,+0#0000e05&|1+0#e000002&|]+0#0000e05&| +0#0000000&
-| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72
+| +0#0000e05#a8a8a8255@1|/+0&#ffffff0@1| |V|I|M|_|T|E|S|T|_|S|E|T|U|P| |l|e|t| |g|:|j|a|v|a|_|i|g|n|o|r|e|_|m|a|r|k|d|o|w|n| |=| |1+0#e000002&| +0#0000000&@24
 | +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72
 | +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72
 | +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72
diff --git a/runtime/syntax/testdir/dumps/java_comments_01.dump b/runtime/syntax/testdir/dumps/java_comments_html_01.dump
similarity index 67%
rename from runtime/syntax/testdir/dumps/java_comments_01.dump
rename to runtime/syntax/testdir/dumps/java_comments_html_01.dump
index ab6007b..c747bed 100644
--- a/runtime/syntax/testdir/dumps/java_comments_01.dump
+++ b/runtime/syntax/testdir/dumps/java_comments_html_01.dump
@@ -5,16 +5,16 @@
 | +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72
 | +0#0000e05#a8a8a8255@1> +0#0000000#ffffff0@72
 | +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72
-|-+0#0000e05#a8a8a8255| |/+0&#ffffff0|*@1|/| +0#0000000&|/+0#0000001#ffff4012|*|/+0#0000e05#ffffff0| |*+0#0000001#ffff4012|/| +0#0000000#ffffff0|/+0#0000001#ffff4012|*| +0#0000e05#ffffff0|/+0#ffffff16#ff404010|*+0#0000001#ffff4012|/| +0#0000000#ffffff0|/+0#0000001#ffff4012|*|/+0#ffffff16#ff404010|*+0#0000001#ffff4012|/| +0#0000000#ffffff0|/+0#0000001#ffff4012|*|/+0#0000e05#ffffff0|/+0#ffffff16#ff404010|*+0#0000001#ffff4012|/| +0#0000000#ffffff0|/+0#0000e05&|*@1| +8#e000e06&|C|o|m@1|e|n|t| |t|e|s|t|s|.| +0#0000000&@22
+|-+0#0000e05#a8a8a8255| |/+0&#ffffff0|*@1|/| +0#0000000&|/+0#0000001#ffff4012|*|/+0#0000e05#ffffff0| |*+0#0000001#ffff4012|/| +0#0000000#ffffff0|/+0#0000001#ffff4012|*| +0#0000e05#ffffff0|/+0#ffffff16#ff404010|*+0#0000001#ffff4012|/| +0#0000000#ffffff0|/+0#0000001#ffff4012|*|/+0#ffffff16#ff404010|*+0#0000001#ffff4012|/| +0#0000000#ffffff0|/+0#0000001#ffff4012|*|/+0#0000e05#ffffff0|/+0#ffffff16#ff404010|*+0#0000001#ffff4012|/| +0#0000000#ffffff0|/+0#0000e05&|*@1| +8#e000e06&|H|T|M|L| |c|o|m@1|e|n|t| |t|e|s|t|s|.| +0#0000000&@17
 ||+0#0000e05#a8a8a8255| | +0&#ffffff0|*| |<+0#00e0e07&|p+0#af5f00255&|>+0#00e0e07&|T+0#0000e05&|h|e|r|e| |i|s| |n|o| |e|n|t|r|y| |p|o|i|n|t| |m|e|t|h|o|d| |{+0#e000e06&|@|c|o|d|e| |m|a|i|n|}|:+0#0000e05&| +0#0000000&@22
-||+0#0000e05#a8a8a8255| | +0&#ffffff0|*| |{+0#e000e06&|@|s|n|i|p@1|e|t| |f+0#00e0003&|i|l|e| +0#e000e06&|=| |S+0#e000002&|n|i|p@1|e|t|s|.|j|a|v|a| +0#e000e06&|r+0#00e0003&|e|g|i|o|n| +0#e000e06&|=| |m+0#e000002&|a|i|n| +0#e000e06&|i+0#00e0003&|d| +0#e000e06&|=| |_+0#e000002&|0|1|}+0#e000e06&| +0#0000000&@15
+||+0#0000e05#a8a8a8255| | +0&#ffffff0|*| |{+0#e000e06&|@|s|n|i|p@1|e|t| |f+0#00e0003&|i|l|e| +0#e000e06&|=| |H+0#e000002&|T|M|L|S|n|i|p@1|e|t|s|.|j|a|v|a| +0#e000e06&|r+0#00e0003&|e|g|i|o|n| +0#e000e06&|=| |m+0#e000002&|a|i|n| +0#e000e06&|i+0#00e0003&|d| +0#e000e06&|=| |_+0#e000002&|0|1|}+0#e000e06&| +0#0000000&@11
 ||+0#0000e05#a8a8a8255| | +0&#ffffff0|*| |<+0#00e0e07&|p+0#af5f00255&|>+0#00e0e07&|T+0#0000e05&|h|e|r|e| |i|s| |n|o| |t|e|x|t|u|a|l| |r|e|p|r|e|s|e|n|t|a|t|i|o|n|:| +0#0000000&@31
-||+0#0000e05#a8a8a8255| | +0&#ffffff0|*| |{+0#e000e06&|@|s|n|i|p@1|e|t| |c+0#00e0003&|l|a|s@1| +0#e000e06&|=| |S+0#e000002&|n|i|p@1|e|t|s| +0#e000e06&|r+0#00e0003&|e|g|i|o|n| +0#e000e06&|=| |t+0#e000002&|o|S|t|r|i|n|g| +0#e000e06&|i+0#00e0003&|d| +0#e000e06&|=| |_+0#e000002&|0|2|}+0#e000e06&| +0#0000e05&|*|/| +0#0000000&@12
-| +0#0000e05#a8a8a8255@1|c+0#00e0003#ffffff0|l|a|s@1| +0#0000000&|C|o|m@1|e|n|t|s|T|e|s|t|s| |i+0#00e0003&|m|p|l|e|m|e|n|t|s| +0#0000000&|C|o|m|p|a|r|a|b|l|e|<|C|o|m@1|e|n|t|s|T|e|s|t|s|>| @16
-| +0#0000e05#a8a8a8255@1|{+0#0000000#ffffff0| @71
-| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@3|p+0#00e0003&|r|i|v|a|t|e| +0#0000000&|C|o|m@1|e|n|t|s|T|e|s|t|s|(|)| |{| |}| @41
+||+0#0000e05#a8a8a8255| | +0&#ffffff0|*| |{+0#e000e06&|@|s|n|i|p@1|e|t| |c+0#00e0003&|l|a|s@1| +0#e000e06&|=| |H+0#e000002&|T|M|L|S|n|i|p@1|e|t|s| +0#e000e06&|r+0#00e0003&|e|g|i|o|n| +0#e000e06&|=| |t+0#e000002&|o|S|t|r|i|n|g| +0#e000e06&|i+0#00e0003&|d| +0#e000e06&|=| |_+0#e000002&|0|2|}+0#e000e06&| +0#0000e05&|*|/| +0#0000000&@8
+| +0#0000e05#a8a8a8255@1|c+0#00e0003#ffffff0|l|a|s@1| +0#0000000&|H|T|M|L|C|o|m@1|e|n|t|s|T|e|s|t|s| |i+0#00e0003&|m|p|l|e|m|e|n|t|s| +0#0000000&|C|o|m|p|a|r|a|b|l|e|<|H|T|M|L|C|o|m@1|e|n|t|s|T|e|s|t|s|>| @8
+| +0#0000e05#a8a8a8255@1|{+0#0000000#ffffff0| @2|/+0#0000e05&@1| |J+0&#ffd7d7255|D|K| +0&#ffffff0|2+0#e000002&|1|++0#0000e05&|.| +0#0000000&@57
+| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@3|p+0#00e0003&|r|i|v|a|t|e| +0#0000000&|H|T|M|L|C|o|m@1|e|n|t|s|T|e|s|t|s|(|)| |{| |}| @37
 | +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72
 |-+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@3|/+0#0000e05&|*@1| +8#e000e06&|N|o|-|o|p|,| |i|.| +0#0000e05&|e+0&#5fd7ff255|.+0&#ffffff0| |n+0&#5fd7ff255|o| +0&#ffffff0|o|p|e|r|a|t|i|o|n|.| +0#0000000&@38
 ||+0#0000e05#a8a8a8255| | +0&#ffffff0@3|*| |(|{+0#e000e06&|@|l|i|t|e|r|a|l|@|l|i|t|e|r|a|l|}| +0#0000e05&|m|a|y| |b|e| |u|s|e|d| |w|i|t|h| |{+0#e000e06&|@|c|o|d|e| |.|}| +0#0000e05&|f|o|r| |c|o|n|t|r|a|c|t|i|o|n|.|)| +0#0000000&@2
 ||+0#0000e05#a8a8a8255| | +0&#ffffff0@3|*| |@+0#e000e06&|r|e|t|u|r|n| +0#0000e05&|{+0#e000e06&|@|c|o|d|e| |n|u|l@1|}| +0#0000e05&|*|/| +0#0000000&@43
-@57|1|9|,|0|-|1| @7|1|2|%| 
+@57|1|9|,|0|-|1| @7|1@1|%| 
diff --git a/runtime/syntax/testdir/dumps/java_comments_02.dump b/runtime/syntax/testdir/dumps/java_comments_html_02.dump
similarity index 98%
rename from runtime/syntax/testdir/dumps/java_comments_02.dump
rename to runtime/syntax/testdir/dumps/java_comments_html_02.dump
index 03c4bcf..927415c 100644
--- a/runtime/syntax/testdir/dumps/java_comments_02.dump
+++ b/runtime/syntax/testdir/dumps/java_comments_html_02.dump
@@ -17,4 +17,4 @@
 | +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72
 |-+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@3|/+0#0000e05&|*@1| +8#e000e06&|N|o|-|o|p|,| |i|.|e|.|<+0&&|!|-@1| |-@1|>| +8&&|n|o| |o|p|e|r|a|t|i|o|n|.| +0#0000000&@31
 ||+0#0000e05#a8a8a8255| | +0&#ffffff0@3|*| |@+0#e000e06&|r|e|t|u|r|n| +0#0000e05&|{+0#e000e06&|@|c|o|d|e| |n|u|l@1|}| +0#0000e05&|*|/| +0#0000000&@43
-@57|3|7|,|2|-|5| @7|3|0|%| 
+@57|3|7|,|2|-|5| @7|2|7|%| 
diff --git a/runtime/syntax/testdir/dumps/java_comments_03.dump b/runtime/syntax/testdir/dumps/java_comments_html_03.dump
similarity index 91%
rename from runtime/syntax/testdir/dumps/java_comments_03.dump
rename to runtime/syntax/testdir/dumps/java_comments_html_03.dump
index a407805..b9b23da 100644
--- a/runtime/syntax/testdir/dumps/java_comments_03.dump
+++ b/runtime/syntax/testdir/dumps/java_comments_html_03.dump
@@ -14,7 +14,7 @@
 | +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@3|/+0#0000e05&|*@1| |{+8#e000e06&|@+0&&|r|e|t|u|r|n| +8&&|{+0&&|@|c|o|d|e| |n|u|l@1|}|,+8&&| |w|i|t|h| |n|o|-|o|p|,| |i|.|e|.| |n|o| |o|p|e|r|a|t|i|o|n|}| |.| |.| |*+0#0000e05&|/| +0#0000000&@4
 | +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@3|V|o|i|d| |n|o|O|p|9|(|)| |{| |r+0#af5f00255&|e|t|u|r|n| +0#0000000&|n+0#e000002&|u|l@1|;+0#0000000&| |}| @39
 | +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72
-| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@3|/+0#0000e05&|*@1| |{+8#e000e06&|@+0&&|r|e|t|u|r|n| +8&&|t|h|e| |m|a|j|o|r| |J|a|v|a| |v|e|r|s|i|o|n|}| |@+0&&|h|i|d@1|e|n| +0#0000e05&|*|/| +0#0000000&@21
+|-+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@3|/+0#0000e05&|*@1| |{+8#e000e06&|@+0&&|r|e|t|u|r|n| +8&&|t|h|e| |m|a|j|o|r| |J|a|v|a| |v|e|r|s|i|o|n|}| +0#0000000&@32
+||+0#0000e05#a8a8a8255| | +0&#ffffff0@4|*| |@+0#e000e06&|h|i|d@1|e|n| +0#0000e05&|*|/| +0#0000000&@55
 | +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@3|p+0#00e0003&|r|o|t|e|c|t|e|d| +0#0000000&|i+0#00e0003&|n|t| +0#0000000&|m|a|j|o|r|V|e|r|s|i|o|n|(|)| |{| |r+0#af5f00255&|e|t|u|r|n| +0#0000000&|2+0#e000002&|1|;+0#0000000&| |}| @25
-| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72
-@57|5@1|,|2|-|5| @7|4|7|%| 
+@57|5@1|,|2|-|5| @7|4|3|%| 
diff --git a/runtime/syntax/testdir/dumps/java_comments_html_04.dump b/runtime/syntax/testdir/dumps/java_comments_html_04.dump
new file mode 100644
index 0000000..bb7e638
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/java_comments_html_04.dump
@@ -0,0 +1,20 @@
+| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@3|p+0#00e0003&|r|o|t|e|c|t|e|d| +0#0000000&|i+0#00e0003&|n|t| +0#0000000&|m|a|j|o|r|V|e|r|s|i|o|n|(|)| |{| |r+0#af5f00255&|e|t|u|r|n| +0#0000000&|2+0#e000002&|1|;+0#0000000&| |}| @25
+| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72
+|-+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@3|/+0#0000e05&|*@1| |{+8#e000e06&|@|s|u|m@1|a|r|y| |C|o|m|p|a|r|e|s| |t|h|i|s| |i|n|s|t|a|n|c|e| |w|i|t|h| |t|h|e| |p|a|s@1|e|d| |{+0&&|@|c|o|d|e| |t|h|a|t|}| +0#0000000&@3
+||+0#0000e05#a8a8a8255| | +0&#ffffff0@4|*| +8#e000e06&|i|n|s|t|a|n|c|e| |f|o|r| |o|r|d|e|r| |b|y| |i|n|v|o|k|i|n|g| |{+0&&|@|l|i|n|k| |I|n|t|e|g|e|r|#|c|o|m|p|a|r|e|(|i|n|t|,| |i|n|t|)| +0#0000000&@2
+||+0#0000e05#a8a8a8255| | +0#e000e06#ffffff0@4|*| |c|o|m|p|a|r|e|}| +8&&|a|n|d| |p|a|s@1|i|n|g| |i|t| |{+0&&|@|c|o|d|e| |t|h|i|s|.|m|a|j|o|r|V|e|r|s|i|o|n|(|)|}| +8&&|a|n|d| +0#0000000&@10
+||+0#0000e05#a8a8a8255| | +0&#ffffff0@4>*| +8#e000e06&|{+0&&|@|c|o|d|e| |t|h|a|t|.|m|a|j|o|r|V|e|r|s|i|o|n|(|)|}| +8&&|a|s| |r|e|s|p|e|c|t|i|v|e| |@|a|r|g|u|m|e|n|t|s|.|}| +0#0000000&@11
+||+0#0000e05#a8a8a8255| | +0&#ffffff0@4|*| |{+0#e000e06&|@|i|n|h|e|r|i|t|D|o|c|}| +0#0000e05&|*|/| +0#0000000&@49
+| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@3|@+0#e000e06&|O|v|e|r@1|i|d|e| +0#0000000&|p+0#00e0003&|u|b|l|i|c| +0#0000000&|i+0#00e0003&|n|t| +0#0000000&|c|o|m|p|a|r|e|T|o|(|H|T|M|L|C|o|m@1|e|n|t|s|T|e|s|t|s| |t|h|a|t|)| @14
+|-+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@3|{| @67
+||+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@7|j|a|v|a|.|u|t|i|l|.|O|b|j|e|c|t|s|.|r|e|q|u|i|r|e|N|o|n|N|u|l@1|(|t|h|a|t|,| |"+0#e000002&|t|h|a|t|"|)+0#0000000&|;| @17
+||+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@7|r+0#af5f00255&|e|t|u|r|n| +0#0000000&|I|n|t|e|g|e|r|.|c|o|m|p|a|r|e|(|t+0#00e0003&|h|i|s|.+0#0000000&|m|a|j|o|r|V|e|r|s|i|o|n|(|)|,| @21
+||+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@23|t|h|a|t|.|m|a|j|o|r|V|e|r|s|i|o|n|(|)@1|;| @27
+||+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@3|}| @67
+| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72
+| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@3|/+0#0000e05&@2| |R|e|t|u|r|n|s| |a|n| |e|m|p|t|y| |s|t|r|i|n|g| |f|o|r| |a|n| |@|O|v|e|r@1|i|d|e| |a|n@1|o|t|a|t|e|d| |m|e|t|h|o|d| +0#0000000&@7
+| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@3|/+0#0000e05&@2| |(|s|e@1| |C|h|a|p|t|e|r| |9+0#e000002&|.|6|.|4|.|4| +0#0000e05&|{|@|l|i|t|e|r|a|l| |@|O|v|e|r@1|i|d|e|}| |i|n| |a| |J|a|v|a| |L|a|n|g|u|a|g|e| +0#0000000&@4
+| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@3|/+0#0000e05&@2| |S|p|e|c|i|f|i|c|a|t|i|o|n|)| |o|v|e|r@1|i|d@1|e|n| |f|r|o|m| |`|j|a|v|a|.|l+0&#ffd7d7255|a|n|g|.+0&#ffffff0|O|b|j|e|c|t|`| +0#0000000&@15
+| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@3|/+0#0000e05&@2| +0#0000000&@65
+| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@3|/+0#0000e05&@2| |@|r|e|t|u|r|n| |a|n| |e|m|p|t|y| |s|t|r|i|n|g| |/@2| |N|o| |p|e|r|i|o|d| |f|o|r| |t|h|e| |a|b|o|v|e| |s|u|m@1|a|r|y|!| +0#0000000&@4
+@57|7|3|,|3|-|6| @7|5|9|%| 
diff --git a/runtime/syntax/testdir/dumps/java_comments_html_05.dump b/runtime/syntax/testdir/dumps/java_comments_html_05.dump
new file mode 100644
index 0000000..d553aa1
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/java_comments_html_05.dump
@@ -0,0 +1,20 @@
+| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@3|/+0#0000e05&@2| |@|r|e|t|u|r|n| |a|n| |e|m|p|t|y| |s|t|r|i|n|g| |/@2| |N|o| |p|e|r|i|o|d| |f|o|r| |t|h|e| |a|b|o|v|e| |s|u|m@1|a|r|y|!| +0#0000000&@4
+| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@3|p+0#00e0003&|r|i|v|a|t|e| +0#0000000&|S|t|r|i|n|g| |a|s|S|t|r|i|n|g|(|)| |{| |r+0#af5f00255&|e|t|u|r|n| +0#0000000&|"+0#e000002&@1|;+0#0000000&| |}| @28
+| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72
+|-+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@3|/+0#0000e05&|*@1| +8#e000e06&|R|e|t|u|r|n|s| |a|n| |e|m|p|t|y| |s|t|r|i|n|g| |f|o|r| |a|n| |@|O|v|e|r@1|i|d|e| |a|n@1|o|t|a|t|e|d| |m|e|t|h|o|d| +0#0000000&@7
+||+0#0000e05#a8a8a8255| | +0&#ffffff0@3|*| +8#e000e06&|(|s|e@1| |C|h|a|p|t|e|r| |9|.|6|.|4|.|4| |{+0&&|@|l|i|t|e|r|a|l| |@|O|v|e|r@1|i|d|e|}| +8&&|i|n| |a| |J|a|v|a| |L|a|n|g|u|a|g|e| +0#0000000&@6
+||+0#0000e05#a8a8a8255| | +0&#ffffff0@3>*| +8#e000e06&|S|p|e|c|i|f|i|c|a|t|i|o|n|)| |o|v|e|r@1|i|d@1|e|n| |f|r|o|m| |<+0#00e0e07&|c+0#af5f00255&|o|d|e|>+0#00e0e07&|j+8#e000e06&|a|v|a|.|l+8&#ffd7d7255|a|n|g|.+8&#ffffff0|O|b|j|e|c|t|<+0#00e0e07&|/|c+0#af5f00255&|o|d|e|>+0#00e0e07&| +0#0000000&@6
+||+0#0000e05#a8a8a8255| | +0&#ffffff0@3|*| +0#0000000&@67
+||+0#0000e05#a8a8a8255| | +0&#ffffff0@3|*| |@+0#e000e06&|r|e|t|u|r|n| +0#0000e05&|a|n| |e|m|p|t|y| |s|t|r|i|n|g| |*|/@2| |N|o| |p|e|r|i|o|d| |f|o|r| |t|h|e| |a|b|o|v|e| |s|u|m@1|a|r|y|!| +0#0000000&@5
+| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@3|@+0#e000e06&|O|v|e|r@1|i|d|e| +0#0000000&|p+0#00e0003&|u|b|l|i|c| +0#0000000&|S|t|r|i|n|g| |t|o|S|t|r|i|n|g|(|)| |{| |r+0#af5f00255&|e|t|u|r|n| +0#0000000&|a|s|S|t|r|i|n|g|(|)|;| |}| @11
+| +0#0000e05#a8a8a8255@1|}+0#0000000#ffffff0| @71
+| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72
+| +0#0000e05#a8a8a8255@1|/+0&#ffffff0@1| |j+0&#ffd7d7255|a|v|a|d|o|c| +0&#ffffff0|-@1|s|n|i|p@1|e|t|-|p|a|t|h| |.| |-@1|s|o|u|r|c|e|-|p|a|t|h| |.| |-|d| |/|t+0&#ffd7d7255|m|p|/+0&#ffffff0|h|t|m|l|_|d|o|c|s|/| |-|p|a|c|k|a|g|e| |\
+| +0&#a8a8a8255@1|/+0&#ffffff0@1| +0#ffffff16#ff404010| +0#0000e05#ffffff0|-|t|a|g| |'|j+0&#ffd7d7255|l|s|:+0&#ffffff0|a|:|S|e@1| |J|a|v|a| |L|a|n|g|u|a|g|e| |S|p|e|c|i|f|i|c|a|t|i|o|n|:|'| |H+0&#ffd7d7255|T|M|L|S|n|i|p@1|e|t|s|.+0&#ffffff0|j|a|v|a| +0#0000000&@5
+| +0#0000e05#a8a8a8255@1|/+0&#ffffff0|*@1| +8#e000e06&|S|n|i|p@1|e|t|s| |f|o|r| |H|T|M|L| |c|o|m@1|e|n|t| |t|e|s|t|s|.| +0#0000e05&|*|/| +0#0000000&@33
+| +0#0000e05#a8a8a8255@1|c+0#00e0003#ffffff0|l|a|s@1| +0#0000000&|H|T|M|L|S|n|i|p@1|e|t|s| @54
+| +0#0000e05#a8a8a8255@1|{+0#0000000#ffffff0| @2|/+0#0000001#ffff4012|*| +0#ffffff16#ff404010| +0#0000e05#ffffff0|T|R|A|I|L|I|N|G| |B|L|A|N|K|S| |A|N|D| |M+0&#ffd7d7255|E|S@1|P|I|L@1|I|N|G|S| +0&#ffffff0|A|R|E| |S|I|G|N|I|F|I|C|A|N|T|!| |*+0#0000001#ffff4012|/| +0#0000000#ffffff0@12
+| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@3|p+0#00e0003&|r|i|v|a|t|e| +0#0000000&|H|T|M|L|S|n|i|p@1|e|t|s|(|)| |{| |}| @42
+| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72
+|-+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@3|/+0#0000e05&|*@1| +8#e000e06&|T|h|e| |m|e|t|h|o|d| |{+0&&|@|c|o|d|e| |m|a|i|n|}| +8&&|m|u|s|t| |b|e| |d|e|c|l|a|r|e|d| |{+0&&|@|c|o|d|e| |p|u|b|l|i|c|}|,+8&&| |{+0&&|@|c|o|d|e| +0#0000000&@1
+@57|9|1|,|2|-|5| @7|7|5|%| 
diff --git a/runtime/syntax/testdir/dumps/java_comments_html_06.dump b/runtime/syntax/testdir/dumps/java_comments_html_06.dump
new file mode 100644
index 0000000..4d26b94
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/java_comments_html_06.dump
@@ -0,0 +1,20 @@
+|-+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@3|/+0#0000e05&|*@1| +8#e000e06&|T|h|e| |m|e|t|h|o|d| |{+0&&|@|c|o|d|e| |m|a|i|n|}| +8&&|m|u|s|t| |b|e| |d|e|c|l|a|r|e|d| |{+0&&|@|c|o|d|e| |p|u|b|l|i|c|}|,+8&&| |{+0&&|@|c|o|d|e| +0#0000000&@1
+||+0#0000e05#a8a8a8255| | +0#e000e06#ffffff0@4|*| |s|t|a|t|i|c|}|,+8&&| |a|n|d| |{+0&&|@|c|o|d|e| |v|o|i|d|}|.+8&&| +0#0000e05&@1|I|t| |m|u|s|t| |s|p|e|c|i|f|y| |a| |f|o|r|m|a|l| |p|a|r|a|m|e|t|e|r| +0#0000000&@3
+||+0#0000e05#a8a8a8255| | +0&#ffffff0@4|*| |w|h|o|s|e| |d|e|c|l|a|r|e|d| |t|y|p|e| |i|s| |a|r@1|a|y| |o|f| |{+0#e000e06&|@|l|i|n|k| |S|t|r|i|n|g|}|.+0#0000e05&| @1|T|h|e|r|e|f|o|r|e|,| +0#0000000&@6
+||+0#0000e05#a8a8a8255| | +0&#ffffff0@4|*| |<+0#00e0e07&|e+0#af5f00255&|m|>+0#00e0e07&|e+0#0000000&|i|t|h|e|r|<+0#00e0e07&|/|e+0#af5f00255&|m|>+0#00e0e07&| +0#0000e05&|o|f| |t|h|e| |f|o|l@1|o|w|i|n|g| |d|e|c|l|a|r|a|t|i|o|n|s| |i|s| |a|c@1|e|p|t|a|b|l|e|:| +0#0000000&@5
+||+0#0000e05#a8a8a8255| | +0&#ffffff0@4|*| +0#ffffff16#ff404010| +0#0000e05#ffffff0|{+0#e000e06&|@|s|n|i|p@1|e|t| |l+0#00e0003&|a|n|g|=+0#e000e06&|"+0#e000002&|j|a|v|a|"|:+0#e000e06&| +0#0000000&@42
+||+0#0000e05#a8a8a8255| | +0#e000e06#ffffff0@4>*| |/@1| |@+0#0000000&|h|i|g|h|l|i|g|h|t| +0#e000e06&|s+0#00e0003&|u|b|s|t|r|i|n|g|=+0#e000e06&|"+0#e000002&|m|a|i|n|"| +0#e000e06&|t+0#00e0003&|y|p|e|=+0#e000e06&|"+0#e000002&|i|t|a|l|i|c|"|:+0#e000e06&| +0#0000000&@20
+||+0#0000e05#a8a8a8255| | +0#e000e06#ffffff0@4|*| |p|u|b|l|i|c| |s|t|a|t|i|c| |v|o|i|d| |m|a|i|n|(|S|t|r|i|n|g|[|]| |a|r|g|s|)| |{| |}| +0#0000000&@23
+||+0#0000e05#a8a8a8255| | +0#e000e06#ffffff0@4|*| |}|<+0#00e0e07&|b+0#af5f00255&|r| +0#00e0e07&|/|>|<|p+0#af5f00255&|r|e| +0#00e0e07&|c+0#00e0003&|l|a|s@1|=+0#00e0e07&|"+0#e000002&|s|n|i|p@1|e|t|"|>+0#00e0e07&| +0#0000000&@37
+||+0#0000e05#a8a8a8255| | +0&#ffffff0@4|*|{+0#e000e06&|@|c|o|d|e| |p|u|b|l|i|c| |s|t|a|t|i|c| |v|o|i|d| |m|a|i|n|(|S|t|r|i|n|g|.@2| |a|r|g|s|)| |{| |}@1|<+0#00e0e07&|/|p+0#af5f00255&|r|e|>+0#00e0e07&| +0#0000000&@9
+||+0#0000e05#a8a8a8255| | +0&#ffffff0@4|*| +0#0000000&@66
+||+0#0000e05#a8a8a8255| | +0&#ffffff0@4|*| |@+0#e000e06&|p|a|r|a|m| |a+0#00e0e07&|r|g|s| +0#0000e05&|o|p|t|i|o|n|a|l| |c+0&#ffd7d7255|o|m@1|a|n|d|e|-+0&#ffffff0|l|i|n|e| |a|r|g|u|m|e|n|t|s| +0#ffffff16#ff404010| +0#0000000#ffffff0@20
+||+0#0000e05#a8a8a8255| | +0&#ffffff0@4|*| |@|j+0&#ffd7d7255|l|s| +0&#ffffff0|1|2|.|1|.|4| |I|n|v|o|k|e| |{+0#e000e06&|@|c|o|d|e| |T|e|s|t|.|m|a|i|n|}| +0#0000e05&|*|/| +0#0000000&@26
+| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@3|/+0#0000e05&@1| |@+0#0000000&|s|t|a|r|t| +0#0000e05&|r+0#00e0003&|e|g|i|o|n| +0#0000e05&|=| |m+0#e000002&|a|i|n| +0#ffffff16#ff404010@4| +0#0000000#ffffff0@40
+| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@3|/+0#0000e05&@1| |@+0#0000000&|l|i|n|k| +0#0000e05&|s+0#00e0003&|u|b|s|t|r|i|n|g| +0#0000e05&|=| |'+0#e000002&|S|t|r|i|n|g|'| +0#0000e05&|t+0#00e0003&|a|r|g|e|t| +0#0000e05&|=| |'+0#e000002&|j|a|v|a|.|l|a|n|g|.|S|t|r|i|n|g|'| +0#0000e05&|:| +0#0000000&@9
+| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@3|p+0#00e0003&|u|b|l|i|c| +0#0000000&|s+0#00e0003&|t|a|t|i|c| +0#0000000&|v+0#00e0003&|o|i|d| +0#0000000&|m|a|i|n|(|S|t|r|i|n|g|[|]| |a|r|g|s|)| |{| |}| @26
+| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@3|/+0#0000e05&@1| |@+0#0000000&|e|n|d| +0#ffffff16#ff404010| +0#0000000#ffffff0@60
+| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72
+|-+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@3|/+0#0000e05&|*@1| |{+8#e000e06&|@+0&&|r|e|t|u|r|n| +8&&|a|n| |e|m|p|t|y| |s|t|r|i|n|g|}| +0#0000000&@39
+||+0#0000e05#a8a8a8255| | +0&#ffffff0@4|*| |@+0#e000e06&|s|e@1| |<+0#00e0e07&|a+0#af5f00255&| +0#00e0e07&|h+0#00e0003&|r|e|f|=+0#00e0e07&|"+0#e000002&|h|t@1|p|s|:|/@1|d|o|c|s|.|o|r|a|c|l|e|.|c|o|m|/|j|a|v|a|s|e|/|s|p|e|c|s|/|j|l|s|/|s|e|2|1|/|h|t|m|@+0#4040ff13&@2
+| +0#0000000&@56|1|0|9|,|3|-|6| @6|9|1|%| 
diff --git a/runtime/syntax/testdir/dumps/java_comments_html_07.dump b/runtime/syntax/testdir/dumps/java_comments_html_07.dump
new file mode 100644
index 0000000..a9384f3
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/java_comments_html_07.dump
@@ -0,0 +1,20 @@
+||+0#0000e05#a8a8a8255| | +0&#ffffff0@4|*| |@+0#e000e06&|s|e@1| |<+0#00e0e07&|a+0#af5f00255&| +0#00e0e07&|h+0#00e0003&|r|e|f|=+0#00e0e07&|"+0#e000002&|h|t@1|p|s|:|/@1|d|o|c|s|.|o|r|a|c|l|e|.|c|o|m|/|j|a|v|a|s|e|/|s|p|e|c|s|/|j|l|s|/|s|e|2|1|/|h|t|m|l|/|j
+||+0#0000e05#a8a8a8255| |l+0#e000002#ffffff0|s|-|3|.|h|t|m|l|#|j|l|s|-|3|.|1|0|.|5|"|>+0#00e0e07&|3+8#e000e06&|.|1|0|.|5| |S|t|r|i|n|g| |L|i|t|e|r|a|l|s|<+0#00e0e07&|/|a+0#af5f00255&|>+0#00e0e07&| +0#0000000&@24
+||+0#0000e05#a8a8a8255| | +0&#ffffff0@4|*| |@+0#e000e06&|s|e@1| +0#0000000&@61
+||+0#0000e05#a8a8a8255| | +0&#ffffff0@4|*| |<+0#00e0e07&|a+0#af5f00255&| +0#00e0e07&|h+0#00e0003&|r|e|f|=+0#00e0e07&|"+0#e000002&|h|t@1|p|s|:|/@1|d|o|c|s|.|o|r|a|c|l|e|.|c|o|m|/|j|a|v|a|s|e|/|s|p|e|c|s|/|j|l|s|/|s|e|2|1|/|h|t|m|l|/|j|l|s|-|4|.
+||+0#0000e05#a8a8a8255| |h+0#e000002#ffffff0|t|m|l|#|j|l|s|-|4|.|3|.|2|"|>+0#00e0e07&|4+8#e000e06&|.|3|.|2| |T|h|e| |C|l|a|s@1| |O|b|j|e|c|t|<+0#00e0e07&|/|a+0#af5f00255&|>+0#00e0e07&| +0#0000000&@30
+||+0#0000e05#a8a8a8255| | +0&#ffffff0@4>*| |@+0#e000e06&|s|e@1| |j+0#00e0e07&|a|v|a|.|b|a|s|e|/|j|a|v|a|.|l|a|n|g|.|O|b|j|e|c|t|#|t|o|S|t|r|i|n|g|(|)| +0#0000e05&|*|/| +0#0000000&@20
+| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@3|/+0#0000e05&@1| |@+0#0000000&|s|t|a|r|t| +0#0000e05&|r+0#00e0003&|e|g|i|o|n| +0#0000e05&|=| |t+0#e000002&|o|S|t|r|i|n|g| +0#ffffff16#ff404010| +0#0000000#ffffff0@40
+| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@3|/+0#0000e05&@1| |@+0#0000000&|r|e|p|l|a|c|e| +0#0000e05&|s+0#00e0003&|u|b|s|t|r|i|n|g| +0#0000e05&|=| |'+0#e000002&|"@1|'| +0#0000e05&|r+0#00e0003&|e|p|l|a|c|e|m|e|n|t| +0#0000e05&|=| |"+0#e000002&|\|u|0@1|2@1|\|u|0@1|2@1|"| +0#0000000&@11
+| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@3|/+0#0000e05&@1| |@+0#0000000&|l|i|n|k| +0#0000e05&|r+0#00e0003&|e|g|e|x| +0#0000e05&|=| |'+0#e000002&|\|b|S|t|r|i|n|g|'| +0#0000e05&|t+0#00e0003&|a|r|g|e|t| +0#0000e05&|=| |j+0#e000002&|a|v|a|.|l|a|n|g|.|S|t|r|i|n|g| +0#0000e05&|t+0#00e0003&|y|p|e| +0#0000e05&|=| |l+0#e000002&|i|n|k|p|l|a|i
+| +0#0000e05#a8a8a8255@1|n+0#e000002#ffffff0| +0#0000e05&|:| +0#0000000&@69
+| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@3|@+0#e000e06&|O|v|e|r@1|i|d|e| +0#0000000&|p+0#00e0003&|u|b|l|i|c| +0#0000000&|S|t|r|i|n|g| |t|o|S|t|r|i|n|g|(|)| |{| |r+0#af5f00255&|e|t|u|r|n| +0#0000000&|"+0#e000002&@1|;+0#0000000&| |}| @19
+| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@3|/+0#0000e05&@1| |@+0#0000000&|e|n|d| +0#ffffff16#ff404010| +0#0000000#ffffff0@60
+| +0#0000e05#a8a8a8255@1|}+0#0000000#ffffff0| @71
+|~+0#4040ff13&| @73
+|~| @73
+|~| @73
+|~| @73
+|~| @73
+|~| @73
+| +0#0000000&@56|1|2|5|,|3|-|6| @6|B|o|t| 
diff --git a/runtime/syntax/testdir/dumps/java_comments_markdown_00.dump b/runtime/syntax/testdir/dumps/java_comments_markdown_00.dump
new file mode 100644
index 0000000..baf8f38
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/java_comments_markdown_00.dump
@@ -0,0 +1,20 @@
+| +0#0000e05#a8a8a8255@1>/+0&#ffffff0@1| |V|I|M|_|T|E|S|T|_|S|E|T|U|P| |u|n|l|e|t|!| |g+0&#5fd7ff255|:+0&#ffffff0|j|a|v|a|_|n|o|_|t|a|b|_|s|p|a|c|e|_|e|r@1|o|r| |g|:|j|a|v|a|_|i|g|n|o|r|e|_|j+0&#ffd7d7255|a|v|a|d|o|c| +0#0000000#ffffff0
+| +0#0000e05#a8a8a8255@1|/+0&#ffffff0@1| |V|I|M|_|T|E|S|T|_|S|E|T|U|P| |u|n|l|e|t|!| |g+0&#5fd7ff255|:+0&#ffffff0|j|a|v|a|_|n|o|_|t|r|a|i|l|_|s|p|a|c|e|_|e|r@1|o|r| +0#0000000&@20
+| +0#0000e05#a8a8a8255@1|/+0&#ffffff0@1| |V|I|M|_|T|E|S|T|_|S|E|T|U|P| |l|e|t|[|g|:|j|a|v|a|_|s|p|a|c|e|_|e|r@1|o|r|s|,|g|:|j|a|v|a|_|c|o|m@1|e|n|t|_|s|t|r|i|n|g|s|]|=|[|1+0#e000002&|,+0#0000e05&|1+0#e000002&|]+0#0000e05&| +0#0000000&@1
+| +0#0000e05#a8a8a8255@1|/+0&#ffffff0@1| |V|I|M|_|T|E|S|T|_|S|E|T|U|P| |l|e|t|[|g|:|j|a|v|a|_|i|g|n|o|r|e|_|h|t|m|l|,|g|:|m|a|r|k|d|o|w|n|_|s|y|n|t|a|x|_|c|o|n|c|e|a|l|]|=|[|1+0#e000002&|,+0#0000e05&|1+0#e000002&|]+0#0000e05&
+| +0&#a8a8a8255@1| +0#0000000#ffffff0@72
+| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72
+| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72
+| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72
+| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72
+| +0#0000e05#a8a8a8255@1|/+0&#ffffff0@1| |V|I|M|_|T|E|S|T|_|S|E|T|U|P| |d|e|f|e|r| |e|x|e|c|u|t|e|(|'|m|a|t|c|h| |V|i|s|u|a|l| |/|\|%|>|2+0#e000002&|1|l|\+0#0000e05&|s|\|+|$|/|'|)| +0#0000000&@11
+| +0#0000e05#a8a8a8255@1|/+0&#ffffff0@1| |V|I|M|_|T|E|S|T|_|S|E|T|U|P| |s+0&#ffd7d7255|e|t|l| +0&#ffffff0|s|p|e|l@1| |f+0&#ffd7d7255|d|c|=+0&#ffffff0|2+0#e000002&| +0#0000e05&|f+0&#ffd7d7255|d|l|=+0&#ffffff0|6+0#e000002&|4| +0#0000e05&|f+0&#ffd7d7255|d|m|=+0&#ffffff0|s|y|n|t|a|x| |f|e|n| |c+0&#ffd7d7255|o|l|e|=+0&#ffffff0|3+0#e000002&| +0#0000e05&|c+0&#ffd7d7255|o|c|u|=+0&#ffffff0|n| +0#0000000&@2
+| +0#0000e05#a8a8a8255@1|/+0&#ffffff0@1| |V|I|M|_|T|E|S|T|_|S|E|T|U|P| |h|i|g|h|l|i|g|h|t| |l|i|n|k| |j+0&#ffd7d7255|a|v|a|C|o|m@1|e|n|t|S|t|a|r|t| +0&#ffffff0|T+0&#ffd7d7255|o|d|o| +0#0000000#ffffff0@18
+| +0#0000e05#a8a8a8255@1|/+0&#ffffff0@1| |V|I|M|_|T|E|S|T|_|S|E|T|U|P| |h|i|g|h|l|i|g|h|t| |l|i|n|k| |j+0&#ffd7d7255|a|v|a|M|a|r|k|d|o|w|n|C|o|m@1|e|n|t|T|i|t|l|e| +0&#ffffff0|U|n|d|e|r|l|i|n|e|d| +0#0000000&@4
+| +0#0000e05#a8a8a8255@1|/+0&#ffffff0@1| |V|I|M|_|T|E|S|T|_|S|E|T|U|P| |h|i|g|h|l|i|g|h|t| |l|i|n|k| |m+0&#ffd7d7255|a|r|k|d|o|w|n|H|2| +0&#ffffff0|N+0&#ffd7d7255|o|n|T|e|x|t| +0#0000000#ffffff0@21
+| +0#0000e05#a8a8a8255@1|/+0&#ffffff0@1| |V|I|M|_|T|E|S|T|_|S|E|T|U|P| |h|i|g|h|l|i|g|h|t| |l|i|n|k| |m+0&#ffd7d7255|a|r|k|d|o|w|n|H|e|a|d|i|n|g|R|u|l|e| +0&#ffffff0|N+0&#ffd7d7255|o|n|T|e|x|t| +0#0000000#ffffff0@12
+| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72
+| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72
+| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72
+| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72
+@57|1|,|1| @10|T|o|p| 
diff --git a/runtime/syntax/testdir/dumps/java_comments_markdown_01.dump b/runtime/syntax/testdir/dumps/java_comments_markdown_01.dump
new file mode 100644
index 0000000..3ec58c9
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/java_comments_markdown_01.dump
@@ -0,0 +1,20 @@
+| +0#0000e05#a8a8a8255@1|/+0&#ffffff0@1| |V|I|M|_|T|E|S|T|_|S|E|T|U|P| |h|i|g|h|l|i|g|h|t| |l|i|n|k| |m+0&#ffd7d7255|a|r|k|d|o|w|n|H|2| +0&#ffffff0|N+0&#ffd7d7255|o|n|T|e|x|t| +0#0000000#ffffff0@21
+| +0#0000e05#a8a8a8255@1|/+0&#ffffff0@1| |V|I|M|_|T|E|S|T|_|S|E|T|U|P| |h|i|g|h|l|i|g|h|t| |l|i|n|k| |m+0&#ffd7d7255|a|r|k|d|o|w|n|H|e|a|d|i|n|g|R|u|l|e| +0&#ffffff0|N+0&#ffd7d7255|o|n|T|e|x|t| +0#0000000#ffffff0@12
+| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72
+| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72
+| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72
+| +0#0000e05#a8a8a8255@1> +0#0000000#ffffff0@72
+| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72
+|-+0#0000e05#a8a8a8255| |/+0&#ffffff0|*@1|/| +0#0000000&|/+0#0000001#ffff4012|*|/+0#0000e05#ffffff0| |*+0#0000001#ffff4012|/| +0#0000000#ffffff0|/+0#0000001#ffff4012|*| +0#0000e05#ffffff0|/+0#ffffff16#ff404010|*+0#0000001#ffff4012|/| +0#0000000#ffffff0|/+0#0000001#ffff4012|*|/+0#ffffff16#ff404010|*+0#0000001#ffff4012|/| +0#0000000#ffffff0|/+0#0000001#ffff4012|*|/+0#0000e05#ffffff0|/+0#ffffff16#ff404010|*+0#0000001#ffff4012|/| +0#0000000#ffffff0|/+0#0000e05&@2| +8#e000e06&|M|a|r|k|d|o|w|n| |c|o|m@1|e|n|t| |t|e|s|t|s|.| +0#0000000&@13
+||+0#0000e05#a8a8a8255| |/+0&#ffffff0@2| +0#0000000&@69
+||+0#0000e05#a8a8a8255| |/+0&#ffffff0@2| +0#0000000&|T+0#0000e05&|h|e|r|e| |i|s| |n|o| |e|n|t|r|y| |p|o|i|n|t| |m|e|t|h|o|d| |`+0#e000e06&|m|a|i|n|`|:+0#0000e05&| +0#0000000&@30
+||+0#0000e05#a8a8a8255| |/+0&#ffffff0@2| +0#0000000&|{+0#e000e06&|@|s|n|i|p@1|e|t| |f+0#00e0003&|i|l|e| +0#e000e06&|=| |M+0#e000002&|a|r|k|d|o|w|n|S|n|i|p@1|e|t|s|.|j|a|v|a| +0#e000e06&|r+0#00e0003&|e|g|i|o|n| +0#e000e06&|=| |m+0#e000002&|a|i|n| +0#e000e06&|i+0#00e0003&|d| +0#e000e06&|=| |_+0#e000002&|0|1|}+0#e000e06&| +0#0000000&@6
+||+0#0000e05#a8a8a8255| |/+0&#ffffff0@2| +0#0000000&@69
+||+0#0000e05#a8a8a8255| |/+0&#ffffff0@2| +0#0000000&|T+0#0000e05&|h|e|r|e| |i|s| |n|o| |t|e|x|t|u|a|l| |r|e|p|r|e|s|e|n|t|a|t|i|o|n|:| +0#0000000&@33
+||+0#0000e05#a8a8a8255| |/+0&#ffffff0@2| +0#0000000&|{+0#e000e06&|@|s|n|i|p@1|e|t| |c+0#00e0003&|l|a|s@1| +0#e000e06&|=| |M+0#e000002&|a|r|k|d|o|w|n|S|n|i|p@1|e|t|s| +0#e000e06&|r+0#00e0003&|e|g|i|o|n| +0#e000e06&|=| |t+0#e000002&|o|S|t|r|i|n|g| +0#e000e06&|i+0#00e0003&|d| +0#e000e06&|=| |_+0#e000002&|0|2|}+0#e000e06&| +0#0000000&@6
+| +0#0000e05#a8a8a8255@1|c+0#00e0003#ffffff0|l|a|s@1| +0#0000000&|M|a|r|k|d|o|w|n|C|o|m@1|e|n|t|s|T|e|s|t|s| |i+0#00e0003&|m|p|l|e|m|e|n|t|s| +0#0000000&|C|o|m|p|a|r|a|b|l|e|<|M|a|r|k|d|o|w|n|C|o|m@1|e|n|t|s|T|e|s|t|s|>| 
+| +0#0000e05#a8a8a8255@1|{+0#0000000#ffffff0| @2|/+0#0000e05&@1| |J+0&#ffd7d7255|D|K| +0&#ffffff0|2+0#e000002&|3|++0#0000e05&|.| +0#0000000&@57
+| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@3|p+0#00e0003&|r|i|v|a|t|e| +0#0000000&|M|a|r|k|d|o|w|n|C|o|m@1|e|n|t|s|T|e|s|t|s|(|)| |{| |}| @33
+| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72
+|-+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@3|/+0#0000e05&@2| +8#e000e06&|N|o|-|o|p|,| |i|.| +0#0000e05&|e+0&#5fd7ff255|.+0&#ffffff0| |n+0&#5fd7ff255|o| +0&#ffffff0|o|p|e|r|a|t|i|o|n|.| +0#0000000&@38
+@57|1|9|,|0|-|1| @7|1|0|%| 
diff --git a/runtime/syntax/testdir/dumps/java_comments_markdown_02.dump b/runtime/syntax/testdir/dumps/java_comments_markdown_02.dump
new file mode 100644
index 0000000..5549348
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/java_comments_markdown_02.dump
@@ -0,0 +1,20 @@
+|-+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@3|/+0#0000e05&@2| +8#e000e06&|N|o|-|o|p|,| |i|.| +0#0000e05&|e+0&#5fd7ff255|.+0&#ffffff0| |n+0&#5fd7ff255|o| +0&#ffffff0|o|p|e|r|a|t|i|o|n|.| +0#0000000&@38
+||+0#0000e05#a8a8a8255| | +0&#ffffff0@3|/@2| +0#0000000&|(+0#0000e05&|{+0#e000e06&|@|l|i|t|e|r|a|l|@|l|i|t|e|r|a|l|}| +0#0000e05&|m|a|y| |b|e| |u|s|e|d| |w|i|t|h| |`+0#e000e06&|.|`| +0#0000e05&|f|o|r| |c|o|n|t|r|a|c|t|i|o|n|.|)| +0#0000000&@6
+||+0#0000e05#a8a8a8255| | +0&#ffffff0@3|/@2| |@+0#e000e06&|r|e|t|u|r|n| +0#0000e05&|`+0#e000e06&|n|u|l@1|`| +0#0000000&@50
+| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@3|V|o|i|d| |n|o|O|p|1|(|)| |{| |r+0#af5f00255&|e|t|u|r|n| +0#0000000&|n+0#e000002&|u|l@1|;+0#0000000&| |}| @39
+| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72
+|-+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@3>/+0#0000e05&@2| +8#e000e06&|N|o|-|o|p|,| |i|.|e|.| +0#0000e05&|n|o| |o|p|e|r|a|t|i|o|n|.| +0#0000000&@39
+||+0#0000e05#a8a8a8255| | +0&#ffffff0@3|/@2| +0#0000000&|(+0#0000e05&|{+0#e000e06&|@|l|i|t|e|r|a|l|<|!|-@1| |-@1|>|}| +0#0000e05&|m|a|y| |b|e| |u|s|e|d| |a|f|t|e|r| |`+0#e000e06&|.|`| +0#0000e05&|f|o|r| |c|o|n|t|r|a|c|t|i|o|n|.|)| +0#0000000&@5
+||+0#0000e05#a8a8a8255| | +0&#ffffff0@3|/@2| |@+0#e000e06&|r|e|t|u|r|n| +0#0000e05&|`+0#e000e06&|n|u|l@1|`| +0#0000000&@50
+| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@3|V|o|i|d| |n|o|O|p|2|(|)| |{| |r+0#af5f00255&|e|t|u|r|n| +0#0000000&|n+0#e000002&|u|l@1|;+0#0000000&| |}| @39
+| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72
+|-+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@3|/+0#0000e05&@2| +8#e000e06&|N|o|-|o|p|,| |i|.|e|\|u+8&#ffd7d7255|0@1|2|e| +8&#ffffff0|n|o| |o|p|e|r|a|t|i|o|n|.| +0#0000000&@34
+||+0#0000e05#a8a8a8255| | +0&#ffffff0@3|/@2| +0#0000000&|(+0#0000e05&|{+0#e000e06&|@|l|i|t|e|r|a|l|\|u|0@1|5|c|u|0@1|2|e|}| +0#0000e05&|i|s| |p|r|o|c|e|s@1|e|d| |e|a|r|l|y|,| |u|s|e| |a|l|t|e|r|n|a|t|i|v|e|s|.|)| +0#0000000&@3
+||+0#0000e05#a8a8a8255| | +0&#ffffff0@3|/@2| |@+0#e000e06&|r|e|t|u|r|n| +0#0000e05&|`+0#e000e06&|n|u|l@1|`| +0#0000000&@50
+| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@3|V|o|i|d| |n|o|O|p|3|(|)| |{| |r+0#af5f00255&|e|t|u|r|n| +0#0000000&|n+0#e000002&|u|l@1|;+0#0000000&| |}| @39
+| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72
+|-+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@3|/+0#0000e05&@2| +8#e000e06&|N|o|-|o|p|,| |i|.|e|{+0&&|@|l|i|t|e|r|a|l| |.|}| +8&&|n|o| |o|p|e|r|a|t|i|o|n|.| +0#0000000&@28
+||+0#0000e05#a8a8a8255| | +0&#ffffff0@3|/@2| |@+0#e000e06&|r|e|t|u|r|n| +0#0000e05&|`+0#e000e06&|n|u|l@1|`| +0#0000000&@50
+| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@3|V|o|i|d| |n|o|O|p|4|(|)| |{| |r+0#af5f00255&|e|t|u|r|n| +0#0000000&|n+0#e000002&|u|l@1|;+0#0000000&| |}| @39
+| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72
+@57|3|7|,|2|-|5| @7|2|4|%| 
diff --git a/runtime/syntax/testdir/dumps/java_comments_markdown_03.dump b/runtime/syntax/testdir/dumps/java_comments_markdown_03.dump
new file mode 100644
index 0000000..4c325cb
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/java_comments_markdown_03.dump
@@ -0,0 +1,20 @@
+| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72
+|-+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@3|/+0#0000e05&@2| +8#e000e06&|N|o|-|o|p|,| |i|.|e|.|<+0&&|!|-@1| |-@1|>| +8&&|n|o| |o|p|e|r|a|t|i|o|n|.| +0#0000000&@31
+||+0#0000e05#a8a8a8255| | +0&#ffffff0@3|/@2| |@+0#e000e06&|r|e|t|u|r|n| +0#0000e05&|`+0#e000e06&|n|u|l@1|`| +0#0000000&@50
+| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@3|V|o|i|d| |n|o|O|p|5|(|)| |{| |r+0#af5f00255&|e|t|u|r|n| +0#0000000&|n+0#e000002&|u|l@1|;+0#0000000&| |}| @39
+| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72
+|-+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@3>/+0#0000e05&@2| +8#e000e06&|N|o|-|o|p|,| |i|.|e|.|&+0&&|n|b|s|p|;|n+8&&|o| |o|p|e|r|a|t|i|o|n|.| +0#0000000&@34
+||+0#0000e05#a8a8a8255| | +0&#ffffff0@3|/@2| |@+0#e000e06&|r|e|t|u|r|n| +0#0000e05&|`+0#e000e06&|n|u|l@1|`| +0#0000000&@50
+| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@3|V|o|i|d| |n|o|O|p|6|(|)| |{| |r+0#af5f00255&|e|t|u|r|n| +0#0000000&|n+0#e000002&|u|l@1|;+0#0000000&| |}| @39
+| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72
+| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@3|/+0#0000e05&@2| |{+8#e000e06&|@+0&&|r|e|t|u|r|n| +8&&|`+0&&|n|u|l@1|`|,+8&&| |w|i|t|h| |n|o|-|o|p|,| |i|.|e|.| |n|o| |o|p|e|r|a|t|i|o|n|}| +0#0000000&@17
+| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@3|V|o|i|d| |n|o|O|p|7|(|)| |{| |r+0#af5f00255&|e|t|u|r|n| +0#0000000&|n+0#e000002&|u|l@1|;+0#0000000&| |}| @39
+| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72
+| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@3|/+0#0000e05&@2| |{+8#e000e06&|@+0&&|r|e|t|u|r|n| +8&&|`+0&&|n|u|l@1|`|,+8&&| |w|i|t|h| |n|o|-|o|p|,| |i|.|e|.| |n|o| |o|p|e|r|a|t|i|o|n|}|.@1| +0#0000000&@15
+| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@3|V|o|i|d| |n|o|O|p|8|(|)| |{| |r+0#af5f00255&|e|t|u|r|n| +0#0000000&|n+0#e000002&|u|l@1|;+0#0000000&| |}| @39
+| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72
+| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@3|/+0#0000e05&@2| |{+8#e000e06&|@+0&&|r|e|t|u|r|n| +8&&|`+0&&|n|u|l@1|`|,+8&&| |w|i|t|h| |n|o|-|o|p|,| |i|.|e|.| |n|o| |o|p|e|r|a|t|i|o|n|}| |.| |.| +0#0000000&@13
+| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@3|V|o|i|d| |n|o|O|p|9|(|)| |{| |r+0#af5f00255&|e|t|u|r|n| +0#0000000&|n+0#e000002&|u|l@1|;+0#0000000&| |}| @39
+| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72
+|-+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@3|/+0#0000e05&@2| |{+8#e000e06&|@+0&&|r|e|t|u|r|n| +8&&|t|h|e| |m|a|j|o|r| |J|a|v|a| |v|e|r|s|i|o|n|}| +0#0000000&@32
+@57|5@1|,|2|-|5| @7|3|8|%| 
diff --git a/runtime/syntax/testdir/dumps/java_comments_markdown_04.dump b/runtime/syntax/testdir/dumps/java_comments_markdown_04.dump
new file mode 100644
index 0000000..b91a80b
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/java_comments_markdown_04.dump
@@ -0,0 +1,20 @@
+|-+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@3|/+0#0000e05&@2| |{+8#e000e06&|@+0&&|r|e|t|u|r|n| +8&&|t|h|e| |m|a|j|o|r| |J|a|v|a| |v|e|r|s|i|o|n|}| +0#0000000&@32
+||+0#0000e05#a8a8a8255| | +0&#ffffff0@3|/@2| |@+0#e000e06&|h|i|d@1|e|n| +0#0000000&@57
+| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@3|p+0#00e0003&|r|o|t|e|c|t|e|d| +0#0000000&|i+0#00e0003&|n|t| +0#0000000&|m|a|j|o|r|V|e|r|s|i|o|n|(|)| |{| |r+0#af5f00255&|e|t|u|r|n| +0#0000000&|2+0#e000002&|3|;+0#0000000&| |}| @25
+| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72
+|-+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@3|/+0#0000e05&@2| @3|{+8#e000e06&|@|s|u|m@1|a|r|y| |C|o|m|p|a|r|e|s| |t|h|i|s| |i|n|s|t|a|n|c|e| |w|i|t|h| |t|h|e| |p|a|s@1|e|d| |`+0&&|t|h|a|t|`| +0#0000000&@6
+||+0#0000e05#a8a8a8255| | +0&#ffffff0@3>/@2| +0#0000000&|i+8#e000e06&|n|s|t|a|n|c|e| |f|o|r| |o|r|d|e|r| |b|y| |i|n|v|o|k|i|n|g| |[+0#0000000&|I+8#e000e06&|n|t|e|g|e|r|.|c|o|m|p|a|r|e|(|i|n|t|,| |i|n|t|)|]+0#0000000&| @6
+||+0#0000e05#a8a8a8255| | +0&#ffffff0@3|/@2| +0#0000000&|a+8#e000e06&|n|d| |p|a|s@1|i|n|g| |i|t| |`+0&&|t|h|i|s|.|m|a|j|o|r|V|e|r|s|i|o|n|(|)|`| +8&&|a|n|d| +0#0000000&@24
+||+0#0000e05#a8a8a8255| | +0&#ffffff0@3|/@2| +0#0000000&|`+0#e000e06&|t|h|a|t|.|m|a|j|o|r|V|e|r|s|i|o|n|(|)|`| +8&&|a|s| |r|e|s|p|e|c|t|i|v|e| |@|a|r|g|u|m|e|n|t|s|.|}| +0#0000000&@16
+||+0#0000e05#a8a8a8255| | +0&#ffffff0@3|/@2| +0#0000000&|{+0#e000e06&|@|i|n|h|e|r|i|t|D|o|c|}| +0#0000000&@51
+| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@3|@+0#e000e06&|O|v|e|r@1|i|d|e| +0#0000000&|p+0#00e0003&|u|b|l|i|c| +0#0000000&|i+0#00e0003&|n|t| +0#0000000&|c|o|m|p|a|r|e|T|o|(|M|a|r|k|d|o|w|n|C|o|m@1|e|n|t|s|T|e|s|t|s| |t|h|a|t|)| @10
+|-+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@3|{| @67
+||+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@7|j|a|v|a|.|u|t|i|l|.|O|b|j|e|c|t|s|.|r|e|q|u|i|r|e|N|o|n|N|u|l@1|(|t|h|a|t|,| |"+0#e000002&|t|h|a|t|"|)+0#0000000&|;| @17
+||+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@7|r+0#af5f00255&|e|t|u|r|n| +0#0000000&|I|n|t|e|g|e|r|.|c|o|m|p|a|r|e|(|t+0#00e0003&|h|i|s|.+0#0000000&|m|a|j|o|r|V|e|r|s|i|o|n|(|)|,| @21
+||+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@23|t|h|a|t|.|m|a|j|o|r|V|e|r|s|i|o|n|(|)@1|;| @27
+||+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@3|}| @67
+| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72
+|-+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@3|/+0#0000001#ffff4012|*|*+0#0000e05#ffffff0| |R|e|t|u|r|n|s| |a|n| |e|m|p|t|y| |s|t|r|i|n|g| |f|o|r| |a|n| |@|O|v|e|r@1|i|d|e| |a|n@1|o|t|a|t|e|d| |m|e|t|h|o|d| +0#0000000&@7
+||+0#0000e05#a8a8a8255| | +0&#ffffff0@3|*| |(|s|e@1| |C|h|a|p|t|e|r| |9+0#e000002&|.|6|.|4|.|4| +0#0000e05&|{|@|l|i|t|e|r|a|l| |@|O|v|e|r@1|i|d|e|}| |i|n| |a| |J|a|v|a| |L|a|n|g|u|a|g|e| +0#0000000&@6
+||+0#0000e05#a8a8a8255| | +0&#ffffff0@3|*| |S|p|e|c|i|f|i|c|a|t|i|o|n|)| |o|v|e|r@1|i|d@1|e|n| |f|r|o|m| |<|c|o|d|e|>|j|a|v|a|.|l+0&#ffd7d7255|a|n|g|.+0&#ffffff0|O|b|j|e|c|t|<|/|c|o|d|e|>| +0#0000000&@6
+@57|7|3|,|2|-|5| @7|5|2|%| 
diff --git a/runtime/syntax/testdir/dumps/java_comments_markdown_05.dump b/runtime/syntax/testdir/dumps/java_comments_markdown_05.dump
new file mode 100644
index 0000000..155a1d3
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/java_comments_markdown_05.dump
@@ -0,0 +1,20 @@
+||+0#0000e05#a8a8a8255| | +0&#ffffff0@3|*| |S|p|e|c|i|f|i|c|a|t|i|o|n|)| |o|v|e|r@1|i|d@1|e|n| |f|r|o|m| |<|c|o|d|e|>|j|a|v|a|.|l+0&#ffd7d7255|a|n|g|.+0&#ffffff0|O|b|j|e|c|t|<|/|c|o|d|e|>| +0#0000000&@6
+||+0#0000e05#a8a8a8255| | +0&#ffffff0@3|*| +0#0000000&@67
+||+0#0000e05#a8a8a8255| | +0&#ffffff0@3|*| |@|r|e|t|u|r|n| |a|n| |e|m|p|t|y| |s|t|r|i|n|g| |*+0#0000001#ffff4012|/|/+0#0000e05#ffffff0@1| |N|o| |p|e|r|i|o|d| |f|o|r| |t|h|e| |a|b|o|v|e| |s|u|m@1|a|r|y|!| +0#0000000&@5
+| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@3|p+0#00e0003&|r|i|v|a|t|e| +0#0000000&|S|t|r|i|n|g| |a|s|S|t|r|i|n|g|(|)| |{| |r+0#af5f00255&|e|t|u|r|n| +0#0000000&|"+0#e000002&@1|;+0#0000000&| |}| @28
+| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72
+|-+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@3>/+0#0000e05&@2| +8#e000e06&|R|e|t|u|r|n|s| |a|n| |e|m|p|t|y| |s|t|r|i|n|g| |f|o|r| |a|n| |@|O|v|e|r@1|i|d|e| |a|n@1|o|t|a|t|e|d| |m|e|t|h|o|d| +0#0000000&@7
+||+0#0000e05#a8a8a8255| | +0&#ffffff0@3|/@2| +0#0000000&|(+8#e000e06&|s|e@1| |C|h|a|p|t|e|r| |9|.|6|.|4|.|4| |{+0&&|@|l|i|t|e|r|a|l| |@|O|v|e|r@1|i|d|e|}| +8&&|i|n| |a| |J|a|v|a| |L|a|n|g|u|a|g|e| +0#0000000&@4
+||+0#0000e05#a8a8a8255| | +0&#ffffff0@3|/@2| +0#0000000&|S+8#e000e06&|p|e|c|i|f|i|c|a|t|i|o|n|)| |o|v|e|r@1|i|d@1|e|n| |f|r|o|m| |`+0&&|j|a|v|a|.|l|a|n|g|.|O|b|j|e|c|t|`| +0#0000000&@15
+||+0#0000e05#a8a8a8255| | +0&#ffffff0@3|/@2| +0#0000000&@65
+||+0#0000e05#a8a8a8255| | +0&#ffffff0@3|/@2| |@+0#e000e06&|r|e|t|u|r|n| +0#0000e05&|a|n| |e|m|p|t|y| |s|t|r|i|n|g| |/@2| +8#e000e06&|N|o| |p|e|r|i|o|d| |f|o|r| |t|h|e| |a|b|o|v|e| |s|u|m@1|a|r|y|!| +0#0000000&@4
+| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@3|@+0#e000e06&|O|v|e|r@1|i|d|e| +0#0000000&|p+0#00e0003&|u|b|l|i|c| +0#0000000&|S|t|r|i|n|g| |t|o|S|t|r|i|n|g|(|)| |{| |r+0#af5f00255&|e|t|u|r|n| +0#0000000&|a|s|S|t|r|i|n|g|(|)|;| |}| @11
+| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72
+| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@3|/+0#0000e05&@2| +8#e000e06&|A| |s|u|m@1|a|r|y| |c|o|m@1|e|n|t|.| +0#0000000&@46
+| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@3|s+0#00e0003&|t|a|t|i|c| +0#0000000&|f+0#00e0003&|i|n|a|l| +0#0000000&|S|t|r|i|n|g| |M|A|R|K|D|O|W|N|_|C|O|M@1|E|N|T|_|A| |=| |"+0#e000002&|/@2|"|;+0#0000000&| @21
+| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@3|/+0#0000e05&@2| |N|o| |s|u|m@1|a|r|y| |c|o|m@1|e|n|t| |(|t|r|y| |f|i|d@1|l|i|n|g| |w|i|t|h| |t|h|e| |a|b|o|v|e| |s|t|r|i|n|g| |v|a|l|u|e|)|.| +0#0000000&@2
+| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@3|s+0#00e0003&|t|a|t|i|c| +0#0000000&|f+0#00e0003&|i|n|a|l| +0#0000000&|S|t|r|i|n|g| |M|A|R|K|D|O|W|N|_|C|O|M@1|E|N|T|_|B| |=| |"+0#e000002&|/@2|"|;+0#0000000&| @21
+| +0#0000e05#a8a8a8255@1|}+0#0000000#ffffff0| @71
+| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72
+| +0#0000e05#a8a8a8255@1|/+0&#ffffff0@1| |j+0&#ffd7d7255|a|v|a|d|o|c| +0&#ffffff0|-@1|s|n|i|p@1|e|t|-|p|a|t|h| |.| |-@1|s|o|u|r|c|e|-|p|a|t|h| |.| |-|d| |/|t+0&#ffd7d7255|m|p|/+0&#ffffff0|m+0&#ffd7d7255|d|_+0&#ffffff0|d|o|c|s|/| |-|p|a|c|k|a|g|e| |\| +0#0000000&@1
+@57|9|1|,|2|-|5| @7|6@1|%| 
diff --git a/runtime/syntax/testdir/dumps/java_comments_markdown_06.dump b/runtime/syntax/testdir/dumps/java_comments_markdown_06.dump
new file mode 100644
index 0000000..d4018da
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/java_comments_markdown_06.dump
@@ -0,0 +1,20 @@
+| +0#0000e05#a8a8a8255@1|/+0&#ffffff0@1| |j+0&#ffd7d7255|a|v|a|d|o|c| +0&#ffffff0|-@1|s|n|i|p@1|e|t|-|p|a|t|h| |.| |-@1|s|o|u|r|c|e|-|p|a|t|h| |.| |-|d| |/|t+0&#ffd7d7255|m|p|/+0&#ffffff0|m+0&#ffd7d7255|d|_+0&#ffffff0|d|o|c|s|/| |-|p|a|c|k|a|g|e| |\| +0#0000000&@1
+| +0#0000e05#a8a8a8255@1|/+0&#ffffff0@1| +0#ffffff16#ff404010| +0#0000e05#ffffff0|-|t|a|g| |'|j+0&#ffd7d7255|l|s|:+0&#ffffff0|a|:|S|e@1| |J|a|v|a| |L|a|n|g|u|a|g|e| |S|p|e|c|i|f|i|c|a|t|i|o|n|:|'| |M+0&#ffd7d7255|a|r|k|d|o|w|n|S|n|i|p@1|e|t|s|.+0&#ffffff0|j|a|v|a| +0#0000000&@1
+| +0#0000e05#a8a8a8255@1|/+0&#ffffff0@2| +8#e000e06&|S|n|i|p@1|e|t|s| |f|o|r| |M|a|r|k|d|o|w|n| |c|o|m@1|e|n|t| |t|e|s|t|s|.| +0#0000000&@32
+| +0#0000e05#a8a8a8255@1|c+0#00e0003#ffffff0|l|a|s@1| +0#0000000&|M|a|r|k|d|o|w|n|S|n|i|p@1|e|t|s| @50
+| +0#0000e05#a8a8a8255@1|{+0#0000000#ffffff0| @2|/+0#0000001#ffff4012|*| +0#ffffff16#ff404010| +0#0000e05#ffffff0|T|R|A|I|L|I|N|G| |B|L|A|N|K|S| |A|N|D| |M+0&#ffd7d7255|E|S@1|P|I|L@1|I|N|G|S| +0&#ffffff0|A|R|E| |S|I|G|N|I|F|I|C|A|N|T|!| |*+0#0000001#ffff4012|/| +0#0000000#ffffff0@12
+| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@3>p+0#00e0003&|r|i|v|a|t|e| +0#0000000&|M|a|r|k|d|o|w|n|S|n|i|p@1|e|t|s|(|)| |{| |}| @38
+| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72
+|-+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@3|/+0#0000e05&@2| +8#e000e06&|T|h|e| |m|e|t|h|o|d| |[+0#0000000&|`+0#e000e06&|m|a|i|n|`|]+0#0000000&| +8#e000e06&|m|u|s|t| |b|e| |d|e|c|l|a|r|e|d| |`+0&&|p|u|b|l|i|c|`|,+8&&| +0#0000000&@18
+||+0#0000e05#a8a8a8255| | +0&#ffffff0@3|/@2| +0#0000000&|`+0#e000e06&|s|t|a|t|i|c|`|,+8&&| |a|n|d| |`+0&&|v|o|i|d|`|.+8&&| +0#0000e05&@1|I|t| |m|u|s|t| |s|p|e|c|i|f|y| |a| |f|o|r|m|a|l| |p|a|r|a|m|e|t|e|r| +0#0000000&@7
+||+0#0000e05#a8a8a8255| | +0&#ffffff0@3|/@2| +0#0000000&|w+0#0000e05&|h|o|s|e| |d|e|c|l|a|r|e|d| |t|y|p|e| |i|s| |a|r@1|a|y| |o|f| |[+0#0000000&|S+8#e000e06&|t|r|i|n|g|]+0#0000000&|.+0#0000e05&| @1|T|h|e|r|e|f|o|r|e|,| +0#0000000&@11
+||+0#0000e05#a8a8a8255| | +0&#ffffff0@3|/@2| +0#0000000&|e|i|t|h|e|r| +0#0000e05&|o|f| |t|h|e| |f|o|l@1|o|w|i|n|g| |d|e|c|l|a|r|a|t|i|o|n|s| |i|s| |a|c@1|e|p|t|a|b|l|e|.| @1|[|^|\+0#e000e06&|*|]+0#0000e05&| +0#0000000&@6
+||+0#0000e05#a8a8a8255| | +0&#ffffff0@3|/@2| +0#0000000&@65
+||+0#0000e05#a8a8a8255| | +0&#ffffff0@3|/@2| +0#e000e06&|-@62| +0#0000000&@1
+||+0#0000e05#a8a8a8255| | +0&#ffffff0@3|/@2| +0#4040ff13&|D|E|C|L|A|R|A|T|I|O|N|S| |(|[+0#0000000&|m+8#e000e06&|a|i|n|(|S|t|r|i|n|g|\+0&&|[|\|]|)+8&&|]+0#0000000&|[+0#0000e05&|#+0#00e0003&|m|a|i|n|(|S|t|r|i|n|g|\|[|\|]|)|]+0#0000e05&|)+0#4040ff13&|:| +0#0000000&@11
+||+0#0000e05#a8a8a8255| | +0&#ffffff0@3|/@2| +0#4040ff13&|-@52| +0#0000000&@11
+||+0#0000e05#a8a8a8255| | +0&#ffffff0@3|/@2| +0#af5f00255&|*| +0#0000e05&|E|.|g|.| |{+0#e000e06&|@|s|n|i|p@1|e|t| |l+0#00e0003&|a|n|g|=+0#e000e06&|"+0#e000002&|j|a|v|a|"|:+0#e000e06&| +0#0000000&@35
+||+0#0000e05#a8a8a8255| | +0#e000e06#ffffff0@3|/@2| |/@1| |@+0#0000000&|h|i|g|h|l|i|g|h|t| +0#e000e06&|s+0#00e0003&|u|b|s|t|r|i|n|g|=+0#e000e06&|"+0#e000002&|m|a|i|n|"| +0#e000e06&|t+0#00e0003&|y|p|e|=+0#e000e06&|"+0#e000002&|i|t|a|l|i|c|"|:+0#e000e06&| +0#0000000&@19
+||+0#0000e05#a8a8a8255| | +0#e000e06#ffffff0@3|/@2| @3|p|u|b|l|i|c| |s|t|a|t|i|c| |v|o|i|d| |m|a|i|n|(|S|t|r|i|n|g|[|]| |a|r|g|s|)| |{| |}| +0#0000000&@19
+||+0#0000e05#a8a8a8255| | +0#e000e06#ffffff0@3|/@2| |}| +0#0000000&@63
+@57|1|0|9|,|2|-|5| @6|8|0|%| 
diff --git a/runtime/syntax/testdir/dumps/java_comments_markdown_07.dump b/runtime/syntax/testdir/dumps/java_comments_markdown_07.dump
new file mode 100644
index 0000000..c6471d6
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/java_comments_markdown_07.dump
@@ -0,0 +1,20 @@
+||+0#0000e05#a8a8a8255| | +0#e000e06#ffffff0@3|/@2| |}| +0#0000000&@63
+||+0#0000e05#a8a8a8255| | +0&#ffffff0@3|/@2| +0#af5f00255&|+| +0#0000e05&|E|.|g|.| +0#0000000&@58
+||+0#0000e05#a8a8a8255| | +0&#ffffff0@3|/@2| |<+0#00e0e07&|p+0#af5f00255&|r|e| +0#00e0e07&|c+0#00e0003&|l|a|s@1|=+0#00e0e07&|"+0#e000002&|s|n|i|p@1|e|t|"|>+0#00e0e07&| +0#0000000&@43
+||+0#0000e05#a8a8a8255| | +0&#ffffff0@3|/@2| +0#e000e06&@3|p|u|b|l|i|c| |s|t|a|t|i|c| |v|o|i|d| |m|a|i|n|(|S|t|r|i|n|g|.@2| |a|r|g|s|)| |{| |}| +0#0000000&@18
+||+0#0000e05#a8a8a8255| | +0&#ffffff0@3|/@2| |<+0#00e0e07&|/|p+0#af5f00255&|r|e|>+0#00e0e07&| +0#0000000&@58
+||+0#0000e05#a8a8a8255| | +0&#ffffff0@3>/@2| +0#0000000&@65
+||+0#0000e05#a8a8a8255| | +0&#ffffff0@3|/@2| |@+0#e000e06&|p|a|r|a|m| |a+0#00e0e07&|r|g|s| +0#0000e05&|o|p|t|i|o|n|a|l| |c+0&#ffd7d7255|o|m@1|a|n|d|e|-+0&#ffffff0|l|i|n|e| |a|r|g|u|m|e|n|t|s| +0#0000001#a8a8a8255| +0#0000000#ffffff0@19
+||+0#0000e05#a8a8a8255| | +0&#ffffff0@3|/@2| |@|j+0&#ffd7d7255|l|s| +0&#ffffff0|1|2|.|1|.|4| |I|n|v|o|k|e| |`+0#e000e06&|T|e|s|t|.|m|a|i|n|`| +0#0000000&@34
+||+0#0000e05#a8a8a8255| | +0&#ffffff0@3|/@2| +0#0000000&@65
+||+0#0000e05#a8a8a8255| | +0&#ffffff0@3|/@2| |[|^+0#00e0003&|\|*|]+0#0000e05&|:| |@+0#e000002&|j|l|s| +0#0000e05&|1|2|.|1|.|4| |I|n|v|o|k|e| |`+0#e000e06&|T|e|s|t|.|m|a|i|n|`| +0#0000000&@27
+| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@3|/+0#0000e05&@1| |@+0#0000000&|s|t|a|r|t| +0#0000e05&|r+0#00e0003&|e|g|i|o|n| +0#0000e05&|=| |m+0#e000002&|a|i|n| +0#0000001#a8a8a8255@4| +0#0000000#ffffff0@40
+| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@3|/+0#0000e05&@1| |@+0#0000000&|l|i|n|k| +0#0000e05&|s+0#00e0003&|u|b|s|t|r|i|n|g| +0#0000e05&|=| |'+0#e000002&|S|t|r|i|n|g|'| +0#0000e05&|t+0#00e0003&|a|r|g|e|t| +0#0000e05&|=| |'+0#e000002&|j|a|v|a|.|l|a|n|g|.|S|t|r|i|n|g|'| +0#0000e05&|:| +0#0000000&@9
+| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@3|p+0#00e0003&|u|b|l|i|c| +0#0000000&|s+0#00e0003&|t|a|t|i|c| +0#0000000&|v+0#00e0003&|o|i|d| +0#0000000&|m|a|i|n|(|S|t|r|i|n|g|[|]| |a|r|g|s|)| |{| |}| @26
+| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@3|/+0#0000e05&@1| |@+0#0000000&|e|n|d| +0#0000001#a8a8a8255| +0#0000000#ffffff0@60
+| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72
+|-+0#0000e05#a8a8a8255| | +0#0000000#ffffff0@3|/+0#0000e05&@2| |{+8#e000e06&|@+0&&|r|e|t|u|r|n| +8&&|a|n| |e|m|p|t|y| |s|t|r|i|n|g|}| +0#0000000&@39
+||+0#0000e05#a8a8a8255| | +0&#ffffff0@3|/@2| |@+0#e000e06&|s|e@1| |S+0#00e0e07&|t|r|i|n|g| +0#0000e05&|[+0#0000000&|3+8#e000e06&|.|1|0|.|5| |S|t|r|i|n|g| |L|i|t|e|r|a|l|s|]+0#0000000&|(+0#0000e05&|h+0#e000002&|t@1|p|s|:|/@1|d|o|c|s|.|o|r|a|c|l|e|.|c|o|m|/|j|a|v|a
+||+0#0000e05#a8a8a8255| |s+0#e000002#ffffff0|e|/|s|p|e|c|s|/|j|l|s|/|s|e|2|1|/|h|t|m|l|/|j|l|s|-|3|.|h|t|m|l|#|j|l|s|-|3|.|1|0|.|5|)+0#0000e05&| +0#0000000&@27
+||+0#0000e05#a8a8a8255| | +0&#ffffff0@3|/@2| |@+0#e000e06&|s|e@1| |O+0#00e0e07&|b|j|e|c|t| +0#0000000&@53
+@57|1|2|7|,|2|-|5| @6|9|3|%| 
diff --git a/runtime/syntax/testdir/dumps/java_comments_markdown_08.dump b/runtime/syntax/testdir/dumps/java_comments_markdown_08.dump
new file mode 100644
index 0000000..1193a9e
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/java_comments_markdown_08.dump
@@ -0,0 +1,20 @@
+||+0#0000e05#a8a8a8255| | +0&#ffffff0@3|/@2| |@+0#e000e06&|s|e@1| |O+0#00e0e07&|b|j|e|c|t| +0#0000000&@53
+||+0#0000e05#a8a8a8255| | +0&#ffffff0@3|/@2| |[+0#0000000&|4+8#e000e06&|.|3|.|2| |T|h|e| |C|l|a|s@1| |O|b|j|e|c|t|]+0#0000000&|(+0#0000e05&|h+0#e000002&|t@1|p|s|:|/@1|d|o|c|s|.|o|r|a|c|l|e|.|c|o|m|/|j|a|v|a|s|e|/|s|p|e|c|s|/|j|l|s
+||+0#0000e05#a8a8a8255| |/+0#e000002#ffffff0|s|e|2|1|/|h|t|m|l|/|j|l|s|-|4|.|h|t|m|l|#|j|l|s|-|4|.|3|.|2|)+0#0000e05&| +0#0000000&@40
+||+0#0000e05#a8a8a8255| | +0&#ffffff0@3|/@2| |@+0#e000e06&|s|e@1| |j+0#00e0e07&|a|v|a|.|b|a|s|e|/|j|a|v|a|.|l|a|n|g|.|O|b|j|e|c|t|#|t|o|S|t|r|i|n|g|(|)| +0#0000000&@22
+| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@3|/+0#0000e05&@1| |@+0#0000000&|s|t|a|r|t| +0#0000e05&|r+0#00e0003&|e|g|i|o|n| +0#0000e05&|=| |t+0#e000002&|o|S|t|r|i|n|g| +0#0000001#a8a8a8255| +0#0000000#ffffff0@40
+| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@3>/+0#0000e05&@1| |@+0#0000000&|r|e|p|l|a|c|e| +0#0000e05&|s+0#00e0003&|u|b|s|t|r|i|n|g| +0#0000e05&|=| |'+0#e000002&|"@1|'| +0#0000e05&|r+0#00e0003&|e|p|l|a|c|e|m|e|n|t| +0#0000e05&|=| |"+0#e000002&|\|u|0@1|2@1|\|u|0@1|2@1|"| +0#0000000&@11
+| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@3|/+0#0000e05&@1| |@+0#0000000&|l|i|n|k| +0#0000e05&|r+0#00e0003&|e|g|e|x| +0#0000e05&|=| |'+0#e000002&|\|b|S|t|r|i|n|g|'| +0#0000e05&|t+0#00e0003&|a|r|g|e|t| +0#0000e05&|=| |j+0#e000002&|a|v|a|.|l|a|n|g|.|S|t|r|i|n|g| +0#0000e05&|t+0#00e0003&|y|p|e| +0#0000e05&|=| |l+0#e000002&|i|n|k|p|l|a|i
+| +0#0000e05#a8a8a8255@1|n+0#e000002#ffffff0| +0#0000e05&|:| +0#0000000&@69
+| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@3|@+0#e000e06&|O|v|e|r@1|i|d|e| +0#0000000&|p+0#00e0003&|u|b|l|i|c| +0#0000000&|S|t|r|i|n|g| |t|o|S|t|r|i|n|g|(|)| |{| |r+0#af5f00255&|e|t|u|r|n| +0#0000000&|"+0#e000002&@1|;+0#0000000&| |}| @19
+| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@3|/+0#0000e05&@1| |@+0#0000000&|e|n|d| +0#0000001#a8a8a8255| +0#0000000#ffffff0@60
+| +0#0000e05#a8a8a8255@1|}+0#0000000#ffffff0| @71
+|~+0#4040ff13&| @73
+|~| @73
+|~| @73
+|~| @73
+|~| @73
+|~| @73
+|~| @73
+|~| @73
+| +0#0000000&@56|1|4|3|,|2|-|5| @6|B|o|t| 
diff --git a/runtime/syntax/testdir/dumps/java_module_info_00.dump b/runtime/syntax/testdir/dumps/java_module_info_00.dump
index 82ef0b2..07fabd3 100644
--- a/runtime/syntax/testdir/dumps/java_module_info_00.dump
+++ b/runtime/syntax/testdir/dumps/java_module_info_00.dump
@@ -10,7 +10,7 @@
 | +0#0000e05&|*| +0#0000000&@72
 | +0#0000e05&|*| |@+0#e000e06&|u|s|e|s| |o+0#00e0e07&|r|g|.|d|e|m|o|.|i|n|t|e|r|n|a|l|.|T|e|s|t|a|b|l|e| +0#0000000&@39
 | +0#0000e05&|*| |@+0#e000e06&|p|r|o|v|i|d|e|s| |o+0#00e0e07&|r|g|.|d|e|m|o|.|i|n|t|e|r|n|a|l|.|T|e|s|t|a|b|l|e| +0#0000000&@35
-| +0#0000e05&|*| |@+0#e000e06&|s|e@1| +0#0000e05&|S+0#00e0e07&|e|r|v|i|c|e|L|o|a|d|e|r| +0#0000000&@53
+| +0#0000e05&|*| |@+0#e000e06&|s|e@1| |S+0#00e0e07&|e|r|v|i|c|e|L|o|a|d|e|r| +0#0000000&@53
 | +0#0000e05&|*|/| +0#0000000&@71
 |m+0#00e0003&|o|d|u|l|e| +0#0000000&|o|r|g|.|m+0#00e0003&|o|d|u|l|e|.+0#0000000&|i|n|f|o|.|d|e|m|o| |/+0#0000e05&@1| |J|D|K| |2|3|+| |(|-@1|e|n|a|b|l|e|-|p|r|e|v|i|e|w| |-@1|r|e|l|e|a|s|e| |2|3|)|.| +0#0000000&@3
 |{| @73
diff --git a/runtime/syntax/testdir/dumps/java_numbers_01.dump b/runtime/syntax/testdir/dumps/java_numbers_01.dump
index a66487a..d9aee00 100644
--- a/runtime/syntax/testdir/dumps/java_numbers_01.dump
+++ b/runtime/syntax/testdir/dumps/java_numbers_01.dump
@@ -13,7 +13,7 @@
 @16|1+0#e000002&|e|+|3|,+0#0000000&| |1+0#e000002&|E|+|3|D|,+0#0000000&| |1+0#e000002&|e|+|3|f|,+0#0000000&| @39
 @12|1+0#e000002&|d|,+0#0000000&| |1+0#e000002&|D|,+0#0000000&| |1+0#e000002&|f|,+0#0000000&| |1+0#e000002&|F|,+0#0000000&| @47
 @75
-|/+0#0000e05&@3| |M|A|L|F|O|R|M|E|D|:| |:|l|e|t| |g|:|j|a|v|a|_|c|o|m@1|e|n|t|_|s|t|r|i|n|g|s| |=| |1| ||| |d|o|a|u|t|o|c|m|d| |S|y|n|t|a|x| +0#0000000&@8
+|/+0#0000e05&@2|/+0#e000e06&| |M|A|L|F|O|R|M|E|D|:| |:|l|e|t| |g|:|j|a|v|a|_+0#ffffff16#ff404010|c+0#e000e06#ffffff0|o|m@1|e|n|t|_+0#ffffff16#ff404010|s+0#e000e06#ffffff0|t|r|i|n|g|s| |=| |1| ||| |d|o|a|u|t|o|c|m|d| |S|y|n|t|a|x| +0#0000000&@8
 |/+0#0000e05&@1| @9|0|_|x|.|0|p|0|,| |0|x|.|_|0|p|0|,| |0|x|.|0|_|p|0|,| |0|x|.|0|p|_|0|,| |0|x|.|0|p|0|_|,| +0#0000000&@18
 |/+0#0000e05&@1| @9|0|x|0|_|.|0|p|0|,| |0|x|_|0|.|0|p|0|,| |0|x|p|0|,| +0#0000000&@37
 @8|}|;| @64
diff --git a/runtime/syntax/testdir/input/java_comments.java b/runtime/syntax/testdir/input/java_comments_html.java
similarity index 74%
rename from runtime/syntax/testdir/input/java_comments.java
rename to runtime/syntax/testdir/input/java_comments_html.java
index 35f6f7d..eeffef5 100644
--- a/runtime/syntax/testdir/input/java_comments.java
+++ b/runtime/syntax/testdir/input/java_comments_html.java
@@ -1,7 +1,7 @@
 // VIM_TEST_SETUP unlet! g:java_no_tab_space_error g:java_ignore_javadoc
 // VIM_TEST_SETUP unlet! g:java_no_trail_space_error
 // VIM_TEST_SETUP let [g:java_space_errors,g:java_comment_strings]=[1,1]
-
+// VIM_TEST_SETUP let g:java_ignore_markdown = 1
 
 
 
@@ -18,14 +18,14 @@
 
 
 
-/**/ /*/ */ /* /*/ /*/*/ /*//*/ /** Comment tests.
+/**/ /*/ */ /* /*/ /*/*/ /*//*/ /** HTML comment tests.
  * <p>There is no entry point method {@code main}:
- * {@snippet file = Snippets.java region = main id = _01}
+ * {@snippet file = HTMLSnippets.java region = main id = _01}
  * <p>There is no textual representation:
- * {@snippet class = Snippets region = toString id = _02} */
-class CommentsTests implements Comparable<CommentsTests>
-{
-	private CommentsTests() { }
+ * {@snippet class = HTMLSnippets region = toString id = _02} */
+class HTMLCommentsTests implements Comparable<HTMLCommentsTests>
+{	// JDK 21+.
+	private HTMLCommentsTests() { }
 
 	/** No-op, i. e. no operation.
 	* ({@literal@literal} may be used with {@code .} for contraction.)
@@ -63,36 +63,43 @@
 	/** {@return {@code null}, with no-op, i.e. no operation} . . */
 	Void noOp9() { return null; }
 
-	/** {@return the major Java version} @hidden */
+	/** {@return the major Java version}
+	 * @hidden */
 	protected int majorVersion() { return 21; }
 
 	/** {@summary Compares this instance with the passed {@code that}
 	 * instance for order by invoking {@link Integer#compare(int, int)
 	 * compare} and passing it {@code this.majorVersion()} and
 	 * {@code that.majorVersion()} as respective @arguments.}
-	 *
 	 * {@inheritDoc} */
-	@Override public int compareTo(CommentsTests that)
+	@Override public int compareTo(HTMLCommentsTests that)
 	{
 		java.util.Objects.requireNonNull(that, "that");
 		return Integer.compare(this.majorVersion(),
 						that.majorVersion());
 	}
 
+	/// Returns an empty string for an @Override annotated method
+	/// (see Chapter 9.6.4.4 {@literal @Override} in a Java Language
+	/// Specification) overridden from `java.lang.Object`
+	///
+	/// @return an empty string /// No period for the above summary!
+	private String asString() { return ""; }
+
 	/** Returns an empty string for an @Override annotated method
 	* (see Chapter 9.6.4.4 {@literal @Override} in a Java Language
 	* Specification) overridden from <code>java.lang.Object</code>
 	*
 	* @return an empty string */// No period for the above summary!
-	@Override public String toString() { return ""; }
+	@Override public String toString() { return asString(); }
 }
 
-// javadoc --snippet-path . --source-path . -d /tmp/docs/ -package \
-// 	-tag 'jls:a:See Java Language Specification:' Snippets.java
-/** Snippets for comment tests. */
-class Snippets
+// javadoc --snippet-path . --source-path . -d /tmp/html_docs/ -package \
+// 	-tag 'jls:a:See Java Language Specification:' HTMLSnippets.java
+/** Snippets for HTML comment tests. */
+class HTMLSnippets
 {	/* 	TRAILING BLANKS AND MESSPILLINGS ARE SIGNIFICANT! */
-	private Snippets() { }
+	private HTMLSnippets() { }
 
 	/** The method {@code main} must be declared {@code public}, {@code
 	 * static}, and {@code void}.  It must specify a formal parameter
@@ -113,6 +120,8 @@
 
 	/** {@return an empty string}
 	 * @see <a href="https://docs.oracle.com/javase/specs/jls/se21/html/jls-3.html#jls-3.10.5">3.10.5 String Literals</a>
+	 * @see
+	 * <a href="https://docs.oracle.com/javase/specs/jls/se21/html/jls-4.html#jls-4.3.2">4.3.2 The Class Object</a>
 	 * @see java.base/java.lang.Object#toString() */
 	// @start region = toString	
 	// @replace substring = '""' replacement = "\u0022\u0022"
diff --git a/runtime/syntax/testdir/input/java_comments_markdown.java b/runtime/syntax/testdir/input/java_comments_markdown.java
new file mode 100644
index 0000000..fa36971
--- /dev/null
+++ b/runtime/syntax/testdir/input/java_comments_markdown.java
@@ -0,0 +1,147 @@
+// VIM_TEST_SETUP unlet! g:java_no_tab_space_error g:java_ignore_javadoc
+// VIM_TEST_SETUP unlet! g:java_no_trail_space_error
+// VIM_TEST_SETUP let[g:java_space_errors,g:java_comment_strings]=[1,1]
+// VIM_TEST_SETUP let[g:java_ignore_html,g:markdown_syntax_conceal]=[1,1]
+
+
+
+
+
+// VIM_TEST_SETUP defer execute('match Visual /\%>21l\s\+$/')
+// VIM_TEST_SETUP setl spell fdc=2 fdl=64 fdm=syntax fen cole=3 cocu=n
+// VIM_TEST_SETUP highlight link javaCommentStart Todo
+// VIM_TEST_SETUP highlight link javaMarkdownCommentTitle Underlined
+// VIM_TEST_SETUP highlight link markdownH2 NonText
+// VIM_TEST_SETUP highlight link markdownHeadingRule NonText
+
+
+
+
+
+/**/ /*/ */ /* /*/ /*/*/ /*//*/ /// Markdown comment tests.
+///
+/// There is no entry point method `main`:
+/// {@snippet file = MarkdownSnippets.java region = main id = _01}
+///
+/// There is no textual representation:
+/// {@snippet class = MarkdownSnippets region = toString id = _02}
+class MarkdownCommentsTests implements Comparable<MarkdownCommentsTests>
+{	// JDK 23+.
+	private MarkdownCommentsTests() { }
+
+	/// No-op, i. e. no operation.
+	/// ({@literal@literal} may be used with `.` for contraction.)
+	/// @return `null`
+	Void noOp1() { return null; }
+
+	/// No-op, i.e. no operation.
+	/// ({@literal<!-- -->} may be used after `.` for contraction.)
+	/// @return `null`
+	Void noOp2() { return null; }
+
+	/// No-op, i.e\u002e no operation.
+	/// ({@literal\u005cu002e} is processed early, use alternatives.)
+	/// @return `null`
+	Void noOp3() { return null; }
+
+	/// No-op, i.e{@literal .} no operation.
+	/// @return `null`
+	Void noOp4() { return null; }
+
+	/// No-op, i.e.<!-- --> no operation.
+	/// @return `null`
+	Void noOp5() { return null; }
+
+	/// No-op, i.e.&nbsp;no operation.
+	/// @return `null`
+	Void noOp6() { return null; }
+
+	/// {@return `null`, with no-op, i.e. no operation}
+	Void noOp7() { return null; }
+
+	/// {@return `null`, with no-op, i.e. no operation}..
+	Void noOp8() { return null; }
+
+	/// {@return `null`, with no-op, i.e. no operation} . .
+	Void noOp9() { return null; }
+
+	/// {@return the major Java version}
+	/// @hidden
+	protected int majorVersion() { return 23; }
+
+	///    {@summary Compares this instance with the passed `that`
+	/// instance for order by invoking [Integer.compare(int, int)]
+	/// and passing it `this.majorVersion()` and
+	/// `that.majorVersion()` as respective @arguments.}
+	/// {@inheritDoc}
+	@Override public int compareTo(MarkdownCommentsTests that)
+	{
+		java.util.Objects.requireNonNull(that, "that");
+		return Integer.compare(this.majorVersion(),
+						that.majorVersion());
+	}
+
+	/** Returns an empty string for an @Override annotated method
+	* (see Chapter 9.6.4.4 {@literal @Override} in a Java Language
+	* Specification) overridden from <code>java.lang.Object</code>
+	*
+	* @return an empty string */// No period for the above summary!
+	private String asString() { return ""; }
+
+	/// Returns an empty string for an @Override annotated method
+	/// (see Chapter 9.6.4.4 {@literal @Override} in a Java Language
+	/// Specification) overridden from `java.lang.Object`
+	///
+	/// @return an empty string /// No period for the above summary!
+	@Override public String toString() { return asString(); }
+
+	/// A summary comment.
+	static final String MARKDOWN_COMMENT_A = "///";
+	/// No summary comment (try fiddling with the above string value).
+	static final String MARKDOWN_COMMENT_B = "///";
+}
+
+// javadoc --snippet-path . --source-path . -d /tmp/md_docs/ -package \
+// 	-tag 'jls:a:See Java Language Specification:' MarkdownSnippets.java
+/// Snippets for Markdown comment tests.
+class MarkdownSnippets
+{	/* 	TRAILING BLANKS AND MESSPILLINGS ARE SIGNIFICANT! */
+	private MarkdownSnippets() { }
+
+	/// The method [`main`] must be declared `public`,
+	/// `static`, and `void`.  It must specify a formal parameter
+	/// whose declared type is array of [String].  Therefore,
+	/// _either_ of the following declarations is acceptable.  [^\*]
+	///
+	/// ---------------------------------------------------------------
+	/// DECLARATIONS ([main(String\[\])][#main(String\[\])]):
+	/// -----------------------------------------------------
+	/// * E.g. {@snippet lang="java":
+	/// // @highlight substring="main" type="italic":
+	///    public static void main(String[] args) { }
+	/// }
+	/// + E.g.
+	/// <pre class="snippet">
+	///    public static void main(String... args) { }
+	/// </pre>
+	///
+	/// @param args optional commande-line arguments 
+	/// @jls 12.1.4 Invoke `Test.main`
+	///
+	/// [^\*]: @jls 12.1.4 Invoke `Test.main`
+	// @start region = main		
+	// @link substring = 'String' target = 'java.lang.String' :
+	public static void main(String[] args) { }
+	// @end 
+
+	/// {@return an empty string}
+	/// @see String [3.10.5 String Literals](https://docs.oracle.com/javase/specs/jls/se21/html/jls-3.html#jls-3.10.5)
+	/// @see Object
+	/// [4.3.2 The Class Object](https://docs.oracle.com/javase/specs/jls/se21/html/jls-4.html#jls-4.3.2)
+	/// @see java.base/java.lang.Object#toString()
+	// @start region = toString	
+	// @replace substring = '""' replacement = "\u0022\u0022"
+	// @link regex = '\bString' target = java.lang.String type = linkplain :
+	@Override public String toString() { return ""; }
+	// @end 
+}