js-tokenizer
Version:
74 lines (65 loc) • 1.79 kB
JavaScript
function combine () {
return new RegExp('('+[].slice.call(arguments).map(function (e) {
var e = e.toString()
return '(?:' + e.substring(1, e.length - 1) + ')'
}).join('|')+')')
}
function makeTester (rx) {
var s = rx.toString()
return new RegExp('^' + s.substring(1, s.length -1) + '$')
// return new RegExp('('+[].slice.call(arguments).map(function (e) {
// var e = e.toString()
// return '(?:' + e.substring(1, e.length - 1) + ')'
// }).join('|')+')')
}
var pattern = {
string1 : /"(?:(?:\\\n|\\"|[^"\n]))*?"/
, string2 : /'(?:(?:\\\n|\\'|[^'\n]))*?'/
//, string2 : /'(?:(?:\\'|[^']))*?'/
, comment1 : /\/\*[\s\S]*?\*\//
, comment2 : /\/\/.*?\n/
, whitespace : /\s+/
, keyword : /\b(?:var|let|for|if|else|in|class|function|return|with|case|break|switch|export|new|while|do|throw|catch)\b/
, regexp : /\/(?:(?:\\\/|[^\n\/]))*?\//
, name : /[a-zA-Z_\$][a-zA-Z_\$0-9]*/
, number : /\d+(?:\.\d+)?(?:e[+-]?\d+)?/
, parens : /[\(\)]/
, curly : /[{}]/
, square : /[\[\]]/
, punct : /[;.:\?\^%<>=!&|+\-,~]/
}
var match = combine(
pattern.string1
, pattern.string2
, pattern.comment1
, pattern.comment2
, pattern.regexp
, pattern.whitespace
, pattern.name
, pattern.number
, pattern.parens
, pattern.curly
, pattern.square
, pattern.punct
)
var tester = {}
for(var k in pattern) {
tester[k] = makeTester(pattern[k])
}
module.exports = function (str, doNotThrow) {
return str.split(match).filter(function (e, i) {
if(i % 2)
return true
if(e !== '') {
if(!doNotThrow)
throw new Error('invalid token:'+JSON.stringify(e))
return true
}
})
}
module.exports.type = function (e) {
for (var type in pattern)
if(tester[type].test(e))
return type
return 'invalid'
}