diff --git a/library/debugger/util.lean b/library/debugger/util.lean index 994d5ffb53..3d0d3d0047 100644 --- a/library/debugger/util.lean +++ b/library/debugger/util.lean @@ -5,7 +5,7 @@ Authors: Leonardo de Moura -/ namespace debugger def is_space (c : char) : bool := -if c = ' ' ∨ c = char.of_nat 11 ∨ c = '\n' then tt else ff +if c = #" " ∨ c = char.of_nat 11 ∨ c = #"\n" then tt else ff def split_core : string → string → list string | (c::cs) [] := @@ -22,7 +22,7 @@ def to_qualified_name_core : string → string → name | [] r := if r = [] then name.anonymous else mk_simple_name r^.reverse | (c::cs) r := if is_space c then to_qualified_name_core cs r - else if c = '.' then + else if c = #"." then if r = [] then to_qualified_name_core cs [] else name.mk_string r^.reverse (to_qualified_name_core cs []) else to_qualified_name_core cs (c::r) diff --git a/library/init/char.lean b/library/init/char.lean index 2d6b271027..1f336ad9c9 100644 --- a/library/init/char.lean +++ b/library/init/char.lean @@ -28,4 +28,4 @@ have decidable_eq (fin char_sz), from fin.decidable_eq _, this instance : inhabited char := -⟨'A'⟩ +⟨#"A"⟩ diff --git a/library/init/string.lean b/library/init/string.lean index d9ed891f62..ad205a5614 100644 --- a/library/init/string.lean +++ b/library/init/string.lean @@ -41,7 +41,7 @@ def utf8_length : string → nat private def to_nat_core : list char → nat → nat | [] r := r | (c::cs) r := - to_nat_core cs (char.to_nat c - char.to_nat '0' + r*10) + to_nat_core cs (char.to_nat c - char.to_nat #"0" + r*10) def string.to_nat (s : string) : nat := to_nat_core s^.reverse 0 diff --git a/library/init/to_string.lean b/library/init/to_string.lean index ad5542a17d..0272c206fb 100644 --- a/library/init/to_string.lean +++ b/library/init/to_string.lean @@ -51,14 +51,13 @@ instance {A : Type u} {P : A → Prop} [has_to_string A] : has_to_string (subtyp ⟨λ s, to_string (elt_of s)⟩ def char.quote_core (c : char) : string := -if c = '\n' then "\\n" -else if c = '\\' then "\\\\" -else if c = '\"' then "\\\"" -else if c = '\'' then "\\\'" +if c = #"\n" then "\\n" +else if c = #"\\" then "\\\\" +else if c = #"\"" then "\\\"" else c::nil instance : has_to_string char := -⟨λ c, "'" ++ char.quote_core c ++ "'"⟩ +⟨λ c, "#\"" ++ char.quote_core c ++ "\""⟩ def string.quote_aux : string → string | [] := "" diff --git a/src/frontends/lean/scanner.cpp b/src/frontends/lean/scanner.cpp index 850267344e..60d52a3b3f 100644 --- a/src/frontends/lean/scanner.cpp +++ b/src/frontends/lean/scanner.cpp @@ -178,12 +178,14 @@ auto scanner::read_string() -> token_kind { } auto scanner::read_char() -> token_kind { + lean_assert(curr() == '\"'); + next(); char c = curr(); if (c == '\\') c = read_quoted_char(g_end_error_char_msg); next(); - if (curr() != '\'') - throw_exception("invalid character, ' expected"); + if (curr() != '"') + throw_exception("invalid character, \" expected"); next(); m_buffer.clear(); m_buffer += c; @@ -535,18 +537,18 @@ auto scanner::read_key_cmd_id() -> token_kind { static name * g_begin_comment_tk = nullptr; static name * g_begin_comment_block_tk = nullptr; -static name * g_tick_tk = nullptr; +static name * g_pound_tk = nullptr; void initialize_scanner() { g_begin_comment_tk = new name("--"); g_begin_comment_block_tk = new name("/-"); - g_tick_tk = new name("'"); + g_pound_tk = new name("#"); } void finalize_scanner() { delete g_begin_comment_tk; delete g_begin_comment_block_tk; - delete g_tick_tk; + delete g_pound_tk; } auto scanner::scan(environment const & env) -> token_kind { @@ -581,7 +583,7 @@ auto scanner::scan(environment const & env) -> token_kind { read_single_line_comment(); else if (n == *g_begin_comment_block_tk) read_comment_block(); - else if (n == *g_tick_tk) + else if (n == *g_pound_tk && curr() == '"') return read_char(); else return k; diff --git a/src/frontends/lean/token_table.cpp b/src/frontends/lean/token_table.cpp index 2a4596e3c3..e6c1cfce15 100644 --- a/src/frontends/lean/token_table.cpp +++ b/src/frontends/lean/token_table.cpp @@ -88,7 +88,7 @@ void init_token_table(token_table & t) { {"(:", g_max_prec}, {":)", 0}, {"⊢", 0}, {"⟨", g_max_prec}, {"⟩", 0}, {"^", 0}, {"↑", 0}, {"▸", 0}, {"//", 0}, {"|", 0}, {"!", g_max_prec}, {"?", 0}, {"with", 0}, {"without", 0}, {"...", 0}, {",", 0}, - {".", 0}, {":", 0}, {"::", 0}, {"calc", 0}, {"as", 0}, {":=", 0}, {"--", 0}, {"#", 0}, + {".", 0}, {":", 0}, {"::", 0}, {"calc", 0}, {"as", 0}, {":=", 0}, {"--", 0}, {"#", g_max_prec}, {"(*", 0}, {"/-", 0}, {"begin", g_max_prec}, {"using", 0}, {"@@", g_max_prec}, {"@", g_max_prec}, {"sorry", g_max_prec}, {"+", g_plus_prec}, {"->", g_arrow_prec}, {"<-", 0}, diff --git a/src/library/string.cpp b/src/library/string.cpp index 9cd36d8c2d..ffcbf4b815 100644 --- a/src/library/string.cpp +++ b/src/library/string.cpp @@ -47,9 +47,9 @@ static void display_char_literal_core(std::ostream & out, char c, bool in_string } static void display_char_literal(std::ostream & out, char c) { - out << "'"; + out << "#\""; display_char_literal_core(out, c, false); - out << "'"; + out << "\""; } static void display_string_literal(std::ostream & out, std::string const & s) { diff --git a/tests/lean/char_lits.lean b/tests/lean/char_lits.lean index eb7056c438..110961ef5f 100644 --- a/tests/lean/char_lits.lean +++ b/tests/lean/char_lits.lean @@ -1,11 +1,11 @@ import system.io -check 'a' +check #"a" -vm_eval 'a' -vm_eval '\n' -vm_eval '\\' -vm_eval put_str (list.cons '\\' "aaa") -vm_eval put_str ['\n'] -vm_eval put_str ['\n'] -vm_eval put_str (list.cons '\'' "aaa") +vm_eval #"a" +vm_eval #"\n" +vm_eval #"\\" +vm_eval put_str (list.cons #"\\" "aaa") +vm_eval put_str [#"\n"] +vm_eval put_str [#"\n"] +vm_eval put_str (list.cons #"\'" "aaa") diff --git a/tests/lean/char_lits.lean.expected.out b/tests/lean/char_lits.lean.expected.out index ad0caa1dd9..8c98cfa32f 100644 --- a/tests/lean/char_lits.lean.expected.out +++ b/tests/lean/char_lits.lean.expected.out @@ -1,7 +1,7 @@ -'a' : char -'a' -'\n' -'\\' +#"a" : char +#"a" +#"\n" +#"\\" aaa\ diff --git a/tests/lean/curly_notation.lean b/tests/lean/curly_notation.lean index 387afd15bd..408f5dba10 100644 --- a/tests/lean/curly_notation.lean +++ b/tests/lean/curly_notation.lean @@ -5,7 +5,7 @@ check ({} : set nat) definition s1 : set nat := {1, 2+3, 3, 4} print s1 -definition s2 : set char := {'a', 'b', 'c'} +definition s2 : set char := {#"a", #"b", #"c"} print s2 definition s3 : set string := {"hello", "world"} diff --git a/tests/lean/curly_notation.lean.expected.out b/tests/lean/curly_notation.lean.expected.out index 640b347733..5c6c0786e4 100644 --- a/tests/lean/curly_notation.lean.expected.out +++ b/tests/lean/curly_notation.lean.expected.out @@ -4,7 +4,7 @@ definition s1 : set ℕ := {1, 2 + 3, 3, 4} definition s2 : set char := -{'a', 'b', 'c'} +{#"a", #"b", #"c"} definition s3 : set string := {"hello", "world"} {a ∈ s1 | a > 1} : set ℕ diff --git a/tests/lean/hex_char.lean b/tests/lean/hex_char.lean index 295f507759..215f85e833 100644 --- a/tests/lean/hex_char.lean +++ b/tests/lean/hex_char.lean @@ -1,3 +1,3 @@ -vm_eval '\x41' -vm_eval '\x42' -vm_eval '\x43' +vm_eval #"\x41" +vm_eval #"\x42" +vm_eval #"\x43" diff --git a/tests/lean/hex_char.lean.expected.out b/tests/lean/hex_char.lean.expected.out index a252a09df7..0fa2564414 100644 --- a/tests/lean/hex_char.lean.expected.out +++ b/tests/lean/hex_char.lean.expected.out @@ -1,3 +1,3 @@ -'A' -'B' -'C' +#"A" +#"B" +#"C"