Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

% 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 マクロと併用されることがよくあります。

この特定のマクロ群は、マクロがキャプチャできるものではなく、マクロが何に展開することを許可されているかによって決まることに注意してください。つまり、マクロは型の位置に出現できないため1as_ty! マクロを持つことはできません。


  1. Issue #27245 を参照してください。