feat(tazjin/rlox): Implement multi-character scanning
Change-Id: Ic5a246a7f5834477aeb97824fa30ba74a8422bc1 Reviewed-on: https://cl.tvl.fyi/c/depot/+/2161 Reviewed-by: tazjin <mail@tazj.in> Tested-by: BuildkiteCI
This commit is contained in:
		
							parent
							
								
									6363efbebf
								
							
						
					
					
						commit
						3f6b88bce2
					
				
					 1 changed files with 16 additions and 0 deletions
				
			
		| 
						 | 
				
			
			@ -90,6 +90,7 @@ impl<'a> Scanner<'a> {
 | 
			
		|||
 | 
			
		||||
    fn scan_token(&mut self) {
 | 
			
		||||
        match self.advance() {
 | 
			
		||||
            // simple single-character tokens
 | 
			
		||||
            '(' => self.add_token(TokenKind::LeftParen),
 | 
			
		||||
            ')' => self.add_token(TokenKind::RightParen),
 | 
			
		||||
            '{' => self.add_token(TokenKind::LeftBrace),
 | 
			
		||||
| 
						 | 
				
			
			@ -101,6 +102,12 @@ impl<'a> Scanner<'a> {
 | 
			
		|||
            ';' => self.add_token(TokenKind::Semicolon),
 | 
			
		||||
            '*' => self.add_token(TokenKind::Star),
 | 
			
		||||
 | 
			
		||||
            // possible multi-character tokens
 | 
			
		||||
            '!' => self.add_if_next('=', TokenKind::BangEqual, TokenKind::Bang),
 | 
			
		||||
            '=' => self.add_if_next('=', TokenKind::EqualEqual, TokenKind::Equal),
 | 
			
		||||
            '<' => self.add_if_next('=', TokenKind::LessEqual, TokenKind::Less),
 | 
			
		||||
            '>' => self.add_if_next('=', TokenKind::GreaterEqual, TokenKind::Greater),
 | 
			
		||||
 | 
			
		||||
            unexpected => self.errors.push(Error {
 | 
			
		||||
                line: self.line,
 | 
			
		||||
                kind: ErrorKind::UnexpectedChar(unexpected),
 | 
			
		||||
| 
						 | 
				
			
			@ -108,6 +115,15 @@ impl<'a> Scanner<'a> {
 | 
			
		|||
        };
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    fn add_if_next(&mut self, expected:char, then: TokenKind, or: TokenKind) {
 | 
			
		||||
        if self.is_at_end() || self.source[self.current] != expected {
 | 
			
		||||
            self.add_token(or);
 | 
			
		||||
        } else {
 | 
			
		||||
            self.current += 1;
 | 
			
		||||
            self.add_token(then);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    fn scan_tokens(mut self) -> Vec<Token<'a>> {
 | 
			
		||||
        while !self.is_at_end() {
 | 
			
		||||
            self.start = self.current;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue