index.js 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. function combine () {
  2. return new RegExp('('+[].slice.call(arguments).map(function (e) {
  3. var e = e.toString()
  4. return '(?:' + e.substring(1, e.length - 1) + ')'
  5. }).join('|')+')')
  6. }
  7. function makeTester (rx) {
  8. var s = rx.toString()
  9. return new RegExp('^' + s.substring(1, s.length -1) + '$')
  10. // return new RegExp('('+[].slice.call(arguments).map(function (e) {
  11. // var e = e.toString()
  12. // return '(?:' + e.substring(1, e.length - 1) + ')'
  13. // }).join('|')+')')
  14. }
  15. var pattern = {
  16. string1 : /"(?:(?:\\\n|\\"|[^"\n]))*?"/
  17. , string2 : /'(?:(?:\\\n|\\'|[^'\n]))*?'/
  18. //, string2 : /'(?:(?:\\'|[^']))*?'/
  19. , comment1 : /\/\*[\s\S]*?\*\//
  20. , comment2 : /\/\/.*?\n/
  21. , whitespace : /\s+/
  22. , keyword : /\b(?:var|let|for|if|else|in|class|function|return|with|case|break|switch|export|new|while|do|throw|catch)\b/
  23. , regexp : /\/(?:(?:\\\/|[^\n\/]))*?\//
  24. , name : /[a-zA-Z_\$][a-zA-Z_\$0-9]*/
  25. , number : /\d+(?:\.\d+)?(?:e[+-]?\d+)?/
  26. , parens : /[\(\)]/
  27. , curly : /[{}]/
  28. , square : /[\[\]]/
  29. , punct : /[;.:\?\^%<>=!&|+\-,~]/
  30. }
  31. var match = combine(
  32. pattern.string1
  33. , pattern.string2
  34. , pattern.comment1
  35. , pattern.comment2
  36. , pattern.regexp
  37. , pattern.whitespace
  38. , pattern.name
  39. , pattern.number
  40. , pattern.parens
  41. , pattern.curly
  42. , pattern.square
  43. , pattern.punct
  44. )
  45. var tester = {}
  46. for(var k in pattern) {
  47. tester[k] = makeTester(pattern[k])
  48. }
  49. module.exports = function (str, doNotThrow) {
  50. return str.split(match).filter(function (e, i) {
  51. if(i % 2)
  52. return true
  53. if(e !== '') {
  54. if(!doNotThrow)
  55. throw new Error('invalid token:'+JSON.stringify(e))
  56. return true
  57. }
  58. })
  59. }
  60. module.exports.type = function (e) {
  61. for (var type in pattern)
  62. if(tester[type].test(e))
  63. return type
  64. return 'invalid'
  65. }