Бизон: yywrap (), чтобы проанализировать тот же файл еще раз? - PullRequest
0 голосов
/ 21 июня 2019

У меня есть некоторые данные, состоящие из чисел, которые я хотел бы проанализировать с Bison после лексизации с Flex. Для этого мне нужно знать минимум и максимум всех моих чисел - если я обманываю и явно определяю их, я могу это сделать.

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

Я думал, что буду использовать yywrap(), но он не вернется к началу.

Вот мой yywrap(): он возвращает 0 один раз, а затем 1, но, похоже, не возвращается к началу между ними. Это остается в конце, и мои тесты printf (s) появляются рядом друг с другом .-

int wrap;
int yywrap()
{
if (wrap == 0) {wrap++;return 0;}
else {return 1;}
}

В настоящее время
ВХОД

--
G0
G0
G0
e0
--
--
--
--
F0
F0
F0
D0
--
--
--

ВЫВОД:

------------
67----------
67----------
67----------
--------63--
------------
------------
------------
------------
----65------
----65------
----65------
----------62
------------
------------
------------

1 Ответ

0 голосов
/ 21 июня 2019

Инструкция flex говорит об использовании yywrap (выделение добавлено):

Когда сканер получает указание конца файла от YY_INPUT, он затем проверяет функцию yywrap(). Если yywrap() возвращает false (ноль), то предполагается, что функция прошла вперед и настроила yyin для указания на другой входной файл , и сканирование продолжается. Если он возвращает true (не ноль), то сканер завершает работу, возвращая 0 своему вызывающему. Обратите внимание, что в любом случае условие запуска остается неизменным; оно не возвращается к INITIAL.

Итак, если вы хотите rewind(yyin), вам нужно сделать это самостоятельно, в функции yywrap.

...