我正在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)
在我的计算器中那样编写表达式。
是否有可能使这种语法明确?