% AST 強制変換
Rust パーサーは、tt 置換に直面したとき、あまり堅牢ではありません。パーサーが特定の文法構造を期待しているときに、代わりに 置換された tt トークンの塊を見つけると、問題が発生することがあります。それらをパースしようとするのではなく、単に諦めてしまうことがよくあります。このような場合には、AST 強制変換を用いる必要があります。
#![allow(dead_code)] macro_rules! as_expr { ($e:expr) => {$e} } macro_rules! as_item { ($i:item) => {$i} } macro_rules! as_pat { ($p:pat) => {$p} } macro_rules! as_stmt { ($s:stmt) => {$s} } as_item!{struct Dummy;} fn main() { as_stmt!(let as_pat!(_) = as_expr!(42)); }
これらの強制変換は、パーサーに最終的な tt シーケンスを特定の種類の文法構造として扱わせるために、push-down accumulation マクロと併用されることがよくあります。
この特定のマクロ群は、マクロがキャプチャできるものではなく、マクロが何に展開することを許可されているかによって決まることに注意してください。つまり、マクロは型の位置に出現できないため1、as_ty! マクロを持つことはできません。
-
Issue #27245 を参照してください。 ↩