1<lexer>
  2  <config>
  3    <name>JavaScript</name>
  4    <alias>js</alias>
  5    <alias>javascript</alias>
  6    <filename>*.js</filename>
  7    <filename>*.jsm</filename>
  8    <filename>*.mjs</filename>
  9    <mime_type>application/javascript</mime_type>
 10    <mime_type>application/x-javascript</mime_type>
 11    <mime_type>text/x-javascript</mime_type>
 12    <mime_type>text/javascript</mime_type>
 13    <dot_all>true</dot_all>
 14    <ensure_nl>true</ensure_nl>
 15  </config>
 16  <rules>
 17    <state name="interp">
 18      <rule pattern="`">
 19        <token type="LiteralStringBacktick"/>
 20        <pop depth="1"/>
 21      </rule>
 22      <rule pattern="\\\\">
 23        <token type="LiteralStringBacktick"/>
 24      </rule>
 25      <rule pattern="\\`">
 26        <token type="LiteralStringBacktick"/>
 27      </rule>
 28      <rule pattern="\\[^`\\]">
 29        <token type="LiteralStringBacktick"/>
 30      </rule>
 31      <rule pattern="\$\{">
 32        <token type="LiteralStringInterpol"/>
 33        <push state="interp-inside"/>
 34      </rule>
 35      <rule pattern="\$">
 36        <token type="LiteralStringBacktick"/>
 37      </rule>
 38      <rule pattern="[^`\\$]+">
 39        <token type="LiteralStringBacktick"/>
 40      </rule>
 41    </state>
 42    <state name="interp-inside">
 43      <rule pattern="\}">
 44        <token type="LiteralStringInterpol"/>
 45        <pop depth="1"/>
 46      </rule>
 47      <rule>
 48        <include state="root"/>
 49      </rule>
 50    </state>
 51    <state name="commentsandwhitespace">
 52      <rule pattern="\s+">
 53        <token type="Text"/>
 54      </rule>
 55      <rule pattern="&lt;!--">
 56        <token type="Comment"/>
 57      </rule>
 58      <rule pattern="//.*?\n">
 59        <token type="CommentSingle"/>
 60      </rule>
 61      <rule pattern="/\*.*?\*/">
 62        <token type="CommentMultiline"/>
 63      </rule>
 64    </state>
 65    <state name="slashstartsregex">
 66      <rule>
 67        <include state="commentsandwhitespace"/>
 68      </rule>
 69      <rule pattern="/(\\.|[^[/\\\n]|\[(\\.|[^\]\\\n])*])+/([gimuy]+\b|\B)">
 70        <token type="LiteralStringRegex"/>
 71        <pop depth="1"/>
 72      </rule>
 73      <rule pattern="(?=/)">
 74        <token type="Text"/>
 75        <push state="#pop" state="badregex"/>
 76      </rule>
 77      <rule>
 78        <pop depth="1"/>
 79      </rule>
 80    </state>
 81    <state name="badregex">
 82      <rule pattern="\n">
 83        <token type="Text"/>
 84        <pop depth="1"/>
 85      </rule>
 86    </state>
 87    <state name="root">
 88      <rule pattern="\A#! ?/.*?\n">
 89        <token type="CommentHashbang"/>
 90      </rule>
 91      <rule pattern="^(?=\s|/|&lt;!--)">
 92        <token type="Text"/>
 93        <push state="slashstartsregex"/>
 94      </rule>
 95      <rule>
 96        <include state="commentsandwhitespace"/>
 97      </rule>
 98      <rule pattern="\d+(\.\d*|[eE][+\-]?\d+)">
 99        <token type="LiteralNumberFloat"/>
100      </rule>
101      <rule pattern="0[bB][01]+">
102        <token type="LiteralNumberBin"/>
103      </rule>
104      <rule pattern="0[oO][0-7]+">
105        <token type="LiteralNumberOct"/>
106      </rule>
107      <rule pattern="0[xX][0-9a-fA-F]+">
108        <token type="LiteralNumberHex"/>
109      </rule>
110      <rule pattern="[0-9][0-9_]*">
111        <token type="LiteralNumberInteger"/>
112      </rule>
113      <rule pattern="\.\.\.|=&gt;">
114        <token type="Punctuation"/>
115      </rule>
116      <rule pattern="\+\+|--|~|&amp;&amp;|\?|:|\|\||\\(?=\n)|(&lt;&lt;|&gt;&gt;&gt;?|==?|!=?|[-&lt;&gt;+*%&amp;|^/])=?">
117        <token type="Operator"/>
118        <push state="slashstartsregex"/>
119      </rule>
120      <rule pattern="[{(\[;,]">
121        <token type="Punctuation"/>
122        <push state="slashstartsregex"/>
123      </rule>
124      <rule pattern="[})\].]">
125        <token type="Punctuation"/>
126      </rule>
127      <rule pattern="(for|in|while|do|break|return|continue|switch|case|default|if|else|throw|try|catch|finally|new|delete|typeof|instanceof|void|yield|this|of)\b">
128        <token type="Keyword"/>
129        <push state="slashstartsregex"/>
130      </rule>
131      <rule pattern="(var|let|with|function)\b">
132        <token type="KeywordDeclaration"/>
133        <push state="slashstartsregex"/>
134      </rule>
135      <rule pattern="(abstract|async|await|boolean|byte|char|class|const|debugger|double|enum|export|extends|final|float|goto|implements|import|int|interface|long|native|package|private|protected|public|short|static|super|synchronized|throws|transient|volatile)\b">
136        <token type="KeywordReserved"/>
137      </rule>
138      <rule pattern="(true|false|null|NaN|Infinity|undefined)\b">
139        <token type="KeywordConstant"/>
140      </rule>
141      <rule pattern="(Array|Boolean|Date|Error|Function|Math|netscape|Number|Object|Packages|RegExp|String|Promise|Proxy|sun|decodeURI|decodeURIComponent|encodeURI|encodeURIComponent|Error|eval|isFinite|isNaN|isSafeInteger|parseFloat|parseInt|document|this|window)\b">
142        <token type="NameBuiltin"/>
143      </rule>
144      <rule pattern="(?:[$_\p{L}\p{N}]|\\u[a-fA-F0-9]{4})(?:(?:[$\p{L}\p{N}]|\\u[a-fA-F0-9]{4}))*">
145        <token type="NameOther"/>
146      </rule>
147      <rule pattern="&#34;(\\\\|\\&#34;|[^&#34;])*&#34;">
148        <token type="LiteralStringDouble"/>
149      </rule>
150      <rule pattern="&#39;(\\\\|\\&#39;|[^&#39;])*&#39;">
151        <token type="LiteralStringSingle"/>
152      </rule>
153      <rule pattern="`">
154        <token type="LiteralStringBacktick"/>
155        <push state="interp"/>
156      </rule>
157    </state>
158  </rules>
159</lexer>