Ragel альтернатива Fbreak; но без перехода к следующему символу?
Я пишу программу, которая анализирует HTML для извлечения URL-адресов с помощью Ragel.
После нахождения URL мне нужно выполнить некоторые действия с ним, а затем готов обработать следующий URL.
Поэтому мне нужно прекратить выполнение основного цикла в конце URL, выполнить некоторые действия вне синтаксического анализатора, а затем начать с того места, где я сломался.
fbreak
кажется хорошим вариантом, но, к сожалению, он съел следующий символ в буфере. Проблема здесь, кроме того, что может быть уже конец буфера, состоит в том, что мы эффективно пропускаем один символ во входном потоке.
Есть ли способ прервать выполнение без перехода к следующему символу во входном потоке, так как fbreak
делает?
Пока я разбираюсь только в грязном хакере, чтобы написать goto _out;
вместо фрик.
1 ответ
Я считаю, что вам нужно сделать fhold
вызов, предшествующий вашему fbreak
,
Цитирую руководство пользователя Ragel:
fhold;
- Не продвигаться над текущим персонажем. При обработке данных в нескольких буферных блокахfhold
оператор должен использоваться только один раз в наборе действий, выполняемых над персонажем. Многократные вызовы могут привести к резервному копированию в начале блока буфера.fhold
Заявление не подразумевает какую-либо передачу контроля. Это эквивалентноp--;
заявление.