4

手続き型マクロは字句的に有効な入力のみを持っている必要があると思っていましたが、何か間違っていない限り、すべての入力も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マクロが関数を正しく削除することを示します。したがって、解析エラーを停止するべきではありませんか?

私は何を間違っていますか?

4

1 に答える 1