Я пишу простой калькулятор на yacc/bison.
Грамматика для выражения выглядит примерно так:
expr
: NUM
| expr '+' expr { $$ = $1 + $3; }
| expr '-' expr { $$ = $1 - $3; }
| expr '*' expr { $$ = $1 * $3; }
| expr '/' expr { $$ = $1 / $3; }
| '+' expr %prec '*' { $$ = $1; }
| '-' expr %prec '*' { $$ = $1; }
| '(' expr ')' { $$ = $2; }
| expr expr { $$ = $1 '*' $2; }
;
Я объявил приоритет таких операторов.
%left '+' '-'
%left '*' '/'
%nonassoc '('
Проблема с последним правилом:
expr expr { $$ = $1 $2; }
Мне нужно это правило, потому что я хочу иметь возможность писать выражения типа 5(3+4)(3-24)
в своем калькуляторе.
Можно ли сделать эту грамматику однозначной?