В последнее время стал очень популярным язык программирования «Phigon». Главная особенность этого языка состоит в том, что все программы на этом языке выглядят очень коротко и лаконично. К сожалению, эти программы отличаются тем, что иногда очень трудно понять, почему же они работают долго.
Вам поручено выяснить ответ на этот вопрос. Для этого первым делом необходимо написать анализатор программы, который определяет, сколько в ней выполняется действий. Мы будем рассматривать упрощенную модель программы на языке «Phigon». Примеры программ на языке «Phigon» смотрите в конце условия. Как и в любом языке программирования, в «Phigon» есть переменные. Названия переменных — это строки из маленьких латинских букв длиной не более 50. Переменные могут иметь любые названия, кроме «if», «while», «or», «and» и «not».
Как и в любом языке программирования, в «Phigon» есть арифметические выражения, состоящие из целых чисел, переменных и знаков арифметических операций «+», «-» и «*». Более формально, арифметические выражения в «Phigon» задаются следующим образом:
≤арифметическое выражение> ::= ≤слагаемое> | ≤cлагаемое> (+|-) ≤арифметическое выражение>
≤слагаемое> ::= ≤множитель> | ≤множитель> * ≤слагаемое>
≤множитель> ::= -≤множитель> | ≤неотрицательное число> | ≤переменная> | (≤арифметическое выражение>)
Тем самым, как и в любом языке программирования, в «Phigon» унарный минус имеет больший приоритет, чем умножение, а оно в свою очередь имеет больший приоритет, чем сложение. Каждое отрицательное число, встречающееся в программе, считается полученным в результате применения унарного минуса к соответствующему положительному числу. Например, запись отрицательного числа вида -42 означает применение унарного минуса к неотрицательному числу 42.
Как и в любом языке программирования, в «Phigon» есть операторы присваивания, которые выглядят следующим образом:
≤оператор присваивания> ::=
≤переменная> = ≤арифметическое выражение>
В результате исполнения подобного оператора переменной, стоящей в левой части, присваивается значение арифметического выражения, стоящего в правой части.
Начиная с момента первого присваивания, переменная считается объявленной, и становится возможным дальнейшее её использование в арифметических выражениях.
Как и в любом языке программирования, в «Phigon» есть логические выражения, состоящие из арифметических выражений, знаков сравнения «≤», «≤=», «>», «>=», «==», «!=» и логических операторов «and», «or» и «not». Более формально,
≤логическое выражение> ::= ≤конъюнкция> | ≤конъюнкция> or ≤логическое выражение>
≤конъюнкция> ::= ≤логическое условие> | ≤логическое условие> and ≤конъюнкция>
≤логическое условие> ::= not ≤логическое условие> | ≤арифметическое выражение>
(≤|≤=|>|>=|==|!=) ≤арифметическое выражение> | (≤логическое выражение>)
.
Тем самым, как и в любом языке программирования, в «Phigon» отрицание имеет больший приоритет, чем оператор конъюнкции «И», а он в свою очередь имеет больший приоритет, чем оператор дизъюнкции «ИЛИ».
Как и в любом языке программирования, в «Phigon» есть условный оператор, имеющий следующий вид:
≤условный оператор> ::=
if ≤логическое выражение>:
≤отступ>≤блок операторов>
где ≤блок операторов> — это некоторая последовательность операторов, идущая с дополнительным отступом в 4 пробела. Формальное определение для ≤блок операторов> мы дадим позднее. Как и в любом языке программирования, если логическое выражение истинно, то соответствующий блок операторов исполняется, а если ложно — то нет. Заметим, что при наличии вложенного условного оператора, у соответствующего блока операторов уже будет отступ в 8 пробелов, и так далее.
Как и в любом языке программирования, в «Phigon» есть оператор цикла, имеющий следующий вид:
≤оператор цикла> ::=
while ≤логическое выражение>:
≤отступ>≤блок операторов>
где, как и в условном операторе, ≤блок операторов> — это некоторая последовательность операторов, идущая с дополнительным отступом в 4 пробела. Как и в любом языке программирования, блок операторов исполняется снова и снова, пока верно логическое выражение.
Тем самым мы, наконец, можем определить общий вид программы на языке программирования «Phigon». Программа представляет собой блок операторов присваивания, условных операторов и операторов цикла:
≤блок операторов> ::= ≤оператор> | ≤оператор> ≤блок операторов>
≤оператор> ::= ≤оператор присваивания> | ≤условный оператор> | ≤оператор цикла>
Ваша задача состоит в том, чтобы узнать значение переменных после выполнения программы и количество раз, которое была выполнена каждая из операций =, +, - (суммарно как бинарный и как унарный), *, ≤=, >=, ≤, >, ==, !=, and, not, or.