gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 13:25:54 24 4
gpt4 key购买 nike

我认为过程宏只需要具有词法上有效的输入,但似乎所有输入也必须解析为 Rust 代码,除非我做错了什么。
RFC 说:

By operating on tokens, code passed to procedural macros does not need to satisfy the Rust parser, only the 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 expression
cargo-expand表明宏正确删除了该函数。难道它不应该停止任何解析错误吗?
我究竟做错了什么?

最佳答案

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

The second argument is the tokens for the AST node the attribute is placed on. Note that in order to compute the tokens to pass here, the compiler must be able to parse the code the attribute is applied to.


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

关于rust - 如何在程序宏中接受语法上无效的输入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68550037/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com