Изменение буферов внутри yyparse (); - PullRequest
2 голосов
/ 25 февраля 2012

Я пытаюсь проанализировать постоянную строку, используя предопределенную грамматику, в середине анализа другой строки.

Мои main() звонки yyparse(), пользователь начинает печатать, и когда определенная грамматика соответствует, например, MACRO или что-то еще, я хотел выполнить yy_scan_string("..."); Я столкнулся с несколькими проблемами

  • Все необходимые мне константы создаются с помощью flex, и мне нужно их в файле бизонов, который зависит от вывода flex
    • я решил эту проблему, скопировав #ifndef операторов из скомпилированных гибких частей
  • после звонка yy_scan_string Я пытался позвонить yyparse(), но это привело меня в бесконечный цикл
  • если я позвоню yy_delete_buffer, то я прекращаю основной анализ и код завершается.

Что мне не хватает? Похоже на простую задачу, я просто хочу проанализировать сохраненную строку, в середине синтаксического анализа файла, а затем вернуться к обычному анализу.

Ответы [ 2 ]

1 голос
/ 25 февраля 2012

Если вы собираетесь использовать yy_scan_string() для добавления новой строки, было бы неплохо также использовать yypush_buffer_state() и yypop_buffer_state() для сохранения контекста текущего анализа государство. (Пример реализации см. Несколько входных буферов .)

0 голосов
/ 25 февраля 2012

Вы пытаетесь вызвать сгенерированный бизоном синтаксический анализатор, находясь в середине другого анализа? Имейте в виду, что синтаксический анализатор имеет состояние - если вы хотите использовать бизона в режиме повторного входа, вы должны специально запросить, чтобы бизон генерировал реентерабельный анализатор, который не используется по умолчанию. В руководстве для зубров есть документация, объясняющая, как это сделать. См. Например: http://www.gnu.org/software/bison/manual/bison.html#Pure-Decl

Кстати, я отмечу, что flex по умолчанию также не реентерабелен, и вам, возможно, придется сделать то же самое там.

...