1<lexer>
  2  <config>
  3    <name>react</name>
  4    <alias>jsx</alias>
  5    <alias>react</alias>
  6    <filename>*.jsx</filename>
  7    <filename>*.react</filename>
  8    <mime_type>text/jsx</mime_type>
  9    <mime_type>text/typescript-jsx</mime_type>
 10    <dot_all>true</dot_all>
 11  </config>
 12  <rules>
 13    <state name="commentsandwhitespace">
 14      <rule pattern="\s+">
 15        <token type="Text"/>
 16      </rule>
 17      <rule pattern="<!--">
 18        <token type="Comment"/>
 19      </rule>
 20      <rule pattern="//.*?\n">
 21        <token type="CommentSingle"/>
 22      </rule>
 23      <rule pattern="/\*.*?\*/">
 24        <token type="CommentMultiline"/>
 25      </rule>
 26    </state>
 27    <state name="slashstartsregex">
 28      <rule>
 29        <include state="commentsandwhitespace"/>
 30      </rule>
 31      <rule pattern="/(\\.|[^[/\\\n]|\[(\\.|[^\]\\\n])*])+/([gimuy]+\b|\B)">
 32        <token type="LiteralStringRegex"/>
 33        <pop depth="1"/>
 34      </rule>
 35      <rule pattern="(?=/)">
 36        <token type="Text"/>
 37        <push state="#pop" state="badregex"/>
 38      </rule>
 39      <rule>
 40        <pop depth="1"/>
 41      </rule>
 42    </state>
 43    <state name="tag">
 44      <rule pattern="\s+">
 45        <token type="Text"/>
 46      </rule>
 47      <rule pattern="([\w]+\s*)(=)(\s*)">
 48        <bygroups>
 49          <token type="NameAttribute"/>
 50          <token type="Operator"/>
 51          <token type="Text"/>
 52        </bygroups>
 53        <push state="attr"/>
 54      </rule>
 55      <rule pattern="[{}]+">
 56        <token type="Punctuation"/>
 57      </rule>
 58      <rule pattern="[\w\.]+">
 59        <token type="NameAttribute"/>
 60      </rule>
 61      <rule pattern="(/?)(\s*)(>)">
 62        <bygroups>
 63          <token type="Punctuation"/>
 64          <token type="Text"/>
 65          <token type="Punctuation"/>
 66        </bygroups>
 67        <pop depth="1"/>
 68      </rule>
 69    </state>
 70    <state name="expression">
 71      <rule pattern="{">
 72        <token type="Punctuation"/>
 73        <push/>
 74      </rule>
 75      <rule pattern="}">
 76        <token type="Punctuation"/>
 77        <pop depth="1"/>
 78      </rule>
 79      <rule>
 80        <include state="root"/>
 81      </rule>
 82    </state>
 83    <state name="attr">
 84      <rule pattern="{">
 85        <token type="Punctuation"/>
 86        <push state="expression"/>
 87      </rule>
 88      <rule pattern="".*?"">
 89        <token type="LiteralString"/>
 90        <pop depth="1"/>
 91      </rule>
 92      <rule pattern="'.*?'">
 93        <token type="LiteralString"/>
 94        <pop depth="1"/>
 95      </rule>
 96      <rule>
 97        <pop depth="1"/>
 98      </rule>
 99    </state>
