Учитывая правило, такое как:
stmt: ID '=' DIGIT
{ $$ = $3; }
;
Сгенерированный фрагмент кода:
{ (yyval) = (yyvsp[(3) - (3)]); }
Массив yyvsp
, следовательно, является частью ответа. Далее, сгенерированный (обычный - не GLR) код, вы обнаружите, что yyvsp
на самом деле является указателем, а не массивом. Например:
yyvsp = yyvs + yysize - 1;
Похоже, yysize
- это значение, которое вы хотите; к сожалению, однако, это локальная переменная для блока, которая завершилась до выполнения действий пользователя, поэтому она не доступна напрямую. Тем не менее, вы также можете найти код с:
yyvsp = yyvs;
Глядя на код, кажется, что yyvs
- это указатель на основание стека (которое может быть динамически выделено), а yyvsp
- это указатель, частично поднимающийся в стек. Эти переменные видны во всей функции yyparse()
(и, в частности, они видны в действиях пользователя. И вам нужен ответ:
int nrules = yyvsp - yyvs;
Дистанционно тыкать в исходный код не так просто, но он дает вам ответ.
Если вы используете грамматику GLR, вам придется проверить, имеет ли грамматика Bison GLR одинаковые переменные с одинаковыми значениями; это не может.