Last active
October 19, 2016 07:40
-
-
Save cevek/1489482a35203731c7bb800907368db2 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
const esprima = require('esprima'); | |
const recast = require('recast'); | |
const fs = require('fs'); | |
var acorn = require("acorn"); | |
var escodegen = require("escodegen"); | |
var babylon = require("babylon"); | |
var cst = require("cst"); | |
var browserify = require('browserify'); | |
var b = browserify(); | |
const code = fs.readFileSync('ang.js', 'utf8'); | |
const code2 = fs.readFileSync('ang.js'); | |
const testCode = 'const a=1; let b="" && 1 || 0 & 2 | 7 % 10 * 10 + (1 < 4 - 1 > 3); var c=u ? (``, 1) : 2; for(let i=0; i<--g; i++){d.a()} while(a-- == d && f === d); const f = ()=>null; const {d,ds = 2} = dsf; d = d => ({d}); function x(a){}'; | |
function abc() { | |
const str = 'abc;/*a*///b\n/a/'; | |
for (let i = 0; i < 1000; i++) { | |
// esprima.parse(testCode, {range: true}); | |
// esprima.tokenize(testCode); | |
parseStr(str, isRequere); | |
extractRequere([]) | |
} | |
console.time('perf'); | |
// parse(); | |
// parseRecast(); | |
// parseBabylon() | |
// parseCst(); | |
// parseBrowserify(); | |
// parseAcorn(); | |
for (let i = 0; i < 10; i++) { | |
var r = parseStr(code, isRequere); | |
} | |
// parseBuffer() | |
console.timeEnd('perf'); | |
// console.log(r); | |
extractRequere(r); | |
console.log(r.length / 3); | |
} | |
function prettyPrintParseResult(code, r) { | |
for (let i = 0; i < r.length; i += 3) { | |
const s = code.substring(r[i + 1], r[i + 2]); | |
if (r[i] === 1) { | |
console.log('id', s); | |
} | |
if (r[i] === 2) { | |
console.log('st', s); | |
} | |
if (r[i] === 5) { | |
console.log('lc', s); | |
} | |
if (r[i] === 6) { | |
console.log('bc', s); | |
} | |
if (r[i] === 8) { | |
console.log('re', s); | |
} | |
} | |
} | |
function isRequere(code, start, size, startSymbolCode) { | |
if (size === 7 && startSymbolCode === 114/*r*/ && code.substr(start, size) === 'require') { | |
return true; | |
} | |
return false; | |
} | |
function extractRequere(r) { | |
const len = r.length; | |
var start = 0; | |
var end = 0; | |
for (var i = 0; i < len; i += 3) { | |
if (r[i] === 1 /*identifier*/) { | |
start = r[i + 1]; | |
end = r[i + 2]; | |
if (end - start === 7 && code[start] === 'r' && code.substring(start, end) === 'require' && code[end] == '(' && code[start - 1] !== '.' && r[i + 3] === 2 /*string*/) { | |
console.log(code.substring(r[i + 4], r[i + 5])); | |
} | |
} | |
} | |
} | |
function patternAllMatcher() { | |
return true; | |
} | |
function parseRecast() { | |
return recast.parse(code); | |
} | |
function parseAcorn() { | |
return escodegen.generate(acorn.parse(code, {ranges: true})); | |
} | |
function parseBabylon() { | |
return babylon.parse(code); | |
} | |
function parseCst() { | |
return new cst.Parser().parse(code); | |
} | |
function parseBuffer() { | |
"use strict"; | |
let x = 0; | |
for (let i = 0; i < code2.length; i++) { | |
x = code2[i]; | |
} | |
return x; | |
} | |
function parseBrowserify() { | |
"use strict"; | |
b.add('./ang.js'); | |
b.bundle().pipe(process.stdout); | |
} | |
function boom() { | |
"use strict"; | |
// | |
/**/ | |
42 | |
//hello | |
/* | |
* My names is boy | |
* // deep comment | |
*/ | |
/*continue*/ | |
const abc = 2; | |
/*//comment in comment | |
* */ | |
var x = 'Ya\'p'; | |
var d = "Hello \\"; | |
var e = "Hello \\\" world"; | |
var x1 = /\/*/; | |
var y1 = /\//; | |
var y1 = /\\\//; | |
var z1 = /\\///comment | |
var zz = /[/]/; | |
var zz = /[\/]/; | |
var zz = /[\]//]/; | |
var zr = /[/*]/; | |
var zr = /\\[/*]/ | |
var zr = /\\[\]/*]/ | |
var zr = /\\[\\\]/*]/ | |
var zr = /'/; | |
var zr = /`/; | |
x /= 1; | |
var y = x / 1; | |
x | |
/ 1; | |
a / /ra/ | |
a(/ru/) | |
a % /rb/ | |
a ^ /rc/ | |
a & /rd/ | |
a - /re/ | |
a + /rf/ | |
var f = /rg/ | |
a[/rh/] | |
[a] / a | |
a; | |
/rj/ | |
a : /rk/ | |
a , /rl/ | |
a * /rm/ | |
a < /rn/ | |
a == /rp/ | |
a ? /rr/ : 1 | |
a | /rs/ | |
a || /rt/ | |
var h = `Man in the sky | |
and fif around // to be or not to be | |
/* not a comment */ | |
escape \` or not escape \\\` | |
${ literalInTheMiddle + `string in${we + `need to go deeper`}the middle` } | |
`; | |
return /ret/ | |
} | |
const tests = [['st', '"use strict"'], | |
['lc', '//\n'], | |
['bc', '/**/'], | |
['lc', '//hello\n'], | |
['bc', | |
'/*\n * My names is boy\n * // deep comment\n */'], | |
['bc', '/*continue*/'], | |
['bc', '/*//comment in comment\n * */'], | |
['st', '\'Ya\\\'p\''], | |
['st', '"Hello \\\\"'], | |
['st', '"Hello \\\\\\" world"'], | |
['re', '/\\/*/'], | |
['re', '/\\//'], | |
['re', '/\\\\\\//'], | |
['re', '/\\\\/'], | |
['re', '/comment\n var zz = /'], | |
['re', '/]/'], | |
['re', '/[\\/]/'], | |
['re', '/[\\]//]/'], | |
['re', '/[/*]/'], | |
['re', '/\\\\[/*]/'], | |
['re', '/\\\\[\\]/*]/'], | |
['re', '/\\\\[\\\\\\]/*]/'], | |
['re', '/\'/'], | |
['re', '/`/'], | |
['re', '/ru/'], | |
['re', '/rb/'], | |
['re', '/rc/'], | |
['re', '/rd/'], | |
['re', '/re/'], | |
['re', '/rf/'], | |
['re', '/rg/'], | |
['re', '/rh/'], | |
['re', '/rk/'], | |
['re', '/rl/'], | |
['re', '/rm/'], | |
['re', '/rn/'], | |
['re', '/rp/'], | |
['re', '/rr/'], | |
['re', '/rs/'], | |
['re', '/rt/'], | |
['st', | |
'`Man in the sky\nand fif around // to be or not to be \n/* not a comment */\nescape \\` or not escape \\\\\\` \n\n`']] | |
// parseStr('/1//2//3') | |
const parseStr = require('./parser'); | |
const testCode2 = boom.toString(); | |
prettyPrintParseResult(testCode2, parseStr(testCode2, patternAllMatcher)); | |
// parseStr('/1///comment\n"boom"'); | |
const x = 'hello; //23;'; | |
function parse() { | |
"use strict"; | |
escodegen.generate(esprima.parse(code, {range: true})); | |
// esprima.parse(code); | |
} | |
/* | |
function scanRegExpBody(codeD, i) { | |
let ch = codeD[i]; | |
i++; | |
let classMarker = false; | |
let terminated = false; | |
while (i < len) { | |
ch = source[i++]; | |
if (ch === '\\') { | |
ch = source[i++]; | |
} else if (classMarker) { | |
if (ch === ']') { | |
classMarker = false; | |
} | |
} else { | |
if (ch === '/') { | |
terminated = true; | |
break; | |
} else if (ch === '[') { | |
classMarker = true; | |
} | |
} | |
} | |
}; | |
function scanRegExpFlags() { | |
let str = ''; | |
let flags = ''; | |
while (!this.eof()) { | |
let ch = this.source[this.index]; | |
if (!Character.isIdentifierPart(ch.charCodeAt(0))) { | |
break; | |
} | |
++this.index; | |
if (ch === '\\' && !this.eof()) { | |
ch = this.source[this.index]; | |
if (ch === 'u') { | |
++this.index; | |
let restore = this.index; | |
ch = this.scanHexEscape('u'); | |
if (ch) { | |
flags += ch; | |
for (str += '\\u'; restore < this.index; ++restore) { | |
str += this.source[restore]; | |
} | |
} else { | |
this.index = restore; | |
flags += 'u'; | |
str += '\\u'; | |
} | |
this.tolerateUnexpectedToken(); | |
} else { | |
str += '\\'; | |
this.tolerateUnexpectedToken(); | |
} | |
} else { | |
flags += ch; | |
str += ch; | |
} | |
} | |
return { | |
value: flags, | |
literal: str | |
}; | |
}; | |
*/ | |
abc(); |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
let Regex = { | |
// Unicode v8.0.0 NonAsciiIdentifierStart: | |
NonAsciiIdentifierStart: /[\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u05D0-\u05EA\u05F0-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u08A0-\u08B4\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0AF9\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C58-\u0C5A\u0C60\u0C61\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D5F-\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u1820-\u1877\u1880-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u1A00-\u1A16\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1CE9-\u1CEC\u1CEE-\u1CF1\u1CF5\u1CF6\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2118-\u211D\u2124\u2126\u2128\u212A-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303C\u3041-\u3096\u309B-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FD5\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B\uA640-\uA66E\uA67F-\uA69D\uA6A0-\uA6EF\uA717-\uA71F\uA722-\uA788\uA78B-\uA7AD\uA7B0-\uA7B7\uA7F7-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA8FD\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uA9E0-\uA9E4\uA9E6-\uA9EF\uA9FA-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD40-\uDD74\uDE80-\uDE9C\uDEA0-\uDED0\uDF00-\uDF1F\uDF30-\uDF4A\uDF50-\uDF75\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDD00-\uDD27\uDD30-\uDD63\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00\uDE10-\uDE13\uDE15-\uDE17\uDE19-\uDE33\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE4\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2]|\uD804[\uDC03-\uDC37\uDC83-\uDCAF\uDCD0-\uDCE8\uDD03-\uDD26\uDD50-\uDD72\uDD76\uDD83-\uDDB2\uDDC1-\uDDC4\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE2B\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEDE\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3D\uDF50\uDF5D-\uDF61]|\uD805[\uDC80-\uDCAF\uDCC4\uDCC5\uDCC7\uDD80-\uDDAE\uDDD8-\uDDDB\uDE00-\uDE2F\uDE44\uDE80-\uDEAA\uDF00-\uDF19]|\uD806[\uDCA0-\uDCDF\uDCFF\uDEC0-\uDEF8]|\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC80-\uDD43]|[\uD80C\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDED0-\uDEED\uDF00-\uDF2F\uDF40-\uDF43\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDF00-\uDF44\uDF50\uDF93-\uDF9F]|\uD82C[\uDC00\uDC01]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB]|\uD83A[\uDC00-\uDCC4]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1]|\uD87E[\uDC00-\uDE1D]/, | |
// Unicode v8.0.0 NonAsciiIdentifierPart: | |
NonAsciiIdentifierPart: /[\xAA\xB5\xB7\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0300-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u0483-\u0487\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u0591-\u05BD\u05BF\u05C1\u05C2\u05C4\u05C5\u05C7\u05D0-\u05EA\u05F0-\u05F2\u0610-\u061A\u0620-\u0669\u066E-\u06D3\u06D5-\u06DC\u06DF-\u06E8\u06EA-\u06FC\u06FF\u0710-\u074A\u074D-\u07B1\u07C0-\u07F5\u07FA\u0800-\u082D\u0840-\u085B\u08A0-\u08B4\u08E3-\u0963\u0966-\u096F\u0971-\u0983\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BC-\u09C4\u09C7\u09C8\u09CB-\u09CE\u09D7\u09DC\u09DD\u09DF-\u09E3\u09E6-\u09F1\u0A01-\u0A03\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A3C\u0A3E-\u0A42\u0A47\u0A48\u0A4B-\u0A4D\u0A51\u0A59-\u0A5C\u0A5E\u0A66-\u0A75\u0A81-\u0A83\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABC-\u0AC5\u0AC7-\u0AC9\u0ACB-\u0ACD\u0AD0\u0AE0-\u0AE3\u0AE6-\u0AEF\u0AF9\u0B01-\u0B03\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3C-\u0B44\u0B47\u0B48\u0B4B-\u0B4D\u0B56\u0B57\u0B5C\u0B5D\u0B5F-\u0B63\u0B66-\u0B6F\u0B71\u0B82\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BBE-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCD\u0BD0\u0BD7\u0BE6-\u0BEF\u0C00-\u0C03\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D-\u0C44\u0C46-\u0C48\u0C4A-\u0C4D\u0C55\u0C56\u0C58-\u0C5A\u0C60-\u0C63\u0C66-\u0C6F\u0C81-\u0C83\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBC-\u0CC4\u0CC6-\u0CC8\u0CCA-\u0CCD\u0CD5\u0CD6\u0CDE\u0CE0-\u0CE3\u0CE6-\u0CEF\u0CF1\u0CF2\u0D01-\u0D03\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D-\u0D44\u0D46-\u0D48\u0D4A-\u0D4E\u0D57\u0D5F-\u0D63\u0D66-\u0D6F\u0D7A-\u0D7F\u0D82\u0D83\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0DCA\u0DCF-\u0DD4\u0DD6\u0DD8-\u0DDF\u0DE6-\u0DEF\u0DF2\u0DF3\u0E01-\u0E3A\u0E40-\u0E4E\u0E50-\u0E59\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB9\u0EBB-\u0EBD\u0EC0-\u0EC4\u0EC6\u0EC8-\u0ECD\u0ED0-\u0ED9\u0EDC-\u0EDF\u0F00\u0F18\u0F19\u0F20-\u0F29\u0F35\u0F37\u0F39\u0F3E-\u0F47\u0F49-\u0F6C\u0F71-\u0F84\u0F86-\u0F97\u0F99-\u0FBC\u0FC6\u1000-\u1049\u1050-\u109D\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u135D-\u135F\u1369-\u1371\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1714\u1720-\u1734\u1740-\u1753\u1760-\u176C\u176E-\u1770\u1772\u1773\u1780-\u17D3\u17D7\u17DC\u17DD\u17E0-\u17E9\u180B-\u180D\u1810-\u1819\u1820-\u1877\u1880-\u18AA\u18B0-\u18F5\u1900-\u191E\u1920-\u192B\u1930-\u193B\u1946-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u19D0-\u19DA\u1A00-\u1A1B\u1A20-\u1A5E\u1A60-\u1A7C\u1A7F-\u1A89\u1A90-\u1A99\u1AA7\u1AB0-\u1ABD\u1B00-\u1B4B\u1B50-\u1B59\u1B6B-\u1B73\u1B80-\u1BF3\u1C00-\u1C37\u1C40-\u1C49\u1C4D-\u1C7D\u1CD0-\u1CD2\u1CD4-\u1CF6\u1CF8\u1CF9\u1D00-\u1DF5\u1DFC-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u200C\u200D\u203F\u2040\u2054\u2071\u207F\u2090-\u209C\u20D0-\u20DC\u20E1\u20E5-\u20F0\u2102\u2107\u210A-\u2113\u2115\u2118-\u211D\u2124\u2126\u2128\u212A-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D7F-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2DE0-\u2DFF\u3005-\u3007\u3021-\u302F\u3031-\u3035\u3038-\u303C\u3041-\u3096\u3099-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FD5\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA62B\uA640-\uA66F\uA674-\uA67D\uA67F-\uA6F1\uA717-\uA71F\uA722-\uA788\uA78B-\uA7AD\uA7B0-\uA7B7\uA7F7-\uA827\uA840-\uA873\uA880-\uA8C4\uA8D0-\uA8D9\uA8E0-\uA8F7\uA8FB\uA8FD\uA900-\uA92D\uA930-\uA953\uA960-\uA97C\uA980-\uA9C0\uA9CF-\uA9D9\uA9E0-\uA9FE\uAA00-\uAA36\uAA40-\uAA4D\uAA50-\uAA59\uAA60-\uAA76\uAA7A-\uAAC2\uAADB-\uAADD\uAAE0-\uAAEF\uAAF2-\uAAF6\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABEA\uABEC\uABED\uABF0-\uABF9\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE00-\uFE0F\uFE20-\uFE2F\uFE33\uFE34\uFE4D-\uFE4F\uFE70-\uFE74\uFE76-\uFEFC\uFF10-\uFF19\uFF21-\uFF3A\uFF3F\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD40-\uDD74\uDDFD\uDE80-\uDE9C\uDEA0-\uDED0\uDEE0\uDF00-\uDF1F\uDF30-\uDF4A\uDF50-\uDF7A\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDCA0-\uDCA9\uDD00-\uDD27\uDD30-\uDD63\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00-\uDE03\uDE05\uDE06\uDE0C-\uDE13\uDE15-\uDE17\uDE19-\uDE33\uDE38-\uDE3A\uDE3F\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE6\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2]|\uD804[\uDC00-\uDC46\uDC66-\uDC6F\uDC7F-\uDCBA\uDCD0-\uDCE8\uDCF0-\uDCF9\uDD00-\uDD34\uDD36-\uDD3F\uDD50-\uDD73\uDD76\uDD80-\uDDC4\uDDCA-\uDDCC\uDDD0-\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE37\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEEA\uDEF0-\uDEF9\uDF00-\uDF03\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3C-\uDF44\uDF47\uDF48\uDF4B-\uDF4D\uDF50\uDF57\uDF5D-\uDF63\uDF66-\uDF6C\uDF70-\uDF74]|\uD805[\uDC80-\uDCC5\uDCC7\uDCD0-\uDCD9\uDD80-\uDDB5\uDDB8-\uDDC0\uDDD8-\uDDDD\uDE00-\uDE40\uDE44\uDE50-\uDE59\uDE80-\uDEB7\uDEC0-\uDEC9\uDF00-\uDF19\uDF1D-\uDF2B\uDF30-\uDF39]|\uD806[\uDCA0-\uDCE9\uDCFF\uDEC0-\uDEF8]|\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC80-\uDD43]|[\uD80C\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDE60-\uDE69\uDED0-\uDEED\uDEF0-\uDEF4\uDF00-\uDF36\uDF40-\uDF43\uDF50-\uDF59\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDF00-\uDF44\uDF50-\uDF7E\uDF8F-\uDF9F]|\uD82C[\uDC00\uDC01]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99\uDC9D\uDC9E]|\uD834[\uDD65-\uDD69\uDD6D-\uDD72\uDD7B-\uDD82\uDD85-\uDD8B\uDDAA-\uDDAD\uDE42-\uDE44]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB\uDFCE-\uDFFF]|\uD836[\uDE00-\uDE36\uDE3B-\uDE6C\uDE75\uDE84\uDE9B-\uDE9F\uDEA1-\uDEAF]|\uD83A[\uDC00-\uDCC4\uDCD0-\uDCD6]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1]|\uD87E[\uDC00-\uDE1D]|\uDB40[\uDD00-\uDDEF]/ | |
}; | |
function isWhiteSpace(cp) { | |
return (cp === 0x20) || (cp === 0x09) || (cp === 0x0B) || (cp === 0x0C) || (cp === 0xA0) || | |
(cp >= 0x1680 && [0x1680, 0x2000, 0x2001, 0x2002, 0x2003, 0x2004, 0x2005, 0x2006, 0x2007, 0x2008, 0x2009, 0x200A, 0x202F, 0x205F, 0x3000, 0xFEFF].indexOf(cp) >= 0); | |
} | |
function isLineTerminator(cp) { | |
return (cp === 0x0A) || (cp === 0x0D) || (cp === 0x2028) || (cp === 0x2029); | |
} | |
function isIdentifierStart(cp) { | |
return (cp === 0x24) || (cp === 0x5F) || // $ (dollar) and _ (underscore) | |
(cp >= 0x41 && cp <= 0x5A) || // A..Z | |
(cp >= 0x61 && cp <= 0x7A) || // a..z | |
(cp === 0x5C) || // \ (backslash) | |
((cp >= 0x80) && Regex.NonAsciiIdentifierStart.test(fromCodePoint(cp))); | |
} | |
function fromCodePoint(cp) { | |
return (cp < 0x10000) ? String.fromCharCode(cp) : | |
String.fromCharCode(0xD800 + ((cp - 0x10000) >> 10)) + | |
String.fromCharCode(0xDC00 + ((cp - 0x10000) & 1023)); | |
} | |
function isIdentifierPart(cp) { | |
return (cp === 0x24) || (cp === 0x5F) || // $ (dollar) and _ (underscore) | |
(cp >= 0x41 && cp <= 0x5A) || // A..Z | |
(cp >= 0x61 && cp <= 0x7A) || // a..z | |
(cp >= 0x30 && cp <= 0x39) || // 0..9 | |
(cp === 0x5C) || // \ (backslash) | |
((cp >= 0x80) && Regex.NonAsciiIdentifierPart.test(fromCodePoint(cp))); | |
} | |
// const globMap = new Uint8Array(256 * 256); | |
const globMap = new Array(256 * 256).fill(0); | |
// 2 - string | |
// 5 - white space | |
// 10 - nextExpression | |
// 15 - line terminator | |
// 20 - identifier_start | |
// 21 - identifier_part | |
const nextNewExpressionStartSymbols = []; | |
'~%^&*/-+([;:?,<>=|'.split('').forEach(ch => { | |
nextNewExpressionStartSymbols[ch.charCodeAt(0)] = true; | |
}); | |
function isNextStartExpression(i) { | |
return nextNewExpressionStartSymbols[i]; | |
} | |
for (let i = 0; i < globMap.length; i++) { | |
if (isWhiteSpace(i)) { | |
globMap[i] = 5; | |
} | |
if (isNextStartExpression(i)) { | |
globMap[i] = 10; | |
} | |
if (isLineTerminator(i)) { | |
globMap[i] = 15; | |
} | |
if (isIdentifierPart(i)) { | |
globMap[i] = 255; // part | |
} | |
/* if (isIdentifierStart(i)) { | |
globMap[i] = 127; // start | |
}*/ | |
} | |
// strings | |
globMap[34] = 2; | |
/*'*/ | |
globMap[39] = 2; | |
/*"*/ | |
// globMap[96] = 2; | |
/*`*/ | |
function parseStr(code, patternMatcher) { | |
// "use strict"; | |
let i = -1; | |
let nextExpressionStart = true; | |
let x = 0; | |
let startS = 0; | |
let type = 0; | |
const len = code.length; | |
const stokens = []; | |
let strSym = 0; | |
let nextX = 0; | |
let prevWasAst = false; | |
let classMarker = false; | |
let scanCurly = false; | |
// let curlyStack = 0; | |
let f = 0; | |
const curlyStack = []; | |
let curlyPos = 0; | |
let curlyType = 0; | |
let size = 0; | |
let startIdentSym = 0; | |
main: while (++i < len) { | |
x = code.charCodeAt(i); | |
type = globMap[x]; | |
// f = type >> 1 & 1; | |
if ((type === 255/* ident part */)) { | |
nextExpressionStart = false; | |
startS = i; | |
startIdentSym = x; | |
/* | |
do { | |
x = code.charCodeAt(++i); | |
type = globMap[x]; | |
} while (type === 255); | |
*/ | |
// stokens.push(1, startS, i); | |
while (++i < len) { | |
x = code.charCodeAt(i); | |
type = globMap[x]; | |
if (type !== 255 /* ident start */) { | |
size = i - startS; | |
if (patternMatcher(code, startS, size, startIdentSym)) { | |
stokens.push(1, startS, i); | |
} | |
if (size === 6 && startIdentSym === 114 /*r*/ && code.substr(startS, size) === 'return') { | |
nextExpressionStart = true; | |
} | |
break; | |
} | |
} | |
} | |
if (x === 123 /*{*/) { | |
curlyStack[curlyPos++] = 1; | |
} | |
else if (x === 125 /*}*/) { | |
// continue template string after "}" | |
if (curlyStack[--curlyPos] === 2) { | |
startS = i; | |
nextExpressionStart = false; | |
while (++i < len) { | |
x = code.charCodeAt(i); | |
if (x === 92 /*\*/) { | |
i++; | |
continue; | |
} | |
if (x === 96 /*`*/) { | |
stokens.push(2, startS + 1, i); | |
continue main; | |
} | |
} | |
} | |
} | |
// string " ' | |
if (type === 2 /*string*/) { | |
strSym = x; | |
startS = i; | |
nextExpressionStart = false; | |
while (++i < len) { | |
x = code.charCodeAt(i); | |
if (x === 92 /*\*/) { | |
i++; | |
continue; | |
} | |
if (x === strSym) { | |
stokens.push(2, startS + 1, i); | |
continue main; | |
} | |
} | |
} | |
// template string | |
else if (x === 96 /*`*/) { | |
startS = i; | |
while (++i < len) { | |
x = code.charCodeAt(i); | |
if (x === 92 /*\*/) { | |
i++; | |
continue; | |
} | |
if (x === 36 /*$*/ && code.charCodeAt(i + 1) === 123 /*{*/) { | |
i++; | |
curlyStack[curlyPos++] = 2; // dollar curly | |
stokens.push(2, startS + 1, i - 1); | |
continue main; | |
} | |
if (x === 96 /*`*/) { | |
stokens.push(2, startS + 1, i); | |
continue main; | |
} | |
} | |
} | |
// / | |
else if (x === 47 /*/*/) { | |
nextX = code.charCodeAt(i + 1); | |
// line comment // | |
if (nextX === 47/*/*/) { | |
startS = i; | |
i++; | |
while (++i < len && globMap[code.charCodeAt(i)] !== 15/*line terminator*/); | |
// ret && tokens.push(["lc", code.substring(startS, i + 1)]); | |
stokens.push(5, startS, i); | |
continue; | |
} | |
// block comment /* | |
if (nextX === 42/* * */) { | |
startS = i; | |
i++; | |
prevWasAst = false; | |
while (++i < len) { | |
x = code.charCodeAt(i); | |
if (x === 42/* * */) { | |
prevWasAst = true; | |
continue; | |
} | |
if (prevWasAst) { | |
if (x === 47/*/*/) { | |
// ret && tokens.push(["bc", code.substring(startS, i + 1)]); | |
stokens.push(6, startS, i + 1); | |
continue main; | |
} | |
prevWasAst = false; | |
} | |
} | |
} | |
// start regexp | |
if (nextExpressionStart) { | |
nextExpressionStart = false; | |
startS = i; | |
classMarker = false; | |
while (++i < len) { | |
// let sym = codeD[i]; | |
x = code.charCodeAt(i); | |
if (x === 92 /*\*/) { | |
x = code[i++]; | |
} else if (classMarker) { | |
if (x === 93/*]*/) { | |
classMarker = false; | |
} | |
} else { | |
if (x === 47 /*/*/) { | |
// todo: flags | |
// ret && tokens.push(["re", code.substring(startS, i + 1)]); | |
stokens.push(8 /*re*/, startS, i + 1); | |
continue main; | |
} else if (x === 91 /*[*/) { | |
classMarker = true; | |
} | |
} | |
} | |
} | |
} | |
// if next expression start | |
else if (type === 10 /* next exrp */) { | |
nextExpressionStart = true; | |
} | |
// non white space | |
else if (type !== 5 /* space */) { | |
nextExpressionStart = false; | |
} | |
} | |
/* | |
for (let i = 0; i < code.length; i++) { | |
x = code.charCodeAt(i); | |
} | |
*/ | |
// tokens.map(t => console.log(t[0], '"' + t[1] + '"')); | |
// console.log(tokens.map(t => t[0] + ' "' + t[1].substr(0, 100) + '"').join('\n')); | |
// console.log(tokens); | |
// for (i = 0; i < stokens.length; i += 3) { | |
// stokens[i]; | |
// } | |
return stokens; | |
} | |
function test() { | |
//abc | |
/**/ | |
/1/ | |
} | |
function patternMatcher() { | |
return true; | |
} | |
parseStr('//a\n"b"', patternMatcher); | |
parseStr('return /1/', patternMatcher); | |
parseStr('yield /1/', patternMatcher); | |
parseStr('yield* /1/', patternMatcher); | |
parseStr('if (1)/1/', patternMatcher); // useless | |
parseStr('while(1)/1/', patternMatcher); // useless | |
parseStr('for(1)/1/', patternMatcher); // useless | |
parseStr('with(1)/1/', patternMatcher); // useless | |
parseStr('function(){} /42', patternMatcher); // useless | |
parseStr('function f(){} /42/', patternMatcher); // useless | |
parseStr('in/1/', patternMatcher); // useless | |
parseStr('typeof/1/', patternMatcher); // useless | |
parseStr('instanceof/1/', patternMatcher); // useless | |
parseStr('new/1/', patternMatcher); // useless | |
parseStr('case /1/', patternMatcher); // useless | |
parseStr('delete /1/', patternMatcher); // useless | |
parseStr('throw /1/', patternMatcher); // useless | |
parseStr('void /1/', patternMatcher); // useless | |
function beforeFunctionExpression(t) { | |
return ['(', '{', '[', 'in', 'typeof', 'instanceof', 'new', | |
'return', 'case', 'delete', 'throw', 'void', | |
// assignment operators | |
'=', '+=', '-=', '*=', '**=', '/=', '%=', '<<=', '>>=', '>>>=', | |
'&=', '|=', '^=', ',', | |
// binary/unary operators | |
'+', '-', '*', '**', '/', '%', '++', '--', '<<', '>>', '>>>', '&', | |
'|', '^', '!', '~', '&&', '||', '?', ':', '===', '==', '>=', | |
'<=', '<', '>', '!=', '!=='].indexOf(t) >= 0; | |
}; | |
if (typeof module == 'object') { | |
module.exports = parseStr; | |
} | |
function x() { | |
"use strict"; | |
console.profile('prof'); | |
for (let i = 0; i < 300; i++) { | |
parseStr('//flow\n/*1*/"1"`1`,/[\\1]/'); | |
} | |
console.profileEnd('prof'); | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
var charToInteger = {}; | |
var integerToChar = {}; | |
'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='.split('').forEach(function (char, i) { | |
charToInteger[char/*.codePointAt(0)*/] = i; | |
integerToChar[i] = char/*.codePointAt(0)*/; | |
}); | |
const fs = require('fs'); | |
const folder = './esprima/'; | |
const files = fs.readdirSync(folder).filter(f => f.substr(-3) == '.js').map(f => ({ | |
source: fs.readFileSync(folder + f, 'utf8'), | |
sourceFile: folder + f, | |
mapFile: folder + f + '.map', | |
mapSource: JSON.parse(fs.readFileSync(folder + f + '.map', 'utf8')), | |
})); | |
function sourcemapDiffCalc(str) { | |
var len = str.length, | |
i, | |
hasContinuationBit, | |
shift = 0, | |
value = 0, | |
integer, | |
sym, | |
shouldNegate, | |
fieldN = 0, | |
genLine = 0, | |
genCol = 0, | |
filePos = 0, | |
line = 0, | |
col = 0, | |
named = 0, | |
segments = 1 | |
for (i = 0; i < len; i++) { | |
sym = str[i]; | |
if (sym === ';' || sym === ',') { | |
segments++; | |
shift = 0; | |
value = 0; | |
fieldN = 0; | |
if (sym === ';') { | |
genLine++; | |
genCol = 0; | |
} | |
continue; | |
} | |
integer = charToInteger[str[i]]; | |
hasContinuationBit = integer & 32; | |
integer &= 31; | |
value += integer << shift; | |
if (hasContinuationBit) { | |
shift += 5; | |
} else { | |
shouldNegate = value & 1; | |
value >>= 1; | |
value = shouldNegate ? -value : value; | |
switch (fieldN) { | |
case 0: | |
genCol += value; | |
break; | |
case 1: | |
filePos += value; | |
break; | |
case 2: | |
line += value; | |
break; | |
case 3: | |
col += value; | |
break; | |
case 4: | |
named += value; | |
break; | |
} | |
fieldN++; | |
// reset | |
value = shift = 0; | |
} | |
} | |
return {genLine, genCol, filePos, line, col, named, segments}; | |
} | |
function encode(value) { | |
var result, i; | |
if (typeof value === 'number') { | |
result = encodeInteger(value); | |
} else { | |
result = ''; | |
for (i = 0; i < value.length; i += 1) { | |
result += encodeInteger(value[i]); | |
} | |
} | |
return result; | |
} | |
function encodeInteger(num) { | |
var result = '', clamped; | |
if (num < 0) { | |
num = ( -num << 1 ) | 1; | |
} else { | |
num <<= 1; | |
} | |
do { | |
clamped = num & 31; | |
num >>= 5; | |
if (num > 0) { | |
clamped |= 32; | |
} | |
result += integerToChar[clamped]; | |
} while (num > 0); | |
return result; | |
} | |
let bulkSource = ''; | |
let sourcemap = { | |
"version": 3, | |
"file": "bundle_.xjs", | |
"sourceRoot": "", | |
names: [], | |
sources: [], | |
mappings: '', | |
}; | |
let prevDiff; | |
let header = (id) => '\n__packer("' + id + '", function(module, exports, require) {\n'; | |
let footer = '\n}\n'; | |
for (let i = 0; i < files.length; i++) { | |
const file = files[i]; | |
let content = header(file.sourceFile) + file.source.replace(/^\/\/[#@]\s+sourceMappingURL=.*$/mg, '') + footer; | |
const map = file.mapSource; | |
let mapping = map.mappings; | |
if (prevDiff) { | |
mapping = encode([0, 1, -prevDiff.line, -prevDiff.col]) + ';;' + mapping + ';;;'; | |
} else { | |
mapping = ';;' + mapping + ';;;'; | |
} | |
prevDiff = sourcemapDiffCalc(map.mappings); | |
sourcemap.mappings += mapping; | |
bulkSource += content; | |
sourcemap.sources.push(...map.sources); | |
} | |
bulkSource += '\n//# sourceMappingURL=bundle_.xjs.map'; | |
fs.writeFileSync('esprima/bundle_.xjs', bulkSource); | |
fs.writeFileSync('esprima/bundle_.xjs.map', JSON.stringify(sourcemap)); | |
const file = files[2].mapSource; | |
let test = ''; | |
for (let i = 0; i < 10000; i++) { | |
test += ';' + file.mappings; | |
} | |
test = new Buffer(test).toString(); | |
console.time('perf'); | |
const res = sourcemapDiffCalc(test); | |
console.timeEnd('perf'); | |
console.log(res); | |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
'use strict'; | |
var convert = require('convert-source-map'); | |
var combine = require('combine-source-map'); | |
const fs = require('fs'); | |
const folder = './esprima/'; | |
const files = fs.readdirSync(folder).filter(f => f.substr(-3) == '.js').map(f => ({ | |
source: fs.readFileSync(folder + f, 'utf8'), | |
sourceFile: folder + f, | |
mapFile: folder + f + '.map', | |
mapSource: JSON.parse(fs.readFileSync(folder + f + '.map', 'utf8')), | |
})); | |
// console.log(files); | |
/* | |
var fooComment = '//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9vLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiZm9vLmNvZmZlZSJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Q0FBQTtDQUFBLENBQUEsQ0FBQSxJQUFPLEdBQUs7Q0FBWiIsInNvdXJjZXNDb250ZW50IjpbImNvbnNvbGUubG9nKHJlcXVpcmUgJy4vYmFyLmpzJylcbiJdfQ=='; | |
var barComment = '//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiYmFyLmNvZmZlZSJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Q0FBQTtDQUFBLENBQUEsQ0FBQSxJQUFPLEdBQUs7Q0FBWiIsInNvdXJjZXNDb250ZW50IjpbImNvbnNvbGUubG9nKGFsZXJ0ICdhbGVydHMgc3VjaycpXG4iXX0='; | |
var fooFile = { | |
source: '(function() {\n\n console.log(require(\'./bar.js\'));\n\n}).call(this);\n' + '\n' + fooComment | |
, sourceFile: 'foo.js' | |
}; | |
var barFile = { | |
source: '(function() {\n\n console.log(alert(\'alerts suck\'));\n\n}).call(this);\n' + '\n' + barComment | |
, sourceFile: 'bar.js' | |
}; | |
*/ | |
const vlq = require('vlq'); | |
var charToInteger = new Array(300); | |
var integerToChar = []; | |
'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='.split('').forEach(function (char, i) { | |
charToInteger[char.codePointAt(0)] = i; | |
integerToChar[i] = char.codePointAt(0); | |
}); | |
function decode(string) { | |
var result,// = [], | |
len = string.length, | |
i = 0, | |
hasContinuationBit, | |
shift = 0, | |
value = 0, | |
integer, | |
shouldNegate, fieldN = 0; | |
for (i = 0; i < len; i++) { | |
integer = charToInteger[string[i]]; | |
if (integer === undefined) { | |
throw new Error('Invalid character (' + string[i] + ')'); | |
} | |
hasContinuationBit = integer & 32; | |
integer &= 31; | |
value += integer << shift; | |
if (hasContinuationBit) { | |
shift += 5; | |
} else { | |
shouldNegate = value & 1; | |
value >>= 1; | |
if (fieldN++ == 1) { | |
return shouldNegate ? -value : value; | |
} | |
// result.push( shouldNegate ? -value : value ); | |
// reset | |
value = shift = 0; | |
} | |
} | |
} | |
function encode(value) { | |
var result, i; | |
if (typeof value === 'number') { | |
result = encodeInteger(value); | |
} else { | |
result = ''; | |
for (i = 0; i < value.length; i += 1) { | |
result += encodeInteger(value[i]); | |
} | |
} | |
return result; | |
} | |
function encodeInteger(num) { | |
var clamped; | |
num <<= 1; | |
do { | |
clamped = num & 31; | |
num >>= 5; | |
if (num > 0) { | |
clamped |= 32; | |
} | |
// result += integerToChar[ clamped ]; | |
} while (num > 0); | |
return num; | |
} | |
const file = files[0]; | |
console.time('perf'); | |
const buff = new Buffer(file.mapSource.mappings); | |
const newBuffer = new Buffer(buff.length * 2).fill(0); | |
// shiftFileNumber(buff, newBuffer); | |
const testMAP = JSON.parse(fs.readFileSync('test/_assert.js.map', 'utf-8')); | |
const result = new Buffer(testMAP.mappings.length * 2).fill(32); | |
shiftFileNumber(new Buffer(testMAP.mappings), result, 0); | |
testMAP.mappings = result.toString().trim(); | |
testMAP.sources.unshift("flow.ts"); | |
fs.writeFileSync('test/assert.js.map', JSON.stringify(testMAP)); | |
// console.log(result.toString()); | |
//;;;;AAAA,0DAA0D;AAC1D,2EAA2E;AAC3E,2EAA2E;AAC3E,oEAAoE;;AAEpE,gBAAuB,SAAkB,EAAE,OAAe;IACtD,wBAAwB;IACxB,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,UAAU,GAAG,OAAO,CAAC,CAAC;IAC1C,CAAC;AACL,CAAC;AALD,wBAKC | |
//;;;;ACAA,0DCA0D;ACC1D,2ECA2E;ACC3E,2ECA2E;ACC3E,oECAoE;;ACEpE,gBCAuB,SCAkB,ECAE,OCAe;ICCtD,wBCAwB;ICCxB,ECAE,CCAC,CCAC,CCAC,SCAS,CCAC,CCAC,CCAC;QCCb,MCAM,ICAI,KCAK,CCAC,UCAU,GCAG,OCAO,CCAC,CCAC;ICC1C,CCAC;ACCL,CCAC;ACLD,wBCKC | |
let bulkSource = ''; | |
let sourcemap = { | |
"version": 3, | |
"file": "bundle_.xjs", | |
"sourceRoot": "", | |
names: [], | |
sources: [], | |
mappings: '', | |
}; | |
for (let i = 0; i < files.length; i++) { | |
const file = files[i]; | |
bulkSource += '\n' + file.source.replace(/^\/\/[#@]\s+sourceMappingURL=.*$/mg, ''); | |
const map = file.mapSource; | |
const ff = (i == 0) ? map.mappings : map.mappings.replace(/^(;*)AA/, "$1AC"); | |
const fixedMapping = ';' + ff + ';'; | |
// i === 0 && console.log('First', map.mappings, fixedMapping); | |
sourcemap.mappings += fixedMapping; | |
sourcemap.sources.push(...map.sources); | |
} | |
bulkSource += '\n//# sourceMappingURL=bundle_.xjs.map'; | |
console.log(sourcemap); | |
fs.writeFileSync('esprima/bundle_.xjs', bulkSource); | |
fs.writeFileSync('esprima/bundle_.xjs.map', JSON.stringify(sourcemap)); | |
let r; | |
for (let i = 0; i < 1000000; i++) { | |
// shiftFileNumber(testBuff, result, 16); | |
// r = decode(buff) | |
// r = encodeInteger(3234) | |
} | |
console.log(r); | |
console.timeEnd('perf') | |
function shiftFileNumber(buffer, newBuffer, shiftN) { | |
var len = buffer.length, | |
i, | |
hasContinuationBit, | |
shift = 0, | |
value = 0, | |
integer, | |
sym, | |
bufferShift = 0, | |
fieldStart = 0, | |
newFieldSize = 0, | |
skipToNextField = false, | |
newI = 0, | |
fieldN = 0, clamped; | |
for (i = 0; i < len; i++) { | |
sym = buffer[i]; | |
newBuffer[i + bufferShift] = sym; | |
if (sym === 59 /*;*/ || sym === 44 /*,*/) { | |
shift = 0; | |
value = 0; | |
fieldN = 0; | |
skipToNextField = false; | |
fieldStart = i + 1; | |
continue; | |
} | |
if (skipToNextField) continue; | |
integer = charToInteger[buffer[i]]; | |
hasContinuationBit = integer & 32; | |
integer &= 31; | |
value += integer << shift; | |
if (hasContinuationBit) { | |
shift += 5; | |
} else { | |
value >>= 1; | |
if (fieldN++ == 1) { | |
value += shiftN; | |
value <<= 1; | |
newFieldSize = 0; | |
newI = i; | |
do { | |
clamped = value & 31; | |
value >>= 5; | |
if (value > 0) { | |
clamped |= 32; | |
} | |
// bufferShift = fieldStart; | |
// newFieldSize++; | |
newBuffer[bufferShift + newI] = integerToChar[clamped]; | |
// result += integerToChar[ clamped ]; | |
newI++; | |
} while (value > 0); | |
bufferShift += newI - i - 1; | |
skipToNextField = true; | |
} | |
// result.push( shouldNegate ? -value : value ); | |
// reset | |
value = shift = 0; | |
} | |
} | |
} | |
function sourcemapDiffCalc(buffer, newBuffer, shiftN) { | |
var len = buffer.length, | |
i, | |
hasContinuationBit, | |
shift = 0, | |
value = 0, | |
integer, | |
sym, | |
bufferShift = 0, | |
fieldStart = 0, | |
newFieldSize = 0, | |
skipToNextField = false, | |
newI = 0, | |
fieldN = 0, clamped; | |
for (i = 0; i < len; i++) { | |
sym = buffer[i]; | |
newBuffer[i + bufferShift] = sym; | |
if (sym === 59 /*;*/ || sym === 44 /*,*/) { | |
shift = 0; | |
value = 0; | |
fieldN = 0; | |
skipToNextField = false; | |
fieldStart = i + 1; | |
continue; | |
} | |
if (skipToNextField) continue; | |
integer = charToInteger[buffer[i]]; | |
hasContinuationBit = integer & 32; | |
integer &= 31; | |
value += integer << shift; | |
if (hasContinuationBit) { | |
shift += 5; | |
} else { | |
value >>= 1; | |
if (fieldN++ == 1) { | |
value += shiftN; | |
value <<= 1; | |
newFieldSize = 0; | |
newI = i; | |
do { | |
clamped = value & 31; | |
value >>= 5; | |
if (value > 0) { | |
clamped |= 32; | |
} | |
// bufferShift = fieldStart; | |
// newFieldSize++; | |
newBuffer[bufferShift + newI] = integerToChar[clamped]; | |
// result += integerToChar[ clamped ]; | |
newI++; | |
} while (value > 0); | |
bufferShift += newI - i - 1; | |
skipToNextField = true; | |
} | |
// result.push( shouldNegate ? -value : value ); | |
// reset | |
value = shift = 0; | |
} | |
} | |
} | |
// console.log(); | |
function abc() { | |
var offset = {line: 2}; | |
let sm = combine.create('bundle.js'); | |
files.forEach(f => { | |
sm.addFile(f, offset) | |
}); | |
console.log(sm); | |
// return convert.fromBase64(sm.base64()).toObject(); | |
} | |
// const x = convert.fromJSON(file.mapSource); | |
// console.log(x); | |
/* | |
console.time('perf') | |
for (let i = 0; i < 1; i++) { | |
var smo = abc(); | |
} | |
console.timeEnd('perf') | |
console.log(smo); | |
*/ |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment