aboutsummaryrefslogtreecommitdiff
path: root/src/lexer.rs
diff options
context:
space:
mode:
authorCody <cody@codyq.dev>2023-02-27 07:21:50 -0600
committerCody <cody@codyq.dev>2023-02-27 07:21:50 -0600
commitebfd74ddf0ef6372624ea171e06f8460d0e1351b (patch)
treed59df0e9600a6f2b86b57949048cf990a3e102ae /src/lexer.rs
parenta653a6602fe5ae5eb4739755db7b34bc92ecdadf (diff)
downloadsloth-ebfd74ddf0ef6372624ea171e06f8460d0e1351b.tar.gz
pain
Diffstat (limited to 'src/lexer.rs')
-rw-r--r--src/lexer.rs18
1 files changed, 14 insertions, 4 deletions
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,