Как заставить yacc / bison и lex / flex приостановить сканирование файлов? - PullRequest
2 голосов
/ 08 ноября 2010

Я пытаюсь проанализировать файл, используя Bison / Yacc, но я хочу приостановить анализ на некоторое время. Причина, по которой я хочу это сделать, заключается в том, что я хочу последовательно обрабатывать огромный файл и моделировать Java-итератор, используя методы hasNext () и next ().

Тривиальным примером будет разделение файла на строку с использованием yacc, чтобы я мог вызвать:

while(myYaccObj.hasNext())
{
    std::string line = myYaccObj.next()
}

Не могу найти, как «приостановить» сканирование файла. Есть ли способ сделать это?

Ответы [ 2 ]

2 голосов
/ 10 ноября 2010

Самый простой способ - просто сделать паузу прямо в коде действия. Например, вы можете иметь правило:

rule:  whatever  { Pause(); }
;

Это вызвало бы вашу Pause функцию, которая может приостанавливать и / или делать что угодно Если вы хотите продолжить анализ, просто верните функцию Pause.

0 голосов
/ 10 ноября 2010

На самом деле пауза для меня означает «сохранить состояние и завершить вызов yyparse». Например, в моей грамматике я бы сделал:

rule:
    SaveLine;
    Pause;

И тогда управление возвращается к моему коду. Я делаю то, что должен, а затем звоню:

yyparse_resume();

и анализ продолжается до следующей паузы или EOF.

...