-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathqrforth.html
More file actions
3 lines (3 loc) · 3.88 KB
/
qrforth.html
File metadata and controls
3 lines (3 loc) · 3.88 KB
1
2
3
<!DOCTYPE html><body><div id="t"><pre id="s"></pre><textarea placeholder="Enter Forth here"rows="5"style="width:100%;"id="i"autofocus></textarea></div><pre id="o"></pre><script>
wa64 = "AGFzbQEAAAABFgVgAAF/YAAAYAF/AX9gAX8AYAJ/fwADCAcAAQACAwQBBQMBABEGGQN/AUGAgMAAC38AQYP6wQALfwBBkPrBAAsHSwgGbWVtb3J5AgAFZmxhZ3MAAAV6ZmxhZwABA3RvcAACBXN0YWNrAAMFZm9ydGgABQpfX2RhdGFfZW5kAwELX19oZWFwX2Jhc2UDAgqrCQcLAEEALQCC+sGAAAsNAEEAQQA6AIL6wYAACwsAQQAvAYD6wYAACyYAAkAgAEG/PksNACAAQQJ0QYCAwIAAaigCAA8LIAAQhICAgAAACwkAEIaAgIAAAAvMCAEBf0EAQQA6AIL6wYAAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIABBv+DNA0oNAAJAIABBX2oOIAkCAgICAgICAgIEAgIMAgICAgICAgICAgICAgICAgIIAAsgAEG94ABGDQYgAEH5yq0DRw0BQQBBEDoAgvrBgAAPCwJAIABB89K1qwZKDQAgAEHA4M0DRg0JIABB8N7JowZHDQFBAC8BgPrBgAAiAA0FQQBBAjoAgvrBgAAPCyAAQfTStasGRg0JIABB5NyF8wZGDQMgAEHo5tWDB0YNAQtBAEEgOgCC+sGAAA8LAkBBAC8BgPrBgAAiAEGgH0kNAEEAQQE6AIL6wYAADwtBACAAQQFqOwGA+sGAACAAQQJ0QYCAwIAAaiABNgIADwtBAC8BgPrBgAAiAEECSQ0IIABBf2ohASAAQcE+Tw0JIABBfmoiAkHAPk8NCkEAIABBf2o7AYD6wYAAIAJBAnRBgIDAgABqIgAgACgCACABQQJ0QYCAwIAAaigCAGo2AgAPC0EALwGA+sGAACIAQQJJDQogAEF/aiEBIABBwT5PDQsgAEF+aiICQcA+Tw0MQQAgAEF/ajsBgPrBgAAgAkECdEGAgMCAAGoiACAAKAIAIAFBAnRBgIDAgABqKAIAcUF/czYCAA8LQQAgAEF/ajsBgPrBgAAPC0EALwGA+sGAAEF/aiIAQcA+Tw0LIABBAnRBgIDAgABqIgBBAEF/IAAoAgAbNgIADwtBAC8BgPrBgABBf2oiAEG/PksNCyAAQQJ0QYCAwIAAaiIBKAIAIgBBwD5PDQwgASAAQQJ0QYCAwIAAaigCADYCAA8LQQAvAYD6wYAAIgBBAkkNDEEAIABBf2oiATsBgPrBgAAgAUH//wNxIQEgAEHBPk8NDSABQX9qIgJBwD5PDQ4CQCABQQJ0QYCAwIAAaigCACIBQcA+Tw0AQQAgAEF+ajsBgPrBgAAgAUECdEGAgMCAAGogAkECdEGAgMCAAGooAgA2AgAPCyABEISAgIAAAAsCQEEALwGA+sGAACIAQaAfSQ0AQQBBAToAgvrBgAAPC0EAIABBAWo7AYD6wYAAIABBAnRBgIDAgABqIABBf2o2AgAPCwJAQQAvAYD6wYAAIgANAEEAQQY6AIL6wYAADwtBACAAQX9qOwGA+sGAAEEAQQQ6AIL6wYAADwsCQEEALwGA+sGAACIADQBBAEEKOgCC+sGAAA8LQQAgAEF/ajsBgPrBgABBAEEIOgCC+sGAAA8LQQBBAjoAgvrBgAAPCyABEISAgIAAAAsgAhCEgICAAAALQQBBAjoAgvrBgAAPCyABEISAgIAAAAsgAhCEgICAAAALIAAQhICAgAAACyAAEISAgIAAAAsgABCEgICAAAALQQBBAjoAgvrBgAAPCyABEISAgIAAAAtBfxCEgICAAAALBAAAAAs=",wabuf=Uint8Array.from(atob(wa64),(A=>A.charCodeAt(0))).buffer,WebAssembly.compile(wabuf).then((A=>{wasm=A,ins=new WebAssembly.Instance(wasm)}));const term=document.getElementById("t"),out=document.getElementById("o"),input=document.getElementById("i"),stack=document.getElementById("s"),dict={};let com="",msg="",status="";function define(A,t){let g=[];for(let s=t;s<A.length;s++)if(";"===A[s]){g=A.slice(t,s+1);break}let s=g.length+t;g.shift(),g.pop();const B=g.shift(),e=g.join(" ");return dict[B]=e,s}function ex(A){const t=A.split(/\s+/);let g=!0,s=0,B=0,e=0,Q=!1;for(;s<t.length;s++){const A=t[s];if(Q){"then"===A&&(Q=!1);continue}if(""===A||"then"===A)continue;if(A in dict)ex(dict[A]),g=!1;else if("until"===A)0===parseInt(ins.exports.stack(ins.exports.top()-1))&&(s=e),ins.exports.forth(1685221232);else if("begin"===A)e=s;else if("if"===A)0===parseInt(ins.exports.stack(ins.exports.top()-1))&&(Q=!0),ins.exports.forth(1685221232);else if(isNaN(A))if(":"===A)B=define(t,B),s=B-1;else{let t=0;for(let g=0;g<A.length;g++){t=t<<8|A.charCodeAt(g)}ins.exports.forth(t)}else ins.exports.forth(1886745448,parseInt(A));let C=ins.exports.flags();if(1&C)msg+=" Overflow";else if(2&C)msg+=" Underflow";else if(4&C)msg+=String.fromCharCode(ins.exports.stack(ins.exports.top()));else if(8&C)msg+=ins.exports.stack(ins.exports.top());else if(16&C){const A=prompt("Enter input");isNaN(A)?ins.exports.forth(1886745448,A.charCodeAt(0)):ins.exports.forth(1886745448,parseInt(A))}32&C&&(status=`${A} ?`),ins.exports.zflag()}}input.addEventListener("keydown",(function(A){if("Return"===A.key||"Enter"===A.code&&!A.shiftKey){A.preventDefault(),msg="",status="";const t=input.value;input.value="",com=t.replace(/\n/g," "),ex(com.replace(/\([^)]*\)/g,"")),stack.innerHTML="Stack:";for(let A=0;A<ins.exports.top();A++)stack.innerHTML+=" "+ins.exports.stack(A);stack.innerHTML+=" <- top",""===status&&(status="ok"),out.innerHTML=`${com}\n${msg} ${status}\n\n`+out.innerHTML}}));
</script></body></html>