100    <state name="interp-inside">
101      <rule pattern="\}">
102        <token type="LiteralStringInterpol"/>
103        <pop depth="1"/>
104      </rule>
105      <rule>
106        <include state="root"/>
107      </rule>
108    </state>
109    <state name="badregex">
110      <rule pattern="\n">
111        <token type="Text"/>
112        <pop depth="1"/>
113      </rule>
114    </state>
115    <state name="jsx">
116      <rule pattern="(<)(/?)(>)">
117        <bygroups>
118          <token type="Punctuation"/>
119          <token type="Punctuation"/>
120          <token type="Punctuation"/>
121        </bygroups>
122      </rule>
123      <rule pattern="(<)([\w\.]+)">
124        <bygroups>
125          <token type="Punctuation"/>
126          <token type="NameTag"/>
127        </bygroups>
128        <push state="tag"/>
129      </rule>
130      <rule pattern="(<)(/)([\w\.]+)(>)">
131        <bygroups>
132          <token type="Punctuation"/>
133          <token type="Punctuation"/>
134          <token type="NameTag"/>
135          <token type="Punctuation"/>
136        </bygroups>
137      </rule>
138    </state>
139    <state name="root">
140      <rule>
141        <include state="jsx"/>
142      </rule>
143      <rule pattern="\A#! ?/.*?\n">
144        <token type="CommentHashbang"/>
145      </rule>
146      <rule pattern="^(?=\s|/|<!--)">
147        <token type="Text"/>
148        <push state="slashstartsregex"/>
149      </rule>
150      <rule>
151        <include state="commentsandwhitespace"/>
152      </rule>
153      <rule pattern="(\.\d+|[0-9]+\.[0-9]*)([eE][-+]?[0-9]+)?">
154        <token type="LiteralNumberFloat"/>
155      </rule>
156      <rule pattern="0[bB][01]+">
157        <token type="LiteralNumberBin"/>
158      </rule>
159      <rule pattern="0[oO][0-7]+">
160        <token type="LiteralNumberOct"/>
161      </rule>
162      <rule pattern="0[xX][0-9a-fA-F]+">
163        <token type="LiteralNumberHex"/>
164      </rule>
165      <rule pattern="[0-9]+">
166        <token type="LiteralNumberInteger"/>
167      </rule>
168      <rule pattern="\.\.\.|=>">
169        <token type="Punctuation"/>
170      </rule>
171      <rule pattern="\+\+|--|~|&&|\?|:|\|\||\\(?=\n)|(<<|>>>?|==?|!=?|[-<>+*%&|^/])=?">
172        <token type="Operator"/>
173        <push state="slashstartsregex"/>
174      </rule>
175      <rule pattern="[{(\[;,]">
176        <token type="Punctuation"/>
177        <push state="slashstartsregex"/>
178      </rule>
179      <rule pattern="[})\].]">
180        <token type="Punctuation"/>
181      </rule>
182      <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">
183        <token type="Keyword"/>
184        <push state="slashstartsregex"/>
185      </rule>
186      <rule pattern="(var|let|with|function)\b">
187        <token type="KeywordDeclaration"/>
188        <push state="slashstartsregex"/>
189      </rule>
190      <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">
191        <token type="KeywordReserved"/>
192      </rule>
193      <rule pattern="(true|false|null|NaN|Infinity|undefined)\b">
194        <token type="KeywordConstant"/>
195      </rule>
196      <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">
197        <token type="NameBuiltin"/>
198      </rule>
199      <rule pattern="(?:[$_\p{L}\p{N}]|\\u[a-fA-F0-9]{4})(?:(?:[$\p{L}\p{N}]|\\u[a-fA-F0-9]{4}))*">
200        <token type="NameOther"/>
201      </rule>
202      <rule pattern=""(\\\\|\\"|[^"])*"">
203        <token type="LiteralStringDouble"/>
204      </rule>
205      <rule pattern="'(\\\\|\\'|[^'])*'">
206        <token type="LiteralStringSingle"/>
207      </rule>
208      <rule pattern="`">
209        <token type="LiteralStringBacktick"/>
210        <push state="interp"/>
211      </rule>
212    </state>
213    <state name="interp">
214      <rule pattern="`">
215        <token type="LiteralStringBacktick"/>
216        <pop depth="1"/>
217      </rule>
218      <rule pattern="\\\\">
219        <token type="LiteralStringBacktick"/>
220      </rule>
221      <rule pattern="\\`">
222        <token type="LiteralStringBacktick"/>
223      </rule>
224      <rule pattern="\$\{">
225        <token type="LiteralStringInterpol"/>
226        <push state="interp-inside"/>
227      </rule>
228      <rule pattern="\$">
229        <token type="LiteralStringBacktick"/>
230      </rule>
231      <rule pattern="[^`\\$]+">
232        <token type="LiteralStringBacktick"/>
233      </rule>
234    </state>
235  </rules>
236</lexer>