首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >向nom解析器添加状态

向nom解析器添加状态
EN

Stack Overflow用户
提问于 2017-10-29 14:34:02
回答 1查看 810关注 0票数 1

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

我有一个名为alt_fn的顶级解析函数,它将把解析后的输出作为枚举变量提供给我,其中的细节可能并不重要。

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

1)如果在作为我的alt_fn结构一部分的不可变HashMap中存在匹配,我需要有条件地对State的输出执行转换。这基本上应该类似于map!,但作为对我的结构的方法调用。如下所示:

代码语言:javascript
复制
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)));

这当前给我:带下划线的alt_fnerror: unexpected end of macro invocation

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

代码语言:javascript
复制
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文档非常有限,而且我不擅长宏语法,所以我不知道我做错了什么。

EN

回答 1

Stack Overflow用户

发布于 2017-12-23 03:56:24

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

例如

代码语言:javascript
复制
named!(my_func<T>, <my_macros>);

等同于

代码语言:javascript
复制
fn my_func(i: &[u8]) -> nom::IResult<T, &[u8]> {
    <my_macros>
}

但条件是您必须将i传递给宏(请参阅我的注释)。

创建自己的函数意味着您可以在其中包含任何您想要的控制流,并且它将很好地处理nom,只要它接受&u8并返回nom::IResult,其中输出&u8是剩余的未解析的原始输入。

如果你需要更多的信息,请留言,我会试着改进我的答案!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46997481

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档