1<lexer>
 2  <config>
 3    <name>JSONata</name>
 4    <alias>jsonata</alias>
 5    <filename>*.jsonata</filename>
 6    <dot_all>true</dot_all>
 7  </config>
 8  <rules>
 9    <state name="root">
10      <rule pattern="/\*.*?\*/">
11        <token type="CommentMultiline"/>
12      </rule>
13      <rule pattern="[{}()\[\]:;,\.=]">
14        <token type="Punctuation"/>
15      </rule>
16       <rule pattern="\.\."> // Spread operator
17        <token type="Operator"/>
18      </rule> 
19      <rule pattern="\^(?=\()"> // Sort operator
20        <token type="Operator"/>
21      </rule>
22      <rule pattern="\*\*|\*(?=\.)|\*"> // Descendant | Wildcard | Multiplication
23        <token type="Operator"/>
24      </rule>
25      <rule pattern="\/(?!\*)"> // Division
26        <token type="Operator"/>
27      </rule>
28      <rule pattern="[<>!]=?"> // Comparison operators
29        <token type="Operator"/>
30      </rule>
31      <rule pattern="~>">
32        <token type="Operator"/>
33      </rule>
34      <rule pattern="\b(and|or|in)\b">
35        <token type="Operator"/>
36      </rule>
37      <rule pattern="[%@#&?]|\+(?!\d)|\-(?!\d)">
38        <token type="Operator"/>
39      </rule>
40      <rule pattern="\$[a-zA-Z0-9_]*(?![\w\(])">
41        <token type="NameVariable"/>
42      </rule>
43      <rule pattern="\$\w*(?=\()">
44        <token type="NameFunction"/>
45      </rule>
46      <rule pattern="\s+">
47        <token type="Text"/>
48      </rule>
49      <rule pattern="(true|false)\b">
50        <token type="KeywordConstant"/>
51      </rule>
52      <rule pattern="\b(function)\b">
53        <token type="Keyword"/>
54      </rule>
55      <rule pattern="(\+|-)?(0|[1-9]\d*)(\.\d+[eE](\+|-)?\d+|[eE](\+|-)?\d+|\.\d+)">
56        <token type="LiteralNumberFloat"/>
57      </rule> 
58      <rule pattern="(\+|-)?(0|[1-9]\d*)">
59        <token type="LiteralNumberInteger"/>
60      </rule>
61      <!-- NOTE: This expression matches all object keys (NameTags), which are essentially strings with double quotes
62      that should only be captured on the left side of a colon (:) within a JSON-like object.
63      Therefore, this expression must preceed the one for all LiteralStringDouble -->
64      <rule pattern=""(\\.|[^\\"\r\n])*"(?=\s*:)">
65        <token type="NameTag"/>
66      </rule>
67      <rule pattern=""(\\\\|\\"|[^"])*"">
68        <token type="LiteralStringDouble"/>
69      </rule>
70      <rule pattern="'(\\|\\'|[^'])*'">
71        <token type="LiteralStringSingle"/>
72      </rule>
73      <rule pattern="`.*`">
74        <token type="LiteralStringBacktick"/>
75      </rule>
76      <!-- NOTE: This expression matches everything remaining, which should be only JSONata names.
77      Therefore, it has been left as last intentionally -->
78      <rule pattern="[a-zA-Z0-9_]*"> 
79        <token type="Name"/>
80      </rule>
81    </state>
82  </rules>
83</lexer>