1<lexer>
  2  <config>
  3    <name>Nix</name>
  4    <alias>nixos</alias>
  5    <alias>nix</alias>
  6    <filename>*.nix</filename>
  7    <mime_type>text/x-nix</mime_type>
  8  </config>
  9  <rules>
 10    <state name="space">
 11      <rule pattern="[ \t\r\n]+">
 12        <token type="Text"/>
 13      </rule>
 14    </state>
 15    <state name="paren">
 16      <rule pattern="\)">
 17        <token type="Punctuation"/>
 18        <pop depth="1"/>
 19      </rule>
 20      <rule>
 21        <include state="root"/>
 22      </rule>
 23    </state>
 24    <state name="scope">
 25      <rule pattern="}:">
 26        <token type="Punctuation"/>
 27        <pop depth="1"/>
 28      </rule>
 29      <rule pattern="}">
 30        <token type="Punctuation"/>
 31        <pop depth="1"/>
 32      </rule>
 33      <rule pattern="in(?![a-zA-Z0-9_'-])">
 34        <token type="Keyword"/>
 35        <pop depth="1"/>
 36      </rule>
 37      <rule pattern="\${">
 38        <token type="LiteralStringInterpol"/>
 39        <push state="interpol"/>
 40      </rule>
 41      <rule>
 42        <include state="root"/>
 43      </rule>
 44      <rule pattern="(=|\?|,)">
 45        <token type="Operator"/>
 46      </rule>
 47    </state>
 48    <state name="builtins">
 49      <rule pattern="throw(?![a-zA-Z0-9_'-])">
 50        <token type="NameException"/>
 51      </rule>
 52      <rule pattern="(dependencyClosure|fetchTarball|filterSource|currentTime|removeAttrs|baseNameOf|derivation|toString|builtins|getAttr|hasAttr|getEnv|isNull|abort|dirOf|toXML|map)(?![a-zA-Z0-9_'-])">
 53        <token type="NameBuiltin"/>
 54      </rule>
 55    </state>
 56    <state name="literals">
 57      <rule pattern="(false|true|null)(?![a-zA-Z0-9_'-])">
 58        <token type="NameConstant"/>
 59      </rule>
 60      <rule>
 61        <include state="uri"/>
 62      </rule>
 63      <rule>
 64        <include state="path"/>
 65      </rule>
 66      <rule>
 67        <include state="int"/>
 68      </rule>
 69      <rule>
 70        <include state="float"/>
 71      </rule>
 72    </state>
 73    <state name="keywords">
 74      <rule pattern="import(?![a-zA-Z0-9_'-])">
 75        <token type="KeywordNamespace"/>
 76      </rule>
 77      <rule pattern="(inherit|assert|with|then|else|rec|if)(?![a-zA-Z0-9_'-])">
 78        <token type="Keyword"/>
 79      </rule>
 80    </state>
 81    <state name="list">
 82      <rule pattern="\]">
 83        <token type="Punctuation"/>
 84        <pop depth="1"/>
 85      </rule>
 86      <rule>
 87        <include state="root"/>
 88      </rule>
 89    </state>
 90    <state name="operators">
 91      <rule pattern=" [/-] ">
 92        <token type="Operator"/>
 93      </rule>
 94      <rule pattern="(\.)(\${)">
 95        <bygroups>
 96          <token type="Operator"/>
 97          <token type="LiteralStringInterpol"/>
 98        </bygroups>
 99        <push state="interpol"/>
