繁体   English   中英

如何在程序宏中接受语法上无效的输入?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM