У меня есть простая игрушечная программа, которую я использую для игры с бинарными выражениями.Я хочу, чтобы обычные правила приоритета применялись в первую очередь для вычисления выражений в круглых скобках, для mult / div и т. Д. У меня настроен следующий код, и он, кажется, работает, но я немного запутался, почему это так.
%left '+' '-'
%left '*' '/'
%%
start: e { printf("%d", $1);}
e: e '+' e { $$ = $1 + $3; }
| e '-' e { $$ = $1 - $3; }
| e '*' e { $$ = $1 * $3; }
| e '/' e { $$ = $1 / $3; }
| '(' e ')' { $$ = $2; }
| NUMBER { $$ = $1; }
;
Например, если я введу 2 * (4 + 4), оно будет оценено как 2 * 8, а не 8 + 4. Я не уверен, почему это работает.Я хочу убедиться, что мое понимание этого верно.Когда парсер встречает 2 * (4 + 4)
, он сначала анализирует 2 *
, затем он видит другое правило e
, которое является (4 + 4)
.Затем он оценивает 4 + 4
и затем передает это значение, так что теперь мы находимся на 2 * 4
?
Это хороший способ определить бинарные правила работы, если я обязательно добавлю правила приоритета?Или я пропускаю некоторые крайние случаи (много играл с этим и пока не нашел неправильных ответов)?