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

时间:2018-12-12 05:50:18

标签: macros rust rust-macros

我可以在Rust宏中重复比赛吗?我希望能够执行以下操作:

#include <stdio.h>

int main(void)
{
    FILE *fp = fopen("mybuffer.txt", "r");  // should check for open failure

    char buffer[100] = { '\0' };  // zero to avoid UB when printing all chars
    fgets(buffer, sizeof buffer, fp);
//  could just as well use:
//  strInput(fp, buffer, sizeof(buffer));

    for (size_t i = 0; i < sizeof buffer; i++) {
        if (buffer[i] == '\0') {
            putchar('*');        // some character not expected in input
        }
        else {
            putchar(buffer[i]);
        }
    }
    putchar('\n');

    return 0;
}

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

我知道我可以有多个my_dsl! { foo <other tokens>; bar <other tokens>; foo <other tokens>; ... } foo!()宏-每个语句都可以,但是理想情况下,我希望避免这种情况。

我在想是否可以捕获类似bar!()的东西,但不包括分号,然后再委托给其他宏?

1 个答案:

答案 0 :(得分:3)

您应该阅读The Little Book of Rust Macros,尤其是问题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)*);
        }
    };
}