我可以通过宏中的多个规则重复匹配吗?

Can I repeat matching by several rules in a macro?

我可以在 Rust 宏中重复匹配吗?我希望能够做类似的事情:

my_dsl! {
    foo <other tokens>;
    bar <other tokens>;
    foo <other tokens>;
    ...
}

基本上,任意数量的分号分隔语句,每个语句由不同的规则处理。

我知道我可以有多个 foo!()bar!() 宏 - 每个语句都有一个,但理想情况下我想避免这种情况。

我在想是否可以捕获类似 $($t:tt)*, 但不包括分号的内容,然后委托给其他宏?

你应该阅读 The Little Book of Rust Macros and specifically for your question section 4.2: Incremental TT munchers

例如:

macro_rules! my_dsl {
    () => {};
    (foo $name:ident; $($tail:tt)*) => {
        {
            println!(concat!("foo ", stringify!($name));
            my_dsl!($($tail)*);
        }
    };
    (bar $name:ident; $($tail:tt)*) => {
        {
            println!(concat!("bar ", stringify!($name));
            my_dsl!($($tail)*);
        }
    };
}