[lexer] Add Quote token
This commit is contained in:
parent
30a876a3f9
commit
061868d2c2
4 changed files with 17 additions and 2 deletions
|
@ -10,6 +10,7 @@ pub trait Lexable {
|
|||
fn is_identifier_initial(&self) -> bool;
|
||||
fn is_identifier_subsequent(&self) -> bool;
|
||||
fn is_left_paren(&self) -> bool;
|
||||
fn is_quote(&self) -> bool;
|
||||
fn is_radix(&self) -> bool;
|
||||
fn is_right_paren(&self) -> bool;
|
||||
}
|
||||
|
@ -43,6 +44,10 @@ impl Lexable for char {
|
|||
self.is_whitespace() || self.is_left_paren() || self.is_right_paren()
|
||||
}
|
||||
|
||||
fn is_quote(&self) -> bool {
|
||||
*self == '\''
|
||||
}
|
||||
|
||||
fn is_radix(&self) -> bool {
|
||||
let radishes = &['b', 'd', 'o', 'x'];
|
||||
radishes.contains(self)
|
||||
|
|
|
@ -36,6 +36,8 @@ impl State for Begin {
|
|||
StateResult::advance(Box::new(Hash::new()))
|
||||
} else if let Some(st) = Digit::with_char(&Builder::new(), c) {
|
||||
StateResult::advance(Box::new(st))
|
||||
} else if c.is_quote() {
|
||||
StateResult::Emit(Token::Quote, Resume::AtNext)
|
||||
} else {
|
||||
StateResult::fail(Error::invalid_char(c))
|
||||
}
|
||||
|
|
|
@ -14,10 +14,11 @@ pub struct Lex {
|
|||
pub enum Token {
|
||||
Bool(bool),
|
||||
Dot,
|
||||
Num(i64),
|
||||
Id,
|
||||
LeftParen,
|
||||
Num(i64),
|
||||
Quote,
|
||||
RightParen,
|
||||
Id
|
||||
}
|
||||
|
||||
impl Lex {
|
||||
|
|
|
@ -95,3 +95,10 @@ fn dot() {
|
|||
assert_eq!(lex.next(), Some(Ok(Lex::new(Token::Dot, ".", 0, 0))));
|
||||
assert_eq!(lex.next(), None);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn quote() {
|
||||
let mut lex = Lexer::new("'".chars());
|
||||
assert_eq!(lex.next(), Some(Ok(Lex::new(Token::Quote, "'", 0, 0))));
|
||||
assert_eq!(lex.next(), None);
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue