Как заставить yacc/bison и lex/flex приостановить сканирование файлов?

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

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

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

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


person TLol    schedule 08.11.2010    source источник
comment
Из-за решения, принятого чрезмерно активными мета-пользователями тег [flex] означает продукт Adobe, а для генератора лексеров вам нужно использовать неправильно названный [gnu-flex].   -  person dmckee --- ex-moderator kitten    schedule 08.11.2010
comment
Что значит ПРИОСТАНОВИТЬ сканирование! Flex генерирует функцию (или метод: yylex() ), когда вы вызываете эту функцию, она считывает токен ONE (лексему), а затем возвращает значение.   -  person Martin York    schedule 08.11.2010
comment
Я подозреваю, что проблема в том, что Tlol не использует Flex напрямую, @Martin. Вместо этого он использует Bison, а Bison неявно вызывает yylex всякий раз, когда это необходимо. Обычное использование Bison заключается в вызове yyparse один раз для создания одного большого AST. Я думаю, Tlol хочет знать, как анализировать файл постепенно, а не за один вызов yyparse.   -  person Rob Kennedy    schedule 08.11.2010
comment
В основном код, который вы хотите написать, уже реализован внутри bison. Таким образом, вопрос действительно становится тем, что вы действительно пытаетесь сделать? Зачем вам нужна «ПАУЗА» (что бы это ни значило) после каждой строки? Поможет ли обратный звонок в конце каждой строки?   -  person Martin York    schedule 08.11.2010


Ответы (2)


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

rule:  whatever  { Pause(); }
;

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

person Chris Dodd    schedule 10.11.2010

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

rule:
    SaveLine;
    Pause;

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

yyparse_resume();

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

person TLol    schedule 10.11.2010