3h-ast
Version:
A simple AST generator.
1 lines • 3.92 kB
JavaScript
!function(e,s){"object"==typeof exports&&"undefined"!=typeof module?s(exports):"function"==typeof define&&define.amd?define(["exports"],s):s((e="undefined"!=typeof globalThis?globalThis:e||self).HA={})}(this,(function(e){"use strict";var s={normalSymbols:new Set("()[]{}<>+-*/\\?~!@#$%^&=|,.:;"),twoCharacterSymbols:new Set(["&&","||","??","==",">=","<=","!=","<<",">>","++","--","**","+=","-=","*=","/=","%=","&=","^=","|=","|>","->","=>","..","//","/*","*/"]),threeCharacterSymbols:new Set(["&&=","||=","??=","===","!==","<<=",">>=","**=","...",">>>"]),fourCharacterSymbols:new Set([">>>="]),globSymbols:new Set(['"',"'","`"]),numberCharacters:new Set("0123456789"),extendedNumberCharacters:new Set(".ABCDEF"),numberSuffixes:new Set(["D","B","O","H"]),spaceCharacters:new Set(" \r\n\t")},t=function tokenize(e,t){var n=Object.assign({},s,t),a=n.normalSymbols,r=n.twoCharacterSymbols,o=n.threeCharacterSymbols,l=n.fourCharacterSymbols,h=n.globSymbols,i=n.numberCharacters,f=n.extendedNumberCharacters,u=n.numberSuffixes,c=n.spaceCharacters,p=[],m=e[0],b="",g=0,y=!1;h.has(m)?b=m:c.has(m)?g=1:i.has(m)?g=2:a.has(m)&&(p.push(m),m="");for(var S=1;S<e.length;S++){var d=e[S];if(b)m+=d,y?y=!1:d===b?(p.push(m),m="",b="",g=0):y="\\"===d;else if(h.has(d))m&&p.push(m),m=d,b=d,y=!1;else if(2!==g&&3!==g||!u.has(d)){if(0===g&&!m&&a.has(d)&&p.length){var v=p[p.length-1];if(1===v.length&&r.has(v+d)){p[p.length-1]+=d;continue}if(2===v.length&&o.has(v+d)){p[p.length-1]+=d;continue}if(3===v.length&&l.has(v+d)){p[p.length-1]+=d;continue}}var w=0;if(c.has(d))w=1;else if(i.has(d)||2===g&&f.has(d)&&!m.includes("."))w=2;else if(a.has(d)){m&&p.push(m),p.push(d),m="",g=0;continue}if(g===w)m+=d;else if(0===g&&2===w){if((m+=d).length>1)continue}else m&&p.push(m),m=d;g=w}else m+=d,g=3}return m&&p.push(m),p},n=Object.assign({},s,{spanSymbols:new Map([["(",")"],["[","]"],["{","}"]]),escapeCharacters:new Map([["t","\t"],["r","\r"],["n","\n"],["\n",""],["\\","\\"],['"','"'],["'","'"],["`","`"]])}),a=function token2ast(e,s,t,a,r,o,l){void 0===t&&(t=0),void 0===a&&(a=1),void 0===r&&(r=1),void 0===o&&(o=0),void 0===l&&(l=e.length);for(var h=Object.assign({},n,s),i=h.normalSymbols,f=h.twoCharacterSymbols,u=h.threeCharacterSymbols,c=h.fourCharacterSymbols,p=h.globSymbols,m=h.numberCharacters,b=h.numberSuffixes,g=h.spaceCharacters,y=h.spanSymbols,S=h.escapeCharacters,d=[],v=t,w=a,C=r,x=o;x<l;x++){var k=e[x];if(y.has(k)){for(var O=y.get(k),j=0,D=x+1;D<e.length;D++)if(e[D]!==k){if(e[D]===O){if(!j)break;j--}}else j++;if(D===e.length)throw new SyntaxError("missing "+O+" for "+k+" at line "+w+" column "+C);if(D===x+1)d.push({type:"span",start:k,stop:O,body:[],offset:v,line:w,column:C}),v++;else{var E=token2ast(e,h,v+1,w,C+1,x+1,D),z=E.ast;d.push({type:"span",start:k,stop:O,body:z,offset:v,line:w,column:C}),v=E.stopOffset,w=E.stopLine,C=E.stopColumn}x=D}else if(i.has(k)||f.has(k)||u.has(k)||c.has(k))d.push({type:"symbol",value:k,offset:v,line:w,column:C});else if(p.has(k[0])){for(var M=k[0],A=!1,B=1;B<k.length-1;B++){var H=k[B];if(A){if(!S.has(H)){if("\r"===H&&"\n"===k[B+1])continue;throw new SyntaxError("unknown escape character: \\"+H)}M+=S.get(H),A=!1}else{if("\\"===H){A=!0;continue}M+=H}}if(A||k[k.length-1]!==k[0]||1===k.length)throw new SyntaxError("missing corresponding "+y+" at line "+w+" column "+C);M+=k[0],d.push({type:"glob",value:M,offset:v,line:w,column:C})}else if(m.has(k[0])){for(var L=k.length-1;L>=0&&b.has(k[L]);L--);L++,d.push({type:"number",value:k.slice(0,L),suffix:k.slice(L),offset:v,line:w,column:C})}else g.has(k[0])||d.push({type:"word",value:k,offset:v,line:w,column:C});v+=k.length;for(var N=0;N<k.length;N++)"\n"===k[N]&&w++;var T=k.lastIndexOf("\n");~T?C=k.length-T:C+=k.length}return{ast:d,stopOffset:v,stopLine:w,stopColumn:C}};e.astDefaults=n,e.parse=function parse(e,s){return a(t(e,s),s)},e.token2ast=a,e.tokenize=t,e.tokenizeDefaults=s,Object.defineProperty(e,"__esModule",{value:!0})}));