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