D. Анализатор исключений
Ограничение времени
2 секунды
Ограничение памяти
256Mb
Ввод
стандартный ввод или input.txt
Вывод
стандартный вывод или output.txt
Опишем синтаксис языка программирования EX:
1. funcf(){…} — объявление функции f (в скобочках — тело).
2. maybethrowExc1 — команда, которая может выбросить исключение вида Exc1, а может и не выбросить.
3. try{…}suppressExc1 — если внутри этого блока происходит исключение вида Exc1, то оно подавляется.
4. f() — вызов функции f.
В языке EX все инструкции, кроме объявлений функций, могут находиться только в теле какой-либо функции. Функции нельзя объявлять внутри других функций. Функцию можно вызывать до её определения, а также в её собственном теле. Имена функций и исключений в языке EX должны подходить под регулярное выражение [a−zA−Z0−9_]+, быть уникальными и не совпадать с ключевыми словами [func, try, suppress, maybethrow]. Текст программы может содержать произвольное количество пробелов и пустых срок.
На вход подаётся программа на языке EX. Также на вход программе подаётся q запросов. Каждый запрос — это одно число l — номер строчки в программе. Необходимо для каждого запроса вывести все исключения, которые могут вылететь в выделенной строчке программы.
Формат ввода
В первой строке входных данных находится единственное число — q (1≤q≤103), количество запросов. Далее следует q чисел по одному в строке — номера строк в запросах. Гарантируется, что все номера строк корректны. В следующей строке входных данных находится единственное число — n, количество объявлений функций в коде. В последующих строках находится текст программы на языке EX.
Гарантируется, что каждая строка программы подходит под одно из описаний ниже:
1. Пустая строка.
2. funcf(){ — объявление функции f.
3. } — конец тела функции.
4. maybethrowExc1.
5. try{ — начало блока подавления исключений.
6. }supress — конец блока подавления исключений.
7. f() — вызов функции f.
Количество вызовов функций в коде не превосходит 103.
Количество видов исключений в коде не превосходит 103.
Количество символов в коде не превосходит 106.
Формат вывода
Для каждого запроса выведите строку, содержащую имена всех исключений, которые являются ответами на запрос, разделённые пробелами.
Пример
Ввод
Вывод
5
14
1
7
14
4
2
func func1() {
maybethrow exc1
try {
maybethrow exc2
maybethrow exc3
} suppress exc1, exc2, exc3
maybethrow exc4
}
func main() {
try {
func1()
} suppress exc1
}