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