我认为过程宏只需要有词汇上有效的输入,但似乎所有的输入都必须解析为Rust代码,除非我做错了什么。
RFC说:
通过对令牌进行操作,传递给过程宏的代码不需要满足Rust解析器,只需要满足lexer。
一旦输入涉及无效的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 expressioncargo-expand显示宏正确地删除了函数。因此,它不应该停止任何解析错误吗?
我做错了什么?
发布于 2021-07-27 21:31:06
通过仔细阅读proc宏RFC,我注意到这是类似属性的proc宏的一种有文档记录的行为:
第二个参数是放置属性的AST节点的令牌。注意,为了计算要在这里传递的标记,编译器必须能够解析应用属性的代码。
要解决这个问题,似乎唯一的选择是使用一个类似函数的宏,它没有这个限制,它稍微改变了语法,这对我来说太糟糕了,但不是世界末日。
https://stackoverflow.com/questions/68550037
复制相似问题