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>