gpt4 book ai didi

rust - 将状态添加到 nom 解析器

转载 作者:行者123 更新时间:2023-11-29 08:18:37 25 4
gpt4 key购买 nike

我在 nom 中编写了一个完全无状态的解析器,现在我需要将它包装在几个有状态的层中。

我有一个名为 alt_fn 的顶级解析函数这将为我提供下一个解析输出作为枚举变体,其细节可能并不重要。

我需要做三件涉及状态的事情:

1) 我需要有条件地对 alt_fn 的输出执行转换如果在属于我的 State 的非可变 HashMap 中存在匹配项结构。这基本上应该像一个 map!但作为对我的结构的方法调用。像这样:

named!(alt_fn<AllTags> ,alt!(// snipped for brevity));

fn applyMath(self, i:AllTags)->AllTags { // snipped for brevity }

method!(apply_math<State, &[u8], AllTags>, mut self, call_m!(self.applyMath, call!(alt_fn)));

这目前给我:error: unexpected end of macro invocationalt_fn下划线。

2) 我需要用我从输入中获得的数据更新状态结构的其他字段(例如计算校验和和更新时间戳等),然后用这个新知识再次转换输出。这可能如下所示:

fn updateState(mut self, i:AllTags) -> AllTags { // snipped for brevity }

method!(update_state<State, &[u8], AllTags>, mut self, call_m!(self.updateState, call_m!(self.applyMath)));

3) 我需要重复调​​用第二部分中的方法,直到用完所有输入:

method!(pub parse<State,&[u8],Vec<AllTags>>, mut self, many1!(update_state));

不幸的是 nom文档非常有限,而且我不擅长宏语法,所以我不知道自己做错了什么。

最佳答案

当我需要用 nom 做一些复杂的事情时,我通常会编写自己的函数。

例如

named!(my_func<T>, <my_macros>);

相当于

fn my_func(i: &[u8]) -> nom::IResult<T, &[u8]> {
<my_macros>
}

前提是您必须将 i 传递给宏(请参阅我的评论)。

创建您自己的函数意味着您可以在其中拥有任何您想要的控制流,只要它接受 &[u8] 并返回 nom::IResult ,它将与 nom 配合得很好,其中输出 &[u8] 是剩余的未解析的原始输入。

如果您需要更多信息评论,我会尝试改进我的答案!

关于rust - 将状态添加到 nom 解析器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46997481/

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