gpt4 book ai didi

file - 从文件中读取字节并使用 `pom`解析器库进行解析

转载 作者:行者123 更新时间:2023-12-03 11:41:26 25 4
gpt4 key购买 nike

我正在尝试使用pom编写一个解析器,这很棒-编写解析器并将字符串文字作为测试数据输入没有问题。但是,当我尝试从文件中运行字节时,它会阻塞。

108 |     fn parse_files() -> Result<(), Box<dyn Error>> {
109 | let byte_vec: Vec<u8> = std::fs::read("assets/valid_so_far.idl")?;
110 | let byte_slice: &[u8] = &byte_vec;
| ^^^^^^^^^ borrowed value does not live long enough
111 | let idl_parser = idl();
112 | let parse_result = idl_parser.parse(byte_slice)?;
| ---------------------------- argument requires that `byte_vec` is borrowed for `'static`
113 |
114 | Ok(())
115 | }
| - `byte_vec` dropped here while still borrowed

我看不出这里出了什么问题。我在这里无法解释编译器错误,而且我也不明白为什么生存期不正确。

第109行的 parse函数具有以下签名:
fn parse(&self, input: &'a [I]) -> Result<O>

pub type Result<O> = ::std::result::Result<O, Error>;

最佳答案

no problems writing the parsers and feeding in string literal as test data.



之所以可行,是因为所有字符串文字都具有 the 'static lifetime。当您改为从文件读取时,潜在的 'static消失了。代码的行为实际上发生了变化,从而触发了错误。

然后的问题是,为什么解析器实现首先需要 'static输入。我怀疑这里应该归咎于 pom自述文件中给出的示例。例如,它具有以下代码:

use pom::Parser;

fn space() -> Parser<u8, ()> {
one_of(b" \t\r\n").repeat(0..).discard()
}
pom::Parser<u8, ()>实际上是 pom::parser::Parser<'static, u8, ()>的别名。如果将其写为:

use pom::parser::Parser;

fn space<'a>() -> Parser<'a, u8, ()> {
one_of(b" \t\r\n").repeat(0..).discard()
}

那么它应该能够处理 'static和非 'static输入。对解析器代码进行类似的更改,它将再次起作用。

关于file - 从文件中读取字节并使用 `pom`解析器库进行解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59389499/

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