aboutsummaryrefslogtreecommitdiffstats
path: root/src/lexer.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/lexer.rs')
-rw-r--r--src/lexer.rs53
1 files changed, 26 insertions, 27 deletions
diff --git a/src/lexer.rs b/src/lexer.rs
index 4130760..397dfda 100644
--- a/src/lexer.rs
+++ b/src/lexer.rs
@@ -5,11 +5,11 @@ pub struct Lexer<'a> {
impl<'a> Lexer<'a> {
fn skip_whitespace(&mut self) {
while let Some(b' ') = self.buf.as_bytes().first() {
- self.buf = &self.buf[1..]
+ self.buf = &self.buf[1..];
}
}
- fn parse_num(&mut self) -> Option<&'a str> {
+ fn parse_num(&mut self) -> &'a str {
let mut i = 0;
while matches!(self.buf.as_bytes().get(i), Some(&b) if b.is_ascii_digit()) {
i += 1;
@@ -23,7 +23,7 @@ impl<'a> Lexer<'a> {
let (Some(b'e') | Some(b'E')) = self.buf.as_bytes().get(i) else {
let t = &self.buf[..i];
self.buf = &self.buf[i..];
- return Some(t);
+ return t;
};
i += 1;
if let Some(b'-') = self.buf.as_bytes().get(i) {
@@ -34,7 +34,7 @@ impl<'a> Lexer<'a> {
}
let t = &self.buf[..i];
self.buf = &self.buf[i..];
- Some(t)
+ t
}
}
@@ -43,32 +43,31 @@ impl<'a> Iterator for Lexer<'a> {
fn next(&mut self) -> Option<&'a str> {
self.skip_whitespace();
- let &first_byte = self.buf.as_bytes().first()?;
- if first_byte.is_ascii_digit() || first_byte == b'.' {
- return self.parse_num();
+ if self.buf.starts_with("//") {
+ self.buf = &self.buf[2..];
+ return Some("//");
}
- match first_byte {
- b'/' => {
- if let Some(b'/') = self.buf.as_bytes().get(1) {
- self.buf = &self.buf[2..];
- return Some("//");
+ Some(match self.buf.as_bytes().first()? {
+ b'0'..=b'9' | b'.' => self.parse_num(),
+ b'a'..=b'z' | b'A'..=b'Z' => {
+ let mut i = 1;
+ while let Some(b'a'..=b'z' | b'A'..=b'Z' | b'0'..=b'9') = self.buf.as_bytes().get(i)
+ {
+ i += 1;
}
- self.buf = &self.buf[1..];
- return Some("/");
+ let t = &self.buf[..i];
+ self.buf = &self.buf[i..];
+ t
}
- b'+' | b'-' | b'*' | b'%' | b'^' | b'(' | b')' => {
- let t = &self.buf[..1];
- self.buf = &self.buf[1..];
- return Some(t);
+ _ => {
+ let mut i = 1;
+ while !self.buf.is_char_boundary(i) {
+ i += 1;
+ }
+ let t = &self.buf[..i];
+ self.buf = &self.buf[i..];
+ t
}
- _ => (),
- }
- let mut i = 0;
- while let Some(b'a'..=b'z' | b'A'..=b'Z' | b'0'..=b'9') = self.buf.as_bytes().get(i) {
- i += 1;
- }
- let t = &self.buf[..i];
- self.buf = &self.buf[i..];
- Some(t)
+ })
}
}