Инженеры авиакомпании Oceanic Airlines предложили писать программы для
установленного в самолётах оборудования на новом, очень простом и
эффективном языке программирования Ocean.
В языке Ocean три типа данных — int, real и string.
Каждая программа начинается со списка заголовков функций, которые
она может использовать. Заголовок функции имеет следующий вид:
-
<имя функции>(<тип аргумента 1>, ..., <тип аргумента k>) : <тип значения>
Функция может не иметь аргументов. Имена разных функций могут
совпадать.
Текст основной программы представляет собой список объявлений переменных с их
инициализацией. Каждая строка программы имеет следующий вид:
-
<тип переменной> <имя переменной> = <имя функции>(<аргумент 1>, ..., <аргумент k>)
При этом для удобства работы программистов вместо типа переменной может быть указано
ключевое слово auto, которое означает, что тип переменной определяется типом результата
вызываемой функции.
В качестве аргументов функции при её вызове указываются имена ранее
объявленных переменных. Если существует несколько функций с указанным
именем, то будет вызвана та из них, количество и типы аргументов которой совпадают
с указанными. Допустимо, чтобы название переменной совпадало с названием
какой-либо функции.
Сотрудники Oceanic Airlines обратились к вам с просьбой написать
интерпретатор языка Ocean.
Интерпретатор должен проверять каждую строку основной программы на наличие
следующих ошибок (в указанном порядке):
- «Double declaration» — переменная с таким именем уже была объявлена;
- «Unknown variable» — один из аргументов не был объявлен в предыдущих строках;
- «No such function» — не существует функции с таким именем и подходящим
списком аргументов;
- «Invalid initialization» — тип результата функции не соответствует типу
переменной.
Исходные данные
В первой строке записано целое число f — количество заголовков
функций (1 ≤ f ≤ 100). Далее в f строках записаны эти заголовки.
Любые две функции отличаются либо именем, либо перечнем
аргументов.
В следующей строке записано целое число n — количество строк в
основной программе (1 ≤ n ≤ 100). В каждой из следующих n строк записано
объявление очередной переменной с её инициализацией. Все
заголовки функций и все их вызовы содержат не более 10 аргументов. Имена
переменных и функций имеют длину от 1 до 20 символов. Имена переменных состоят
только из строчных английских букв, имена функций могут также содержать
заглавные английские буквы. Имена функций, отличающиеся только регистром,
следует считать различными. Строки «int», «real», «string», «auto» не
могут выступать в качестве имён переменных и функций. Расстановка пробелов
соответствует той, которая приведена в примерах входных данных.
Результат
Если в программе нет ошибок, выведите список всех переменных, которые
были объявлены как «auto», и их типы.
Переменные следует выдавать в порядке их объявления в программе. Если в
программе есть ошибки, выведите номер строки с первой ошибкой и тип этой ошибки.
Формат вывода должен соответствовать приведённым примерам.
Примеры
исходные данные | результат |
---|
2
ReadInt() : int
IntToReal(int) : real
3
auto a = ReadInt()
auto b = IntToReal(a)
int c = ReadInt()
| a : int
b : real
|
1
ReadInt() : int
2
int x = ReadInt()
int x = ReadInt()
| Error on line 2: Double declaration
|
3
ReadInt() : int
ReadReal() : real
SumRealInt(real, int) : real
4
auto x = ReadInt()
auto y = ReadReal()
real z = SumRealInt(y, x)
real q = SumRealInt(x, y)
| Error on line 4: No such function
|
Автор задачи: Алексей Самсонов
Источник задачи: NEERC 2011, Четвертьфинал Восточного подрегиона