Как сделать что-то еще в Bison после того, как Flex вернет 0? - PullRequest
0 голосов
/ 05 марта 2020

Функция Bison yyparse() останавливает чтение своего ввода (файла или потока), когда возвращается 0.

Мне было интересно, есть ли способ выполнить еще несколько команды после того, как это произойдет.

Я имею в виду, можно ли протолкнуть 0 (или какой-нибудь токен , брошенный при его возврате) в файл зубров?


Что-то как:

Flex

<<EOF>>      { return 0; }

Бизон

%token start

start   : start '0' {
           // Desired something else
        }

1 Ответ

3 голосов
/ 05 марта 2020

Предположим, program - это символ верхнего уровня в грамматике. То есть, это нетерминал, который должен соответствовать входу парсера.

Конечно, возможно, что program также будет соответствовать несколько раз, прежде чем ввод завершится. Например, грамматика может выглядеть примерно так:

%start program
%%
program: %empty
       | program declaration

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

Но очень просто создать нетерминал, действие которого будет выполнено только один раз, в конце разбора. Все, что нам нужно сделать, это вставить новую «единицу продукции» в начале грамматики:

%start start
%%
start  : program { /* Completion action */ }
program: %empty
       | program declaration

Поскольку start не появляется в правой части любого произведения в грамматике, оно может быть уменьшено только в конце анализа, когда анализатор уменьшил символ %start. Таким образом, даже несмотря на то, что производство явно не включает в себя конечный токен, мы знаем, что этот конечный токен является токеном предварительного просмотра при выполнении действия сокращения.

Производство единиц - производство, правая часть которого содержит только один Символ - часто используются для запуска действий в стратегических точках c разбора, и приведенное выше является лишь одним из примеров техники.

...