1<lexer>
  2  <config>
  3    <name>Lateralus</name>
  4    <alias>lateralus</alias>
  5    <alias>ltl</alias>
  6    <filename>*.ltl</filename>
  7    <mime_type>text/x-lateralus</mime_type>
  8    <ensure_nl>true</ensure_nl>
  9  </config>
 10  <rules>
 11    <state name="root">
 12      <!-- Whitespace -->
 13      <rule pattern="\s+">
 14        <token type="TextWhitespace"/>
 15      </rule>
 16      <!-- Comments -->
 17      <rule pattern="///[^\n]*">
 18        <token type="CommentSpecial"/>
 19      </rule>
 20      <rule pattern="//[^\n]*">
 21        <token type="CommentSingle"/>
 22      </rule>
 23      <rule pattern="/\*">
 24        <token type="CommentMultiline"/>
 25        <push state="block_comment"/>
 26      </rule>
 27      <!-- Attribute decorators: @memo, @doc("...") -->
 28      <rule pattern="@[A-Za-z_][A-Za-z0-9_]*">
 29        <token type="NameDecorator"/>
 30      </rule>
 31      <!-- Capability annotations: #[caps(io, net)] -->
 32      <rule pattern="#\[">
 33        <token type="NameDecorator"/>
 34        <push state="attribute"/>
 35      </rule>
 36      <!-- Control flow / declaration keywords -->
 37      <rule pattern="(fn|let|mut|match|if|else|elif|while|for|in|return|break|continue|import|export|module|pub|priv|struct|enum|impl|trait|where|type|const|static|async|await|spawn|guard|defer|use|as|self|Self|super|yield|do)\b">
 38        <token type="Keyword"/>
 39      </rule>
 40      <!-- Builtin types -->
 41      <rule pattern="(int|i8|i16|i32|i64|i128|uint|u8|u16|u32|u64|u128|float|f32|f64|bool|str|char|bytes|any|never|list|map|set|tuple|Option|Result|Some|None|Ok|Err)\b">
 42        <token type="KeywordType"/>
 43      </rule>
 44      <!-- Boolean / null literals -->
 45      <rule pattern="(true|false|null)\b">
 46        <token type="KeywordConstant"/>
 47      </rule>
 48      <!-- Builtin functions -->
 49      <rule pattern="(print|println|eprint|eprintln|format|panic|assert|assert_eq|todo|unimplemented|unreachable|len|range|map|filter|reduce|fold|zip|enumerate|sort|sorted|reverse|sum|min|max)\b">
 50        <token type="NameBuiltin"/>
 51      </rule>
 52      <!-- Function definition -->
 53      <rule pattern="(fn)(\s+)([A-Za-z_][A-Za-z0-9_]*)">
 54        <bygroups>
 55          <token type="Keyword"/>
 56          <token type="TextWhitespace"/>
 57          <token type="NameFunction"/>
 58        </bygroups>
 59      </rule>
 60      <!-- Type / struct / enum / trait / impl definition -->
 61      <rule pattern="(struct|enum|trait|type|impl)(\s+)([A-Z][A-Za-z0-9_]*)">
 62        <bygroups>
 63          <token type="Keyword"/>
 64          <token type="TextWhitespace"/>
 65          <token type="NameClass"/>
 66        </bygroups>
 67      </rule>
 68      <!-- Module path: foo::bar -->
 69      <rule pattern="([A-Za-z_][A-Za-z0-9_]*)(::)">
 70        <bygroups>
 71          <token type="NameNamespace"/>
 72          <token type="Punctuation"/>
 73        </bygroups>
 74      </rule>
 75      <!-- ADT variant: UppercaseIdentifier -->
 76      <rule pattern="[A-Z][A-Za-z0-9_]*">
 77        <token type="NameClass"/>
 78      </rule>
 79      <!-- Raw strings: r"...", r#"..."# -->
 80      <rule pattern="r#&#34;.*?&#34;#">
 81        <token type="LiteralString"/>
 82      </rule>
 83      <rule pattern="r&#34;[^&#34;\\]*(?:\\.[^&#34;\\]*)*&#34;">
 84        <token type="LiteralString"/>
 85      </rule>
 86      <!-- Byte strings -->
 87      <rule pattern="b&#34;">
 88        <token type="LiteralString"/>
 89        <push state="string"/>
 90      </rule>
 91      <!-- Regular / interpolated strings -->
 92      <rule pattern="&#34;">
 93        <token type="LiteralString"/>
 94        <push state="string"/>
 95      </rule>
 96      <!-- Char literals -->
 97      <rule pattern="&#39;(?:\\.|[^&#39;\\])&#39;">
 98        <token type="LiteralStringChar"/>
 99      </rule>
