【发布时间】:2021-01-01 05:56:30
【问题描述】:
在我正在处理的汇编程序中,标识符可以是两种类型 - 标签或符号。在定义 tokenize_line() 辅助函数时,可以自动将 TokenInfo 枚举的 Identifier 变体的标识符类型参数设置为 Some(IdentifierType::Label) 或 Some(IdentifierType::Symbol)。但是,当使用标识符时,标识符类型并不像定义标识符时那样立即明显。
因此,这需要在主 lex() 函数中完成。但是,为了做到这一点,我需要获取所有标识符标记的可变借用,因为除非标识符类型已经是 Some(whatever),否则我将不得不修改它们。其中一部分是通过我的标记向量向量(标记列表列表)进行线性搜索并获取所有标识符标记的位置,第二部分实际上是对所有这些标识符标记进行可变借用并将它们放入向量中/列表。
但是,通过 for 循环执行此操作会产生一个问题:rust 编译器认为我在重复借用向量/列表,而不是单个标记。我不知道这是否可以解决,或者我是否只需要使用位置列表和令牌列表的实际列表。这是我的代码:
let mut i = 0; // i = Line counter
let mut j = 0; // j = Token counter
let mut positions: Vec<(usize, usize)> = vec!();
for line in &tokens {
for token in line {
match &token.info {
TokenInfo::Identifier(t) => {
positions.push((i, j));
}
_ => {}
}
j = j + 1;
}
i = i + 1;
}
let mut ident_tokens: Vec<&mut Token> = vec!();
for position in positions {
ident_tokens.push(&mut tokens[position.0][position.1]);
}
【问题讨论】:
标签: rust