1<lexer>
  2  <config>
  3    <name>Spade</name>
  4    <alias>spade</alias>
  5    <filename>*.spade</filename>
  6    <mime_type>text/spade</mime_type>
  7    <mime_type>text/x-spade</mime_type>
  8    <ensure_nl>true</ensure_nl>
  9  </config>
 10  <rules>
 11    <state name="modname">
 12      <rule pattern="\s+">
 13        <token type="Text"/>
 14      </rule>
 15      <rule pattern="[a-zA-Z_]\w*">
 16        <token type="NameNamespace"/>
 17        <pop depth="1"/>
 18      </rule>
 19      <rule>
 20        <pop depth="1"/>
 21      </rule>
 22    </state>
 23    <state name="number_lit">
 24      <rule pattern="[ui]\d*">
 25        <token type="Keyword"/>
 26        <pop depth="1"/>
 27      </rule>
 28      <rule>
 29        <pop depth="1"/>
 30      </rule>
 31    </state>
 32    <state name="attribute_common">
 33      <rule pattern="&#34;">
 34        <token type="LiteralString"/>
 35        <push state="string"/>
 36      </rule>
 37      <rule pattern="\[">
 38        <token type="CommentPreproc"/>
 39        <push state="attribute["/>
 40      </rule>
 41    </state>
 42    <state name="comment">
 43      <rule pattern="[^*/]+">
 44        <token type="CommentMultiline"/>
 45      </rule>
 46      <rule pattern="/\*">
 47        <token type="CommentMultiline"/>
 48        <push/>
 49      </rule>
 50      <rule pattern="\*/">
 51        <token type="CommentMultiline"/>
 52        <pop depth="1"/>
 53      </rule>
 54      <rule pattern="[*/]">
 55        <token type="CommentMultiline"/>
 56      </rule>
 57    </state>
 58    <state name="doccomment">
 59      <rule pattern="[^*/]+">
 60        <token type="LiteralStringDoc"/>
 61      </rule>
 62      <rule pattern="/\*">
 63        <token type="LiteralStringDoc"/>
 64        <push/>
 65      </rule>
 66      <rule pattern="\*/">
 67        <token type="LiteralStringDoc"/>
 68        <pop depth="1"/>
 69      </rule>
 70      <rule pattern="[*/]">
 71        <token type="LiteralStringDoc"/>
 72      </rule>
 73    </state>
 74    <state name="funcname">
 75      <rule pattern="\s+">
 76        <token type="Text"/>
 77      </rule>
 78      <rule pattern="[a-zA-Z_]\w*">
 79        <token type="NameFunction"/>
 80        <pop depth="1"/>
 81      </rule>
 82      <rule>
 83        <pop depth="1"/>
 84      </rule>
 85    </state>
 86    <state name="string">
 87      <rule pattern="&#34;">
 88        <token type="LiteralString"/>
 89        <pop depth="1"/>
 90      </rule>
 91      <rule pattern="\\[&#39;&#34;\\nrt]|\\(?=\n)|\\x[0-7][0-9a-fA-F]|\\0|\\u\{[0-9a-fA-F]{1,6}\}">
 92        <token type="LiteralStringEscape"/>
 93      </rule>
 94      <rule pattern="[^\\&#34;]+">
 95        <token type="LiteralString"/>
 96      </rule>
 97      <rule pattern="\\">
 98        <token type="LiteralString"/>
 99      </rule>
