我正在Rust中研究词法分析器。
所需的API:
enum Token<'input> {
Name(&'input str)
}
let mut lexicon = LexiconBuilder::<Token>::new()
.token("[a-zA-Z]+", |s| Token::Name(s))
// among others
.build();
let mut lexer = Lexer::new(lexicon, "input");
这个想法是用户可以提供一个正则表达式,以及一个当正则表达式匹配输入文本时运行的闭包。但是,我很难向生命周期检查器证明传递到token()
的闭包中的切片的寿命足够长。从我的POV来看,这似乎很安全,因为在您提供字符串之前不会返回令牌。
我花了很长时间尝试通过所有类型对输入生存期进行线程化,但是我似乎无法证明词典(即规则的处理程序ergo)的生存期将匹配/支配输入的生存期。
答案 0 :(得分:5)
type Handler<T> = fn(&str) -> T;
不是完整的类型。 &str
需要有一个生存期,但是未指定生存期。终身淘汰意味着这会扩展到
type Handler<T> = for<'a> fn(&'a str) -> T;
因此,Handler
个不知道被赋予它们的&str
个生命周期。对于某些'input
,要构造一个Rule<Token<'input>>
,您需要一个Handler<Token<'input>>
,但这意味着您需要for<'a> fn(&'a str) -> Token<'input>
,其中Token
需要一个{{1} },但您只有&'input str
。您需要将&'a str
设置为'input
的参数,以便它可以限制将接受的参数:
Handler
这必须通过您所有其他类型传播。 Playground link。
您问题中的代码不完整,操场上的代码不匹配。如果您已经尝试过,那么您将不得不更清楚地告诉我们出了什么问题。