|
Stack Unwinding
(Время: 1 сек. Память: 16 Мб Сложность: 58%)
Давид увлекается изучением своего любимого языка программирования. Для этого он иногда просматривает видео с различных курсов. На одном из них он познакомился с исключениями и теперь везде их пихаетиспользует. К сожалению, он не совсем понимает в каком порядке удаляются объекты при срабатывании исключения, поэтому просит вас по написанному им коду вывести в каком порядке будут создаваться и удаляться объекты в программе.
Напомним, что в языке Давида, при завершении функции объекты удаляются в обратном порядке, а при срабатывании исключения, программа завершается (т.к. Давид забыл написать соответствующий обработчик), предварительно освобождая созданные ей объекты. Выполнение программы всегда начинается с функции main.
Входные данные
В нескольких строчках входного файла INPUT.TXT содержится псевдокод программы. Он представляет собой описание нескольких функций (не больше 10), каждая из которых задается следующим образом. Вначале записывается сигнатура функции. Для упрощения во всех программах сигнатура функции будет выглядеть как "void funcName() {" (без кавычек), где funcName – имя объявляемой функции. Затем до "}" описывается тело функции, в котором могут быть только следующие команды:
- Type name – создать объект name типа Type (например, "MyType var");
- throw – место, где сработает исключение, гарантируется, что исключение может возникнуть только в одном месте;
- funcName() – вызов функции. Здесь funcName - имя функции, которая описана в программе.
Все имена состоят только из английских букв и цифр. Код программы не превышает 10000 символов. Гарантируется, что в коде нет циклов (рекурсивных вызовов функций) и определение функции main является последним.
Выходные данные
В выходной файл OUTPUT.TXT требуется вывести последовательность создаваемых и удаляемых в программе Давида объектов. При создании объекта типа Type в отдельной строке нужно вывести Type(), при удалении – ∼Type(), возникновение исключения – throw.
Пример
INPUT.TXT | OUTPUT.TXT |
void foo() {
B b
C c
bar()
throw
bar()
}
void bar() {
T t
}
void main() {
A a
foo()
} | A()
B()
C()
T()
~T()
throw
~C()
~B()
~A() |
Для отправки решения задачи необходимо зарегистрироваться и авторизоваться!
| |