Tokenizer test
parent
957ec64ee0
commit
4bd5773dde
@ -0,0 +1,49 @@
|
|||||||
|
use nom::bytes::complete::tag;
|
||||||
|
use nom::bytes::complete::take_until1;
|
||||||
|
use nom::sequence::tuple;
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
todo!()
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, PartialEq)]
|
||||||
|
enum Token {
|
||||||
|
Tag(String),
|
||||||
|
Str(String),
|
||||||
|
Num(f32),
|
||||||
|
}
|
||||||
|
|
||||||
|
fn tokenize(line: &str) -> Vec<Token> {
|
||||||
|
line.split(" ")
|
||||||
|
.map(|piece| {
|
||||||
|
if let Ok(n) = piece.parse::<f32>() {
|
||||||
|
Token::Num(n)
|
||||||
|
} else if let Ok((_, (_, s, _))) = tuple((
|
||||||
|
tag::<&str, &str, ()>("\""),
|
||||||
|
take_until1("\""),
|
||||||
|
tag::<&str, &str, ()>("\""),
|
||||||
|
))(piece)
|
||||||
|
{
|
||||||
|
Token::Str(s.into())
|
||||||
|
} else {
|
||||||
|
Token::Tag(piece.into())
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.collect()
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_tokenize() {
|
||||||
|
let line = "foo \"bar\" 1.23 baz \"asdf\" etc";
|
||||||
|
assert_eq!(
|
||||||
|
tokenize(line),
|
||||||
|
vec![
|
||||||
|
Token::Tag("foo".into()),
|
||||||
|
Token::Str("bar".into()),
|
||||||
|
Token::Num(1.23),
|
||||||
|
Token::Tag("baz".into()),
|
||||||
|
Token::Str("asdf".into()),
|
||||||
|
Token::Tag("etc".into())
|
||||||
|
]
|
||||||
|
);
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue