Problems reported:

parser/coverage/string4:8:10: Expected ';' after this.
  return r"""
         ^^^^^...

parser/coverage/string4:8:10: String starting with r""" must end with """.
  return r"""
         ^^^^^...

parser/coverage/string4:7:12: Can't find '}' to match '{'.
void bar() {
           ^

beginCompilationUnit(void)
  beginMetadataStar(void)
  endMetadataStar(0)
  beginTopLevelMember(void)
    beginTopLevelMethod(UnmatchedToken({), null, null)
      handleVoidKeyword(void)
      handleIdentifier(foo, topLevelFunctionDeclaration)
      handleNoTypeVariables(()
      beginFormalParameters((, MemberKind.TopLevelMethod)
      endFormalParameters(0, (, ), MemberKind.TopLevelMethod)
      handleAsyncModifier(null, null)
      beginBlockFunctionBody({)
        beginReturnStatement(return)
          beginLiteralString(r"""
æbler
æbler""")
          endLiteralString(0, ;)
        endReturnStatement(true, return, ;)
      endBlockFunctionBody(1, {, })
    endTopLevelMethod(void, null, })
  endTopLevelDeclaration(})
  beginMetadataStar(void)
  endMetadataStar(0)
  beginTopLevelMember(void)
    beginTopLevelMethod(}, null, null)
      handleVoidKeyword(void)
      handleIdentifier(bar, topLevelFunctionDeclaration)
      handleNoTypeVariables(()
      beginFormalParameters((, MemberKind.TopLevelMethod)
      endFormalParameters(0, (, ), MemberKind.TopLevelMethod)
      handleAsyncModifier(null, null)
      beginBlockFunctionBody({)
        beginReturnStatement(return)
          beginLiteralString(r"""
æbler""")
          endLiteralString(0, })
          handleRecoverableError(Message[ExpectedAfterButGot, Expected ';' after this., null, {string: ;}], r"""
æbler""", r"""
æbler""")
        endReturnStatement(true, return, ;)
      endBlockFunctionBody(1, {, })
    endTopLevelMethod(void, null, })
  endTopLevelDeclaration(})
  handleErrorToken(UnterminatedString(r"""))
  handleRecoverableError(Message[UnterminatedString, String starting with r""" must end with """., null, {string: r""", string2: """}], UnterminatedString(r"""), UnterminatedString(r"""))
  handleErrorToken(UnmatchedToken({))
  handleRecoverableError(Message[UnmatchedToken, Can't find '}' to match '{'., null, {string: }, lexeme: {}], UnmatchedToken({), UnmatchedToken({))
endCompilationUnit(2, )
