Я использую Ragel для разбора строки в C ++. Мне нужно быть в состоянии приостановить анализ на неопределенное время, а затем возобновить анализ с того места, где я остановился.
Прямо сейчас я пытаюсь сделать это, поставив fbreak
в конце завершающего действия. Кажется, это работает нормально, возвращая управление родительской программе. Тем не менее, я не уверен, как возобновить анализ. Я думал, что просто вызывая код, сгенерированный %write exec
было бы достаточно, но это не так. Когда он возвращается к синтаксическому анализу, ссылка на исходную строку кажется неправильной / потерянной.
Не уверен, что я делаю что-то не так в C ++ здесь (это не мой родной язык) или я использую неправильный подход с Ragel.
Вот мой старт и код возобновления:
const char *p;
const char *pe;
void start()
{
int len = theString.length();
char chars[len+1];
theString.toCharArray(chars, len+1);
p = chars;
pe = chars + len;
resume();
}
void resume() {
%% write exec;
}
Первый раз звоню start()
Мое состояние машины в конце концов fbreak
с, а потом я звоню resume()
(надеюсь) продолжить анализ.
Любые указатели на то, что я могу делать не так?
Похоже, это была какая-то проблема с висящим указателем. Перемещение инициализации theString
в другом месте, кажется, исправили проблему. В общем, я все еще сосу на C.
Других решений пока нет …