Parsing 如何在Rust中将相同的可变Peekable传递给不同的函数
我想写一个解析器。 对我来说,拥有一个可变的Parsing 如何在Rust中将相同的可变Peekable传递给不同的函数,parsing,rust,iterator,mutable,Parsing,Rust,Iterator,Mutable,我想写一个解析器。 对我来说,拥有一个可变的迭代器,我可以将它传递给不同的解析器函数,这似乎很实用 我试图说明一种简化的方法,它可以编译,但还不理想 fn main() { let tokens = vec!["fIrSt".to_string(), "SeConD".to_string(), "tHiRd".to_string(), "FoUrTh".to_string()]; let parsed = parse_input(tokens); println!("
迭代器
,我可以将它传递给不同的解析器函数,这似乎很实用
我试图说明一种简化的方法,它可以编译,但还不理想
fn main() {
let tokens = vec!["fIrSt".to_string(), "SeConD".to_string(), "tHiRd".to_string(), "FoUrTh".to_string()];
let parsed = parse_input(tokens);
println!("{}", parsed);
}
fn parse_input(tokens: Vec<String>) -> String {
let mut tokens_iter = tokens.iter();
let upps = parse_upper(&mut tokens_iter);
let lowers = parse_lower(&mut tokens_iter);
upps + &lowers
}
fn parse_upper(tokens_iter: &mut Iterator<Item=&String>) -> String {
let mut result = String::new();
let token_1 = tokens_iter.next().unwrap().to_uppercase();
let token_2 = tokens_iter.next().unwrap().to_uppercase();
result.push_str(&token_1);
result.push_str(&token_2);
result
}
fn parse_lower(tokens_iter: &mut Iterator<Item=&String>) -> String {
let mut result = String::new();
let token_1 = tokens_iter.next().unwrap().to_lowercase();
let token_2 = tokens_iter.next().unwrap().to_lowercase();
result.push_str(&token_1);
result.push_str(&token_2);
result
}
fn main(){
让tokens=vec![“第一”。to_string(),“第二”。to_string(),“第三”。to_string(),“第四”。to_string();
让parsed=parse_输入(令牌);
println!(“{}”,已解析);
}
fn parse_输入(令牌:Vec)->字符串{
让mut tokens_iter=tokens.iter();
设upps=parse_upper(&mut tokens_iter);
let lowers=parse_lower(&mut tokens_iter);
upps+&降低
}
fn parse_upper(标记:和mut迭代器)->String{
让mut result=String::new();
让token_1=tokens_iter.next().unwrap().to_大写();
让token_2=tokens_iter.next().unwrap().to_大写();
结果:推送符号(和标记符号1);
结果:推送符号(和标记符号2);
结果
}
fn parse_lower(标记:和mut迭代器)->String{
让mut result=String::new();
让token_1=tokens_iter.next().unwrap().to_lowercase();
让token_2=tokens_iter.next().unwrap().to_lowercase();
结果:推送符号(和标记符号1);
结果:推送符号(和标记符号2);
结果
}
示例的工作原理:
假设我有一些输入,已经标记化了。这里它由标记
向量(Vec
)表示。
在外部parse_input
函数中,Vec
被转换成一个迭代器,然后被传递到不同的特定解析器函数中。这里:parse\u upper
和parse\u lower
。在现实生活中,这些可能是“parse_if_statement”或“parse_while_loop”,但是迭代器的哪个部分得到处理与问题无关。
与此相关的是,对next的每次调用都会将光标向前移动到迭代器上。这样每个函数都会消耗它所需要的片段。
此示例编译并给出输出:FIRSTSECONDthirdfourth
我希望在将其传递给函数之前,能够将peek()
插入到迭代器中。
这是确定实际应调用哪个函数所必需的。但是,我尝试使用peek
而不是Iterator
的所有方法都会导致整个生命周期和借用混乱
关于在这种情况下如何传递可查看的而不是迭代器的建议?
首先,使用peakable
作为函数参数可能是个坏主意。或者可能我的迭代器方法已经错了。欢迎所有建议/提示 如果你要做一个全功能的词法分析器/语法分析器,只需要使用一个像这样的库。你为什么认为这是一个混乱,您只是告诉迭代器中的项位于调用函数的位置。@ÖmerErden非常感谢您!这正是我要找的,但不太合适。我对泛型和生命周期缺乏了解。@niilz啊,好吧!通常,在对代码进行词法分析之后,您没有拥有的字符串,而是片段。然后,你可以随意“窥视”它们。如果你要做一个全功能的词法分析器/解析器,只需使用像这样的库。你为什么认为这是一个混乱,您只是告诉迭代器中的项位于调用函数的位置。@ÖmerErden非常感谢您!这正是我要找的,但不太合适。我对泛型和生命周期缺乏了解。@niilz啊,好吧!通常,在对代码进行词法分析之后,您没有拥有的字符串,而是片段。然后,你可以“偷看”他们,你想看多少就看多少。