Как реализовать цикл while на YACC

Есть множество примеров калькуляторов на YACC, которые работают в режиме интерпретации (вычисления сразу же). Типа

expr   :  Number
       {
           $$.number = $1.number;
       }
       | expr '+' expr
       {
           $$.number = $1.number + $3.number;
       }
       | expr '-' expr
       {
           $$.number = $1.number - $3.number;
       }
       | '-' expr %prec uminus
       {
           $$.number = -$2.number;
       }
       | '+' expr %prec uminus

Хочу сделать мощный калькулятор, с переменными, циклами и т.п.

Переменные добавил, все работает. Но как добавить цикл, например, while?

statement | WHILE '(' expr ')' statement ';'

компилирует, но как его заставить считать? Если я пишу что-то вроде

{
    while($3.number) { $5; }
}

то очевидно, что ничего не работает, потому что $3 и $5 вычисляются один раз. Подскажите, как быть? Как правильно реализовать циклические вычисления в режиме интерпретатора (вычисления при компиляции)?


Ответы (0 шт):