簡體   English   中英

如何在程序宏中接受語法上無效的輸入?

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM