Advertisement
Guest User

Untitled

a guest
Apr 21st, 2019
72
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.67 KB | None | 0 0
  1. #[derive(Copy, Clone, Debug)]
  2. enum Operator {
  3. Addition,
  4. Subtraction,
  5. Multiplication,
  6. Division,
  7. }
  8.  
  9. #[derive(Copy, Clone, Debug)]
  10. enum Position {
  11. Start,
  12. Stop,
  13. }
  14.  
  15. #[derive(Copy, Clone, Debug)]
  16. enum Token {
  17. Number(f64),
  18. Operator(Operator),
  19. Separator(Position),
  20. }
  21.  
  22. struct Lexer<I: Iterator<Item = char>> {
  23. iter: std::iter::Peekable<I>,
  24. }
  25.  
  26. impl<I: Iterator<Item = char>> Lexer<I> {
  27. fn new(iter: I) -> Self {
  28. Lexer {
  29. iter: iter.peekable(),
  30. }
  31. }
  32.  
  33. fn skip_whitespace(&mut self) {
  34. while self.iter.peek().map(|c| c.is_whitespace()).unwrap_or(false) {
  35. self.iter.next();
  36. }
  37. }
  38. }
  39.  
  40. impl<I: Iterator<Item = char>> Iterator for Lexer<I> {
  41. type Item = Token;
  42.  
  43. fn next(&mut self) -> Option<Token> {
  44. self.skip_whitespace();
  45. let chr = self.iter.next()?;
  46. return Some(match chr {
  47. '+' => Token::Operator(Operator::Addition),
  48. '-' => Token::Operator(Operator::Subtraction),
  49. '*' => Token::Operator(Operator::Multiplication),
  50. '/' => Token::Operator(Operator::Division),
  51. '(' => Token::Separator(Position::Start),
  52. ')' => Token::Separator(Position::Stop),
  53. '0'..='9' => {
  54. let mut buf = ((chr as u8) - b'0') as f64;
  55. while let Some('0'..='9') = self.iter.peek() {
  56. buf = buf * 10.0 + ((self.iter.next().unwrap() as u8) - b'0') as f64;
  57. }
  58. Token::Number(buf)
  59. }
  60. _ => panic!("invalid char: {}", chr),
  61. });
  62. }
  63. }
  64.  
  65. fn main() {
  66. println!("{:?}", Lexer::new("10+20((".chars()).collect::<Vec<_>>());
  67. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement