Macros 可以定义一个处理语法格的宏吗?

Macros 可以定义一个处理语法格的宏吗?,macros,rust,Macros,Rust,我想定义一个宏callme,它可以这样应用 fn main() { let a=4; let b=5; callme!( a (b) => { a+b } ; a (b) => { a*b } ; a (b) ~ C ); } 我不知道如何获得callme的工作宏定义。目前我正在尝试这样的方法: macro_rules! callme { ( $($A: ident ($B: i

我想定义一个宏
callme
,它可以这样应用

fn main() {
    let a=4;
    let b=5;
    callme!(
        a (b) => { a+b } ;
        a (b) => { a*b } ;
        a (b) ~ C
    );
}
我不知道如何获得
callme
的工作宏定义。目前我正在尝试这样的方法:

macro_rules! callme {
    (
        $($A: ident ($B: ident) => {$E: expr}) ; *
    ) => (
        $(
            println!("{:?} {:?} {:?}", $A, $B, $E);
        ) *
    );
    (
        $($A: ident ($B: ident) ~ $Q: ident) ; *
    ) => (
        $(
            println!("We got {:?} . {:?} . {:?}", $A, $B, $Q);
        ) *
    );
}

这不起作用,因为我不能同时使用这两种语法

当您使用令牌流时,在这种情况下,将其留给递归来处理片段会更容易。例如,您可以执行以下操作:

macro_rules! callme {
    ($A:ident ($B:ident) => { $E:expr }; $($rest:tt)*) => {
        println!("{:?} {:?} {:?}", $A, $B, $E);

        callme!($($rest)*);
    };
    ($A:ident ($B:ident) ~ $Q:ident; $($rest:tt)*) => {
        println!("We got {:?} . {:?} . {:?}", $A, $B, $Q);

        callme!($($rest)*);
    };
    () => {};
}

fn main() {
    let a=4;
    let b=5;
    let c = "C";
    callme!(
        a (b) => { a+b } ;
        a (b) => { a*b } ;
        a (b) ~ c;
    );
}
()


请注意,在每组令牌之后,您将收集所有剩余的令牌,并将它们留给以后调用
callme,最后一个
()=>{}
表示完成条件。

谢谢您的回答。这管用!您的回答帮助我理解了rust宏的令牌流。遗憾的是,我还不能+1你的答案。