From ebfd74ddf0ef6372624ea171e06f8460d0e1351b Mon Sep 17 00:00:00 2001 From: Cody Date: Mon, 27 Feb 2023 07:21:50 -0600 Subject: pain --- src/lexer.rs | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) (limited to 'src/lexer.rs') diff --git a/src/lexer.rs b/src/lexer.rs index 27669cb..2155e31 100644 --- a/src/lexer.rs +++ b/src/lexer.rs @@ -1,6 +1,6 @@ #![allow(dead_code)] -#[derive(Debug, Eq, PartialEq)] +#[derive(Debug, Clone, Eq, PartialEq)] pub enum TokenType { // Utility DocComment(String), @@ -25,8 +25,10 @@ pub enum TokenType { BangEq, // != Gt, // > + GtGt, // >> GtEq, // >= Lt, // < + LtLt, // << LtEq, // <= Amp, // & @@ -34,6 +36,8 @@ pub enum TokenType { Pipe, // | PipePipe, // || + DotDot, // . + LeftParen, // ( RightParen, // ) LeftBracket, // [ @@ -70,7 +74,7 @@ pub enum TokenType { Print, // TODO: Change to std library function } -#[derive(Debug, Eq, PartialEq)] +#[derive(Debug, Clone, Eq, PartialEq)] pub enum Literal { String(String), Character(char), @@ -190,11 +194,12 @@ impl<'a> Iterator for Lexer<'a> { '0'..='9' => { let mut value = String::new(); value.push(character); - while ('0'..='9').contains(&self.peek().unwrap()) { + while let Some('0'..='9') = &self.peek() { value.push(self.advance().unwrap()); } - if self.advance_if_eq(Some('.')) { + if self.peek() == Some('.') && self.peek_nth(1) != Some('.') { + self.advance(); value.push('.'); while ('0'..='9').contains(&self.peek().unwrap()) { value.push(self.advance().unwrap()); @@ -206,7 +211,9 @@ impl<'a> Iterator for Lexer<'a> { // Logical & Bitwise '!' if self.advance_if_eq(Some('=')) => TokenType::BangEq, '=' if self.advance_if_eq(Some('=')) => TokenType::EqEq, + '>' if self.advance_if_eq(Some('>')) => TokenType::GtGt, '>' if self.advance_if_eq(Some('=')) => TokenType::GtEq, + '<' if self.advance_if_eq(Some('<')) => TokenType::LtLt, '<' if self.advance_if_eq(Some('=')) => TokenType::LtEq, '!' => TokenType::Bang, '=' => TokenType::Eq, @@ -218,6 +225,9 @@ impl<'a> Iterator for Lexer<'a> { '&' => TokenType::Amp, '|' => TokenType::Pipe, + // Misc. Operators + '.' if self.advance_if_eq(Some('.')) => TokenType::DotDot, + // Scope '(' => TokenType::LeftParen, ')' => TokenType::RightParen, -- cgit v1.2.3