100      <!-- Numeric literals -->
101      <rule pattern="[0-9][0-9_]*\.[0-9][0-9_]*(?:[eE][-+]?[0-9][0-9_]*)?(?:_?f(32|64))?">
102        <token type="LiteralNumberFloat"/>
103      </rule>
104      <rule pattern="0x[0-9a-fA-F][0-9a-fA-F_]*(?:_?[iu](8|16|32|64|128))?">
105        <token type="LiteralNumberHex"/>
106      </rule>
107      <rule pattern="0o[0-7][0-7_]*(?:_?[iu](8|16|32|64|128))?">
108        <token type="LiteralNumberOct"/>
109      </rule>
110      <rule pattern="0b[01][01_]*(?:_?[iu](8|16|32|64|128))?">
111        <token type="LiteralNumberBin"/>
112      </rule>
113      <rule pattern="[0-9][0-9_]*(?:_?[iu](8|16|32|64|128))?">
114        <token type="LiteralNumberInteger"/>
115      </rule>
116      <!-- Pipeline operator (signature feature) -->
117      <rule pattern="\|&gt;">
118        <token type="Operator"/>
119      </rule>
120      <!-- Other operators -->
121      <rule pattern="(==|!=|&lt;=|&gt;=|-&gt;|=&gt;|&amp;&amp;|\|\||&lt;&lt;|&gt;&gt;|::|\.\.=?|\?\?|[+\-*/%&lt;&gt;!=&amp;|\^~?])">
122        <token type="Operator"/>
123      </rule>
124      <!-- Punctuation -->
125      <rule pattern="[{}()\[\];,.:]">
126        <token type="Punctuation"/>
127      </rule>
128      <!-- Identifiers -->
129      <rule pattern="[A-Za-z_][A-Za-z0-9_]*">
130        <token type="Name"/>
131      </rule>
132    </state>
133    <state name="block_comment">
134      <rule pattern="[^/*]+">
135        <token type="CommentMultiline"/>
136      </rule>
137      <rule pattern="/\*">
138        <token type="CommentMultiline"/>
139        <push/>
140      </rule>
141      <rule pattern="\*/">
142        <token type="CommentMultiline"/>
143        <pop depth="1"/>
144      </rule>
145      <rule pattern="[/*]">
146        <token type="CommentMultiline"/>
147      </rule>
148    </state>
149    <state name="string">
150      <rule pattern="\\[nrt&#39;&#34;\\0]">
151        <token type="LiteralStringEscape"/>
152      </rule>
153      <rule pattern="\\x[0-9a-fA-F]{2}">
154        <token type="LiteralStringEscape"/>
155      </rule>
156      <rule pattern="\\u\{[0-9a-fA-F]+\}">
157        <token type="LiteralStringEscape"/>
158      </rule>
159      <rule pattern="\{[^}]*\}">
160        <token type="LiteralStringInterpol"/>
161      </rule>
162      <rule pattern="[^&#34;\\{}]+">
163        <token type="LiteralString"/>
164      </rule>
165      <rule pattern="&#34;">
166        <token type="LiteralString"/>
167        <pop depth="1"/>
168      </rule>
169    </state>
170    <state name="attribute">
171      <rule pattern="[^\[\]]+">
172        <token type="NameDecorator"/>
173      </rule>
174      <rule pattern="\[">
175        <token type="NameDecorator"/>
176        <push/>
177      </rule>
178      <rule pattern="\]">
179        <token type="NameDecorator"/>
180        <pop depth="1"/>
181      </rule>
182    </state>
183  </rules>
184</lexer>