宏如何匹配除逗号之外的任何标记树

ube*_*ben 4 macros rust rust-macros

macro_rules! foo {
    ( $( $( $tok:tt )* ,)* ) => {
        [ bar!( $( $tok )* ,)* ]
    }
}
Run Code Online (Sandbox Code Playgroud)

产生错误:local ambiguity when calling macro 'foo'. 因为逗号','的类型是:tt。我需要一种方法来匹配除逗号标记之外的所有标记树。

使用示例

foo!(
    add t0 zero zero,
    add t1 t0 a0,
    lb t1 0(t1),
)
Run Code Online (Sandbox Code Playgroud)

应产生:

[
    bar!(add t0 zero zero),
    bar!(add t1 t0 a0),
    bar!(lb t1 0(t1)),
]
Run Code Online (Sandbox Code Playgroud)

Cha*_*man 5

TT 咀嚼救援!

macro_rules! foo {
    (@accumulate [ $($accumulated:tt)* ] [ ]) => { [ $($accumulated)* ] };
    (@accumulate [ $($accumulated:tt)* ] [ $($this_line:tt)* ] , $($rest:tt)* ) => {
        foo! { @accumulate [
            $($accumulated)*
            bar!( $($this_line)* ),
        ] [] $($rest)* }
    };
    (@accumulate [ $($accumulated:tt)* ] [ $($this_line:tt)* ] $current:tt $($rest:tt)* ) => {
        foo! { @accumulate [ $($accumulated)* ] [ $($this_line)* $current ] $($rest)* }
    };
    ( $($t:tt)* ) => { foo! { @accumulate [] [] $($t)* } }
}
Run Code Online (Sandbox Code Playgroud)