Make a program for printing a string in my esolang MAWP! The task

Given an ascii string, output a program in my esolang MAWP that outputs the inputted string when run.

Useful functions in MAWP

Numbers from 0-9: Pushes the number to stack
M                 Takes the top two numbers off stack and pushes the sum to stack
A                 Takes the top two numbers off stack and pushes the difference to stack (xyA = y-x)
W                 Takes the top two numbers off stack and pushes the multiplied result to stack
P                 Takes the top two numbers off stack and pushes the floored divided result to stack (xyP = yx)
;                 Takes top number off stack and prints it as an ascii char


Test cases

Input: Hello, World!

Possible output: 89W;689MWA;269WW;269WW;1278WWA;159WA;48W;699WM;1278WWA;67W89WM;269WW;455WW;148WM;

Input: codegolf

Possible output: 929MW;278WWA;455WW;1689MWA;1849MWA;1278WWA;269WW;689MW;

Rules


There can be multiple solutions for each symbol, but the length must be minimal: for example, 04M5W5W; is unacceptable while 45W5W; is fine.
The stack starts with a 1 one it.
You may leave something on the stack
Your output may not print out other characters other than the string, and all of the character s must be given in the og order.
This is code-golf, so lowest byte score wins!


ASCII table for reference
JavaScript (Node.js),  276 266  263 bytes
Saved 3 bytes thanks to @KevinCruijssen

i=&gt;[v=[],O='',[...2**29+'4'].map(F=x=&gt;F[v[x]=+x]=x)].map(s=_=&gt;v.map(x=&gt;v.map(y=&gt;[x+y,x*y,y-x].map((z,o)=&gt;(!F[z]&amp;&amp;V.push(z))|(S=~~s[x]-~s[y])&lt;s[z]|S==s[z]&amp;F[x]&lt;2?F[s[z]=S,z]=F[x]+F[y]+'MWA'[o]:0)),V=[])&amp;&amp;v.push(...V))&amp;Buffer(i).map(n=&gt;O+=F[n]+';')||O.replace(1,'')

Try it online!
MAWP interpreter
Here is a simple MAWP interpreter I wrote to check the results.

function MAWP(code) {
  let stack = [ 1 ], out = &quot;&quot;;

  function assertStkSz(n) { if(stack.length &lt; n) throw &quot;stack error&quot;; }

  [...code].forEach(c =&gt; {
    switch(c) {
      case 'M': assertStkSz(2); stack.push(stack.pop() + stack.pop()); break;
      case 'A': assertStkSz(2); stack.push(stack.pop() - stack.pop()); break;
      case 'W': assertStkSz(2); stack.push(stack.pop() * stack.pop()); break;
      case 'P': assertStkSz(2); stack.push(stack.pop() / stack.pop() | 0); break;
      case ';': assertStkSz(1); out += String.fromCharCode(stack.pop()); break;
      default : stack.push(+c); break;
    }
  })
  return out;
}

Try it online!