试图在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
确实,问题集中在第一个参数上。由于某种原因,它不会让我像在宏中一样放置它。我不确定这是否是由于我调用了另一个宏(命名为!)或其他原因引起的。任何帮助将不胜感激,谢谢!
答案 0 :(得分:1)
我不知道为什么宏扩展会失败。但是,它确实挂在了扩展中调用nom-macro的完整路径上。如果您添加use nom::*;
以便事先将do_parse
和named
纳入范围,并从中剥离两个nom::
片段(nom::named!...
-> named!...
)宏体,它起作用。