1<lexer>
  2  <config>
  3    <name>Haskell</name>
  4    <alias>haskell</alias>
  5    <alias>hs</alias>
  6    <filename>*.hs</filename>
  7    <mime_type>text/x-haskell</mime_type>
  8  </config>
  9  <rules>
 10    <state name="escape">
 11      <rule pattern="[abfnrtv"\'&\\]">
 12        <token type="LiteralStringEscape"/>
 13        <pop depth="1"/>
 14      </rule>
 15      <rule pattern="\^[][\p{Lu}@^_]">
 16        <token type="LiteralStringEscape"/>
 17        <pop depth="1"/>
 18      </rule>
 19      <rule pattern="NUL|SOH|[SE]TX|EOT|ENQ|ACK|BEL|BS|HT|LF|VT|FF|CR|S[OI]|DLE|DC[1-4]|NAK|SYN|ETB|CAN|EM|SUB|ESC|[FGRU]S|SP|DEL">
 20        <token type="LiteralStringEscape"/>
 21        <pop depth="1"/>
 22      </rule>
 23      <rule pattern="o[0-7]+">
 24        <token type="LiteralStringEscape"/>
 25        <pop depth="1"/>
 26      </rule>
 27      <rule pattern="x[\da-fA-F]+">
 28        <token type="LiteralStringEscape"/>
 29        <pop depth="1"/>
 30      </rule>
 31      <rule pattern="\d+">
 32        <token type="LiteralStringEscape"/>
 33        <pop depth="1"/>
 34      </rule>
 35      <rule pattern="\s+\\">
 36        <token type="LiteralStringEscape"/>
 37        <pop depth="1"/>
 38      </rule>
 39    </state>
 40    <state name="root">
 41      <rule pattern="\s+">
 42        <token type="Text"/>
 43      </rule>
 44      <rule pattern="--(?![!#$%&*+./<=>?@^|_~:\\]).*?$">
 45        <token type="CommentSingle"/>
 46      </rule>
 47      <rule pattern="\{-">
 48        <token type="CommentMultiline"/>
 49        <push state="comment"/>
 50      </rule>
 51      <rule pattern="\bimport\b">
 52        <token type="KeywordReserved"/>
 53        <push state="import"/>
 54      </rule>
 55      <rule pattern="\bmodule\b">
 56        <token type="KeywordReserved"/>
 57        <push state="module"/>
 58      </rule>
 59      <rule pattern="\berror\b">
 60        <token type="NameException"/>
 61      </rule>
 62      <rule pattern="\b(case|class|data|default|deriving|do|else|family|if|in|infix[lr]?|instance|let|newtype|of|then|type|where|_)(?!\')\b">
 63        <token type="KeywordReserved"/>
 64      </rule>
 65      <rule pattern="'[^\\]'">
 66        <token type="LiteralStringChar"/>
 67      </rule>
 68      <rule pattern="^[_\p{Ll}][\w\']*">
 69        <token type="NameFunction"/>
 70      </rule>
 71      <rule pattern="'?[_\p{Ll}][\w']*">
 72        <token type="Name"/>
 73      </rule>
 74      <rule pattern="('')?[\p{Lu}][\w\']*">
 75        <token type="KeywordType"/>
 76      </rule>
 77      <rule pattern="(')[\p{Lu}][\w\']*">
 78        <token type="KeywordType"/>
 79      </rule>
 80      <rule pattern="(')\[[^\]]*\]">
 81        <token type="KeywordType"/>
 82      </rule>
 83      <rule pattern="(')\([^)]*\)">
 84        <token type="KeywordType"/>
 85      </rule>
 86      <rule pattern="\\(?![:!#$%&*+.\\/<=>?@^|~-]+)">
 87        <token type="NameFunction"/>
 88      </rule>
 89      <rule pattern="(<-|::|->|=>|=|'([:!#$%&*+.\\/<=>?@^|~-]+))(?![:!#$%&*+.\\/<=>?@^|~-]+)">
 90        <token type="OperatorWord"/>
 91      </rule>
 92      <rule pattern=":[:!#$%&*+.\\/<=>?@^|~-]*">
 93        <token type="KeywordType"/>
 94      </rule>
 95      <rule pattern="[:!#$%&*+.\\/<=>?@^|~-]+">
 96        <token type="Operator"/>
 97      </rule>
 98      <rule pattern="\d+_*[eE][+-]?\d+">
 99        <token type="LiteralNumberFloat"/>
