-
Notifications
You must be signed in to change notification settings - Fork 0
/
symbolLiterals.min.js
1 lines (1 loc) · 2.93 KB
/
symbolLiterals.min.js
1
var stream;var streamPos;var result="";var look;var EOF=false;var CR="\r";var LF="\n";var QUOTES="'\"";var STRINGESCAPE="\\";var EOFMaxRead=10000;var charPosAtStartEmit=0;function read(){if(streamPos<stream.length){look=stream[streamPos];streamPos=streamPos+1}else{EOF=true;look="";if(!EOFMaxRead--){abort("ABORTED: Stuck in loop.. ")}}}function getChar(){read()}function error(a){console.log("Error@char "+(streamPos-1)+" : "+a);setTextareaSelection(charPosAtStartEmit,streamPos)}function abort(a){error(a);throw new Error(a)}function expected(a){abort(a+" Expected")}function match(a){if(look==a){getChar()}else{expected("'"+a+"'")}}function matchOne(b){for(var a=0;a<b.length;a++){if(look==b[a]){getChar();return b[a]}}expected("'One of "+b+"'")}function isAlpha(b){var a=b.charCodeAt(0);return(a>64&&a<91)||(a>96&&a<123)}function isDigit(b){var a=b.charCodeAt(0);return(a>47&&a<58)}function isAlNum(a){return isAlpha(a)||isDigit(a)}function isQuote(a){return"'"==a||'"'==a}function isHash(a){return a=="#"}function isSingleLineComment(a){return(a=="/")&&("/"==stream[streamPos])}function isMultiLineComment(a){return(a=="/")&&("*"==stream[streamPos])}function isEndOfLineOrFile(a){return(a==CR)||(a==LF)||EOF}function isRegExLiteral(e){var d=(streamPos>1)&&(STRINGESCAPE==stream[streamPos-2]);var b=isSingleLineComment(e)&&d;var a=isMultiLineComment(e)&&d;return b||a}function emit(a){result+=a}function emitAndGetChar(a){emit(a);getChar()}function emitRegExLiteral(){if(isSingleLineComment(look)){emitAndGetChar(look);emitAndGetChar(look)}else{if(isMultiLineComment(look)){emitAndGetChar(look);while(look!="/"&&STRINGESCAPE==stream[streamPos-2]&&!EOF){emitAndGetChar(look)}emitAndGetChar(look)}}while("igm".indexOf(look)!=-1){emitAndGetChar(look)}}function emitSymbolLiteral(){match("#");emit("Symbol.for('");if(!isAlpha(look)){expected("Symbol literal name")}while(isAlNum(look)){emitAndGetChar(look)}emit("')")}function emitStringLiteral(){var a=matchOne(QUOTES);emit(a);while(look!=a&&!isEndOfLineOrFile(look)){if(look==STRINGESCAPE){emitAndGetChar(look)}emitAndGetChar(look)}if(look!=a){abort("String Literal Error: End of line or file: expecting string terminator")}emitAndGetChar(look)}function emitMultiLineComment(){emitAndGetChar(look);while(!(look=="/"&&"*"==stream[streamPos-2])&&!EOF){emitAndGetChar(look)}emitAndGetChar(look)}function emitSingleLineComment(){while(!isEndOfLineOrFile(look)){emitAndGetChar(look)}emitAndGetChar(look)}function init(){result="";EOF=false;EOFMaxRead=1000;charPosAtStartEmit=0;getChar()}function replaceSymbolLiterals(){switch(true){case isRegExLiteral(look):emitRegExLiteral();break;case isSingleLineComment(look):emitSingleLineComment();break;case isMultiLineComment(look):emitMultiLineComment();break;case isQuote(look):emitStringLiteral();break;case isHash(look):emitSymbolLiteral();break;default:emitAndGetChar(look)}}function main(a){stream=a;streamPos=0;init();while(!EOF){charPosAtStartEmit=streamPos-1;replaceSymbolLiterals()}return result};