tangled
alpha
login
or
join now
gearsco.de
/
pearl
2
fork
atom
An Erlang lexer and syntax highlighter in Gleam
2
fork
atom
overview
issues
pulls
pipelines
Lex variables
gearsco.de
11 months ago
e43e2db0
e676204b
+75
-37
1 changed file
expand all
collapse all
unified
split
src
pearl.gleam
+75
-37
src/pearl.gleam
···
161
161
| "y" as char <> source
162
162
| "z" as char <> source -> lex_atom(advance(lexer, source), char)
163
163
164
164
+
"A" as char <> source
165
165
+
| "B" as char <> source
166
166
+
| "C" as char <> source
167
167
+
| "D" as char <> source
168
168
+
| "E" as char <> source
169
169
+
| "F" as char <> source
170
170
+
| "G" as char <> source
171
171
+
| "H" as char <> source
172
172
+
| "I" as char <> source
173
173
+
| "J" as char <> source
174
174
+
| "K" as char <> source
175
175
+
| "L" as char <> source
176
176
+
| "M" as char <> source
177
177
+
| "N" as char <> source
178
178
+
| "O" as char <> source
179
179
+
| "P" as char <> source
180
180
+
| "Q" as char <> source
181
181
+
| "R" as char <> source
182
182
+
| "S" as char <> source
183
183
+
| "T" as char <> source
184
184
+
| "U" as char <> source
185
185
+
| "V" as char <> source
186
186
+
| "W" as char <> source
187
187
+
| "X" as char <> source
188
188
+
| "Y" as char <> source
189
189
+
| "Z" as char <> source
190
190
+
| "_" as char <> source -> lex_variable(advance(lexer, source), char)
191
191
+
164
192
"\"" <> source -> lex_string(advance(lexer, source), "")
165
193
"'" <> source -> lex_quoted_atom(advance(lexer, source), "")
166
194
···
227
255
}
228
256
}
229
257
230
230
-
fn lex_atom(lexer: Lexer, lexed: String) -> #(Lexer, Token) {
258
258
+
fn lex_variable_or_atom(lexer: Lexer, lexed: String) -> #(Lexer, String) {
231
259
case lexer.source {
232
260
"a" as char <> source
233
261
| "b" as char <> source
···
292
320
| "8" as char <> source
293
321
| "9" as char <> source
294
322
| "_" as char <> source
295
295
-
| "@" as char <> source -> lex_atom(advance(lexer, source), lexed <> char)
323
323
+
| "@" as char <> source ->
324
324
+
lex_variable_or_atom(advance(lexer, source), lexed <> char)
296
325
297
297
-
_ -> {
298
298
-
let token = case lexed {
299
299
-
"after" -> token.After
300
300
-
"begin" -> token.Begin
301
301
-
"case" -> token.Case
302
302
-
"catch" -> token.Catch
303
303
-
"cond" -> token.Cond
304
304
-
"else" -> token.Else
305
305
-
"end" -> token.End
306
306
-
"fun" -> token.Fun
307
307
-
"if" -> token.If
308
308
-
"let" -> token.Let
309
309
-
"maybe" -> token.Maybe
310
310
-
"of" -> token.Of
311
311
-
"receive" -> token.Receive
312
312
-
"try" -> token.Try
313
313
-
"when" -> token.When
314
314
-
"bnot" -> token.Bnot
315
315
-
"div" -> token.Div
316
316
-
"rem" -> token.Rem
317
317
-
"band" -> token.Band
318
318
-
"bor" -> token.Bor
319
319
-
"bxor" -> token.Bxor
320
320
-
"bsl" -> token.Bsl
321
321
-
"bsr" -> token.Bsr
322
322
-
"not" -> token.Not
323
323
-
"and" -> token.And
324
324
-
"or" -> token.Or
325
325
-
"xor" -> token.Xor
326
326
-
"andalso" -> token.Andalso
327
327
-
"orelse" -> token.Orelse
326
326
+
_ -> #(lexer, lexed)
327
327
+
}
328
328
+
}
328
329
329
329
-
_ -> token.Atom(lexed, False)
330
330
-
}
331
331
-
#(lexer, token)
332
332
-
}
330
330
+
fn lex_variable(lexer: Lexer, char: String) -> #(Lexer, Token) {
331
331
+
let #(lexer, name) = lex_variable_or_atom(lexer, char)
332
332
+
#(lexer, token.Variable(name))
333
333
+
}
334
334
+
335
335
+
fn lex_atom(lexer: Lexer, char: String) -> #(Lexer, Token) {
336
336
+
let #(lexer, name) = lex_variable_or_atom(lexer, char)
337
337
+
338
338
+
let token = case name {
339
339
+
"after" -> token.After
340
340
+
"begin" -> token.Begin
341
341
+
"case" -> token.Case
342
342
+
"catch" -> token.Catch
343
343
+
"cond" -> token.Cond
344
344
+
"else" -> token.Else
345
345
+
"end" -> token.End
346
346
+
"fun" -> token.Fun
347
347
+
"if" -> token.If
348
348
+
"let" -> token.Let
349
349
+
"maybe" -> token.Maybe
350
350
+
"of" -> token.Of
351
351
+
"receive" -> token.Receive
352
352
+
"try" -> token.Try
353
353
+
"when" -> token.When
354
354
+
"bnot" -> token.Bnot
355
355
+
"div" -> token.Div
356
356
+
"rem" -> token.Rem
357
357
+
"band" -> token.Band
358
358
+
"bor" -> token.Bor
359
359
+
"bxor" -> token.Bxor
360
360
+
"bsl" -> token.Bsl
361
361
+
"bsr" -> token.Bsr
362
362
+
"not" -> token.Not
363
363
+
"and" -> token.And
364
364
+
"or" -> token.Or
365
365
+
"xor" -> token.Xor
366
366
+
"andalso" -> token.Andalso
367
367
+
"orelse" -> token.Orelse
368
368
+
369
369
+
_ -> token.Atom(name, False)
333
370
}
371
371
+
#(lexer, token)
334
372
}
335
373
336
374
fn lex_until_end_of_line(lexer: Lexer) -> #(Lexer, String) {