Rust 为什么我会得到;意外标记“;当试图用外部宏的参数调用内部宏时?

Rust 为什么我会得到;意外标记“;当试图用外部宏的参数调用内部宏时?,rust,macros,arguments,parameter-passing,rust-decl-macros,Rust,Macros,Arguments,Parameter Passing,Rust Decl Macros,在尝试传递更高版本接收到的表达式时,我无法理解此失败宏到下方宏: // A low-level macro using only Rust primitives. macro_rules! lower { (x, $a:expr) => { println!("x is {}", $a); }; (x($b:expr), $a:expr) => { println!("x({}) is rather {}", $b, $a);

在尝试传递
更高版本接收到的表达式时,我无法理解此失败宏到
下方宏:

// A low-level macro using only Rust primitives.
macro_rules! lower {
    (x, $a:expr) => {
        println!("x is {}", $a);
    };
    (x($b:expr), $a:expr) => {
        println!("x({}) is rather {}", $b, $a);
    };
}

// A higher-level macro using my own previous macro.
macro_rules! higher {
    ($xstuff:expr, $a:expr) => {
        // Here, I expect transferring the expression $xstuff to lower!.. but it fails.
        lower!($xstuff, $a)
    };
}

fn main() {
    lower!(x, '5'); // x is 5
    lower!(x(8), '6'); // x(8) is rather 6

    higher!(x(7), '9'); 
}
错误:令牌`x(7)不需要任何规则`
-->src/main.rs:15:16
|
2 |宏观规则!降低{
|--------------调用此宏时
...
15 |更低!($xstuff,$a)
|^^^^^^^^宏调用中不需要此令牌
...
23 |更高!(x(7),‘9’);
|------------------在该宏调用中

我希望
lower!
中的规则会预期最后一个标记,但编译器告诉我这是意外的。我在这里缺少了什么?如何将
更高!
接收的表达式作为
$xstuff
传输到
更低!

调用
更高!
x(7)
已被解析为宏变量
$xstuff
持有的完整表达式:

    ($xstuff:expr, $a:expr) => { /* ... */ }
//           ^~~~
但是,
lower!
的宏规则都不接受任意表达式作为第一个参数,它们只接受标记
x

    (x, $a:expr) => { /* ... */ }
//   ^
    (x($b:expr), $a:expr) => { /* ... */ }
//   ^
最简单的修复方法是对较高宏中的
x
设置相同的限制:

macro_rules! higher {
    (x($xstuff:expr), $a:expr) => {
        lower!(x($xstuff), $a)
    };
}
另一种解决方案(更改调用语法)是不立即将
x(7)
解析为表达式,而是将其解析为令牌树的集合。您需要在调用站点添加其他分组,以便解析器知道何时停止:

macro_rules! higher {
    (($($xstuff:tt)*), $a:expr) => {
        lower!($($xstuff)*, $a)
    };
}

fn main() {
    higher!((x(7)), '9');
}
另见: