Использование $ n для n <0 в Bison - PullRequest
1 голос
/ 15 января 2010

Есть ли способ в Bison проверить текущий размер стека токенов?

Я хотел бы использовать $ n с n как отрицательное число для доступа к семантическому значению другого правила, но только если стек достаточно велик.

Спасибо.

1 Ответ

0 голосов
/ 15 января 2010

Учитывая правило, такое как:

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 одинаковые переменные с одинаковыми значениями; это не может.

...