rust - 将新函数名称放入内部宏

标签 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

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

最佳答案

我不知道为什么宏展开会以这种方式失败。但是,它确实卡在扩展中调用的 nom-macro 的完整路径上。如果您添加 use nom::*; 预先将 do_parsenamed 放入作用域,并去除这两个 nom::-fragments (nom::named!... -> named!...) 来自宏体,它有效。

关于rust - 将新函数名称放入内部宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55983268/

相关文章:

c++ - 在 C++ 中使自己的宏先于库宏

c - 为什么我不能将类似对象的宏粘贴到函数中?

rust - 当 Iterator::map 返回 Result::Err 时,如何停止迭代并返回错误?

rust - 如何返回带有 `&self` 的 future 组合器

c - 在 C11 匿名结构定义中使用宏

c : multidimensional array using 1d array under the covers

c - 将变量类型与 token 合并

rust - 为什么在特征中返回 `Self` 有效,但返回 `Option<Self>` 需要 `Sized` ?

rust - 如何通过具有语法扩展的特征标识符获取原始 AST?

json - 如何将元组向量转换为 JSON 对象?