sub read_atom ($rdr) {
my $atom = $rdr.next;
given $atom {
- when /^\"/ {
- die X::MalIncomplete.new(end => '"') if $atom !~~ /\"$/;
+ when /^'"' [ \\. || <-[\"\\]> ]* '"'$/ {
s:g/^\"|\"$//;
MalString(.trans(/\\\"/ => '"', /\\n/ => "\n", /\\\\/ => '\\'));
}
+ when /^\"/ {
+ die X::MalIncomplete.new(end => '"');
+ }
when /^\:(.*)/ { MalString("\x29E$0") }
when /^'-'? <[0..9]>+$/ { MalNumber($_) }
when 'nil' { $NIL }
as.integer(token)
} else if (re_match("^-?[0-9][0-9.]*$", token)) {
as.double(token)
- } else if (substr(token,1,1) == "\"") {
- if (substr(token, nchar(token), nchar(token)) != "\"") {
- throw("expected '\"', got EOF")
- }
+ } else if (re_match("^\"(?:\\\\.|[^\\\\\"])*\"$", token)) {
gsub("\x7f", "\\\\",
gsub("\\\\n", "\n",
gsub("\\\\\"", "\"",
gsub("\\\\\\\\", "\x7f",
substr(token, 2, nchar(token)-1)))))
+ } else if (substr(token,1,1) == "\"") {
+ throw("expected '\"', got EOF")
} else if (substr(token,1,1) == ":") {
new.keyword(substring(token,2))
} else if (token == "nil") {
}
def read_atom(rdr Reader) MalVal {
+ var sre = RegExp.new("^\"(?:\\\\.|[^\\\\\"])*\"$")
const token = rdr.peek
if token == "nil" {
rdr.next
}
case '"' {
const s = rdr.next
- if s[s.count - 1] == '"' {
+ if sre.exec(s) {
return MalString.new(unescape(s.slice(1, s.count - 1)))
} else {
throw MalError.new("expected '\"', got EOF")