38 lines
766 B
Rust
38 lines
766 B
Rust
use std::str::SplitWhitespace;
|
|
use TokenType::*;
|
|
|
|
#[derive(Debug)]
|
|
pub enum TokenType<'a> {
|
|
Number(u64),
|
|
Word(&'a str),
|
|
}
|
|
|
|
#[derive(Clone)]
|
|
pub struct Parser<'a> {
|
|
pub(crate) split_whitespace: SplitWhitespace<'a>
|
|
}
|
|
|
|
impl<'a> Iterator for Parser<'a> {
|
|
type Item = TokenType<'a>;
|
|
|
|
fn next(&mut self) -> Option<TokenType<'a>> {
|
|
let item = self.split_whitespace.next()?;
|
|
if let Ok(number) = item.parse::<u64>() {
|
|
return Some(Number(number));
|
|
} else {
|
|
return Some(Word(item));
|
|
}
|
|
}
|
|
}
|
|
|
|
impl<'a> Parser<'a> {
|
|
pub fn new(source: &'a str) -> Parser {
|
|
Parser {
|
|
split_whitespace: source.split_whitespace(),
|
|
}
|
|
}
|
|
pub fn inner_next(&mut self) -> Option<&'a str> {
|
|
self.split_whitespace.next()
|
|
}
|
|
}
|