1package e
2
3import (
4 . "github.com/alecthomas/chroma" // nolint
5 "github.com/alecthomas/chroma/lexers/internal"
6)
7
8// Elixir lexer.
9var Elixir = internal.Register(MustNewLexer(
10 &Config{
11 Name: "Elixir",
12 Aliases: []string{"elixir", "ex", "exs"},
13 Filenames: []string{"*.ex", "*.exs"},
14 MimeTypes: []string{"text/x-elixir"},
15 },
16 Rules{
17 "root": {
18 {`\s+`, Text, nil},
19 {`#.*$`, CommentSingle, nil},
20 {`(\?)(\\x\{)([\da-fA-F]+)(\})`, ByGroups(LiteralStringChar, LiteralStringEscape, LiteralNumberHex, LiteralStringEscape), nil},
21 {`(\?)(\\x[\da-fA-F]{1,2})`, ByGroups(LiteralStringChar, LiteralStringEscape), nil},
22 {`(\?)(\\[abdefnrstv])`, ByGroups(LiteralStringChar, LiteralStringEscape), nil},
23 {`\?\\?.`, LiteralStringChar, nil},
24 {`:::`, LiteralStringSymbol, nil},
25 {`::`, Operator, nil},
26 {`:(?:\.\.\.|<<>>|%\{\}|%|\{\})`, LiteralStringSymbol, nil},
27 {`:(?:(?:\.\.\.|[a-z_]\w*[!?]?)|[A-Z]\w*(?:\.[A-Z]\w*)*|(?:\<\<\<|\>\>\>|\|\|\||\&\&\&|\^\^\^|\~\~\~|\=\=\=|\!\=\=|\~\>\>|\<\~\>|\|\~\>|\<\|\>|\=\=|\!\=|\<\=|\>\=|\&\&|\|\||\<\>|\+\+|\-\-|\|\>|\=\~|\-\>|\<\-|\||\.|\=|\~\>|\<\~|\<|\>|\+|\-|\*|\/|\!|\^|\&))`, LiteralStringSymbol, nil},
28 {`:"`, LiteralStringSymbol, Push("string_double_atom")},
29 {`:'`, LiteralStringSymbol, Push("string_single_atom")},
30 {`((?:\.\.\.|<<>>|%\{\}|%|\{\})|(?:(?:\.\.\.|[a-z_]\w*[!?]?)|[A-Z]\w*(?:\.[A-Z]\w*)*|(?:\<\<\<|\>\>\>|\|\|\||\&\&\&|\^\^\^|\~\~\~|\=\=\=|\!\=\=|\~\>\>|\<\~\>|\|\~\>|\<\|\>|\=\=|\!\=|\<\=|\>\=|\&\&|\|\||\<\>|\+\+|\-\-|\|\>|\=\~|\-\>|\<\-|\||\.|\=|\~\>|\<\~|\<|\>|\+|\-|\*|\/|\!|\^|\&)))(:)(?=\s|\n)`, ByGroups(LiteralStringSymbol, Punctuation), nil},
31 {`@(?:\.\.\.|[a-z_]\w*[!?]?)`, NameAttribute, nil},
32 {`(?:\.\.\.|[a-z_]\w*[!?]?)`, Name, nil},
33 {`(%?)([A-Z]\w*(?:\.[A-Z]\w*)*)`, ByGroups(Punctuation, NameClass), nil},
34 {`\<\<\<|\>\>\>|\|\|\||\&\&\&|\^\^\^|\~\~\~|\=\=\=|\!\=\=|\~\>\>|\<\~\>|\|\~\>|\<\|\>`, Operator, nil},
35 {`\=\=|\!\=|\<\=|\>\=|\&\&|\|\||\<\>|\+\+|\-\-|\|\>|\=\~|\-\>|\<\-|\||\.|\=|\~\>|\<\~`, Operator, nil},
36 {`\\\\|\<\<|\>\>|\=\>|\(|\)|\:|\;|\,|\[|\]`, Punctuation, nil},
37 {`&\d`, NameEntity, nil},
38 {`\<|\>|\+|\-|\*|\/|\!|\^|\&`, Operator, nil},
39 {`0b[01](_?[01])*`, LiteralNumberBin, nil},
40 {`0o[0-7](_?[0-7])*`, LiteralNumberOct, nil},
41 {`0x[\da-fA-F](_?[\dA-Fa-f])*`, LiteralNumberHex, nil},
42 {`\d(_?\d)*\.\d(_?\d)*([eE][-+]?\d(_?\d)*)?`, LiteralNumberFloat, nil},
43 {`\d(_?\d)*`, LiteralNumberInteger, nil},
44 {`"""\s*`, LiteralStringHeredoc, Push("heredoc_double")},
45 {`'''\s*$`, LiteralStringHeredoc, Push("heredoc_single")},
46 {`"`, LiteralStringDouble, Push("string_double")},
47 {`'`, LiteralStringSingle, Push("string_single")},
48 Include("sigils"),
49 {`%\{`, Punctuation, Push("map_key")},
50 {`\{`, Punctuation, Push("tuple")},
51 },
52 "heredoc_double": {
53 {`^\s*"""`, LiteralStringHeredoc, Pop(1)},
54 Include("heredoc_interpol"),
55 },
56 "heredoc_single": {
57 {`^\s*'''`, LiteralStringHeredoc, Pop(1)},
58 Include("heredoc_interpol"),
59 },
60 "heredoc_interpol": {
61 {`[^#\\\n]+`, LiteralStringHeredoc, nil},
62 Include("escapes"),
63 {`\\.`, LiteralStringHeredoc, nil},
64 {`\n+`, LiteralStringHeredoc, nil},
65 Include("interpol"),
66 },
67 "heredoc_no_interpol": {
68 {`[^\\\n]+`, LiteralStringHeredoc, nil},
69 {`\\.`, LiteralStringHeredoc, nil},
70 {`\n+`, LiteralStringHeredoc, nil},
71 },
72 "escapes": {
73 {`(\\x\{)([\da-fA-F]+)(\})`, ByGroups(LiteralStringEscape, LiteralNumberHex, LiteralStringEscape), nil},
74 {`(\\x[\da-fA-F]{1,2})`, LiteralStringEscape, nil},
75 {`(\\[abdefnrstv])`, LiteralStringEscape, nil},
76 },
77 "interpol": {
78 {`#\{`, LiteralStringInterpol, Push("interpol_string")},
79 },
80 "interpol_string": {
81 {`\}`, LiteralStringInterpol, Pop(1)},
82 Include("root"),
83 },
84 "map_key": {
85 Include("root"),
86 {`:`, Punctuation, Push("map_val")},
87 {`=>`, Punctuation, Push("map_val")},
88 {`\}`, Punctuation, Pop(1)},
89 },
90 "map_val": {
91 Include("root"),
92 {`,`, Punctuation, Pop(1)},
93 {`(?=\})`, Punctuation, Pop(1)},
94 },
95 "tuple": {
96 Include("root"),
97 {`\}`, Punctuation, Pop(1)},
98 },
99 "string_double": {
100 {`[^#"\\]+`, LiteralStringDouble, nil},
101 Include("escapes"),
102 {`\\.`, LiteralStringDouble, nil},
103 {`(")`, ByGroups(LiteralStringDouble), Pop(1)},
104 Include("interpol"),
105 },
106 "string_single": {
107 {`[^#'\\]+`, LiteralStringSingle, nil},
108 Include("escapes"),
109 {`\\.`, LiteralStringSingle, nil},
110 {`(')`, ByGroups(LiteralStringSingle), Pop(1)},
111 Include("interpol"),
112 },
113 "string_double_atom": {
114 {`[^#"\\]+`, LiteralStringSymbol, nil},
115 Include("escapes"),
116 {`\\.`, LiteralStringSymbol, nil},
117 {`(")`, ByGroups(LiteralStringSymbol), Pop(1)},
118 Include("interpol"),
119 },
120 "string_single_atom": {
121 {`[^#'\\]+`, LiteralStringSymbol, nil},
122 Include("escapes"),
123 {`\\.`, LiteralStringSymbol, nil},
124 {`(')`, ByGroups(LiteralStringSymbol), Pop(1)},
125 Include("interpol"),
126 },
127 "sigils": {
128 {`(~[a-z])(""")`, ByGroups(LiteralStringOther, LiteralStringHeredoc), Push("triquot-end", "triquot-intp")},
129 {`(~[A-Z])(""")`, ByGroups(LiteralStringOther, LiteralStringHeredoc), Push("triquot-end", "triquot-no-intp")},
130 {`(~[a-z])(''')`, ByGroups(LiteralStringOther, LiteralStringHeredoc), Push("triapos-end", "triapos-intp")},
131 {`(~[A-Z])(''')`, ByGroups(LiteralStringOther, LiteralStringHeredoc), Push("triapos-end", "triapos-no-intp")},
132 {`~[a-z]\{`, LiteralStringOther, Push("cb-intp")},
133 {`~[A-Z]\{`, LiteralStringOther, Push("cb-no-intp")},
134 {`~[a-z]\[`, LiteralStringOther, Push("sb-intp")},
135 {`~[A-Z]\[`, LiteralStringOther, Push("sb-no-intp")},
136 {`~[a-z]\(`, LiteralStringOther, Push("pa-intp")},
137 {`~[A-Z]\(`, LiteralStringOther, Push("pa-no-intp")},
138 {`~[a-z]<`, LiteralStringOther, Push("ab-intp")},
139 {`~[A-Z]<`, LiteralStringOther, Push("ab-no-intp")},
140 {`~[a-z]/`, LiteralStringOther, Push("slas-intp")},
141 {`~[A-Z]/`, LiteralStringOther, Push("slas-no-intp")},
142 {`~[a-z]\|`, LiteralStringOther, Push("pipe-intp")},
143 {`~[A-Z]\|`, LiteralStringOther, Push("pipe-no-intp")},
144 {`~[a-z]"`, LiteralStringOther, Push("quot-intp")},
145 {`~[A-Z]"`, LiteralStringOther, Push("quot-no-intp")},
146 {`~[a-z]'`, LiteralStringOther, Push("apos-intp")},
147 {`~[A-Z]'`, LiteralStringOther, Push("apos-no-intp")},
148 },
149 "triquot-end": {
150 {`[a-zA-Z]+`, LiteralStringOther, Pop(1)},
151 Default(Pop(1)),
152 },
153 "triquot-intp": {
154 {`^\s*"""`, LiteralStringHeredoc, Pop(1)},
155 Include("heredoc_interpol"),
156 },
157 "triquot-no-intp": {
158 {`^\s*"""`, LiteralStringHeredoc, Pop(1)},
159 Include("heredoc_no_interpol"),
160 },
161 "triapos-end": {
162 {`[a-zA-Z]+`, LiteralStringOther, Pop(1)},
163 Default(Pop(1)),
164 },
165 "triapos-intp": {
166 {`^\s*'''`, LiteralStringHeredoc, Pop(1)},
167 Include("heredoc_interpol"),
168 },
169 "triapos-no-intp": {
170 {`^\s*'''`, LiteralStringHeredoc, Pop(1)},
171 Include("heredoc_no_interpol"),
172 },
173 "cb-intp": {
174 {`[^#\}\\]+`, LiteralStringOther, nil},
175 Include("escapes"),
176 {`\\.`, LiteralStringOther, nil},
177 {`\}[a-zA-Z]*`, LiteralStringOther, Pop(1)},
178 Include("interpol"),
179 },
180 "cb-no-intp": {
181 {`[^\}\\]+`, LiteralStringOther, nil},
182 {`\\.`, LiteralStringOther, nil},
183 {`\}[a-zA-Z]*`, LiteralStringOther, Pop(1)},
184 },
185 "sb-intp": {
186 {`[^#\]\\]+`, LiteralStringOther, nil},
187 Include("escapes"),
188 {`\\.`, LiteralStringOther, nil},
189 {`\][a-zA-Z]*`, LiteralStringOther, Pop(1)},
190 Include("interpol"),
191 },
192 "sb-no-intp": {
193 {`[^\]\\]+`, LiteralStringOther, nil},
194 {`\\.`, LiteralStringOther, nil},
195 {`\][a-zA-Z]*`, LiteralStringOther, Pop(1)},
196 },
197 "pa-intp": {
198 {`[^#\)\\]+`, LiteralStringOther, nil},
199 Include("escapes"),
200 {`\\.`, LiteralStringOther, nil},
201 {`\)[a-zA-Z]*`, LiteralStringOther, Pop(1)},
202 Include("interpol"),
203 },
204 "pa-no-intp": {
205 {`[^\)\\]+`, LiteralStringOther, nil},
206 {`\\.`, LiteralStringOther, nil},
207 {`\)[a-zA-Z]*`, LiteralStringOther, Pop(1)},
208 },
209 "ab-intp": {
210 {`[^#>\\]+`, LiteralStringOther, nil},
211 Include("escapes"),
212 {`\\.`, LiteralStringOther, nil},
213 {`>[a-zA-Z]*`, LiteralStringOther, Pop(1)},
214 Include("interpol"),
215 },
216 "ab-no-intp": {
217 {`[^>\\]+`, LiteralStringOther, nil},
218 {`\\.`, LiteralStringOther, nil},
219 {`>[a-zA-Z]*`, LiteralStringOther, Pop(1)},
220 },
221 "slas-intp": {
222 {`[^#/\\]+`, LiteralStringOther, nil},
223 Include("escapes"),
224 {`\\.`, LiteralStringOther, nil},
225 {`/[a-zA-Z]*`, LiteralStringOther, Pop(1)},
226 Include("interpol"),
227 },
228 "slas-no-intp": {
229 {`[^/\\]+`, LiteralStringOther, nil},
230 {`\\.`, LiteralStringOther, nil},
231 {`/[a-zA-Z]*`, LiteralStringOther, Pop(1)},
232 },
233 "pipe-intp": {
234 {`[^#\|\\]+`, LiteralStringOther, nil},
235 Include("escapes"),
236 {`\\.`, LiteralStringOther, nil},
237 {`\|[a-zA-Z]*`, LiteralStringOther, Pop(1)},
238 Include("interpol"),
239 },
240 "pipe-no-intp": {
241 {`[^\|\\]+`, LiteralStringOther, nil},
242 {`\\.`, LiteralStringOther, nil},
243 {`\|[a-zA-Z]*`, LiteralStringOther, Pop(1)},
244 },
245 "quot-intp": {
246 {`[^#"\\]+`, LiteralStringOther, nil},
247 Include("escapes"),
248 {`\\.`, LiteralStringOther, nil},
249 {`"[a-zA-Z]*`, LiteralStringOther, Pop(1)},
250 Include("interpol"),
251 },
252 "quot-no-intp": {
253 {`[^"\\]+`, LiteralStringOther, nil},
254 {`\\.`, LiteralStringOther, nil},
255 {`"[a-zA-Z]*`, LiteralStringOther, Pop(1)},
256 },
257 "apos-intp": {
258 {`[^#'\\]+`, LiteralStringOther, nil},
259 Include("escapes"),
260 {`\\.`, LiteralStringOther, nil},
261 {`'[a-zA-Z]*`, LiteralStringOther, Pop(1)},
262 Include("interpol"),
263 },
264 "apos-no-intp": {
265 {`[^'\\]+`, LiteralStringOther, nil},
266 {`\\.`, LiteralStringOther, nil},
267 {`'[a-zA-Z]*`, LiteralStringOther, Pop(1)},
268 },
269 },
270))