Dot state
This commit is contained in:
parent
7b4d3c62b9
commit
59f9b5dd97
1 changed files with 19 additions and 1 deletions
|
@ -17,6 +17,7 @@ use self::token::Token;
|
||||||
enum State {
|
enum State {
|
||||||
Initial,
|
Initial,
|
||||||
Identifier,
|
Identifier,
|
||||||
|
Dot,
|
||||||
Hash,
|
Hash,
|
||||||
Comment,
|
Comment,
|
||||||
String,
|
String,
|
||||||
|
@ -90,7 +91,8 @@ impl Lexer {
|
||||||
*token = Some(Token::RightParen(c.to_string()));
|
*token = Some(Token::RightParen(c.to_string()));
|
||||||
}
|
}
|
||||||
else if c.is_dot() {
|
else if c.is_dot() {
|
||||||
*token = Some(Token::Dot);
|
self.state = State::Dot;
|
||||||
|
self.advance();
|
||||||
}
|
}
|
||||||
else if c.is_hash() {
|
else if c.is_hash() {
|
||||||
self.state = State::Hash;
|
self.state = State::Hash;
|
||||||
|
@ -141,6 +143,16 @@ impl Lexer {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn state_dot(&mut self, c: char, token: &mut Option<Token>) {
|
||||||
|
if c.is_identifier_delimiter() {
|
||||||
|
*token = Some(Token::Dot);
|
||||||
|
self.retract();
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
assert!(false, "Invalid token character: '{}'", c);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fn state_hash(&mut self, c: char, token: &mut Option<Token>) {
|
fn state_hash(&mut self, c: char, token: &mut Option<Token>) {
|
||||||
if c.is_boolean_true() || c.is_boolean_false() {
|
if c.is_boolean_true() || c.is_boolean_false() {
|
||||||
self.advance();
|
self.advance();
|
||||||
|
@ -195,6 +207,7 @@ impl Iterator for Lexer {
|
||||||
match self.state {
|
match self.state {
|
||||||
State::Initial => self.state_initial(c, &mut token),
|
State::Initial => self.state_initial(c, &mut token),
|
||||||
State::Identifier => self.state_identifier(c, &mut token),
|
State::Identifier => self.state_identifier(c, &mut token),
|
||||||
|
State::Dot => self.state_dot(c, &mut token),
|
||||||
State::Hash => self.state_hash(c, &mut token),
|
State::Hash => self.state_hash(c, &mut token),
|
||||||
State::String => self.state_string(c, &mut token),
|
State::String => self.state_string(c, &mut token),
|
||||||
State::Comment => self.state_comment(c, &mut token),
|
State::Comment => self.state_comment(c, &mut token),
|
||||||
|
@ -229,6 +242,11 @@ mod tests {
|
||||||
#[test]
|
#[test]
|
||||||
fn lexer_finds_dots() {
|
fn lexer_finds_dots() {
|
||||||
check_single_token(".", Token::Dot);
|
check_single_token(".", Token::Dot);
|
||||||
|
|
||||||
|
let mut lexer = Lexer::new("abc . abc");
|
||||||
|
assert_next_token(&mut lexer, &Token::Identifier(String::from("abc")));
|
||||||
|
assert_next_token(&mut lexer, &Token::Dot);
|
||||||
|
assert_next_token(&mut lexer, &Token::Identifier(String::from("abc")));
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue