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

Posted

技术标签:

【中文标题】在过程宏中,如何检查字符串是不是是有效的变量名而不是关键字?【英文标题】:In a procedural macro, how can I check if a string is a valid variable name and not a keyword?在过程宏中,如何检查字符串是否是有效的变量名而不是关键字? 【发布时间】:2020-03-15 03:43:21 【问题描述】:

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

proc_macro2::Ident 会在尝试使用无效变量名时惊慌失措,但它会允许使用我不想被允许的关键字。在恐慌之前使用漂亮且有用的错误消息来处理错误也会更好。

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

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

【问题讨论】:

【参考方案1】:

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

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

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

来自documentation:

使用Ident::new 构造的标识符允许作为Rust 关键字,尽管通过其Parse 实现解析一个标识符会拒绝Rust 关键字。

【讨论】:

如果字符串实际上是一个字符串(比如来自一个文件)而不是一个流,你可以使用syn::parse_str::<syn::Ident>("my_ident_str")?;来做你需要的事情

以上是关于在过程宏中,如何检查字符串是不是是有效的变量名而不是关键字?的主要内容,如果未能解决你的问题,请参考以下文章

Python3 Flask 路由变量显示为变量名而不是从邮递员传递的值

在 Django 中从外键设置会话变量:需要字段名而不是主键

为啥在C语言中,“scanf”竟然可以作为自定义函数的函数名而不报错??

CakePHP 通过组名而不是 ID 检查权限

NSStringFromSelector 返回变量名而不是变量值

如何在 Python 中检查字符串是不是是有效的 JSON?