Advertisement
Guest User

Untitled

a guest
Jul 9th, 2019
158
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Rust 4.98 KB | None | 0 0
  1.  
  2. use crate::token::*;
  3. use crate::grammar::*;
  4. use crate::error::*;
  5. use std::rc::Rc;
  6.  
  7. struct TokenExplorer {
  8.     tokens: Vec<Token>,
  9.     current: usize,
  10. }
  11.  
  12. impl TokenExplorer {
  13.     fn match_next(&mut self, types: Vec<TokenType>) -> bool {
  14.         for tt in types {
  15.             if self.check(tt) {
  16.                 self.advance();
  17.                 return true;
  18.             }
  19.         }
  20.         false
  21.     }
  22.  
  23.     fn check(&mut self, tt: TokenType) -> bool {
  24.         if self.is_at_end() {
  25.             false
  26.         } else {
  27.             self.peek().token_type == tt
  28.         }
  29.     }
  30.  
  31.     fn advance(&mut self) -> &Token {
  32.         if !self.is_at_end() {
  33.             self.current += 1;
  34.         }
  35.         self.previous()
  36.     }
  37.  
  38.     fn is_at_end(&mut self) -> bool {
  39.         self.peek().token_type == TokenType::EOF
  40.     }
  41.  
  42.     fn peek(&mut self) -> &Token {
  43.         self.tokens.get(self.current).unwrap()
  44.     }
  45.  
  46.     fn previous(&mut self) -> &Token {
  47.         self.tokens.get(self.current - 1).unwrap()
  48.     }
  49.  
  50.     fn consume(&mut self, tt: TokenType, message: &str) -> Result<&Token, LoxError> {
  51.         if self.check(tt) {
  52.             Ok(self.advance())
  53.         } else {
  54.             Err(Self::error(self.peek(), message))
  55.         }
  56.     }
  57.  
  58.     fn error(token: &Token, message: &str) -> LoxError {
  59.         if token.token_type == TokenType::EOF {
  60.             LoxError::new(token.line, String::from(" at end"), String::from(message))
  61.         } else {
  62.             LoxError::new(token.line, String::from(format!(" at '{}'", &token.lexeme)), String::from(message))
  63.         }
  64.     }
  65.  
  66.     fn synchronize(&mut self) {
  67.         self.advance();
  68.  
  69.         while !self.is_at_end() {
  70.             if self.previous().token_type == TokenType::Semicolon {
  71.                 return;
  72.             }
  73.  
  74.             match self.peek().token_type {
  75.                 TokenType::Class |
  76.                 TokenType::Fun |
  77.                 TokenType::Var |
  78.                 TokenType::For |
  79.                 TokenType::If |
  80.                 TokenType::While |
  81.                 TokenType::Print |
  82.                 TokenType::Return => {
  83.                     return;
  84.                 },
  85.                 _ => ()
  86.             }
  87.             self.advance();
  88.         }
  89.     }
  90. }
  91.  
  92. struct Parser {
  93.     tokens: TokenExplorer,
  94. }
  95.  
  96. impl Parser {
  97.     pub fn new(tokens: Vec<Token>) -> Parser {
  98.         Parser {
  99.             tokens: TokenExplorer {
  100.                 tokens: tokens,
  101.                 current: 0,
  102.             }
  103.         }
  104.     }
  105.  
  106.     fn expression(&mut self) -> Rc<dyn Expr> {
  107.         self.equality()
  108.     }
  109.  
  110.     fn equality(&mut self) -> Rc<dyn Expr> {
  111.         let mut expr = self.comparison();
  112.  
  113.         while self.tokens.match_next(vec![TokenType::BangEqual, TokenType::EqualEqual]) {
  114.             // ==============================================================
  115.             // Error occurs here (and similarly in the other functions below)
  116.             // cannot borrow \`*self\` as mutable more than once at a time
  117.             let operator = self.tokens.previous();
  118.             //             ----------- first mutable borrow occurs here
  119.             let right = self.comparison();
  120.             //          ^^^^ second mutable borrow occurs here
  121.             expr = Rc::new(Binary {
  122.                 left: expr,
  123.                 operator: *operator,
  124.             //            -------- first borrow later used here
  125.                 right: right,
  126.             });
  127.         }
  128.  
  129.         expr
  130.     }
  131.  
  132.     fn comparison(&mut self) -> Rc<dyn Expr> {
  133.         let mut expr = self.addition();
  134.  
  135.         while self.tokens.match_next(vec![TokenType::Greater, TokenType::GreaterEqual, TokenType::Less, TokenType::LessEqual]) {
  136.             let operator = self.tokens.previous();
  137.             let right = self.addition();
  138.             expr = Rc::new(Binary {
  139.                 left: expr,
  140.                 operator: *operator,
  141.                 right,
  142.             });
  143.         }
  144.  
  145.         expr
  146.     }
  147.  
  148.     fn addition(&mut self) -> Rc<dyn Expr> {
  149.         let mut expr = self.multiplication();
  150.  
  151.         while self.tokens.match_next(vec![TokenType::Minus, TokenType::Plus]) {
  152.             let operator = self.tokens.previous();
  153.             let right = self.multiplication();
  154.             expr = Rc::new(Binary {
  155.                 left: expr,
  156.                 operator: *operator,
  157.                 right,
  158.             });
  159.         }
  160.  
  161.         expr
  162.     }
  163.  
  164.     fn multiplication(&mut self) -> Rc<dyn Expr> {
  165.         let mut expr = self.unary();
  166.  
  167.         while self.tokens.match_next(vec![TokenType::Slash, TokenType::Star]) {
  168.             let operator = self.tokens.previous();
  169.             let right = self.unary();
  170.             expr = Rc::new(Binary {
  171.                 left: expr,
  172.                 operator: *operator,
  173.                 right,
  174.             });
  175.         }
  176.  
  177.         expr
  178.     }
  179.  
  180.     fn unary(&mut self) -> Rc<dyn Expr> {
  181.         if self.tokens.match_next(vec![TokenType::Bang, TokenType::Minus]) {
  182.             let operator = self.tokens.previous();
  183.             let right = self.unary();
  184.             return Rc::new(Unary {
  185.                 operator: *operator,
  186.                 right,
  187.             });
  188.         }
  189.         self.primary()
  190.     }
  191.  
  192.     fn primary(&mut self) -> Rc<dyn Expr> {
  193.         if self.tokens.match_next(vec![TokenType::False]) {
  194.             return Rc::new(Literal {
  195.                 value: LiteralType::Bool(false)
  196.             });
  197.         } else if self.tokens.match_next(vec![TokenType::True]) {
  198.             return Rc::new(Literal {
  199.                 value: LiteralType::Bool(true)
  200.             });
  201.         } else if self.tokens.match_next(vec![TokenType::Nil]) {
  202.             return Rc::new(Literal {
  203.                 value: LiteralType::Nil
  204.             });
  205.         }
  206.  
  207.         if self.tokens.match_next(vec![TokenType::Number, TokenType::Str]) {
  208.             return Rc::new(Literal {
  209.                 value: self.tokens.previous().literal.unwrap()
  210.             })
  211.         }
  212.  
  213.         if self.tokens.match_next(vec![TokenType::LeftParen]) {
  214.         //else {
  215.             let expression = self.expression();
  216.             self.tokens.consume(TokenType::RightParen, "Expect ')' after expression.");
  217.             return Rc::new(Grouping {
  218.                 expression
  219.             })
  220.         }
  221.         panic!("oopsie doopsie");
  222.     }
  223.  
  224. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement