使用nom

时间:2017-01-15 06:16:44

标签: parsing rust

我试图使用nom解析一个字符串,该字符串将被换行符终止,或者一旦消耗就会达到输入结束。我有以下代码似乎应该编译:

named!(am_implied <AddressingMode>,
    do_parse!(
        opt!(space) >>
        alt!(
            line_ending |
            eof!()
        ) >>
        (AddressingMode::Implied)
    )
);

此操作失败,并显示以下消息:

error[E0282]: unable to infer enough type information about `E`
   --> src/lib.rs:181:1
    |
181 | named!(am_implied <AddressingMode>,
    | ^ cannot infer type for `E`
    |
    = note: type annotations or generic parameter binding required

我认为上面的代码应该编译,因为下面的代码编译:

named!(am_implied <AddressingMode>,
    do_parse!(
        opt!(space) >>
        line_ending >>
        eof!() >>
        (AddressingMode::Implied)
    )
);

line_endingeof!解析器未在alt!解析器中使用时,我很困惑为什么会这样做,但是当它们失败时会失败。我想知道在line_endingeof!上匹配的正确解决方案。

1 个答案:

答案 0 :(得分:2)

这看起来像this issue in nomWIP PR。基本上,某些nom宏没有提供足够的类型提示,因此推理失败。

建议的解决方法是将一些子解析器拆分为单独的解析器以帮助进行类型推断,但在我遇到这种情况时,这对我来说不起作用。