100      </rule>
101      <rule pattern="\d+(_+[\d]+)*\.\d+(_+[\d]+)*([eE][+-]?\d+)?">
102        <token type="LiteralNumberFloat"/>
103      </rule>
104      <rule pattern="0[oO](_*[0-7])+">
105        <token type="LiteralNumberOct"/>
106      </rule>
107      <rule pattern="0[xX](_*[\da-fA-F])+">
108        <token type="LiteralNumberHex"/>
109      </rule>
110      <rule pattern="0[bB](_*[01])+">
111        <token type="LiteralNumberBin"/>
112      </rule>
113      <rule pattern="\d+(_*[\d])*">
114        <token type="LiteralNumberInteger"/>
115      </rule>
116      <rule pattern="'">
117        <token type="LiteralStringChar"/>
118        <push state="character"/>
119      </rule>
120      <rule pattern=""">
121        <token type="LiteralString"/>
122        <push state="string"/>
123      </rule>
124      <rule pattern="\[\]">
125        <token type="KeywordType"/>
126      </rule>
127      <rule pattern="\(\)">
128        <token type="NameBuiltin"/>
129      </rule>
130      <rule pattern="[][(),;`{}]">
131        <token type="Punctuation"/>
132      </rule>
133    </state>
134    <state name="import">
135      <rule pattern="\s+">
136        <token type="Text"/>
137      </rule>
138      <rule pattern=""">
139        <token type="LiteralString"/>
140        <push state="string"/>
141      </rule>
142      <rule pattern="\)">
143        <token type="Punctuation"/>
144        <pop depth="1"/>
145      </rule>
146      <rule pattern="qualified\b">
147        <token type="Keyword"/>
148      </rule>
149      <rule pattern="([\p{Lu}][\w.]*)(\s+)(as)(\s+)([\p{Lu}][\w.]*)">
150        <bygroups>
151          <token type="NameNamespace"/>
152          <token type="Text"/>
153          <token type="Keyword"/>
154          <token type="Text"/>
155          <token type="Name"/>
156        </bygroups>
157        <pop depth="1"/>
158      </rule>
159      <rule pattern="([\p{Lu}][\w.]*)(\s+)(hiding)(\s+)(\()">
160        <bygroups>
161          <token type="NameNamespace"/>
162          <token type="Text"/>
163          <token type="Keyword"/>
164          <token type="Text"/>
165          <token type="Punctuation"/>
166        </bygroups>
167        <push state="funclist"/>
168      </rule>
169      <rule pattern="([\p{Lu}][\w.]*)(\s+)(\()">
170        <bygroups>
171          <token type="NameNamespace"/>
172          <token type="Text"/>
173          <token type="Punctuation"/>
174        </bygroups>
175        <push state="funclist"/>
176      </rule>
177      <rule pattern="[\w.]+">
178        <token type="NameNamespace"/>
179        <pop depth="1"/>
180      </rule>
181    </state>
182    <state name="module">
183      <rule pattern="\s+">
184        <token type="Text"/>
185      </rule>
186      <rule pattern="([\p{Lu}][\w.]*)(\s+)(\()">
187        <bygroups>
188          <token type="NameNamespace"/>
189          <token type="Text"/>
190          <token type="Punctuation"/>
191        </bygroups>
192        <push state="funclist"/>
193      </rule>
194      <rule pattern="[\p{Lu}][\w.]*">
195        <token type="NameNamespace"/>
196        <pop depth="1"/>
197      </rule>
198    </state>
199    <state name="funclist">
200      <rule pattern="\s+">
201        <token type="Text"/>
202      </rule>
203      <rule pattern="[\p{Lu}]\w*">
204        <token type="KeywordType"/>
205      </rule>
206      <rule pattern="(_[\w\']+|[\p{Ll}][\w\']*)">
207        <token type="NameFunction"/>
208      </rule>
209      <rule pattern="--(?![!#$%&*+./<=>?@^|_~:\\]).*?$">
210        <token type="CommentSingle"/>
211      </rule>
212      <rule pattern="\{-">
213        <token type="CommentMultiline"/>
214        <push state="comment"/>
215      </rule>
216      <rule pattern=",">
217        <token type="Punctuation"/>
218      </rule>
219      <rule pattern="[:!#$%&*+.\\/<=>?@^|~-]+">
220        <token type="Operator"/>
221      </rule>
222      <rule pattern="\(">
223        <token type="Punctuation"/>
224        <push state="funclist" state="funclist"/>
225      </rule>
226      <rule pattern="\)">
227        <token type="Punctuation"/>
228        <pop depth="2"/>
229      </rule>
230    </state>
231    <state name="comment">
232      <rule pattern="[^-{}]+">
233        <token type="CommentMultiline"/>
234      </rule>
235      <rule pattern="\{-">
236        <token type="CommentMultiline"/>
237        <push/>
238      </rule>
239      <rule pattern="-\}">
240        <token type="CommentMultiline"/>
241        <pop depth="1"/>
242      </rule>
243      <rule pattern="[-{}]">
244        <token type="CommentMultiline"/>
245      </rule>
246    </state>
247    <state name="character">
248      <rule pattern="[^\\']'">
249        <token type="LiteralStringChar"/>
250        <pop depth="1"/>
251      </rule>
252      <rule pattern="\\">
253        <token type="LiteralStringEscape"/>
254        <push state="escape"/>
255      </rule>
256      <rule pattern="'">
257        <token type="LiteralStringChar"/>
258        <pop depth="1"/>
259      </rule>
260    </state>
261    <state name="string">
262      <rule pattern="[^\\"]+">
263        <token type="LiteralString"/>
264      </rule>
265      <rule pattern="\\">
266        <token type="LiteralStringEscape"/>
267        <push state="escape"/>
268      </rule>
269      <rule pattern=""">
270        <token type="LiteralString"/>
271        <pop depth="1"/>
272      </rule>
273    </state>
274  </rules>
275</lexer>