1<lexer>
  2  <config>
  3    <name>Crystal</name>
  4    <alias>cr</alias>
  5    <alias>crystal</alias>
  6    <filename>*.cr</filename>
  7    <mime_type>text/x-crystal</mime_type>
  8    <dot_all>true</dot_all>
  9  </config>
 10  <rules>
 11    <state name="pa-intp-string">
 12      <rule pattern="\\[\(]">
 13        <token type="LiteralStringOther"/>
 14      </rule>
 15      <rule pattern="\(">
 16        <token type="LiteralStringOther"/>
 17        <push/>
 18      </rule>
 19      <rule pattern="\)">
 20        <token type="LiteralStringOther"/>
 21        <pop depth="1"/>
 22      </rule>
 23      <rule>
 24        <include state="string-intp-escaped"/>
 25      </rule>
 26      <rule pattern="[\\#()]">
 27        <token type="LiteralStringOther"/>
 28      </rule>
 29      <rule pattern="[^\\#()]+">
 30        <token type="LiteralStringOther"/>
 31      </rule>
 32    </state>
 33    <state name="ab-regex">
 34      <rule pattern="\\[\\<>]">
 35        <token type="LiteralStringRegex"/>
 36      </rule>
 37      <rule pattern="<">
 38        <token type="LiteralStringRegex"/>
 39        <push/>
 40      </rule>
 41      <rule pattern=">[imsx]*">
 42        <token type="LiteralStringRegex"/>
 43        <pop depth="1"/>
 44      </rule>
 45      <rule>
 46        <include state="string-intp"/>
 47      </rule>
 48      <rule pattern="[\\#<>]">
 49        <token type="LiteralStringRegex"/>
 50      </rule>
 51      <rule pattern="[^\\#<>]+">
 52        <token type="LiteralStringRegex"/>
 53      </rule>
 54    </state>
 55    <state name="cb-regex">
 56      <rule pattern="\\[\\{}]">
 57        <token type="LiteralStringRegex"/>
 58      </rule>
 59      <rule pattern="\{">
 60        <token type="LiteralStringRegex"/>
 61        <push/>
 62      </rule>
 63      <rule pattern="\}[imsx]*">
 64        <token type="LiteralStringRegex"/>
 65        <pop depth="1"/>
 66      </rule>
 67      <rule>
 68        <include state="string-intp"/>
 69      </rule>
 70      <rule pattern="[\\#{}]">
 71        <token type="LiteralStringRegex"/>
 72      </rule>
 73      <rule pattern="[^\\#{}]+">
 74        <token type="LiteralStringRegex"/>
 75      </rule>
 76    </state>
 77    <state name="simple-backtick">
 78      <rule>
 79        <include state="string-intp-escaped"/>
 80      </rule>
 81      <rule pattern="[^\\`#]+">
 82        <token type="LiteralStringBacktick"/>
 83      </rule>
 84      <rule pattern="[\\#]">
 85        <token type="LiteralStringBacktick"/>
 86      </rule>
 87      <rule pattern="`">
 88        <token type="LiteralStringBacktick"/>
 89        <pop depth="1"/>
 90      </rule>
 91    </state>
 92    <state name="string-intp">
 93      <rule pattern="#\{">
 94        <token type="LiteralStringInterpol"/>
 95        <push state="in-intp"/>
 96      </rule>
 97    </state>
 98    <state name="interpolated-regex">
 99      <rule>
