在过程宏中,如何检查字符串是否是有效的变量名而不是关键字?

In a procedural macro, how can I check if a string is a valid variable name and not a keyword?

在程序宏中,我希望能够检查字符串是否是有效的变量名而不是关键字。

proc_macro2::Ident 如果有人试图使用无效的变量名,将会出现恐慌,但它会允许我不想被允许的关键字。在恐慌之前用一个好的和有用的错误消息来处理错误也会更好。

是否有一些宏或函数(在板条箱中或其他地方)会检查字符串是否遵守 rules about variable names?我可能可以用正则表达式来做到这一点,但龙生活在正则表达式中。

此用例是处理用户输入字符串,其中可能包含垃圾字符串。

您可以使用 syn crate 中的 Ident::parse。如果输入是关键字,它将失败:

use syn::{Ident, parse::Parse as _};

let ident = parse_stream.call(Ident::parse)?;

来自documentation

An identifier constructed with Ident::new is permitted to be a Rust keyword, though parsing one through its Parse implementation rejects Rust keywords.