Rust 如何为令牌的Vec实现nom::Inputer?
我正在使用构建一个解析器,我想使用nom组合符来处理标记化输入 令牌流由Rust 如何为令牌的Vec实现nom::Inputer?,rust,nom,Rust,Nom,我正在使用构建一个解析器,我想使用nom组合符来处理标记化输入 令牌流由Vec表示,其中Token为: #[派生(调试、克隆、部分Q)] 发布枚举令牌{ 标识符, 串, } 我尝试为任意值的向量实现InputIter: impl; fn国际热核实验堆指数(&self)->self::国际热核实验堆{ self.iter().enumerate() } fn iter_元素(&self)->self::IterElem{ self.iter() } } 当我遇到以下错误时: error[E02
Vec
表示,其中Token
为:
#[派生(调试、克隆、部分Q)]
发布枚举令牌{
标识符,
串,
}
我尝试为任意值的向量实现InputIter
:
impl;
fn国际热核实验堆指数(&self)->self::国际热核实验堆{
self.iter().enumerate()
}
fn iter_元素(&self)->self::IterElem{
self.iter()
}
}
当我遇到以下错误时:
error[E0207]:生存期参数“a”不受impl-trait、self-type或谓词的约束
-->src/lex/tokens.rs:37:6
|
37 | Vec的实施输入;
Iter型=枚举;
输入IterElem=Iter InputIter for Vec InputIter for token;
|^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^`
|
=注意:预期的引用`&标记`
找到枚举标记`
错误[E0271]:为令牌解析'inputter'类型不匹配;
|^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^`
|
=注意:应为元组“”(\ux、&Token)`
找到元组“”(\ux,标记)`
@Stargateur更新了一个指向操场的链接。您的问题似乎可以通过的答案来回答。如果没有,请回答您的问题以解释差异。否则,我们可以将此问题标记为已回答。感谢您为我指出了正确的方向。从Iter
切换到IntoIter
并调用vec.into\u Iter()
帮助我完成了实现。我认为现在应该问的问题是,是否有可能在不引入中间结构的情况下,将Vec
与nom组合器一起使用。请告知我是否应该将其设置为新问题或更新当前问题并删除中间步骤?
struct Tokens<S> {
vec: Vec<Token<S>>,
}
impl<'a> InputIter for Tokens<&'a str> {
type Item = Token<&'a str>;
type Iter = Enumerate<Self::IterElem>;
type IterElem = Iter<'a, Self::Item>;
fn iter_indices(&self) -> Self::Iter {
self.vec.iter().enumerate()
}
fn iter_elements(&self) -> Self::IterElem {
self.vec.iter()
}
}
use std::iter::Enumerate;
use std::slice::Iter;
#[derive(Debug, Clone, PartialEq)]
pub enum Token<S> {
Identifier(S),
String(S),
}
struct Tokens<S> {
vec: Vec<Token<S>>,
}
pub trait InputIter {
type Item;
type Iter: Iterator<Item = (usize, Self::Item)>;
type IterElem: Iterator<Item = Self::Item>;
fn iter_indices(&self) -> Self::Iter;
fn iter_elements(&self) -> Self::IterElem;
}
impl<'a> InputIter for Tokens<&'a str> {
type Item = Token<&'a str>;
type Iter = Enumerate<Self::IterElem>;
type IterElem = Iter<'a, Token<&'a str>>;
fn iter_indices(&self) -> Self::Iter {
self.vec.iter().enumerate()
}
fn iter_elements(&self) -> Self::IterElem {
self.vec.iter()
}
}
fn main() {}