我正在编写一个简单的令牌生成器,它将从它的新函数中获取输入(希望将其取而代之以使用REPL),并吐出与css语法关联的令牌。
这里是一个例子:
#[derive(Debug)]
pub enum Token {
Selector,
LBrace,
RBrace,
Property,
Value,
}
#[derive(Debug)]
pub struct Tokenizer {
source: String,
tokens: Vec<(Token, String)>,
}
impl Tokenizer {
pub fn new(source: &str) -> Self {
let source = source.to_string();
for (i, c) in source.chars().enumerate() {
if c == '.' {
// This is where I am stuck.
}
}
Self {
source,
tokens: vec![],
}
}
}
fn main() {
let tokens = Tokenizer::new(".example{}");
println!("{:#?}", tokens);
}
现在我的问题是我要遍历下一个字符,直到遇到#
'space'
,.
中的一个为止,但我不知道生锈如何使我保持迭代直到满足条件。是否可以调用序列中的下一个字符?
[如果您在我所遵循的指导方针范围内确实发现此代码有任何问题,请告诉我。谢谢。
这里是rust playground的链接。
由于这是一个非常广泛的问题,我将参考servo's css-parser。
一些可能派上用场的功能:
skip_while
可以在开头满足特定谓词的条件下跳过元素skip_while
创建一个可以向前看的迭代器除了使用迭代器,您还可以使用切片(peekable
)。这可能更容易,因为(普通的)迭代器基本上使您可以访问一次一个元素,而切片则使您可以根据需要来回移动(当然,在合理范围内)。