100      </rule>
101      <rule pattern="(\?)(\s*)(\${)">
102        <bygroups>
103          <token type="Operator"/>
104          <token type="Text"/>
105          <token type="LiteralStringInterpol"/>
106        </bygroups>
107        <push state="interpol"/>
108      </rule>
109      <rule pattern="(&&|>=|<=|\+\+|->|!=|=|\|\||//|==|@|!|\+|\?|<|\.|>|\*)">
110        <token type="Operator"/>
111      </rule>
112      <rule pattern="[;:]">
113        <token type="Punctuation"/>
114      </rule>
115    </state>
116    <state name="comment">
117      <rule pattern="\*/">
118        <token type="CommentMultiline"/>
119        <pop depth="1"/>
120      </rule>
121      <rule pattern=".|\n">
122        <token type="CommentMultiline"/>
123      </rule>
124    </state>
125    <state name="interpol">
126      <rule pattern="}">
127        <token type="LiteralStringInterpol"/>
128        <pop depth="1"/>
129      </rule>
130      <rule>
131        <include state="root"/>
132      </rule>
133    </state>
134    <state name="path">
135      <rule pattern="[a-zA-Z0-9._+-]*(/[a-zA-Z0-9._+-]+)+">
136        <token type="LiteralStringRegex"/>
137      </rule>
138      <rule pattern="~(/[a-zA-Z0-9._+-]+)+/?">
139        <token type="LiteralStringRegex"/>
140      </rule>
141      <rule pattern="<[a-zA-Z0-9._+-]+(/[a-zA-Z0-9._+-]+)*>">
142        <token type="LiteralStringRegex"/>
143      </rule>
144    </state>
145    <state name="float">
146      <rule pattern="-?(([1-9][0-9]*\.[0-9]*)|(0?\.[0-9]+))([Ee][+-]?[0-9]+)?(?![a-zA-Z0-9_'-])">
147        <token type="LiteralNumberFloat"/>
148      </rule>
149    </state>
150    <state name="root">
151      <rule>
152        <include state="keywords"/>
153      </rule>
154      <rule>
155        <include state="builtins"/>
156      </rule>
157      <rule>
158        <include state="literals"/>
159      </rule>
160      <rule>
161        <include state="operators"/>
162      </rule>
163      <rule pattern="#.*$">
164        <token type="CommentSingle"/>
165      </rule>
166      <rule pattern="/\*">
167        <token type="CommentMultiline"/>
168        <push state="comment"/>
169      </rule>
170      <rule pattern="\(">
171        <token type="Punctuation"/>
172        <push state="paren"/>
173      </rule>
174      <rule pattern="\[">
175        <token type="Punctuation"/>
176        <push state="list"/>
177      </rule>
178      <rule pattern=""">
179        <token type="LiteralStringDouble"/>
180        <push state="qstring"/>
181      </rule>
182      <rule pattern="''">
183        <token type="LiteralStringSingle"/>
184        <push state="istring"/>
185      </rule>
186      <rule pattern="{">
187        <token type="Punctuation"/>
188        <push state="scope"/>
189      </rule>
190      <rule pattern="let(?![a-zA-Z0-9_'-])">
191        <token type="Keyword"/>
192        <push state="scope"/>
193      </rule>
194      <rule>
195        <include state="id"/>
196      </rule>
197      <rule>
198        <include state="space"/>
199      </rule>
200    </state>
201    <state name="int">
202      <rule pattern="-?[0-9]+(?![a-zA-Z0-9_'-])">
203        <token type="LiteralNumberInteger"/>
204      </rule>
205    </state>
206    <state name="uri">
207      <rule pattern="[a-zA-Z][a-zA-Z0-9+.-]*:[a-zA-Z0-9%/?:@&=+$,_.!~*'-]+">
208        <token type="LiteralStringDoc"/>
209      </rule>
210    </state>
211    <state name="qstring">
212      <rule pattern=""">
213        <token type="LiteralStringDouble"/>
214        <pop depth="1"/>
215      </rule>
216      <rule pattern="\${">
217        <token type="LiteralStringInterpol"/>
218        <push state="interpol"/>
219      </rule>
220      <rule pattern="\\.">
221        <token type="LiteralStringEscape"/>
222      </rule>
223      <rule pattern=".|\n">
224        <token type="LiteralStringDouble"/>
225      </rule>
226    </state>
227    <state name="istring">
228      <rule pattern="''\$">
229        <token type="LiteralStringEscape"/>
230      </rule>
231      <rule pattern="'''">
232        <token type="LiteralStringEscape"/>
233      </rule>
234      <rule pattern="''\\.">
235        <token type="LiteralStringEscape"/>
236      </rule>
237      <rule pattern="''">
238        <token type="LiteralStringSingle"/>
239        <pop depth="1"/>
240      </rule>
241      <rule pattern="\${">
242        <token type="LiteralStringInterpol"/>
243        <push state="interpol"/>
244      </rule>
245      <rule pattern="\$.">
246        <token type="LiteralStringSingle"/>
247      </rule>
248      <rule pattern=".|\n">
249        <token type="LiteralStringSingle"/>
250      </rule>
251    </state>
252    <state name="id">
253      <rule pattern="[a-zA-Z_][a-zA-Z0-9_'-]*">
254        <token type="Name"/>
255      </rule>
256    </state>
257  </rules>
258</lexer>