Есть ли способ заставить бизонов и / или flex перезапустить сканирование после того, как я заменил какой-нибудь токен чем-то другим?
Мой конкретный пример будет с заменой конкретного слова / строки. Если я хочу, чтобы слово hello
было заменено на echo hello
, как я могу заставить flex или bison заменить hello
, а затем снова начать синтаксический анализ (подобрать 2 слова вместо одного). Так было бы как:
- Получить токен WORD (тип строки)
- Если
hello
, заменить значение токена на echo hello
- Перезапустить анализ всего ввода (который теперь
echo hello
)
- Получить токен WORD (
echo
)
- Получить токен WORD (
hello
)
Я видел очень заманчивые функции, такие как yyrestart()
, но я не совсем понимаю, что на самом деле выполняет эта функция. Спасибо за любую помощь, спасибо!
Обновление 4/23/2010
Одним из видов решения для взлома и слеша, которое я в итоге использовал, является то, что для каждого проходящего word
я проверяю массив "псевдонимов". Если word
имеет псевдоним, я заменяю значение слова (используя, например, strcopy($1,aliasval)
) и отмечаю флаг aliasfound
.
После того, как вся строка ввода анализируется один раз, если флаг aliasfound
установлен в true, я использую yy_scan_string()
, чтобы переключить состояние буфера на вход с расширенными псевдонимами, и вызываю YYACCEPT
.
Итак, он выпрыгивает в основную функцию, и я снова вызываю yyparse()
с буфером, все еще указывающим на мою строку. Это продолжается, пока псевдонимы не найдены. Когда все мои грамматические действия завершены, я звоню yyrestart(stdin)
, чтобы вернуться в «нормальный» режим.
Если кто-нибудь знает, как я могу эффективно расширить свои слова с их значениями псевдонимов, вставить в stdin
(или каким-либо другим способом) и, в основном, развернуть все псевдонимы (даже вложенные), как это происходит, это было бы здорово. Я играл с yypush_buffer_state()
и yypop_buffer_state()
, наряду с yy_switch_to_buffer()
, но я не мог получить "встроенную" замену с продолжением синтаксического анализа ...