Переключить входной поток в lex и yacc - PullRequest
1 голос
/ 30 января 2012

Я настаиваю на использовании lex, а не flex.

я разрабатываю API в lex, подобный тому, который существует в flex util (yy_switch_buffer, yy_create_buffer ...), предлагая возможность переключения между несколькими буферами.

Это основная трудность для меня до сих пор:

  • например, когда я сталкиваюсь с токеном #include, я должен переключить буфер на включенный файл.Итак, сначала я должен прервать текущее действие синтаксического анализа (я попытался fclose(yyin) FAILED), парсер завершил весь текущий yyin.НЕ хорошо, потому что я должен анализировать включенный файл для хранения структур (например), используемых в основном файле.

Вопрос: Как я могу немедленно прервать анализатор?Достаточно ли мне для определения нового буфера, используя yyin = fopen(somefile, "r"); ??

Ответы [ 4 ]

1 голос
/ 10 ноября 2017

Решение «включенных входных файлов» является частью документации Flex, в которой приведен пример переключения между вводами Flex ftp: //ftp.gnu.org/old-gnu/Manuals/flex-2.5 .4 / html_mono / flex.html # SEC12 («Несколько буферов ввода»)

1 голос
/ 31 января 2012

Нет никакого портативного способа сделать это с помощью POSIX lex - разные реализации имеют разные внутренние механизмы того, как они обрабатывают и буферизуют ввод, и во время lexing, возможно, читали перед текущим токеном обработки и буферизовали кучу ввода , Поэтому вам нужно получить его, чтобы сохранить то, что он в данный момент буферизовал, и переключиться на другой вход, а затем восстановить буферизованный материал (так, чтобы он читался далее) после того, как вы закончите с #include или чем-то еще. Это как раз то, для чего нужны вызовы Flex для управления буфером, но если вы настаиваете на использовании lex, вам нужно (эффективно) портировать эти подпрограммы, чтобы понять внутреннюю часть тех версий lex, которые вам нужно поддерживать.

1 голос
/ 30 января 2012

Будет трудно с этим справиться, если это вообще выполнимо.AFAIK, Lex позволяет вам только переключать входные потоки на EOF (реальные или смоделированные), когда он вызывает yywrap().

Возможно, вы можете подделать вещи так, что, когда вы найдете директиву include, вы подделаете EOFв текущем потоке, а затем yywrap() исправьте все так, чтобы новый ввод поступал из включенного файла, а затем, когда вы достигнете EOF для включенного файла, вы получите yywrap() восстановление ввода из исходного потока ввода в исходное положение,Понятно, что это работает для вложенных включений (если вообще работает), если только вы не ограничите произвольно количество уровней включения.

0 голосов
/ 30 января 2012

Вы можете найти гибкий инструмент, перенесенный в систему Windows здесь http://sourceforge.net/projects/winflexbison/

...