Advertisement
Guest User

review_fix.diff

a guest
Oct 16th, 2017
244
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Diff 2.91 KB | None | 0 0
  1. --- code.rs 2017-10-16 10:34:52.866213600 -0600
  2. +++ code_reviewed.rs    2017-10-16 13:46:27.105442600 -0600
  3. @@ -1,5 +1,3 @@
  4. -#![feature(box_syntax)]
  5. -
  6.  use std::fmt;
  7.  use std::str::Chars;
  8.  use std::iter::Peekable;
  9. @@ -40,13 +38,13 @@
  10.          }
  11.      }
  12.  
  13. -    pub fn err(&mut self) {
  14. +    pub fn err() -> ! {
  15.          panic!("Error parsing input");
  16.      }
  17.  
  18.      fn read_number(&mut self) -> Token {
  19.          let mut s = String::new();
  20. -        while { let temp = self.input.peek(); temp.is_some() && temp.unwrap().is_digit(10) } {
  21. +        while self.input.peek().map(|t| t.is_digit(10)).unwrap_or(false) {
  22.              let ch = self.input.next().unwrap();
  23.              s.push(ch);
  24.          }
  25. @@ -54,52 +52,52 @@
  26.      }
  27.  
  28.      fn read_op(&mut self) -> Token {
  29. -        let ch = self.input.next().unwrap();
  30. -        if ch == '+' {
  31. -            Plus(ch)
  32. -        } else {
  33. -            Minus(ch)
  34. +        match self.input.next().unwrap() {
  35. +            c if c == '+' => Plus(c),
  36. +            c => Minus(c)
  37.          }
  38.      }
  39.  
  40. +    pub fn next(&mut self) -> Token {
  41. +        let read_fn: &Fn(&mut Interpreter<'a>) -> Token;
  42.  
  43. -    pub fn next(&mut self) ->  Token {
  44. -        let ch = self.input.peek();
  45. -        match ch {
  46. +        match self.input.peek() {
  47.              Some(c) => {
  48.                  self.pos += 1;
  49. +
  50.                  if c.is_digit(10) {
  51. -                    self.read_number()
  52. +                    read_fn = &Interpreter::read_number;
  53.                  } else if *c == '+' || *c == '-' {
  54. -                    self.read_op()
  55. +                    read_fn = &Interpreter::read_op;
  56.                  } else if c.is_whitespace() {
  57. -                    self.next()
  58. +                    read_fn = &Interpreter::next;
  59.                  } else {
  60. -                    self.err();
  61. -                    ERR
  62. +                    Interpreter::err();
  63.                  }
  64.              },
  65. +            None => return EOF
  66. +        };
  67.  
  68. -            None => EOF
  69. -        }
  70. +        read_fn(self)
  71.      }
  72.  
  73.      fn eat(&mut self) -> i32 {
  74. -        let tok = self.next();
  75. -        match tok{
  76. +        match self.next() {
  77.              Int(i) => i,
  78. -            _ => { self.err(); 0 }
  79. +            _ => Interpreter::err()
  80.          }
  81.      }
  82.  
  83.      pub fn expr(&mut self) -> i32 {
  84. -        let mut f: Box<Fn(i32, i32) -> i32> = box |a: i32, b: i32| a + b;
  85. +        let add = |a: i32, b: i32| a + b;
  86. +        let subtract = |a: i32, b: i32| a - b;
  87. +
  88.          let left = self.eat();
  89. -        match self.next() {
  90. -            Plus(_) => f = box |a: i32, b: i32| a + b,
  91. -            Minus(_) => f = box |a: i32, b: i32| a - b,
  92. -            _ => self.err()
  93. -        }
  94. +        let f: &Fn(i32, i32) -> i32 = match self.next() {
  95. +            Plus(_) => &add,
  96. +            Minus(_) => &subtract,
  97. +            _ => Interpreter::err()
  98. +        };
  99.          let right = self.eat();
  100.          f(left, right)
  101.      }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement