An Erlang lexer and syntax highlighter in Gleam

Use new splitter functions to improve performance

Changed files
+18 -22
birdie_snapshots
src
test
+7 -7
birdie_snapshots/highlight_comments_ansi.accepted
··· 14 14 --- 15 15 16 16  17 - %%% This a comment for the entire module 18 - 19 - %% This is a doc comment for the main function 20 - main() -> 21 - % A comment within a function 22 - nil. % This one is after the line 23 -  17 + %%% This a comment for the entire module 18 +  19 + %% This is a doc comment for the main function 20 + main() -> 21 + % A comment within a function 22 +  nil. % This one is after the line 23 + 
+1 -1
manifest.toml
··· 18 18 { name = "justin", version = "1.0.1", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "justin", source = "hex", outer_checksum = "7FA0C6DB78640C6DC5FBFD59BF3456009F3F8B485BF6825E97E1EB44E9A1E2CD" }, 19 19 { name = "rank", version = "1.0.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "rank", source = "hex", outer_checksum = "5660E361F0E49CBB714CC57CC4C89C63415D8986F05B2DA0C719D5642FAD91C9" }, 20 20 { name = "simplifile", version = "2.3.0", build_tools = ["gleam"], requirements = ["filepath", "gleam_stdlib"], otp_app = "simplifile", source = "hex", outer_checksum = "0A868DAC6063D9E983477981839810DC2E553285AB4588B87E3E9C96A7FB4CB4" }, 21 - { name = "splitter", version = "1.0.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "splitter", source = "hex", outer_checksum = "128FC521EE33B0012E3E64D5B55168586BC1B9C8D7B0D0CA223B68B0D770A547" }, 21 + { name = "splitter", version = "1.1.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "splitter", source = "hex", outer_checksum = "05564A381580395DCDEFF4F88A64B021E8DAFA6540AE99B4623962F52976AA9D" }, 22 22 { name = "term_size", version = "1.0.1", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "term_size", source = "hex", outer_checksum = "D00BD2BC8FB3EBB7E6AE076F3F1FF2AC9D5ED1805F004D0896C784D06C6645F1" }, 23 23 { name = "trie_again", version = "1.1.3", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "trie_again", source = "hex", outer_checksum = "365FE609649F3A098D1D7FC7EA5222EE422F0B3745587BF2AB03352357CA70BB" }, 24 24 ]
+9 -10
src/pearl.gleam
··· 628 628 | "^_" as sequence <> source 629 629 | "^?" as sequence <> source -> #(advance(lexer, source), sequence) 630 630 631 - "x{" <> source -> lex_brace_escape_sequence(advance(lexer, source)) 631 + "x{" <> _source -> lex_brace_escape_sequence(lexer) 632 632 "x" <> source -> lex_hex_escape_sequence(advance(lexer, source)) 633 633 634 634 "0" as char <> source ··· 714 714 } 715 715 716 716 fn lex_brace_escape_sequence(lexer: Lexer) -> #(Lexer, String) { 717 - case splitter.split(lexer.splitters.brace_escape_sequence, lexer.source) { 718 - #(before, "}", after) -> #(advance(lexer, after), "x{" <> before <> "}") 719 - #(before, separator, after) -> #( 720 - advance(error(lexer, UnterminatedEscapeSequence), separator <> after), 721 - "x{" <> before, 722 - ) 717 + case 718 + splitter.split_after(lexer.splitters.brace_escape_sequence, lexer.source) 719 + { 720 + #(before, "") -> #(error(lexer, UnterminatedEscapeSequence), before) 721 + #(before, after) -> #(advance(lexer, after), before) 723 722 } 724 723 } 725 724 ··· 1300 1299 } 1301 1300 1302 1301 fn lex_until_end_of_line(lexer: Lexer) -> #(Lexer, String) { 1303 - let #(before, split, after) = 1304 - splitter.split(lexer.splitters.until_end_of_line, lexer.source) 1305 - #(advance(lexer, split <> after), before) 1302 + let #(before, after) = 1303 + splitter.split_after(lexer.splitters.until_end_of_line, lexer.source) 1304 + #(advance(lexer, after), before) 1306 1305 } 1307 1306 1308 1307 fn lex_whitespace(lexer: Lexer, lexed: String) -> #(Lexer, Token) {
+1 -4
test/pearl_test.gleam
··· 221 221 222 222 pub fn unterminated_escape_sequence3_test() { 223 223 let src = "\"\\x{123\"" 224 - assert_errors(src, [ 225 - pearl.UnterminatedEscapeSequence, 226 - pearl.UnterminatedStringLiteral, 227 - ]) 224 + assert_errors(src, [pearl.UnterminatedEscapeSequence]) 228 225 } 229 226 230 227 pub fn unterminated_escape_sequence4_test() {