Как продолжить итерацию следующего символа в a для каждого l oop в ржавчине - PullRequest
0 голосов
/ 22 апреля 2020

Я пишу простой токенизатор, который будет принимать входные данные от его новой функции (которая, вероятно, будет удалена в пользу REPL) и выплевывать токены, связанные с синтаксисом css.

Здесь Вот пример:

#[derive(Debug)]
pub enum Token {
    Selector,
    LBrace,
    RBrace,
    Property,
    Value,
}

#[derive(Debug)]
pub struct Tokenizer {
    source: String,
    tokens: Vec<(Token, String)>,
}

impl Tokenizer {
    pub fn new(source: &str) -> Self {
        let source = source.to_string();

        for (i, c) in source.chars().enumerate() {
            if c == '.' {
                // This is where I am stuck.
            }
        }

        Self {
            source,
            tokens: vec![],
        }
    }
}

fn main() {
    let tokens = Tokenizer::new(".example{}");
    println!("{:#?}", tokens);
}

Теперь моя проблема в том, что я хочу перебирать следующие символы, пока не встретлю один из # 'space', ., но я понятия не имею, как ржавчина позволяет мне продолжать итерации, пока не будет выполнено условие. Есть ли способ вызвать следующий символ в последовательности?

Также, если вы обнаружите, что что-то не так с этим кодом с точки зрения направления, которое я выбираю, пожалуйста, дайте мне знать. Спасибо.

Вот ссылка на ржавую площадку .

1 Ответ

0 голосов
/ 22 апреля 2020

Поскольку это очень широкий вопрос, я бы сослался на серво css -парсер .

Некоторые функции, которые могут пригодиться:

  • skip_while может пропускать элементы в начале, удовлетворяющие определенному предикату
  • peekable создает итератор, способный смотреть в будущее

Вместо того, чтобы работать с итераторами, вы также можете работать со срезами (&str). Это может быть проще, потому что (обычный старый) итератор в основном дает вам доступ к одному элементу за один раз , тогда как срез позволяет вам go назад и вперед, когда вы будете sh (в разумных пределах, конечно).

...