nom如何在宏指示符位置进行宏调用?

时间:2018-06-01 16:24:59

标签: macros rust

在以下示例中,取自nom,参数$submac在指定位置中具有ident!( $($args:tt)* )。我的印象是ident!(...)是一个宏调用,但据我所知,nom没有定义名为ident的宏。 Rust关于宏的文档没有指定宏调用甚至可以出现在指定位置。

#[macro_export]
macro_rules! exact (
  ($i:expr, $submac:ident!( $($args:tt)* )) => ({
      terminated!($i, $submac!( $($args)*), eof!())
  });
  ($i:expr, $f:expr) => (
    exact!($i, call!($f));
  );
);

正式语法中的ident!(...)是什么?

1 个答案:

答案 0 :(得分:2)

  

我的印象是ident!(...)是一个宏调用

不是。这是故意看起来像宏调用的东西。添加空间可能会使其更加明显:

macro_rules! example {
    ($foo:ident !) => (1);
}

fn main() {
    example!(hello!);
}