A JavaScript lexer and syntax highlighter for Gleam!

Report errors for invalid private identifiers

+35 -2
+35 -2
src/just.gleam
··· 26 26 UnterminatedTemplate 27 27 LetterAfterNumber 28 28 NumericSeparatorNotAllowed 29 - NumberEndAfterExponent 29 + ExpectedExponent 30 + InvalidPrivateIdentifier(identifier: String) 31 + } 32 + 33 + pub fn stringify_error(error: Error) -> String { 34 + case error { 35 + InvalidPrivateIdentifier(identifier) -> 36 + "Invalid private identifier: `" <> identifier <> "`" 37 + LetterAfterNumber -> 38 + "Identifier characters cannot appear directly after numbers" 39 + ExpectedExponent -> "Expected an exponent" 40 + NumericSeparatorNotAllowed -> "Numeric separator is not allowed here" 41 + UnknownCharacter(character) -> "Unexpected character: `" <> character <> "`" 42 + UnterminatedComment -> "Unterminated comment" 43 + UnterminatedRegularExpression -> "Unterminated regular expression literal" 44 + UnterminatedString -> "Unterminated strint literal" 45 + UnterminatedTemplate -> "Unterminated template literal" 46 + } 30 47 } 31 48 32 49 pub fn new(source: String) -> Lexer { ··· 261 278 262 279 "#" <> source -> { 263 280 let #(lexer, name) = lex_identifier(advance(lexer, source), "") 281 + 282 + let lexer = case name { 283 + "" 284 + | "0" <> _ 285 + | "1" <> _ 286 + | "2" <> _ 287 + | "3" <> _ 288 + | "4" <> _ 289 + | "5" <> _ 290 + | "6" <> _ 291 + | "7" <> _ 292 + | "8" <> _ 293 + | "9" <> _ -> error(lexer, InvalidPrivateIdentifier("#" <> name)) 294 + _ -> lexer 295 + } 296 + 264 297 #(lexer, token.PrivateIdentifier(name)) 265 298 } 266 299 ··· 487 520 ) 488 521 489 522 _, _, AfterExponent -> #( 490 - error(lexer, NumberEndAfterExponent), 523 + error(lexer, ExpectedExponent), 491 524 token.Number(lexed), 492 525 ) 493 526