100        <include state="string-intp"/>
101      </rule>
102      <rule pattern="[\\#]">
103        <token type="LiteralStringRegex"/>
104      </rule>
105      <rule pattern="[^\\#]+">
106        <token type="LiteralStringRegex"/>
107      </rule>
108    </state>
109    <state name="cb-string">
110      <rule pattern="\\[\\{}]">
111        <token type="LiteralStringOther"/>
112      </rule>
113      <rule pattern="\{">
114        <token type="LiteralStringOther"/>
115        <push/>
116      </rule>
117      <rule pattern="\}">
118        <token type="LiteralStringOther"/>
119        <pop depth="1"/>
120      </rule>
121      <rule pattern="[\\#{}]">
122        <token type="LiteralStringOther"/>
123      </rule>
124      <rule pattern="[^\\#{}]+">
125        <token type="LiteralStringOther"/>
126      </rule>
127    </state>
128    <state name="in-macro-control">
129      <rule pattern="\{%">
130        <token type="LiteralStringInterpol"/>
131        <push/>
132      </rule>
133      <rule pattern="%\}">
134        <token type="LiteralStringInterpol"/>
135        <pop depth="1"/>
136      </rule>
137      <rule pattern="for\b|in\b">
138        <token type="Keyword"/>
139      </rule>
140      <rule>
141        <include state="root"/>
142      </rule>
143    </state>
144    <state name="interpolated-string">
145      <rule>
146        <include state="string-intp"/>
147      </rule>
148      <rule pattern="[\\#]">
149        <token type="LiteralStringOther"/>
150      </rule>
151      <rule pattern="[^\\#]+">
152        <token type="LiteralStringOther"/>
153      </rule>
154    </state>
155    <state name="in-macro-expr">
156      <rule pattern="\{\{">
157        <token type="LiteralStringInterpol"/>
158        <push/>
159      </rule>
160      <rule pattern="\}\}">
161        <token type="LiteralStringInterpol"/>
162        <pop depth="1"/>
163      </rule>
164      <rule>
165        <include state="root"/>
166      </rule>
167    </state>
168    <state name="simple-string">
169      <rule>
170        <include state="string-intp-escaped"/>
171      </rule>
172      <rule pattern="[^\\"#]+">
173        <token type="LiteralStringDouble"/>
174      </rule>
175      <rule pattern="[\\#]">
176        <token type="LiteralStringDouble"/>
177      </rule>
178      <rule pattern=""">
179        <token type="LiteralStringDouble"/>
180        <pop depth="1"/>
181      </rule>
182    </state>
183    <state name="cb-intp-string">
184      <rule pattern="\\[\{]">
185        <token type="LiteralStringOther"/>
186      </rule>
187      <rule pattern="\{">
188        <token type="LiteralStringOther"/>
189        <push/>
190      </rule>
191      <rule pattern="\}">
192        <token type="LiteralStringOther"/>
193        <pop depth="1"/>
194      </rule>
195      <rule>
196        <include state="string-intp-escaped"/>
197      </rule>
198      <rule pattern="[\\#{}]">
199        <token type="LiteralStringOther"/>
200      </rule>
201      <rule pattern="[^\\#{}]+">
202        <token type="LiteralStringOther"/>
203      </rule>
204    </state>
205    <state name="string-intp-escaped">
206      <rule>
207        <include state="string-intp"/>
208      </rule>
209      <rule>
210        <include state="string-escaped"/>
211      </rule>
212    </state>
213    <state name="sb-regex">
214      <rule pattern="\\[\\\[\]]">
215        <token type="LiteralStringRegex"/>
216      </rule>
217      <rule pattern="\[">
218        <token type="LiteralStringRegex"/>
219        <push/>
220      </rule>
221      <rule pattern="\][imsx]*">
222        <token type="LiteralStringRegex"/>
223        <pop depth="1"/>
224      </rule>
225      <rule>
226        <include state="string-intp"/>
227      </rule>
228      <rule pattern="[\\#\[\]]">
229        <token type="LiteralStringRegex"/>
230      </rule>
231      <rule pattern="[^\\#\[\]]+">
232        <token type="LiteralStringRegex"/>
233      </rule>
234    </state>
235    <state name="classname">
236      <rule pattern="[A-Z_]\w*">
237        <token type="NameClass"/>
238      </rule>
239      <rule pattern="(\()(\s*)([A-Z_]\w*)(\s*)(\))">
240        <bygroups>
241          <token type="Punctuation"/>
242          <token type="Text"/>
243          <token type="NameClass"/>
244          <token type="Text"/>
245          <token type="Punctuation"/>
246        </bygroups>
247      </rule>
248      <rule>
249        <pop depth="1"/>
250      </rule>
251    </state>
252    <state name="string-escaped">
253      <rule pattern="\\([\\befnstv#"\']|x[a-fA-F0-9]{1,2}|[0-7]{1,3})">
254        <token type="LiteralStringEscape"/>
255      </rule>
256    </state>
257    <state name="sb-intp-string">
258      <rule pattern="\\[\[]">
259        <token type="LiteralStringOther"/>
260      </rule>
261      <rule pattern="\[">
262        <token type="LiteralStringOther"/>
263        <push/>
264      </rule>
265      <rule pattern="\]">
266        <token type="LiteralStringOther"/>
267        <pop depth="1"/>
268      </rule>
269      <rule>
270        <include state="string-intp-escaped"/>
271      </rule>
272      <rule pattern="[\\#\[\]]">
273        <token type="LiteralStringOther"/>
274      </rule>
275      <rule pattern="[^\\#\[\]]+">
276        <token type="LiteralStringOther"/>
277      </rule>
278    </state>
279    <state name="pa-regex">
280      <rule pattern="\\[\\()]">
281        <token type="LiteralStringRegex"/>
282      </rule>
283      <rule pattern="\(">
284        <token type="LiteralStringRegex"/>
285        <push/>
286      </rule>
287      <rule pattern="\)[imsx]*">
288        <token type="LiteralStringRegex"/>
289        <pop depth="1"/>
290      </rule>
291      <rule>
292        <include state="string-intp"/>
293      </rule>
294      <rule pattern="[\\#()]">
295        <token type="LiteralStringRegex"/>
296      </rule>
297      <rule pattern="[^\\#()]+">
298        <token type="LiteralStringRegex"/>
299      </rule>
300    </state>
301    <state name="in-attr">
302      <rule pattern="\[">
303        <token type="Operator"/>
304        <push/>
305      </rule>
306      <rule pattern="\]">
307        <token type="Operator"/>
308        <pop depth="1"/>
309      </rule>
310      <rule>
311        <include state="root"/>
312      </rule>
313    </state>
314    <state name="ab-intp-string">
315      <rule pattern="\\[<]">
316        <token type="LiteralStringOther"/>
317      </rule>
318      <rule pattern="<">
319        <token type="LiteralStringOther"/>
320        <push/>
321      </rule>
322      <rule pattern=">">
323        <token type="LiteralStringOther"/>
324        <pop depth="1"/>
325      </rule>
326      <rule>
327        <include state="string-intp-escaped"/>
328      </rule>
329      <rule pattern="[\\#<>]">
330        <token type="LiteralStringOther"/>
331      </rule>
332      <rule pattern="[^\\#<>]+">
333        <token type="LiteralStringOther"/>
334      </rule>
335    </state>
336    <state name="in-intp">
337      <rule pattern="\{">
338        <token type="LiteralStringInterpol"/>
339        <push/>
340      </rule>
341      <rule pattern="\}">
342        <token type="LiteralStringInterpol"/>
343        <pop depth="1"/>
344      </rule>
345      <rule>
346        <include state="root"/>
347      </rule>
348    </state>
349    <state name="end-part">
350      <rule pattern=".+">
351        <token type="CommentPreproc"/>
352        <pop depth="1"/>
353      </rule>
354    </state>
355    <state name="root">
356      <rule pattern="#.*?$">
357        <token type="CommentSingle"/>
358      </rule>
359      <rule pattern="(instance_sizeof|pointerof|protected|abstract|require|private|include|unless|typeof|sizeof|return|extend|ensure|rescue|ifdef|super|break|begin|until|while|elsif|yield|next|when|else|then|case|with|end|asm|if|do|as|of)\b">
360        <token type="Keyword"/>
361      </rule>
362      <rule pattern="(false|true|nil)\b">
363        <token type="KeywordConstant"/>
364      </rule>
365      <rule pattern="(module|lib)(\s+)([a-zA-Z_]\w*(?:::[a-zA-Z_]\w*)*)">
366        <bygroups>
367          <token type="Keyword"/>
368          <token type="Text"/>
369          <token type="NameNamespace"/>
370        </bygroups>
371      </rule>
372      <rule pattern="(def|fun|macro)(\s+)((?:[a-zA-Z_]\w*::)*)">
373        <bygroups>
374          <token type="Keyword"/>
375          <token type="Text"/>
376          <token type="NameNamespace"/>
377        </bygroups>
378        <push state="funcname"/>
379      </rule>
380      <rule pattern="def(?=[*%&^`~+-/\[<>=])">
381        <token type="Keyword"/>
382        <push state="funcname"/>
383      </rule>
384      <rule pattern="(class|struct|union|type|alias|enum)(\s+)((?:[a-zA-Z_]\w*::)*)">
385        <bygroups>
386          <token type="Keyword"/>
387          <token type="Text"/>
388          <token type="NameNamespace"/>
389        </bygroups>
390        <push state="classname"/>
391      </rule>
392      <rule pattern="(self|out|uninitialized)\b|(is_a|responds_to)\?">
393        <token type="KeywordPseudo"/>
394      </rule>
395      <rule pattern="(def_equals_and_hash|assert_responds_to|forward_missing_to|def_equals|property|def_hash|parallel|delegate|debugger|getter|record|setter|spawn|pp)\b">
396        <token type="NameBuiltinPseudo"/>
397      </rule>
398      <rule pattern="getter[!?]|property[!?]|__(DIR|FILE|LINE)__\b">
399        <token type="NameBuiltinPseudo"/>
400      </rule>
401      <rule pattern="(?<!\.)(get_stack_top|StaticArray|Concurrent|with_color|Reference|Scheduler|read_line|Exception|at_exit|Pointer|Channel|Float64|sprintf|Float32|Process|Object|Struct|caller|UInt16|UInt32|UInt64|system|future|Number|printf|String|Symbol|Int32|Range|Slice|Regex|Mutex|sleep|Array|Class|raise|Tuple|Deque|delay|Float|Int16|print|abort|Value|UInt8|Int64|puts|Proc|File|Void|exit|fork|Bool|Char|gets|lazy|loop|main|rand|Enum|Int8|Time|Hash|Set|Box|Nil|Dir|Int|p)\b">
402        <token type="NameBuiltin"/>
403      </rule>
404      <rule pattern="(?<!\w)(<<-?)(["`\']?)([a-zA-Z_]\w*)(\2)(.*?\n)">
405        <token type="LiteralStringHeredoc"/>
406      </rule>
407      <rule pattern="(<<-?)("|\')()(\2)(.*?\n)">
408        <token type="LiteralStringHeredoc"/>
409      </rule>
410      <rule pattern="__END__">
411        <token type="CommentPreproc"/>
412        <push state="end-part"/>
413      </rule>
414      <rule pattern="(?:^|(?<=[=<>~!:])|(?<=(?:\s|;)when\s)|(?<=(?:\s|;)or\s)|(?<=(?:\s|;)and\s)|(?<=\.index\s)|(?<=\.scan\s)|(?<=\.sub\s)|(?<=\.sub!\s)|(?<=\.gsub\s)|(?<=\.gsub!\s)|(?<=\.match\s)|(?<=(?:\s|;)if\s)|(?<=(?:\s|;)elsif\s)|(?<=^when\s)|(?<=^index\s)|(?<=^scan\s)|(?<=^sub\s)|(?<=^gsub\s)|(?<=^sub!\s)|(?<=^gsub!\s)|(?<=^match\s)|(?<=^if\s)|(?<=^elsif\s))(\s*)(/)">
415        <bygroups>
416          <token type="Text"/>
417          <token type="LiteralStringRegex"/>
418        </bygroups>
419        <push state="multiline-regex"/>
420      </rule>
421      <rule pattern="(?<=\(|,|\[)/">
422        <token type="LiteralStringRegex"/>
423        <push state="multiline-regex"/>
424      </rule>
425      <rule pattern="(\s+)(/)(?![\s=])">
426        <bygroups>
427          <token type="Text"/>
428          <token type="LiteralStringRegex"/>
429        </bygroups>
430        <push state="multiline-regex"/>
431      </rule>
432      <rule pattern="(0o[0-7]+(?:_[0-7]+)*(?:_?[iu][0-9]+)?)\b(\s*)([/?])?">
433        <bygroups>
434          <token type="LiteralNumberOct"/>
435          <token type="Text"/>
436          <token type="Operator"/>
437        </bygroups>
438      </rule>
439      <rule pattern="(0x[0-9A-Fa-f]+(?:_[0-9A-Fa-f]+)*(?:_?[iu][0-9]+)?)\b(\s*)([/?])?">
440        <bygroups>
441          <token type="LiteralNumberHex"/>
442          <token type="Text"/>
443          <token type="Operator"/>
444        </bygroups>
445      </rule>
446      <rule pattern="(0b[01]+(?:_[01]+)*(?:_?[iu][0-9]+)?)\b(\s*)([/?])?">
447        <bygroups>
448          <token type="LiteralNumberBin"/>
449          <token type="Text"/>
450          <token type="Operator"/>
451        </bygroups>
452      </rule>
453      <rule pattern="((?:0(?![0-9])|[1-9][\d_]*)(?:\.\d[\d_]*)(?:e[+-]?[0-9]+)?(?:_?f[0-9]+)?)(\s*)([/?])?">
454        <bygroups>
455          <token type="LiteralNumberFloat"/>
456          <token type="Text"/>
457          <token type="Operator"/>
458        </bygroups>
459      </rule>
460      <rule pattern="((?:0(?![0-9])|[1-9][\d_]*)(?:\.\d[\d_]*)?(?:e[+-]?[0-9]+)(?:_?f[0-9]+)?)(\s*)([/?])?">
461        <bygroups>
462          <token type="LiteralNumberFloat"/>
463          <token type="Text"/>
464          <token type="Operator"/>
465        </bygroups>
466      </rule>
467      <rule pattern="((?:0(?![0-9])|[1-9][\d_]*)(?:\.\d[\d_]*)?(?:e[+-]?[0-9]+)?(?:_?f[0-9]+))(\s*)([/?])?">
468        <bygroups>
469          <token type="LiteralNumberFloat"/>
470          <token type="Text"/>
471          <token type="Operator"/>
472        </bygroups>
473      </rule>
474      <rule pattern="(0\b|[1-9][\d]*(?:_\d+)*(?:_?[iu][0-9]+)?)\b(\s*)([/?])?">
475        <bygroups>
476          <token type="LiteralNumberInteger"/>
477          <token type="Text"/>
478          <token type="Operator"/>
479        </bygroups>
480      </rule>
481      <rule pattern="@@[a-zA-Z_]\w*">
482        <token type="NameVariableClass"/>
483      </rule>
484      <rule pattern="@[a-zA-Z_]\w*">
485        <token type="NameVariableInstance"/>
486      </rule>
487      <rule pattern="\$\w+">
488        <token type="NameVariableGlobal"/>
489      </rule>
490      <rule pattern="\$[!@&`\'+~=/\\,;.<>_*$?:"^-]">
491        <token type="NameVariableGlobal"/>
492      </rule>
493      <rule pattern="\$-[0adFiIlpvw]">
494        <token type="NameVariableGlobal"/>
495      </rule>
496      <rule pattern="::">
497        <token type="Operator"/>
498      </rule>
499      <rule>
500        <include state="strings"/>
501      </rule>
502      <rule pattern="\?(\\[MC]-)*(\\([\\befnrtv#"\']|x[a-fA-F0-9]{1,2}|[0-7]{1,3})|\S)(?!\w)">
503        <token type="LiteralStringChar"/>
504      </rule>
505      <rule pattern="[A-Z][A-Z_]+\b">
506        <token type="NameConstant"/>
507      </rule>
508      <rule pattern="\{%">
509        <token type="LiteralStringInterpol"/>
510        <push state="in-macro-control"/>
511      </rule>
512      <rule pattern="\{\{">
513        <token type="LiteralStringInterpol"/>
514        <push state="in-macro-expr"/>
515      </rule>
516      <rule pattern="(@\[)(\s*)([A-Z]\w*)">
517        <bygroups>
518          <token type="Operator"/>
519          <token type="Text"/>
520          <token type="NameDecorator"/>
521        </bygroups>
522        <push state="in-attr"/>
523      </rule>
524      <rule pattern="(\.|::)(\[\]\?|<=>|===|\[\]=|>>|&&|\*\*|\[\]|\|\||>=|=~|!~|<<|<=|!=|==|<|/|=|-|\+|>|\*|&|%|\^|!|\||~)">
525        <bygroups>
526          <token type="Operator"/>
527          <token type="NameOperator"/>
528        </bygroups>
529      </rule>
530      <rule pattern="(\.|::)([a-zA-Z_]\w*[!?]?|[*%&^`~+\-/\[<>=])">
531        <bygroups>
532          <token type="Operator"/>
533          <token type="Name"/>
534        </bygroups>
535      </rule>
536      <rule pattern="[a-zA-Z_]\w*(?:[!?](?!=))?">
537        <token type="Name"/>
538      </rule>
539      <rule pattern="(\[|\]\??|\*\*|<=>?|>=|<<?|>>?|=~|===|!~|&&?|\|\||\.{1,3})">
540        <token type="Operator"/>
541      </rule>
542      <rule pattern="[-+/*%=<>&!^|~]=?">
543        <token type="Operator"/>
544      </rule>
545      <rule pattern="[(){};,/?:\\]">
546        <token type="Punctuation"/>
547      </rule>
548      <rule pattern="\s+">
549        <token type="Text"/>
550      </rule>
551    </state>
552    <state name="multiline-regex">
553      <rule>
554        <include state="string-intp"/>
555      </rule>
556      <rule pattern="\\\\">
557        <token type="LiteralStringRegex"/>
558      </rule>
559      <rule pattern="\\/">
560        <token type="LiteralStringRegex"/>
561      </rule>
562      <rule pattern="[\\#]">
563        <token type="LiteralStringRegex"/>
564      </rule>
565      <rule pattern="[^\\/#]+">
566        <token type="LiteralStringRegex"/>
567      </rule>
568      <rule pattern="/[imsx]*">
569        <token type="LiteralStringRegex"/>
570        <pop depth="1"/>
571      </rule>
572    </state>
573    <state name="ab-string">
574      <rule pattern="\\[\\<>]">
575        <token type="LiteralStringOther"/>
576      </rule>
577      <rule pattern="<">
578        <token type="LiteralStringOther"/>
579        <push/>
580      </rule>
581      <rule pattern=">">
582        <token type="LiteralStringOther"/>
583        <pop depth="1"/>
584      </rule>
585      <rule pattern="[\\#<>]">
586        <token type="LiteralStringOther"/>
587      </rule>
588      <rule pattern="[^\\#<>]+">
589        <token type="LiteralStringOther"/>
590      </rule>
591    </state>
592    <state name="pa-string">
593      <rule pattern="\\[\\()]">
594        <token type="LiteralStringOther"/>
595      </rule>
596      <rule pattern="\(">
597        <token type="LiteralStringOther"/>
598        <push/>
599      </rule>
600      <rule pattern="\)">
601        <token type="LiteralStringOther"/>
602        <pop depth="1"/>
603      </rule>
604      <rule pattern="[\\#()]">
605        <token type="LiteralStringOther"/>
606      </rule>
607      <rule pattern="[^\\#()]+">
608        <token type="LiteralStringOther"/>
609      </rule>
610    </state>
611    <state name="strings">
612      <rule pattern="\:@{0,2}[a-zA-Z_]\w*[!?]?">
613        <token type="LiteralStringSymbol"/>
614      </rule>
615      <rule pattern="\:@{0,2}(\[\]\?|<=>|===|\[\]=|>>|&&|\*\*|\[\]|\|\||>=|=~|!~|<<|<=|!=|==|<|/|=|-|\+|>|\*|&|%|\^|!|\||~)">
616        <token type="LiteralStringSymbol"/>
617      </rule>
618      <rule pattern=":'(\\\\|\\'|[^'])*'">
619        <token type="LiteralStringSymbol"/>
620      </rule>
621      <rule pattern="'(\\\\|\\'|[^']|\\[^'\\]+)'">
622        <token type="LiteralStringChar"/>
623      </rule>
624      <rule pattern=":"">
625        <token type="LiteralStringSymbol"/>
626        <push state="simple-sym"/>
627      </rule>
628      <rule pattern="([a-zA-Z_]\w*)(:)(?!:)">
629        <bygroups>
630          <token type="LiteralStringSymbol"/>
631          <token type="Punctuation"/>
632        </bygroups>
633      </rule>
634      <rule pattern=""">
635        <token type="LiteralStringDouble"/>
636        <push state="simple-string"/>
637      </rule>
638      <rule pattern="(?<!\.)`">
639        <token type="LiteralStringBacktick"/>
640        <push state="simple-backtick"/>
641      </rule>
642      <rule pattern="%\{">
643        <token type="LiteralStringOther"/>
644        <push state="cb-intp-string"/>
645      </rule>
646      <rule pattern="%[wi]\{">
647        <token type="LiteralStringOther"/>
648        <push state="cb-string"/>
649      </rule>
650      <rule pattern="%r\{">
651        <token type="LiteralStringRegex"/>
652        <push state="cb-regex"/>
653      </rule>
654      <rule pattern="%\[">
655        <token type="LiteralStringOther"/>
656        <push state="sb-intp-string"/>
657      </rule>
658      <rule pattern="%[wi]\[">
659        <token type="LiteralStringOther"/>
660        <push state="sb-string"/>
661      </rule>
662      <rule pattern="%r\[">
663        <token type="LiteralStringRegex"/>
664        <push state="sb-regex"/>
665      </rule>
666      <rule pattern="%\(">
667        <token type="LiteralStringOther"/>
668        <push state="pa-intp-string"/>
669      </rule>
670      <rule pattern="%[wi]\(">
671        <token type="LiteralStringOther"/>
672        <push state="pa-string"/>
673      </rule>
674      <rule pattern="%r\(">
675        <token type="LiteralStringRegex"/>
676        <push state="pa-regex"/>
677      </rule>
678      <rule pattern="%<">
679        <token type="LiteralStringOther"/>
680        <push state="ab-intp-string"/>
681      </rule>
682      <rule pattern="%[wi]<">
683        <token type="LiteralStringOther"/>
684        <push state="ab-string"/>
685      </rule>
686      <rule pattern="%r<">
687        <token type="LiteralStringRegex"/>
688        <push state="ab-regex"/>
689      </rule>
690      <rule pattern="(%r([\W_]))((?:\\\2|(?!\2).)*)(\2[imsx]*)">
691        <token type="LiteralString"/>
692      </rule>
693      <rule pattern="(%[wi]([\W_]))((?:\\\2|(?!\2).)*)(\2)">
694        <token type="LiteralString"/>
695      </rule>
696      <rule pattern="(?<=[-+/*%=<>&!^|~,(])(\s*)(%([\t ])(?:(?:\\\3|(?!\3).)*)\3)">
697        <bygroups>
698          <token type="Text"/>
699          <token type="LiteralStringOther"/>
700          <token type="None"/>
701        </bygroups>
702      </rule>
703      <rule pattern="^(\s*)(%([\t ])(?:(?:\\\3|(?!\3).)*)\3)">
704        <bygroups>
705          <token type="Text"/>
706          <token type="LiteralStringOther"/>
707          <token type="None"/>
708        </bygroups>
709      </rule>
710      <rule pattern="(%([\[{(<]))((?:\\\2|(?!\2).)*)(\2)">
711        <token type="LiteralString"/>
712      </rule>
713    </state>
714    <state name="sb-string">
715      <rule pattern="\\[\\\[\]]">
716        <token type="LiteralStringOther"/>
717      </rule>
718      <rule pattern="\[">
719        <token type="LiteralStringOther"/>
720        <push/>
721      </rule>
722      <rule pattern="\]">
723        <token type="LiteralStringOther"/>
724        <pop depth="1"/>
725      </rule>
726      <rule pattern="[\\#\[\]]">
727        <token type="LiteralStringOther"/>
728      </rule>
729      <rule pattern="[^\\#\[\]]+">
730        <token type="LiteralStringOther"/>
731      </rule>
732    </state>
733    <state name="funcname">
734      <rule pattern="(?:([a-zA-Z_]\w*)(\.))?([a-zA-Z_]\w*[!?]?|\*\*?|[-+]@?|[/%&|^`~]|\[\]=?|<<|>>|<=?>|>=?|===?)">
735        <bygroups>
736          <token type="NameClass"/>
737          <token type="Operator"/>
738          <token type="NameFunction"/>
739        </bygroups>
740        <pop depth="1"/>
741      </rule>
742      <rule>
743        <pop depth="1"/>
744      </rule>
745    </state>
746    <state name="simple-sym">
747      <rule>
748        <include state="string-escaped"/>
749      </rule>
750      <rule pattern="[^\\"#]+">
751        <token type="LiteralStringSymbol"/>
752      </rule>
753      <rule pattern="[\\#]">
754        <token type="LiteralStringSymbol"/>
755      </rule>
756      <rule pattern=""">
757        <token type="LiteralStringSymbol"/>
758        <pop depth="1"/>
759      </rule>
760    </state>
761  </rules>
762</lexer>