100    </state>
101    <state name="root">
102      <rule pattern="#![^[\r\n].*$">
103        <token type="CommentPreproc"/>
104      </rule>
105      <rule>
106        <push state="base"/>
107      </rule>
108    </state>
109    <state name="attribute[">
110      <rule>
111        <include state="attribute_common"/>
112      </rule>
113      <rule pattern="\]">
114        <token type="CommentPreproc"/>
115        <pop depth="1"/>
116      </rule>
117      <rule pattern="[^&#34;\]\[]+">
118        <token type="CommentPreproc"/>
119      </rule>
120    </state>
121    <state name="base">
122      <rule pattern="\n">
123        <token type="TextWhitespace"/>
124      </rule>
125      <rule pattern="\s+">
126        <token type="TextWhitespace"/>
127      </rule>
128      <rule pattern="//!.*?\n">
129        <token type="LiteralStringDoc"/>
130      </rule>
131      <rule pattern="///(\n|[^/].*?\n)">
132        <token type="LiteralStringDoc"/>
133      </rule>
134      <rule pattern="//(.*?)\n">
135        <token type="CommentSingle"/>
136      </rule>
137      <rule pattern="/\*\*(\n|[^/*])">
138        <token type="LiteralStringDoc"/>
139        <push state="doccomment"/>
140      </rule>
141      <rule pattern="/\*!">
142        <token type="LiteralStringDoc"/>
143        <push state="doccomment"/>
144      </rule>
145      <rule pattern="/\*">
146        <token type="CommentMultiline"/>
147        <push state="comment"/>
148      </rule>
149      <rule pattern="&#34;">
150        <token type="LiteralString"/>
151        <push state="string"/>
152      </rule>
153      <rule pattern="\$([a-zA-Z_]\w*|\(,?|\),?|,?)">
154        <token type="CommentPreproc"/>
155      </rule>
156      <rule pattern="(reg|decl|inst|reset|initial|if|else|match|set|pipeline|stage|entity|trait|impl|for|fn|port|mod|use|as|assert|mut|inv|pub|where|gen)\b">
157        <token type="Keyword"/>
158      </rule>
159      <rule pattern="(true|false)\b">
160        <token type="KeywordConstant"/>
161      </rule>
162      <rule pattern="self\b">
163        <token type="NameBuiltinPseudo"/>
164      </rule>
165      <rule pattern="mod\b">
166        <token type="Keyword"/>
167        <push state="modname"/>
168      </rule>
169      <rule pattern="let\b">
170        <token type="KeywordDeclaration"/>
171      </rule>
172      <rule pattern="fn\b">
173        <token type="Keyword"/>
174        <push state="funcname"/>
175      </rule>
176      <rule pattern="(struct|enum)\b">
177        <token type="Keyword"/>
178        <push state="typename"/>
179      </rule>
180      <rule pattern="(default)(\s+)(type|fn)\b">
181        <bygroups>
182          <token type="Keyword"/>
183          <token type="Text"/>
184          <token type="Keyword"/>
185        </bygroups>
186      </rule>
187      <rule pattern="(int|uint|bool|clock|inout)\b">
188        <token type="KeywordType"/>
189      </rule>
190      <rule pattern="[sS]elf\b">
191        <token type="NameBuiltinPseudo"/>
192      </rule>
193      <rule pattern="(Option|Fn|Entity|Pipeline)\b">
194        <token type="NameBuiltin"/>
195      </rule>
196      <rule pattern="::\b">
197        <token type="Text"/>
198      </rule>
199      <rule pattern="(?::|-&gt;)">
200        <token type="Text"/>
201        <push state="typename"/>
202      </rule>
203      <rule pattern="&#39;[A-z0-9_]+">
204        <token type="NameLabel"/>
205      </rule>
206      <rule pattern="&#39;(\\[&#39;&#34;\\nrt]|\\x[0-7][0-9a-fA-F]|\\0|\\u\{[0-9a-fA-F]{1,6}\}|.)&#39;">
207        <token type="LiteralStringChar"/>
208      </rule>
209      <rule pattern="(b)(&#39;(?:\\[&#39;&#34;\\nrt]|\\x[0-9a-fA-F]{2}|\\0|.)&#39;)">
210        <bygroups>
211          <token type="LiteralStringAffix"/>
212          <token type="LiteralStringChar"/>
213        </bygroups>
214      </rule>
215      <rule pattern="0b[01_]+">
216        <token type="LiteralNumberBin"/>
217        <push state="number_lit"/>
218      </rule>
219      <rule pattern="0[xX][0-9a-fA-F_]+">
220        <token type="LiteralNumberHex"/>
221        <push state="number_lit"/>
222      </rule>
223      <rule pattern="[0-9][0-9_]*">
224        <token type="LiteralNumberInteger"/>
225        <push state="number_lit"/>
226      </rule>
227      <rule pattern="\.\.=?">
228        <token type="Operator"/>
229      </rule>
230      <rule pattern="`[A-z0-9_]+`">
231        <token type="Operator"/>
232      </rule>
233      <rule pattern="[{}()\[\],.;]">
234        <token type="Punctuation"/>
235      </rule>
236      <rule pattern="[+\-*/%&amp;|&lt;&gt;^!~@=:?]">
237        <token type="Operator"/>
238      </rule>
239      <rule pattern="\b(r#)?_?([A-Z][A-Z0-9_]*){2,}\b">
240        <token type="NameConstant"/>
241      </rule>
242      <rule pattern="([a-zA-Z_]\w*!)(\s*)(\(|\[|\{)">
243        <bygroups>
244          <token type="NameFunctionMagic"/>
245          <token type="TextWhitespace"/>
246          <token type="Punctuation"/>
247        </bygroups>
248      </rule>
249      <rule pattern="(r#)?[a-zA-Z_]\w*">
250        <token type="Name"/>
251      </rule>
252      <rule pattern="r#[a-zA-Z_]\w*">
253        <token type="Name"/>
254      </rule>
255      <rule pattern="#!?\[">
256        <token type="CommentPreproc"/>
257        <push state="attribute["/>
258      </rule>
259      <rule pattern="#">
260        <token type="Text"/>
261      </rule>
262    </state>
263    <state name="typename">
264      <rule pattern="\s+">
265        <token type="Text"/>
266      </rule>
267      <rule pattern="&amp;">
268        <token type="KeywordPseudo"/>
269      </rule>
270      <rule pattern="&#39;(static|_)">
271        <token type="NameBuiltin"/>
272      </rule>
273      <rule pattern="&#39;">
274        <token type="NameAttribute"/>
275        <push state="lifetime"/>
276      </rule>
277      <rule pattern="(Option|Fn|Entity|Pipeline)\b">
278        <token type="NameBuiltin"/>
279      </rule>
280      <rule pattern="(int|uint|bool|clock|inout)\b">
281        <token type="KeywordType"/>
282      </rule>
283      <rule pattern="[a-zA-Z_]\w*">
284        <token type="NameClass"/>
285        <pop depth="1"/>
286      </rule>
287      <rule>
288        <pop depth="1"/>
289      </rule>
290    </state>
291  </rules>
292</lexer>