diff --git a/src/lexer/char.rs b/src/lexer/char.rs index 67534f3..3ef608f 100644 --- a/src/lexer/char.rs +++ b/src/lexer/char.rs @@ -9,15 +9,16 @@ pub trait Lexable { fn is_right_paren(&self) -> bool; fn is_identifier_initial(&self) -> bool; fn is_identifier_subsequent(&self) -> bool; + fn is_identifier_single(&self) -> bool; } impl Lexable for char { fn is_left_paren(&self) -> bool { - self == &'(' + *self == '(' } fn is_right_paren(&self) -> bool { - self == &')' + *self == ')' } fn is_identifier_initial(&self) -> bool { @@ -27,5 +28,9 @@ impl Lexable for char { fn is_identifier_subsequent(&self) -> bool { charset::identifier_subsequents().contains(&self) } + + fn is_identifier_single(&self) -> bool { + charset::identifier_singles().contains(&self) + } } diff --git a/src/lexer/charset.rs b/src/lexer/charset.rs index 63aaaaf..eb7e7cb 100644 --- a/src/lexer/charset.rs +++ b/src/lexer/charset.rs @@ -41,3 +41,7 @@ pub fn identifier_subsequents() -> CharSet { subsequents.extend(extras.iter()); subsequents } + +pub fn identifier_singles() -> CharSet { + CharSet::from_iter("+-".chars()) +} diff --git a/src/lexer/mod.rs b/src/lexer/mod.rs index 5c61537..e64f5fa 100644 --- a/src/lexer/mod.rs +++ b/src/lexer/mod.rs @@ -76,6 +76,9 @@ impl Lexer { else if c.is_right_paren() { *token = Some(Token::new(Kind::RightParen, c.to_string())); } + else if c.is_identifier_single() { + *token = Some(Token::new(Kind::Identifier, c.to_string())); + } else if c.is_identifier_initial() { self.state = State::Identifier; self.advance();