[英]How do I accept syntactically invalid input in a procedural macro?
我认为过程宏只需要具有词法上有效的输入,但似乎所有输入也必须解析为 Rust 代码,除非我做错了什么。
RFC 说:
通过对令牌进行操作,传递给过程宏的代码不需要满足 Rust 解析器,只需要满足词法分析器。
一旦输入涉及无效的 Rust 语法,我就会收到解析错误。
考虑以下程序宏:
#[proc_macro_attribute]
pub fn my_macro(_: TokenStream, _: TokenStream) -> TokenStream {
TokenStream::from(quote! {})
}
运行时:
#[my_macro]
fn test() { * } // lexically valid but syntactically invalid
我收到错误:
error: expected expression, found `}`
--> blah.rs:38:2
|
33 | #[logic] fn omg () { * }
| ^ expected expression
cargo-expand
显示宏正确删除了函数。 难道它不应该停止任何解析错误吗?
我究竟做错了什么?
通过仔细阅读 proc-macro RFC,我注意到这是类似属性的 proc-macros 的记录行为:
第二个参数是属性所在的 AST 节点的标记。 请注意,为了计算要在此处传递的标记,编译器必须能够解析应用该属性的代码。
为了解决这个问题,似乎唯一的选择是使用一个没有这个限制的类似函数的宏,它稍微改变了语法,这太糟糕了,但对我来说不是世界末日。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.