eolymp
bolt
Спробуйте наш новий інтерфейс для відправки розв'язків
Задачі

Програма для програми

Програма для програми

Напевно кожен програміст опісля того як написав тетріс, повинен обов'язково написати компілятор для певної мови програмування. Ну що ж, кожен - так кожен... У цій задачі Вам пропонується написати інтерпретатор (не будемо ж ми бруднити руки низькорівневими мовами програмування) для наступної мови програмування. Назвемо її \textbf{Сю}. Це \textbf{С}-подібна мова, але динамічно типізована. І у ній є наступні конструкції: 1) Вся програма -- набір функцій. Оскільки функції можуть викликатись до їх виконання, то присутні також і прототипи функції. Функція задається: <<\textbf{ім'я}>> ( <<\textbf{імена аргументів через кому}>>) <<\textbf{блок (тіло функції)}>> Прототип функції: <<\textbf{ім'я}>> (<<\textbf{імена аргументів через кому}>> ); Програма починається із виконання функції \textbf{main}. Якщо така відсутня, то, якщо функція одна, то вона виконується. 2) Блок: \{ <<\textbf{набір операторів розділених крапкою із комою}>> \} Блок повертає значення останнього оператора блоку. 3) Оператор може бути наступних типів: а) виклик функції: <<\textbf{ім'я функції}>>(<<\textbf{набір параметрів через кому}>>) б) присвоєння: <<\textbf{ім'я змінної 1}>> = <<\textbf{ім'я змінної 2}>> = ... = <<\textbf{ім'я змінної n}>> = \textbf{вираз}. в) \textbf{вираз} -- за усіма математичними правилами; також можуть бути присутні тернарні оператори. г) тернарний оператор: <<\textbf{вираз 1}>>\textbf{?}<<\textbf{вираз 2}>>\textbf{:}<<\textbf{вираз 3}>> Виконується наступним чином: якщо \textbf{вираз 1} -- істинний, то результат -- \textbf{вираз 2}, інакше -- \textbf{вираз 3}. д) Умовний оператор: \textbf{if} (<<\textbf{вираз 1}>>) <<\textbf{блок 1}>> \textbf{else} <<\textbf{блок 2}>> Виконується як тернарний оператор. Частина \textbf{else} <<\textbf{вираз 3}>>; може бути відсутня. е) Цикли: I) \textbf{for} (<<\textbf{вираз 1}>>\textbf{;} <<\textbf{вираз 2}>>\textbf{;} <<\textbf{вираз 3}>>) <<\textbf{блок}>> Виконує на початку \textbf{вираз 1}. Потім поки \textbf{вираз 2} істинний виконується \textbf{блок} і опісля -- \textbf{вираз 3}. Спочатку перевірка істинності -- тоді виконання. II) \textbf{while(}<<\textbf{вираз}>>\textbf{)}<<\textbf{блок}>> Виконує \textbf{блок} доти, доки істинне значення \textbf{виразу}. Спочатку перевірка істинності -- тоді виконання. III) \textbf{do} <<\textbf{блок}>> \textbf{while} (<<\textbf{вираз}>>) Виконує блок доти, доки істинне значення виразу. Спочатку виконання -- тоді перевірка істинності. є) оператор повернення: \textbf{return} <<\textbf{вираз}>> Повертає функції значення виразу і припиняє її роботу. ж) оператор виходу із циклу: \textbf{break} Припиняє роботу циклу чи оператора умови. При цьому може повертати значення. и) Рядок -- \textbf{"}<<\textbf{набір символів}>>\textbf{"} і) Символ в програмі - \textbf{'}<<\textbf{символ}>>\textbf{'} й) Присутні оператори \textbf{>} (більше), \textbf{<} (менше), \textbf{>=} (більше або рівне), \textbf{<=} (менше або рівне), \textbf{!=} (не дорівнює),\textbf{==} (логічне дорівнює), \textbf{||} - логічне або, \textbf{&&} - логічне і. к) Оператори \textbf{+=} (додати та присвоїти), \textbf{-=} (відняти та присвоїти), \textbf{*=} (помножити та присвоїти), \textbf{/=} (поділити та присвоїти), \textbf{\%=} (взяти по модулю та присвоїти), \textbf{++}<<\textbf{ім'я змінної}>> (додати одиницю та повернути значення), <<\textbf{ім'я змінної}>>\textbf{++} (повернути значення та додати \textbf{1}), <<\textbf{ім'я змінної}>>\textbf{--} (повернути значення та відняти \textbf{1}), \textbf{--}<<\textbf{ім'я змінної}>> (відняти \textbf{1} та повернути значення). Присутня стандартна функція \textbf{print}, котра виводить аргументи, що їй передаються. з) \textbf{Ім'я} -- це послідовність латинських літер, цифр та символу підкреслення. Першим символом імені не може бути цифра. \textit{\textbf{Зауваження:}} 1) Програма синтаксично правильна та виконує не більше \textbf{1000000} ітерацій. 2) Якщо є логічні помилки, то має видаватись відповідне повідомлення. Їх список: а) Якщо функції \textbf{main} немає, та всього функцій не одна, то видається повідомлення "\textbf{Ambiguity in function calling}". б) Якщо програма запитує значення змінної, якої поки немає в програмі, видається повідомлення "\textbf{No such variable}". в) Якщо програма запитує значення функції, яка ще не описана в програмі, видається повідомлення "\textbf{No such function}" г) Якщо в математичному виразі виконуються операції, які при даних значеннях не можуть бути виконані, виводиться повідомлення "\textbf{Incompatible types}". Із числами виконуються всі математичні операції. Із рядками операції \textbf{+} та \textbf{*} - конкатенація рядків. Якщо конкатенується число та рядок, то результат -- конкатенація числа, переведеного в рядок, та рядка. Усі інші операції недозволені. д) При діленні на нуль виводиться повідомлення "\textbf{Division by zero}" 3) Усі операції, окрім =, виконуються у порядку зліва-направо (при однакових пріоритетах). \InputFile У вхідному файлі програма на вище описаній мові. \OutputFile У вихідному файлі результат роботи програми (а саме те, що виводили функції \textit{\textbf{print}}) або ж одна із помилок, якщо програмі не вдалось виконатись (перша із помилок і лише вона).
Ліміт часу 8 секунд
Ліміт використання пам'яті 256 MiB
Вхідні дані #1
main(){
	print("Hello, World!");
	a = "My name is ";
	name = "Sue";
	print('\n',a * name,"\n");
	for (i = 0; i != 10; i++) {
		print('.');
	};
	return (2*3) % 5 ? 0 : 1;
}
Вихідні дані #1
Hello, World!
My name is Sue
..........
Автор Кожухівський Віталій
Джерело Дистанційна Літня Комп`ютерна Школа - літо 2013 року