Add support for negative numbers

This commit is contained in:
Sameer Rahmani 2020-06-14 21:23:39 +01:00
parent 47bf80e834
commit 5181c84696
2 changed files with 25 additions and 3 deletions

View File

@ -7,7 +7,7 @@ pub mod collections;
fn main() { fn main() {
let input = String::from("(println \">>>>>\" (+ 2 3))"); let input = String::from("(println \">>>>>\" '(+ 2 -3))");
println!("{:?}", println!("{:?}",
reader::read_string(&input).unwrap()); reader::read_string(&input).unwrap());

View File

@ -185,8 +185,14 @@ impl ExprReader {
} }
fn read_number<T: Read>(&mut self, reader: &mut BufReader<T>, neg: bool) -> ReadResult { fn read_number<T: Read>(&mut self, reader: &mut BufReader<T>, neg: bool) -> ReadResult {
let mut is_double = false; let mut is_double = false;
let mut string = "".to_string(); let mut string = (if neg {
"-"
} else {
""
}).to_string();
loop { loop {
match self.get_char(reader, false) { match self.get_char(reader, false) {
Some(e) if e == '.' && is_double => return Err("A double with more that one '.' ???".to_string()), Some(e) if e == '.' && is_double => return Err("A double with more that one '.' ???".to_string()),
@ -216,7 +222,23 @@ impl ExprReader {
c if c.is_digit(10) => self.read_number(reader, false), c if c.is_digit(10) => self.read_number(reader, false),
// ':' => self.read_keyword(reader), // ':' => self.read_keyword(reader),
// '-' => { '-' => {
// Read the '-' char
let _ = self.get_char(reader, true);
match self.peek_char(reader, true) {
Some(ch) => match ch {
ch if ch.is_digit(10) => self.read_number(reader, true),
_ => {
self.unget_char(c);
self._read_symbol(reader)
}
},
None => {
self.unget_char(c);
self._read_symbol(reader)
}
}
}
// Neg number // Neg number
// } // }
_ => self._read_symbol(reader) _ => self._read_symbol(reader)