在Rust中,是否可以接受属性宏中的任意语法?(与其他宏一样)
在Rust中,声明性宏和过程性宏(在Rust中,是否可以接受属性宏中的任意语法?(与其他宏一样),rust,macros,attributes,Rust,Macros,Attributes,在Rust中,声明性宏和过程性宏(macro\u rules!)都可以接受任意语法,只要它进行解析,这些语法就不一定是有效的Rust。例如,这用于创建一个宏,该宏从类似SQL的语法解析SQL查询 但是,在使用属性宏时,情况似乎并非如此。例如: #[my_attribute_macro] fn example() { impl A { impl B { // This is invalid Rust code (nested `impl`s) whi
macro\u rules!
)都可以接受任意语法,只要它进行解析,这些语法就不一定是有效的Rust。例如,这用于创建一个宏,该宏从类似SQL的语法解析SQL查询
但是,在使用属性宏时,情况似乎并非如此。例如:
#[my_attribute_macro]
fn example() {
impl A {
impl B {
// This is invalid Rust code (nested `impl`s) which is parsable
}
}
}
产生编译器错误,因为
impl
s不能嵌套在有效的Rust中。是否有任何方法可以绕过此限制,以获得与其他宏更相似的属性宏?这可能是不可能的。属性语法需要解析它下面的函数(或结构或任何东西),以便它知道它所影响的项何时结束。也就是说,同样的限制也适用于类似函数的宏,它们还需要确定调用何时结束,所以我不确定区别在哪里。类似函数的宏只需要解析括号中的所有内容,这更简单(类似于{$($tree:tt)*}
)。属性可能只是重用函数解析代码,该代码解析主体中的语句。理论上,编译器可以制作一个替代函数解析器,在解析函数的同时对主体执行与上述类似的操作,但这可能还没有完成。