@@ -1165,31 +1165,48 @@ defmodule NimbleParsec.Compiler do
11651165 defp bin_range_to_guard ( var , range ) do
11661166 case range do
11671167 min .. min // step when abs ( step ) == 1 ->
1168- quote ( do: unquote ( var ) === unquote ( min ) )
1168+ quote ( do: unquote ( var ) === unquote ( char ( min ) ) )
11691169
11701170 min .. max // 1 ->
1171- quote ( do: unquote ( var ) >= unquote ( min ) and unquote ( var ) <= unquote ( max ) )
1171+ quote ( do: unquote ( var ) >= unquote ( char ( min ) ) and unquote ( var ) <= unquote ( char ( max ) ) )
11721172
11731173 min .. max // - 1 ->
1174- quote ( do: unquote ( var ) >= unquote ( max ) and unquote ( var ) <= unquote ( min ) )
1174+ quote ( do: unquote ( var ) >= unquote ( char ( max ) ) and unquote ( var ) <= unquote ( char ( min ) ) )
11751175
11761176 min when is_integer ( min ) ->
1177- quote ( do: unquote ( var ) === unquote ( min ) )
1177+ quote ( do: unquote ( var ) === unquote ( char ( min ) ) )
11781178
11791179 { :not , min .. min // step } when abs ( step ) == 1 ->
1180- quote ( do: unquote ( var ) !== unquote ( min ) )
1180+ quote ( do: unquote ( var ) !== unquote ( char ( min ) ) )
11811181
11821182 { :not , min .. max // 1 } ->
1183- quote ( do: unquote ( var ) < unquote ( min ) or unquote ( var ) > unquote ( max ) )
1183+ quote ( do: unquote ( var ) < unquote ( char ( min ) ) or unquote ( var ) > unquote ( char ( max ) ) )
11841184
11851185 { :not , min .. max // - 1 } ->
1186- quote ( do: unquote ( var ) < unquote ( max ) or unquote ( var ) > unquote ( min ) )
1186+ quote ( do: unquote ( var ) < unquote ( char ( max ) ) or unquote ( var ) > unquote ( char ( min ) ) )
11871187
11881188 { :not , min } when is_integer ( min ) ->
1189- quote ( do: unquote ( var ) !== unquote ( min ) )
1189+ quote ( do: unquote ( var ) !== unquote ( char ( min ) ) )
11901190 end
11911191 end
11921192
1193+ # `?a` and `97` are the same AST node, so the literal spelling only survives as
1194+ # `:token` metadata, which `Macro.to_string/1` honours when printing.
1195+ defp char ( codepoint ) do
1196+ token =
1197+ case codepoint do
1198+ ?\\ -> "?\\ \\ "
1199+ ?\s -> "?\\ s"
1200+ ?\n -> "?\\ n"
1201+ ?\t -> "?\\ t"
1202+ ?\r -> "?\\ r"
1203+ codepoint when codepoint in ?! .. ?~ -> "?" <> << codepoint >>
1204+ codepoint -> Integer . to_string ( codepoint )
1205+ end
1206+
1207+ { :__block__ , [ token: token ] , [ codepoint ] }
1208+ end
1209+
11931210 defp inspect_bin_range ( min .. max // _ , printable? ) do
11941211 { " in the range #{ inspect_char ( min ) } to #{ inspect_char ( max ) } " ,
11951212 printable? and printable? ( min ) and printable? ( max ) }
0 commit comments