4

我认为程序宏只需要具有词法有效的输入,但似乎所有输入也必须解析为 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表明宏正确地删除了函数。它不应该因此停止任何解析错误吗?

我究竟做错了什么?

4

1 回答 1

2

通过仔细阅读 proc-macro RFC,我注意到这是类似属性的 proc-macros 的记录行为:

第二个参数是属性所在的 AST 节点的标记。请注意,为了计算要在此处传递的标记,编译器必须能够解析应用属性的代码。

要解决这个问题,似乎唯一的选择是使用一个没有这个限制的类似函数的宏,它稍微改变了语法,这太糟糕了,但对我来说不是世界末日。

于 2021-07-27T21:31:06.047 回答