将新函数名称放入内部宏

时间:2019-05-04 13:59:11

标签: rust macros

试图在Rust中编写一个非常基本的宏。我正在尝试将多行声明(使用nom)转换为单行,因为它被复制了很多。以下是我要定义的宏:

macro_rules! tag_parser {
    ($name:ident, $tag:expr, $ret:expr) => {
        nom::named!(
            $name<&str, AnsiSequence>,
            nom::do_parse!(
                nom::tag!($tag) >>
                ($ret)
            )
        );
    }
}

这是一个示例调用:

tag_parser!(cursor_restore, "u", AnsiSequence::CursorRestore);

我得到的错误如下:

error: no rules expected the token `cursor_restore`
  --> src/parsers.rs:95:13
   |
95 | tag_parser!(cursor_restore, "u", AnsiSequence::CursorRestore);
   |             ^^^^^^^^^^^^^^^^ no rules expected this token in macro call

确实,问题集中在第一个参数上。由于某种原因,它不会让我像在宏中一样放置它。我不确定这是否是由于我调用了另一个宏(命名为!)或其他原因引起的。任何帮助将不胜感激,谢谢!

1 个答案:

答案 0 :(得分:1)

我不知道为什么宏扩展会失败。但是,它确实挂在了扩展中调用nom-macro的完整路径上。如果您添加use nom::*;以便事先将do_parsenamed纳入范围,并从中剥离两个nom::片段(nom::named!...-> named!...)宏体,它起作用。