Problems reported:

parser/error_recovery/issue_44785.crash:2:17: Binary operator 'or' is written as '||' instead of the written out word.
  if (a == null or b == null){
                ^^

parser/error_recovery/issue_44785.crash:3:12: Expected ';' after this.
    return null
           ^^^^

parser/error_recovery/issue_44785.crash:8:17: Binary operator 'and' is written as '&&' instead of the written out word.
  if (a == null and b == null){
                ^^^

parser/error_recovery/issue_44785.crash:9:12: Expected ';' after this.
    return null
           ^^^^

beginCompilationUnit(foo)
  beginMetadataStar(foo)
  endMetadataStar(0)
  beginTopLevelMember(foo)
    beginTopLevelMethod(, null)
      handleNoType()
      handleIdentifier(foo, topLevelFunctionDeclaration)
      handleNoTypeVariables(()
      beginFormalParameters((, MemberKind.TopLevelMethod)
        beginMetadataStar(int)
        endMetadataStar(0)
        beginFormalParameter(int, MemberKind.TopLevelMethod, null, null, null)
          handleIdentifier(int, typeReference)
          handleNoTypeArguments(a)
          handleType(int, null)
          handleIdentifier(a, formalParameterDeclaration)
          handleFormalParameterWithoutValue(,)
        endFormalParameter(null, null, a, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
        beginMetadataStar(int)
        endMetadataStar(0)
        beginFormalParameter(int, MemberKind.TopLevelMethod, null, null, null)
          handleIdentifier(int, typeReference)
          handleNoTypeArguments(b)
          handleType(int, null)
          handleIdentifier(b, formalParameterDeclaration)
          handleFormalParameterWithoutValue())
        endFormalParameter(null, null, b, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
      endFormalParameters(2, (, ), MemberKind.TopLevelMethod)
      handleAsyncModifier(null, null)
      beginBlockFunctionBody({)
        beginIfStatement(if)
          handleIdentifier(a, expression)
          handleNoTypeArguments(==)
          handleNoArguments(==)
          handleSend(a, ==)
          beginBinaryExpression(==)
            handleLiteralNull(null)
          endBinaryExpression(==)
          handleRecoverableError(Message[BinaryOperatorWrittenOut, Binary operator 'or' is written as '||' instead of the written out word., Try replacing 'or' with '||'., {string: or, string2: ||}], or, or)
          beginBinaryExpression(||)
            handleIdentifier(b, expression)
            handleNoTypeArguments(==)
            handleNoArguments(==)
            handleSend(b, ==)
            beginBinaryExpression(==)
              handleLiteralNull(null)
            endBinaryExpression(==)
          endBinaryExpression(||)
          handleParenthesizedCondition(()
          beginThenStatement({)
            beginBlock({, BlockKind(statement))
              beginReturnStatement(return)
                handleLiteralNull(null)
                handleRecoverableError(Message[ExpectedAfterButGot, Expected ';' after this., null, {string: ;}], null, null)
              endReturnStatement(true, return, ;)
            endBlock(1, {, }, BlockKind(statement))
          endThenStatement(})
        endIfStatement(if, null)
      endBlockFunctionBody(1, {, })
    endTopLevelMethod(foo, null, })
  endTopLevelDeclaration(bar)
  beginMetadataStar(bar)
  endMetadataStar(0)
  beginTopLevelMember(bar)
    beginTopLevelMethod(}, null)
      handleNoType(})
      handleIdentifier(bar, topLevelFunctionDeclaration)
      handleNoTypeVariables(()
      beginFormalParameters((, MemberKind.TopLevelMethod)
        beginMetadataStar(int)
        endMetadataStar(0)
        beginFormalParameter(int, MemberKind.TopLevelMethod, null, null, null)
          handleIdentifier(int, typeReference)
          handleNoTypeArguments(a)
          handleType(int, null)
          handleIdentifier(a, formalParameterDeclaration)
          handleFormalParameterWithoutValue(,)
        endFormalParameter(null, null, a, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
        beginMetadataStar(int)
        endMetadataStar(0)
        beginFormalParameter(int, MemberKind.TopLevelMethod, null, null, null)
          handleIdentifier(int, typeReference)
          handleNoTypeArguments(b)
          handleType(int, null)
          handleIdentifier(b, formalParameterDeclaration)
          handleFormalParameterWithoutValue())
        endFormalParameter(null, null, b, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
      endFormalParameters(2, (, ), MemberKind.TopLevelMethod)
      handleAsyncModifier(null, null)
      beginBlockFunctionBody({)
        beginIfStatement(if)
          handleIdentifier(a, expression)
          handleNoTypeArguments(==)
          handleNoArguments(==)
          handleSend(a, ==)
          beginBinaryExpression(==)
            handleLiteralNull(null)
          endBinaryExpression(==)
          handleRecoverableError(Message[BinaryOperatorWrittenOut, Binary operator 'and' is written as '&&' instead of the written out word., Try replacing 'and' with '&&'., {string: and, string2: &&}], and, and)
          beginBinaryExpression(&&)
            handleIdentifier(b, expression)
            handleNoTypeArguments(==)
            handleNoArguments(==)
            handleSend(b, ==)
            beginBinaryExpression(==)
              handleLiteralNull(null)
            endBinaryExpression(==)
          endBinaryExpression(&&)
          handleParenthesizedCondition(()
          beginThenStatement({)
            beginBlock({, BlockKind(statement))
              beginReturnStatement(return)
                handleLiteralNull(null)
                handleRecoverableError(Message[ExpectedAfterButGot, Expected ';' after this., null, {string: ;}], null, null)
              endReturnStatement(true, return, ;)
            endBlock(1, {, }, BlockKind(statement))
          endThenStatement(})
        endIfStatement(if, null)
      endBlockFunctionBody(1, {, })
    endTopLevelMethod(bar, null, })
  endTopLevelDeclaration()
endCompilationUnit(2, )
