尝试用 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
实际上,问题集中在第一个参数上。出于某种原因,它不会让我按照我在宏中的方式放置它。我不确定这是否是由于我调用了另一个宏(已命名!)或其他原因。任何帮助将不胜感激,谢谢!
最佳答案
我不知道为什么宏展开会以这种方式失败。但是,它确实卡在扩展中调用的 nom-macro 的完整路径上。如果您添加 use nom::*;
预先将 do_parse
和 named
放入作用域,并去除这两个 nom::
-fragments (nom::named!...
-> named!...
) 来自宏体,它有效。
关于rust - 将新函数名称放入内部宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55983268/