X-Git-Url: http://nitlanguage.org diff --git a/src/literal.nit b/src/literal.nit index f98c209..0395299 100644 --- a/src/literal.nit +++ b/src/literal.nit @@ -21,8 +21,6 @@ import parser import toolcontext import phase -import modelbuilder #FIXME useless - redef class ToolContext var literal_phase: Phase = new LiteralPhase(self, null) end @@ -67,12 +65,22 @@ end redef class AIntExpr # The value of the literal int once computed. var value: nullable Int +end + +redef class ADecIntExpr redef fun accept_literal(v) do self.value = self.n_number.text.to_i end end +redef class AHexIntExpr + redef fun accept_literal(v) + do + self.value = self.n_hex_number.text.substring_from(2).to_hex + end +end + redef class AFloatExpr # The value of the literal float once computed. var value: nullable Float @@ -92,7 +100,7 @@ redef class ACharExpr v.toolcontext.error(self.hot_location, "Invalid character literal {txt}") return end - self.value = txt[1] + self.value = txt.chars[1] end end @@ -102,47 +110,13 @@ redef class AStringFormExpr redef fun accept_literal(v) do var txt = self.n_string.text - var skip = 1 - if txt[0] == txt[1] and txt.length >= 6 then skip = 3 - self.value = txt.substring(skip, txt.length-(2*skip)).unescape_nit - end -end - -redef class String - # Return a string where Nit escape sequences are transformed. - # - # Example: - # var s = "\\n" - # assert s.length == 2 - # var u = s.unescape_nit - # assert u.length == 1 - # assert u[0].ascii == 10 # (the ASCII value of the "new line" character) - fun unescape_nit: String - do - var res = new Buffer.with_capacity(self.length) - var was_slash = false - for c in self do - if not was_slash then - if c == '\\' then - was_slash = true - else - res.add(c) - end - continue - end - was_slash = false - if c == 'n' then - res.add('\n') - else if c == 'r' then - res.add('\r') - else if c == 't' then - res.add('\t') - else if c == '0' then - res.add('\0') - else - res.add(c) - end + var behead = 1 + var betail = 1 + if txt.chars[0] == txt.chars[1] and txt.length >= 6 then + behead = 3 + betail = 3 + if txt.chars[0] == '"' and txt.chars[3] == '\n' then behead = 4 # ignore first \n in """ end - return res.to_s + self.value = txt.substring(behead, txt.length - behead - betail).unescape_nit end end