gpt4 book ai didi

Rust TT muncher 具有无限递归

转载 作者:行者123 更新时间:2023-11-29 08:12:09 24 4
gpt4 key购买 nike

我正在尝试使用 TT muncher 创建嵌套 HashMap 结构。基本类型定义是

type Object = HashMap<String, Node>;

enum Node {
Terminal(String),
Nested(Object),
}

我知道我可以手动创建这些对象:

let mut x: Object = HashMap::new();

x.insert("foo".into(), Node::Terminal("bar".into()));
x.insert("bing".into(), {
let mut bing = HashMap::new();
bing.insert("bar".into(), Node::Terminal("baz".into()));
Node::Nested(bing)
});

这确实生成了预期的结构

{
"bing": Nested(
{
"bar": Terminal(
"baz"
)
}
),
"foo": Terminal(
"bar"
)
}

但是我有一些这种格式的大文字,而且我更喜欢使用不太难看的语法,所以我正在尝试制作一个宏。这是我认为应该有效的最小示例:

use std::collections::HashMap;

type Object = HashMap<String, Node>;


#[derive(Debug)]
enum Node {
Terminal(String),
Nested(Object),
}


macro_rules! obj {
{
$($tt:tt)*
} => {
{
let map = ::std::collections::HashMap::new();

obj!(@parse; map; ($($tt)*));

map
}
};
(@parse; $name:ident; ()) => {};
(@parse; $name:ident; ($key:expr => $value:expr, $($tail:tt)*)) => {
$name.insert($key.into(), Node::Terminal($value.into()));
obj!(@parse; $name; ($($tail)*));
};
(@parse; $name:ident; ($key:expr => $value:block, $($tail:tt)*)) => {
$name.insert($key.into(), Node::Nested(obj!{$value}));
obj!(@parse; $name; ($($tail)*));
};
}

fn main() {
let x: Object = obj!{
"foo" => "bar",
"bing" => {
"bar" => "baz",
},
};

println!("{:#?}", x);
}

这不起作用,当我尝试编译它时出现递归错误:

error: recursion limit reached while expanding the macro `obj`
--> src/main.rs:22:13
|
22 | obj!(@parse; map; ($($tt)*));
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
...
40 | let x: Object = obj!{
| _____________________-
41 | | "foo" => "bar",
42 | | "bing" => {
43 | | "bar" => "baz",
44 | | },
45 | | };
| |_____- in this macro invocation
|
= help: consider adding a `#![recursion_limit="128"]` attribute to your crate

我尝试提高递归限制,但它不会终止。我的宏中缺少什么?

最佳答案

因为第一条规则实际上匹配任何内容。它不可能不递归。

编写宏时,您需要按照从最具体到最不具体的顺序编写规则。

关于Rust TT muncher 具有无限递归,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52324443/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com