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)
電卓のように式を記述できるようにしたいので、このルールが必要です。
この文法を明確にすることは可能ですか?